generated from ehmicky/template-javascript
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.d.ts
80 lines (76 loc) · 2.36 KB
/
main.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Any character which might start a new JSON token
type JsonTokenStart =
// Array
| '['
// Object
| '{'
// String
| '"'
// Number
| '-'
| '0'
| '1'
| '2'
| '3'
| '4'
| '5'
| '6'
| '7'
| '8'
| '9'
// Boolean
| 't'
| 'f'
// null
| 'n'
// Common top-level JSON values in full
type JsonTokenFull = '[]' | '{}' | 'true' | 'false' | 'null'
// JSON allows both CR and CRLF newlines
type Newline = '\n' | '\r\n'
// Common start of a JSON indented string
type IndentedTokenStart = `${'[' | '{'}${Newline}`
/**
* Guess the indentation of a JSON string.
* The return value is the same as the third argument to `JSON.stringify()`.
*
* - `undefined`: none
* - integer: number of spaces
* - string: tabs
*
* @example
* ```js
* const input = [{ example: true }]
* guessJsonIndent(JSON.stringify(input)) // undefined
* guessJsonIndent(JSON.stringify(input, undefined, 1)) // 1
* guessJsonIndent(JSON.stringify(input, undefined, 2)) // 2
* guessJsonIndent(JSON.stringify(input, undefined, 4)) // 4
* guessJsonIndent(JSON.stringify(input, undefined, '\t')) // '\t'
* guessJsonIndent(JSON.stringify(input, undefined, '\t\t')) // '\t\t'
*
* // Keep the indentation of a JSON string when parsing/serializing it
* const jsonString = JSON.stringify(input, undefined, 2)
* const indent = guessJsonIndent(jsonString)
* const parsedValue = JSON.parse(jsonString)
* console.log(JSON.stringify(input, undefined, indent)) // Same as jsonString
* ```
*/
// Does a best effort to guess the return value from the type only
/* eslint-disable @typescript-eslint/no-magic-numbers */
export default function guessJsonIndent<T extends string>(
jsonString: T,
): T extends `${JsonTokenStart}${JsonTokenStart}${string}` | JsonTokenFull
? undefined
: T extends `${IndentedTokenStart} ${JsonTokenStart}${string}`
? 1
: T extends `${IndentedTokenStart} ${JsonTokenStart}${string}`
? 2
: T extends `${IndentedTokenStart} ${JsonTokenStart}${string}`
? 4
: T extends `${IndentedTokenStart} ${JsonTokenStart}${string}`
? 8
: T extends `${IndentedTokenStart}\t${JsonTokenStart}${string}`
? '\t'
: T extends `${IndentedTokenStart}\t\t${JsonTokenStart}${string}`
? '\t\t'
: undefined | number | `\t${string}`
/* eslint-enable @typescript-eslint/no-magic-numbers */