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
| /*
| MIT License http://www.opensource.org/licenses/mit-license.php
| Author Tobias Koppers @sokra
| */
|
| "use strict";
|
| const SAFE_IDENTIFIER = /^[_a-zA-Z$][_a-zA-Z$0-9]*$/;
| const RESERVED_IDENTIFIER = new Set([
| "break",
| "case",
| "catch",
| "class",
| "const",
| "continue",
| "debugger",
| "default",
| "delete",
| "do",
| "else",
| "export",
| "extends",
| "finally",
| "for",
| "function",
| "if",
| "import",
| "in",
| "instanceof",
| "new",
| "return",
| "super",
| "switch",
| "this",
| "throw",
| "try",
| "typeof",
| "var",
| "void",
| "while",
| "with",
| "enum",
| // strict mode
| "implements",
| "interface",
| "let",
| "package",
| "private",
| "protected",
| "public",
| "static",
| "yield",
| "yield",
| // module code
| "await",
| // skip future reserved keywords defined under ES1 till ES3
| // additional
| "null",
| "true",
| "false"
| ]);
|
| /**
| * @summary Returns a valid JS property name for the given property.
| * Certain strings like "default", "null", and names with whitespace are not
| * valid JS property names, so they are returned as strings.
| *
| * @param {string} prop property name to analyze
| * @returns {string} valid JS property name
| */
| const propertyName = prop => {
| if (SAFE_IDENTIFIER.test(prop) && !RESERVED_IDENTIFIER.has(prop)) {
| return prop;
| } else {
| return JSON.stringify(prop);
| }
| };
|
| module.exports = { SAFE_IDENTIFIER, RESERVED_IDENTIFIER, propertyName };
|
|