summaryrefslogtreecommitdiff
path: root/node_modules/sucrase/dist/esm/util/isIdentifier.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/sucrase/dist/esm/util/isIdentifier.js')
-rw-r--r--node_modules/sucrase/dist/esm/util/isIdentifier.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/node_modules/sucrase/dist/esm/util/isIdentifier.js b/node_modules/sucrase/dist/esm/util/isIdentifier.js
new file mode 100644
index 0000000..4a62ff6
--- /dev/null
+++ b/node_modules/sucrase/dist/esm/util/isIdentifier.js
@@ -0,0 +1,81 @@
+import {IS_IDENTIFIER_CHAR, IS_IDENTIFIER_START} from "../parser/util/identifier";
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar
+// Hard-code a list of reserved words rather than trying to use keywords or contextual keywords
+// from the parser, since currently there are various exceptions, like `package` being reserved
+// but unused and various contextual keywords being reserved. Note that we assume that all code
+// compiled by Sucrase is in a module, so strict mode words and await are all considered reserved
+// here.
+const RESERVED_WORDS = new Set([
+ // Reserved keywords as of ECMAScript 2015
+ "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",
+ "yield",
+ // Future reserved keywords
+ "enum",
+ "implements",
+ "interface",
+ "let",
+ "package",
+ "private",
+ "protected",
+ "public",
+ "static",
+ "await",
+ // Literals that cannot be used as identifiers
+ "false",
+ "null",
+ "true",
+]);
+
+/**
+ * Determine if the given name is a legal variable name.
+ *
+ * This is needed when transforming TypeScript enums; if an enum key is a valid
+ * variable name, it might be referenced later in the enum, so we need to
+ * declare a variable.
+ */
+export default function isIdentifier(name) {
+ if (name.length === 0) {
+ return false;
+ }
+ if (!IS_IDENTIFIER_START[name.charCodeAt(0)]) {
+ return false;
+ }
+ for (let i = 1; i < name.length; i++) {
+ if (!IS_IDENTIFIER_CHAR[name.charCodeAt(i)]) {
+ return false;
+ }
+ }
+ return !RESERVED_WORDS.has(name);
+}