-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
identifierHelpers.ts
42 lines (32 loc) · 1.08 KB
/
identifierHelpers.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
import RESERVED_NAMES from './RESERVED_NAMES';
const illegalCharacters = /[^\w$]/g;
const startsWithDigit = (value: string): boolean => /\d/.test(value[0]);
const needsEscape = (value: string) =>
startsWithDigit(value) || RESERVED_NAMES.has(value) || value === 'arguments';
export function isLegal(value: string): boolean {
if (needsEscape(value)) {
return false;
}
return !illegalCharacters.test(value);
}
export function makeLegal(value: string): string {
value = value
.replace(/-(\w)/g, (_, letter) => letter.toUpperCase())
.replace(illegalCharacters, '_');
if (needsEscape(value)) value = `_${value}`;
return value || '_';
}
export const VALID_IDENTIFIER_REGEXP = /^[$_\p{ID_Start}][$\u200C\u200D\p{ID_Continue}]*$/u;
export const NUMBER_REGEXP = /^\d+$/;
export function stringifyObjectKeyIfNeeded(key: string) {
if (VALID_IDENTIFIER_REGEXP.test(key) || NUMBER_REGEXP.test(key)) {
return key;
}
return JSON.stringify(key);
}
export function stringifyIdentifierIfNeeded(key: string) {
if (VALID_IDENTIFIER_REGEXP.test(key)) {
return key;
}
return JSON.stringify(key);
}