decorator-transforms
Version:
Better babel transforms for decorators
1 lines • 68.2 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../node_modules/.pnpm/babel-import-util@3.0.1/node_modules/babel-import-util/src/sanitize.js","../node_modules/.pnpm/babel-import-util@3.0.1/node_modules/babel-import-util/src/index.js","../src/index.ts"],"sourcesContent":["\"use strict\";\n// make a name into a valid javascript identifier, as pleasantly as possible.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sanitize = void 0;\nfunction sanitize(identifier) {\n // first we opportunistically do camelization when an illegal character is not\n // the first character and is followed by a lowercase letter, in an effort to\n // aid readability of the output.\n let cleaned = identifier.replace(new RegExp(`(?<!^)(?:${illegalChar.source})([a-z])`, 'g'), (_m, letter) => letter.toUpperCase());\n // then we unliterally strip all remaining illegal characters.\n cleaned = cleaned.replace(new RegExp(illegalChar.source, 'g'), '');\n return cleaned;\n}\nexports.sanitize = sanitize;\nconst illegalChar = /^[^a-zA-Z_$]|(?<=.)[^a-zA-Z_$0-9]/;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FuaXRpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzYW5pdGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsNkVBQTZFOzs7QUFFN0UsU0FBZ0IsUUFBUSxDQUFDLFVBQWtCO0lBQ3pDLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsaUNBQWlDO0lBQ2pDLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQzlCLElBQUksTUFBTSxDQUFDLFlBQVksV0FBVyxDQUFDLE1BQU0sVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUN6RCxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FDckMsQ0FBQztJQUNGLDhEQUE4RDtJQUM5RCxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFYRCw0QkFXQztBQUVELE1BQU0sV0FBVyxHQUFHLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbWFrZSBhIG5hbWUgaW50byBhIHZhbGlkIGphdmFzY3JpcHQgaWRlbnRpZmllciwgYXMgcGxlYXNhbnRseSBhcyBwb3NzaWJsZS5cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGZpcnN0IHdlIG9wcG9ydHVuaXN0aWNhbGx5IGRvIGNhbWVsaXphdGlvbiB3aGVuIGFuIGlsbGVnYWwgY2hhcmFjdGVyIGlzIG5vdFxuICAvLyB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBpcyBmb2xsb3dlZCBieSBhIGxvd2VyY2FzZSBsZXR0ZXIsIGluIGFuIGVmZm9ydCB0b1xuICAvLyBhaWQgcmVhZGFiaWxpdHkgb2YgdGhlIG91dHB1dC5cbiAgbGV0IGNsZWFuZWQgPSBpZGVudGlmaWVyLnJlcGxhY2UoXG4gICAgbmV3IFJlZ0V4cChgKD88IV4pKD86JHtpbGxlZ2FsQ2hhci5zb3VyY2V9KShbYS16XSlgLCAnZycpLFxuICAgIChfbSwgbGV0dGVyKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKVxuICApO1xuICAvLyB0aGVuIHdlIHVubGl0ZXJhbGx5IHN0cmlwIGFsbCByZW1haW5pbmcgaWxsZWdhbCBjaGFyYWN0ZXJzLlxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKG5ldyBSZWdFeHAoaWxsZWdhbENoYXIuc291cmNlLCAnZycpLCAnJyk7XG4gIHJldHVybiBjbGVhbmVkO1xufVxuXG5jb25zdCBpbGxlZ2FsQ2hhciA9IC9eW15hLXpBLVpfJF18KD88PS4pW15hLXpBLVpfJDAtOV0vO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ImportUtil = void 0;\nconst sanitize_1 = require(\"./sanitize\");\nclass ImportUtil {\n constructor(babel, program) {\n this.babel = babel;\n this.program = program;\n this.t = babel.types;\n }\n // remove one imported binding. If this is the last thing imported from the\n // given moduleSpecifier, the whole statement will also be removed.\n removeImport(moduleSpecifier, exportedName) {\n for (let topLevelPath of this.program.get('body')) {\n if (!matchModule(topLevelPath, moduleSpecifier)) {\n continue;\n }\n let importSpecifierPath = topLevelPath\n .get('specifiers')\n .find((specifierPath) => matchSpecifier(specifierPath, exportedName));\n if (importSpecifierPath) {\n if (topLevelPath.node.specifiers.length === 1) {\n topLevelPath.remove();\n }\n else {\n importSpecifierPath.remove();\n }\n }\n }\n }\n // remove all imports from the given moduleSpecifier\n removeAllImports(moduleSpecifier) {\n for (let topLevelPath of this.program.get('body')) {\n if (matchModule(topLevelPath, moduleSpecifier)) {\n topLevelPath.remove();\n }\n }\n }\n // Import the given value (if needed) and return an Identifier representing\n // it.\n //\n // This method is trickier to use safely than our higher-level methods\n // (`insertAfter`, `insertBefore`, `replaceWith`, `mutate`) because after you\n // insert the identifier into the AST, it's up to you to ensure that babel's\n // scope system is aware of the new reference. The other methods do that for\n // you automatically.\n import(\n // the spot at which you will insert the Identifier we return to you\n target, \n // the path to the module you're importing from\n moduleSpecifier, \n // the name you're importing from that module. Use \"default\" for the default\n // export. Use \"*\" for the namespace.\n exportedName, \n // Optional hint for helping us pick a name for the imported binding\n nameHint) {\n return this.unreferencedImport(target, moduleSpecifier, exportedName, desiredName(nameHint, exportedName, defaultNameHint(target)));\n }\n // Import the given value (if needed) and return an Identifier representing\n // it.\n unreferencedImport(\n // the spot at which you will insert the Identifier we return to you\n target, \n // the path to the module you're importing from\n moduleSpecifier, \n // the name you're importing from that module. Use \"default\" for the default\n // export. Use \"*\" for the namespace.\n exportedName, \n // the preferred name you want, if we neeed to create a new binding. You\n // might get something similar instead, to avoid collisions.\n preferredName) {\n var _a;\n let isNamespaceImport = exportedName === '*';\n let isDefaultImport = exportedName === 'default';\n let isNamedImport = !isDefaultImport && !isNamespaceImport;\n let declaration = this.findImportFrom(moduleSpecifier);\n let hasNamespaceSpecifier = declaration === null || declaration === void 0 ? void 0 : declaration.node.specifiers.find((s) => s.type === 'ImportNamespaceSpecifier');\n let hasNamedSpecifiers = declaration === null || declaration === void 0 ? void 0 : declaration.node.specifiers.find((s) => s.type === 'ImportSpecifier');\n /**\n * the file has a preexisting non-namespace import and a transform tries to add a namespace import, so they don't get combined\n * the file has a preexisting namespace import and a transform tries to add a non-namespace import, so they don't get combined\n * the file has a preexisting namespace import and a transform tries to add a namespace import, so they don't get combined\n */\n let cannotUseExistingDeclaration = (hasNamedSpecifiers && isNamespaceImport) ||\n (hasNamespaceSpecifier && isNamedImport) ||\n (hasNamespaceSpecifier && isNamespaceImport);\n if (!cannotUseExistingDeclaration && declaration) {\n let specifier = declaration\n .get('specifiers')\n .find((spec) => matchSpecifier(spec, exportedName));\n if (specifier && ((_a = target.scope.getBinding(specifier.node.local.name)) === null || _a === void 0 ? void 0 : _a.kind) === 'module') {\n return this.t.identifier(specifier.node.local.name);\n }\n else {\n return this.addSpecifier(target, declaration, exportedName, preferredName);\n }\n }\n else {\n let declaration = this.insertAfterExistingImports(this.t.importDeclaration([], this.t.stringLiteral(moduleSpecifier)));\n return this.addSpecifier(target, declaration, exportedName, preferredName);\n }\n }\n importForSideEffect(moduleSpecifier) {\n let declaration = this.findImportFrom(moduleSpecifier);\n if (!declaration) {\n this.insertAfterExistingImports(this.t.importDeclaration([], this.t.stringLiteral(moduleSpecifier)));\n }\n }\n replaceWith(target, fn) {\n return this.mutate((i) => {\n target.replaceWith(fn(i));\n // the return value of replaceWith is not a reliable way to get the\n // updated path, at least in the case where the user replaced an\n // expression with a statement. Instead we will rely on the fact that path\n // replacement also mutates its argument, so `target` now points at the\n // newly replaced path.\n return target;\n }, defaultNameHint(target));\n }\n insertAfter(target, fn) {\n return this.mutate((i) => target.insertAfter(fn(i))[0], defaultNameHint(target));\n }\n insertBefore(target, fn) {\n return this.mutate((i) => target.insertBefore(fn(i))[0], defaultNameHint(target));\n }\n // Low-level method for when you don't want to use our higher-level methods\n // (replaceWith, insertBefore, insertAfter)\n mutate(fn, defaultNameHint) {\n let symbols = new Map();\n const importer = {\n import: (moduleSpecifier, exportedName, nameHint) => {\n let identifier = this.t.identifier('__babel_import_util_placeholder__');\n symbols.set(identifier, { moduleSpecifier, exportedName, nameHint });\n return identifier;\n },\n };\n const updateReference = (path) => {\n if (!path.isIdentifier()) {\n return;\n }\n let hit = symbols.get(path.node);\n if (hit) {\n let newIdentifier = this.unreferencedImport(path, hit.moduleSpecifier, hit.exportedName, desiredName(hit.nameHint, hit.exportedName, defaultNameHint));\n path.replaceWith(newIdentifier);\n let binding = path.scope.getBinding(newIdentifier.name);\n if (!binding) {\n // we create the binding at the point where we add the import, so this\n // would indicate broken behavior\n throw new Error(`bug: this is supposed to never happen`);\n }\n binding.reference(path);\n }\n };\n let result = fn(importer);\n updateReference(result);\n this.babel.traverse(result.node, {\n ReferencedIdentifier: (path) => {\n updateReference(path);\n },\n }, result.scope, {}, result);\n return result;\n }\n addSpecifier(target, declaration, exportedName, preferredName) {\n let local = this.t.identifier(unusedNameLike(target, preferredName));\n let specifier = this.buildSpecifier(exportedName, local);\n let added;\n if (specifier.type === 'ImportDefaultSpecifier') {\n declaration.node.specifiers.unshift(specifier);\n added = declaration.get(`specifiers.0`);\n }\n else {\n declaration.node.specifiers.push(specifier);\n added = declaration.get(`specifiers.${declaration.node.specifiers.length - 1}`);\n }\n declaration.scope.registerBinding('module', added);\n return local;\n }\n buildSpecifier(exportedName, localName) {\n switch (exportedName) {\n case 'default':\n return this.t.importDefaultSpecifier(localName);\n case '*':\n return this.t.importNamespaceSpecifier(localName);\n default:\n return this.t.importSpecifier(localName, this.t.identifier(exportedName));\n }\n }\n findImportFrom(moduleSpecifier) {\n for (let path of this.program.get('body')) {\n if (path.isImportDeclaration() &&\n path.node.source.value === moduleSpecifier &&\n path.node.importKind !== 'type') {\n return path;\n }\n }\n return undefined;\n }\n insertAfterExistingImports(statement) {\n let lastIndex;\n for (let [index, node] of this.program.node.body.entries()) {\n if (node.type === 'ImportDeclaration') {\n lastIndex = index;\n }\n }\n if (lastIndex == null) {\n // we are intentionally not using babel's container-aware methods, because\n // while in theory it's nice that they schedule other plugins to run on\n // our nodes, in practice those nodes might get mutated or removed by some\n // other plugin in the intervening time causing failures.\n this.program.node.body.unshift(statement);\n return this.program.get('body.0');\n }\n else {\n this.program.node.body.splice(lastIndex + 1, 0, statement);\n return this.program.get(`body.${lastIndex + 1}`);\n }\n }\n}\nexports.ImportUtil = ImportUtil;\nfunction unusedNameLike(path, name) {\n let candidate = name;\n let counter = 0;\n while (path.scope.hasBinding(candidate)) {\n candidate = `${name}${counter++}`;\n }\n return candidate;\n}\nfunction name(node) {\n if (node.type === 'StringLiteral') {\n return node.value;\n }\n else {\n return node.name;\n }\n}\nfunction desiredName(nameHint, exportedName, defaultNameHint) {\n if (nameHint) {\n return (0, sanitize_1.sanitize)(nameHint);\n }\n if (exportedName === 'default' || exportedName === '*') {\n return defaultNameHint !== null && defaultNameHint !== void 0 ? defaultNameHint : 'a';\n }\n else {\n return exportedName;\n }\n}\nfunction defaultNameHint(target) {\n if (target === null || target === void 0 ? void 0 : target.isIdentifier()) {\n return target.node.name;\n }\n else if (target) {\n return target.scope.generateUidIdentifierBasedOnNode(target.node).name;\n }\n else {\n return undefined;\n }\n}\nfunction matchSpecifier(spec, exportedName) {\n switch (exportedName) {\n case 'default':\n return spec.isImportDefaultSpecifier();\n case '*':\n return spec.isImportNamespaceSpecifier();\n default:\n return spec.isImportSpecifier() && name(spec.node.imported) === exportedName;\n }\n}\nfunction matchModule(path, moduleSpecifier) {\n return path.isImportDeclaration() && path.get('source').node.value === moduleSpecifier;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx5Q0FBc0M7QUFFdEMsTUFBYSxVQUFVO0lBR3JCLFlBQW9CLEtBQW1CLEVBQVUsT0FBNEI7UUFBekQsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUFVLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBQzNFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLG1FQUFtRTtJQUNuRSxZQUFZLENBQUMsZUFBdUIsRUFBRSxZQUFvQjtRQUN4RCxLQUFLLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxFQUFFO2dCQUMvQyxTQUFTO2FBQ1Y7WUFFRCxJQUFJLG1CQUFtQixHQUFHLFlBQVk7aUJBQ25DLEdBQUcsQ0FBQyxZQUFZLENBQUM7aUJBQ2pCLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksbUJBQW1CLEVBQUU7Z0JBQ3ZCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDN0MsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUN2QjtxQkFBTTtvQkFDTCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQkFDOUI7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxnQkFBZ0IsQ0FBQyxlQUF1QjtRQUN0QyxLQUFLLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pELElB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SUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDM0M7WUFDRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFlBQVksQ0FBQztLQUNoRjtBQUNILENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsSUFBbUIsRUFDbkIsZUFBdUI7SUFFdkIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDO0FBQ3pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEJhYmVsIGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCB0eXBlIHsgdHlwZXMgYXMgdCwgTm9kZVBhdGggfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgeyBzYW5pdGl6ZSB9IGZyb20gJy4vc2FuaXRpemUnO1xuXG5leHBvcnQgY2xhc3MgSW1wb3J0VXRpbCB7XG4gIHByaXZhdGUgdDogdHlwZW9mIEJhYmVsLnR5cGVzO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYmFiZWw6IHR5cGVvZiBCYWJlbCwgcHJpdmF0ZSBwcm9ncmFtOiBOb2RlUGF0aDx0LlByb2dyYW0+KSB7XG4gICAgdGhpcy50ID0gYmFiZWwudHlwZXM7XG4gIH1cblxuICAvLyByZW1vdmUgb25lIGltcG9ydGVkIGJpbmRpbmcuIElmIHRoaXMgaXMgdGhlIGxhc3QgdGhpbmcgaW1wb3J0ZWQgZnJvbSB0aGVcbiAgLy8gZ2l2ZW4gbW9kdWxlU3BlY2lmaWVyLCB0aGUgd2hvbGUgc3RhdGVtZW50IHdpbGwgYWxzbyBiZSByZW1vdmVkLlxuICByZW1vdmVJbXBvcnQobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcsIGV4cG9ydGVkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChsZXQgdG9wTGV2ZWxQYXRoIG9mIHRoaXMucHJvZ3JhbS5nZXQoJ2JvZHknKSkge1xuICAgICAgaWYgKCFtYXRjaE1vZHVsZSh0b3BMZXZlbFBhdGgsIG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBpbXBvcnRTcGVjaWZpZXJQYXRoID0gdG9wTGV2ZWxQYXRoXG4gICAgICAgIC5nZXQoJ3NwZWNpZmllcnMnKVxuICAgICAgICAuZmluZCgoc3BlY2lmaWVyUGF0aCkgPT4gbWF0Y2hTcGVjaWZpZXIoc3BlY2lmaWVyUGF0aCwgZXhwb3J0ZWROYW1lKSk7XG4gICAgICBpZiAoaW1wb3J0U3BlY2lmaWVyUGF0aCkge1xuICAgICAgICBpZiAodG9wTGV2ZWxQYXRoLm5vZGUuc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0b3BMZXZlbFBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW1wb3J0U3BlY2lmaWVyUGF0aC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBhbGwgaW1wb3J0cyBmcm9tIHRoZSBnaXZlbiBtb2R1bGVTcGVjaWZpZXJcbiAgcmVtb3ZlQWxsSW1wb3J0cyhtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAobGV0IHRvcExldmVsUGF0aCBvZiB0aGlzLnByb2dyYW0uZ2V0KCdib2R5JykpIHtcbiAgICAgIGlmIChtYXRjaE1vZHVsZSh0b3BMZXZlbFBhdGgsIG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgdG9wTGV2ZWxQYXRoLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEltcG9ydCB0aGUgZ2l2ZW4gdmFsdWUgKGlmIG5lZWRlZCkgYW5kIHJldHVybiBhbiBJZGVudGlmaWVyIHJlcHJlc2VudGluZ1xuICAvLyBpdC5cbiAgLy9cbiAgLy8gVGhpcyBtZXRob2QgaXMgdHJpY2tpZXIgdG8gdXNlIHNhZmVseSB0aGFuIG91ciBoaWdoZXItbGV2ZWwgbWV0aG9kc1xuICAvLyAoYGluc2VydEFmdGVyYCwgYGluc2VydEJlZm9yZWAsIGByZXBsYWNlV2l0aGAsIGBtdXRhdGVgKSBiZWNhdXNlIGFmdGVyIHlvdVxuICAvLyBpbnNlcnQgdGhlIGlkZW50aWZpZXIgaW50byB0aGUgQVNULCBpdCdzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCBiYWJlbCdzXG4gIC8vIHNjb3BlIHN5c3RlbSBpcyBhd2FyZSBvZiB0aGUgbmV3IHJlZmVyZW5jZS4gVGhlIG90aGVyIG1ldGhvZHMgZG8gdGhhdCBmb3JcbiAgLy8geW91IGF1dG9tYXRpY2FsbHkuXG4gIGltcG9ydChcbiAgICAvLyB0aGUgc3BvdCBhdCB3aGljaCB5b3Ugd2lsbCBpbnNlcnQgdGhlIElkZW50aWZpZXIgd2UgcmV0dXJuIHRvIHlvdVxuICAgIHRhcmdldDogTm9kZVBhdGg8dC5Ob2RlPixcblxuICAgIC8vIHRoZSBwYXRoIHRvIHRoZSBtb2R1bGUgeW91J3JlIGltcG9ydGluZyBmcm9tXG4gICAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcsXG5cbiAgICAvLyB0aGUgbmFtZSB5b3UncmUgaW1wb3J0aW5nIGZyb20gdGhhdCBtb2R1bGUuIFVzZSBcImRlZmF1bHRcIiBmb3IgdGhlIGRlZmF1bHRcbiAgICAvLyBleHBvcnQuIFVzZSBcIipcIiBmb3IgdGhlIG5hbWVzcGFjZS5cbiAgICBleHBvcnRlZE5hbWU6IHN0cmluZyxcblxuICAgIC8vIE9wdGlvbmFsIGhpbnQgZm9yIGhlbHBpbmcgdXMgcGljayBhIG5hbWUgZm9yIHRoZSBpbXBvcnRlZCBiaW5kaW5nXG4gICAgbmFtZUhpbnQ/OiBzdHJpbmdcbiAgKTogdC5JZGVudGlmaWVyIHtcbiAgICByZXR1cm4gdGhpcy51bnJlZmVyZW5jZWRJbXBvcnQoXG4gICAgICB0YXJnZXQsXG4gICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICBleHBvcnRlZE5hbWUsXG4gICAgICBkZXNpcmVkTmFtZShuYW1lSGludCwgZXhwb3J0ZWROYW1lLCBkZWZhdWx0TmFtZUhpbnQodGFyZ2V0KSlcbiAgICApO1xuICB9XG5cbiAgLy8gSW1wb3J0IHRoZSBnaXZlbiB2YWx1ZSAoaWYgbmVlZGVkKSBhbmQgcmV0dXJuIGFuIElkZW50aWZpZXIgcmVwcmVzZW50aW5nXG4gIC8vIGl0LlxuICBwcml2YXRlIHVucmVmZXJlbmNlZEltcG9ydChcbiAgICAvLyB0aGUgc3BvdCBhdCB3aGljaCB5b3Ugd2lsbCBpbnNlcnQgdGhlIElkZW50aWZpZXIgd2UgcmV0dXJuIHRvIHlvdVxuICAgIHRhcmdldDogTm9kZVBhdGg8dC5Ob2RlPixcblxuICAgIC8vIHRoZSBwYXRoIHRvIHRoZSBtb2R1bGUgeW91J3JlIGltcG9ydGluZyBmcm9tXG4gICAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcsXG5cbiAgICAvLyB0aGUgbmFtZSB5b3UncmUgaW1wb3J0aW5nIGZyb20gdGhhdCBtb2R1bGUuIFVzZSBcImRlZmF1bHRcIiBmb3IgdGhlIGRlZmF1bHRcbiAgICAvLyBleHBvcnQuIFVzZSBcIipcIiBmb3IgdGhlIG5hbWVzcGFjZS5cbiAgICBleHBvcnRlZE5hbWU6IHN0cmluZyxcblxuICAgIC8vIHRoZSBwcmVmZXJyZWQgbmFtZSB5b3Ugd2FudCwgaWYgd2UgbmVlZWQgdG8gY3JlYXRlIGEgbmV3IGJpbmRpbmcuIFlvdVxuICAgIC8vIG1pZ2h0IGdldCBzb21ldGhpbmcgc2ltaWxhciBpbnN0ZWFkLCB0byBhdm9pZCBjb2xsaXNpb25zLlxuICAgIHByZWZlcnJlZE5hbWU6IHN0cmluZ1xuICApOiB0LklkZW50aWZpZXIge1xuICAgIGxldCBpc05hbWVzcGFjZUltcG9ydCA9IGV4cG9ydGVkTmFtZSA9PT0gJyonO1xuICAgIGxldCBpc0RlZmF1bHRJbXBvcnQgPSBleHBvcnRlZE5hbWUgPT09ICdkZWZhdWx0JztcbiAgICBsZXQgaXNOYW1lZEltcG9ydCA9ICFpc0RlZmF1bHRJbXBvcnQgJiYgIWlzTmFtZXNwYWNlSW1wb3J0O1xuICAgIGxldCBkZWNsYXJhdGlvbiA9IHRoaXMuZmluZEltcG9ydEZyb20obW9kdWxlU3BlY2lmaWVyKTtcbiAgICBsZXQgaGFzTmFtZXNwYWNlU3BlY2lmaWVyID0gZGVjbGFyYXRpb24/Lm5vZGUuc3BlY2lmaWVycy5maW5kKFxuICAgICAgKHMpID0+IHMudHlwZSA9PT0gJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcidcbiAgICApO1xuICAgIGxldCBoYXNOYW1lZFNwZWNpZmllcnMgPSBkZWNsYXJhdGlvbj8ubm9kZS5zcGVjaWZpZXJzLmZpbmQoKHMpID0+IHMudHlwZSA9PT0gJ0ltcG9ydFNwZWNpZmllcicpO1xuXG4gICAgLyoqXG4gICAgICogdGhlIGZpbGUgaGFzIGEgcHJlZXhpc3Rpbmcgbm9uLW5hbWVzcGFjZSBpbXBvcnQgYW5kIGEgdHJhbnNmb3JtIHRyaWVzIHRvIGFkZCBhIG5hbWVzcGFjZSBpbXBvcnQsIHNvIHRoZXkgZG9uJ3QgZ2V0IGNvbWJpbmVkXG4gICAgICogdGhlIGZpbGUgaGFzIGEgcHJlZXhpc3RpbmcgbmFtZXNwYWNlIGltcG9ydCBhbmQgYSB0cmFuc2Zvcm0gdHJpZXMgdG8gYWRkIGEgbm9uLW5hbWVzcGFjZSBpbXBvcnQsIHNvIHRoZXkgZG9uJ3QgZ2V0IGNvbWJpbmVkXG4gICAgICogdGhlIGZpbGUgaGFzIGEgcHJlZXhpc3RpbmcgbmFtZXNwYWNlIGltcG9ydCBhbmQgYSB0cmFuc2Zvcm0gdHJpZXMgdG8gYWRkIGEgbmFtZXNwYWNlIGltcG9ydCwgc28gdGhleSBkb24ndCBnZXQgY29tYmluZWRcbiAgICAgKi9cbiAgICBsZXQgY2Fubm90VXNlRXhpc3RpbmdEZWNsYXJhdGlvbiA9XG4gICAgICAoaGFzTmFtZWRTcGVjaWZpZXJzICYmIGlzTmFtZXNwYWNlSW1wb3J0KSB8fFxuICAgICAgKGhhc05hbWVzcGFjZVNwZWNpZmllciAmJiBpc05hbWVkSW1wb3J0KSB8fFxuICAgICAgKGhhc05hbWVzcGFjZVNwZWNpZmllciAmJiBpc05hbWVzcGFjZUltcG9ydCk7XG5cbiAgICBpZiAoIWNhbm5vdFVzZUV4aXN0aW5nRGVjbGFyYXRpb24gJiYgZGVjbGFyYXRpb24pIHtcbiAgICAgIGxldCBzcGVjaWZpZXIgPSBkZWNsYXJhdGlvblxuICAgICAgICAuZ2V0KCdzcGVjaWZpZXJzJylcbiAgICAgICAgLmZpbmQoKHNwZWMpID0+IG1hdGNoU3BlY2lmaWVyKHNwZWMsIGV4cG9ydGVkTmFtZSkpO1xuICAgICAgaWYgKHNwZWNpZmllciAmJiB0YXJnZXQuc2NvcGUuZ2V0QmluZGluZyhzcGVjaWZpZXIubm9kZS5sb2NhbC5uYW1lKT8ua2luZCA9PT0gJ21vZHVsZScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudC5pZGVudGlmaWVyKHNwZWNpZmllci5ub2RlLmxvY2FsLm5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVyKHRhcmdldCwgZGVjbGFyYXRpb24sIGV4cG9ydGVkTmFtZSwgcHJlZmVycmVkTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkZWNsYXJhdGlvbiA9IHRoaXMuaW5zZXJ0QWZ0ZXJFeGlzdGluZ0ltcG9ydHMoXG4gICAgICAgIHRoaXMudC5pbXBvcnREZWNsYXJhdGlvbihbXSwgdGhpcy50LnN0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5hZGRTcGVjaWZpZXIodGFyZ2V0LCBkZWNsYXJhdGlvbiwgZXhwb3J0ZWROYW1lLCBwcmVmZXJyZWROYW1lKTtcbiAgICB9XG4gIH1cblxuICBpbXBvcnRGb3JTaWRlRWZmZWN0KG1vZHVsZVNwZWNpZmllcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGRlY2xhcmF0aW9uID0gdGhpcy5maW5kSW1wb3J0RnJvbShtb2R1bGVTcGVjaWZpZXIpO1xuICAgIGlmICghZGVjbGFyYXRpb24pIHtcbiAgICAgIHRoaXMuaW5zZXJ0QWZ0ZXJFeGlzdGluZ0ltcG9ydHMoXG4gICAgICAgIHRoaXMudC5pbXBvcnREZWNsYXJhdGlvbihbXSwgdGhpcy50LnN0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVwbGFjZVdpdGg8VCBleHRlbmRzIHQuTm9kZSwgUiBleHRlbmRzIHQuTm9kZT4oXG4gICAgdGFyZ2V0OiBOb2RlUGF0aDxUPixcbiAgICBmbjogKGk6IEltcG9ydGVyKSA9PiBSXG4gICk6IE5vZGVQYXRoPFI+IHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUoKGkpID0+IHtcbiAgICAgIHRhcmdldC5yZXBsYWNlV2l0aChmbihpKSk7XG4gICAgICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlcGxhY2VXaXRoIGlzIG5vdCBhIHJlbGlhYmxlIHdheSB0byBnZXQgdGhlXG4gICAgICAvLyB1cGRhdGVkIHBhdGgsIGF0IGxlYXN0IGluIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIHJlcGxhY2VkIGFuXG4gICAgICAvLyBleHByZXNzaW9uIHdpdGggYSBzdGF0ZW1lbnQuIEluc3RlYWQgd2Ugd2lsbCByZWx5IG9uIHRoZSBmYWN0IHRoYXQgcGF0aFxuICAgICAgLy8gcmVwbGFjZW1lbnQgYWxzbyBtdXRhdGVzIGl0cyBhcmd1bWVudCwgc28gYHRhcmdldGAgbm93IHBvaW50cyBhdCB0aGVcbiAgICAgIC8vIG5ld2x5IHJlcGxhY2VkIHBhdGguXG4gICAgICByZXR1cm4gdGFyZ2V0IGFzIHVua25vd24gYXMgTm9kZVBhdGg8Uj47XG4gICAgfSwgZGVmYXVsdE5hbWVIaW50KHRhcmdldCkpO1xuICB9XG5cbiAgaW5zZXJ0QWZ0ZXI8VCBleHRlbmRzIHQuTm9kZSwgUiBleHRlbmRzIHQuTm9kZT4oXG4gICAgdGFyZ2V0OiBOb2RlUGF0aDxUPixcbiAgICBmbjogKGk6IEltcG9ydGVyKSA9PiBSXG4gICk6IE5vZGVQYXRoPFI+IHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUoKGkpID0+IHRhcmdldC5pbnNlcnRBZnRlcihmbihpKSlbMF0gYXMgTm9kZVBhdGg8Uj4sIGRlZmF1bHROYW1lSGludCh0YXJnZXQpKTtcbiAgfVxuXG4gIGluc2VydEJlZm9yZTxUIGV4dGVuZHMgdC5Ob2RlLCBSIGV4dGVuZHMgdC5Ob2RlPihcbiAgICB0YXJnZXQ6IE5vZGVQYXRoPFQ+LFxuICAgIGZuOiAoaTogSW1wb3J0ZXIpID0+IFJcbiAgKTogTm9kZVBhdGg8Uj4ge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZShcbiAgICAgIChpKSA9PiB0YXJnZXQuaW5zZXJ0QmVmb3JlKGZuKGkpKVswXSBhcyBOb2RlUGF0aDxSPixcbiAgICAgIGRlZmF1bHROYW1lSGludCh0YXJnZXQpXG4gICAgKTtcbiAgfVxuXG4gIC8vIExvdy1sZXZlbCBtZXRob2QgZm9yIHdoZW4geW91IGRvbid0IHdhbnQgdG8gdXNlIG91ciBoaWdoZXItbGV2ZWwgbWV0aG9kc1xuICAvLyAocmVwbGFjZVdpdGgsIGluc2VydEJlZm9yZSwgaW5zZXJ0QWZ0ZXIpXG4gIG11dGF0ZTxSZXBsYWNlbWVudCBleHRlbmRzIHQuTm9kZT4oXG4gICAgZm46IChpbXBvcnRlcjogSW1wb3J0ZXIpID0+IE5vZGVQYXRoPFJlcGxhY2VtZW50PixcbiAgICBkZWZhdWx0TmFtZUhpbnQ/OiBzdHJpbmdcbiAgKTogTm9kZVBhdGg8UmVwbGFjZW1lbnQ+IHtcbiAgICBsZXQgc3ltYm9sczogTWFwPFxuICAgICAgdC5JZGVudGlmaWVyLFxuICAgICAgeyBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZzsgZXhwb3J0ZWROYW1lOiBzdHJpbmc7IG5hbWVIaW50OiBzdHJpbmcgfCB1bmRlZmluZWQgfVxuICAgID4gPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaW1wb3J0ZXI6IEltcG9ydGVyID0ge1xuICAgICAgaW1wb3J0OiAobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcsIGV4cG9ydGVkTmFtZTogc3RyaW5nLCBuYW1lSGludD86IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgaWRlbnRpZmllciA9IHRoaXMudC5pZGVudGlmaWVyKCdfX2JhYmVsX2ltcG9ydF91dGlsX3BsYWNlaG9sZGVyX18nKTtcbiAgICAgICAgc3ltYm9scy5zZXQoaWRlbnRpZmllciwgeyBtb2R1bGVTcGVjaWZpZXIsIGV4cG9ydGVkTmFtZSwgbmFtZUhpbnQgfSk7XG4gICAgICAgIHJldHVybiBpZGVudGlmaWVyO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlUmVmZXJlbmNlID0gKHBhdGg6IE5vZGVQYXRoKSA9PiB7XG4gICAgICBpZiAoIXBhdGguaXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGhpdCA9IHN5bWJvbHMuZ2V0KHBhdGgubm9kZSk7XG4gICAgICBpZiAoaGl0KSB7XG4gICAgICAgIGxldCBuZXdJZGVudGlmaWVyID0gdGhpcy51bnJlZmVyZW5jZWRJbXBvcnQoXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBoaXQubW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIGhpdC5leHBvcnRlZE5hbWUsXG4gICAgICAgICAgZGVzaXJlZE5hbWUoaGl0Lm5hbWVIaW50LCBoaXQuZXhwb3J0ZWROYW1lLCBkZWZhdWx0TmFtZUhpbnQpXG4gICAgICAgICk7XG4gICAgICAgIHBhdGgucmVwbGFjZVdpdGgobmV3SWRlbnRpZmllcik7XG4gICAgICAgIGxldCBiaW5kaW5nID0gcGF0aC5zY29wZS5nZXRCaW5kaW5nKG5ld0lkZW50aWZpZXIubmFtZSk7XG4gICAgICAgIGlmICghYmluZGluZykge1xuICAgICAgICAgIC8vIHdlIGNyZWF0ZSB0aGUgYmluZGluZyBhdCB0aGUgcG9pbnQgd2hlcmUgd2UgYWRkIHRoZSBpbXBvcnQsIHNvIHRoaXNcbiAgICAgICAgICAvLyB3b3VsZCBpbmRpY2F0ZSBicm9rZW4gYmVoYXZpb3JcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1ZzogdGhpcyBpcyBzdXBwb3NlZCB0byBuZXZlciBoYXBwZW5gKTtcbiAgICAgICAgfVxuICAgICAgICBiaW5kaW5nLnJlZmVyZW5jZShwYXRoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHJlc3VsdCA9IGZuKGltcG9ydGVyKTtcbiAgICB1cGRhdGVSZWZlcmVuY2UocmVzdWx0KTtcbiAgICB0aGlzLmJhYmVsLnRyYXZlcnNlKFxuICAgICAgcmVzdWx0Lm5vZGUsXG4gICAgICB7XG4gICAgICAgIFJlZmVyZW5jZWRJZGVudGlmaWVyOiAocGF0aCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZVJlZmVyZW5jZShwYXRoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXN1bHQuc2NvcGUsXG4gICAgICB7fSxcbiAgICAgIHJlc3VsdFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlY2lmaWVyKFxuICAgIHRhcmdldDogTm9kZVBhdGg8dC5Ob2RlPixcbiAgICBkZWNsYXJhdGlvbjogTm9kZVBhdGg8dC5JbXBvcnREZWNsYXJhdGlvbj4sXG4gICAgZXhwb3J0ZWROYW1lOiBzdHJpbmcsXG4gICAgcHJlZmVycmVkTmFtZTogc3RyaW5nXG4gICk6IHQuSWRlbnRpZmllciB7XG4gICAgbGV0IGxvY2FsID0gdGhpcy50LmlkZW50aWZpZXIodW51c2VkTmFtZUxpa2UodGFyZ2V0LCBwcmVmZXJyZWROYW1lKSk7XG4gICAgbGV0IHNwZWNpZmllciA9IHRoaXMuYnVpbGRTcGVjaWZpZXIoZXhwb3J0ZWROYW1lLCBsb2NhbCk7XG4gICAgbGV0IGFkZGVkOiBOb2RlUGF0aDtcbiAgICBpZiAoc3BlY2lmaWVyLnR5cGUgPT09ICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJykge1xuICAgICAgZGVjbGFyYXRpb24ubm9kZS5zcGVjaWZpZXJzLnVuc2hpZnQoc3BlY2lmaWVyKTtcbiAgICAgIGFkZGVkID0gZGVjbGFyYXRpb24uZ2V0KGBzcGVjaWZpZXJzLjBgKSBhcyBOb2RlUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjbGFyYXRpb24ubm9kZS5zcGVjaWZpZXJzLnB1c2goc3BlY2lmaWVyKTtcbiAgICAgIGFkZGVkID0gZGVjbGFyYXRpb24uZ2V0KGBzcGVjaWZpZXJzLiR7ZGVjbGFyYXRpb24ubm9kZS5zcGVjaWZpZXJzLmxlbmd0aCAtIDF9YCkgYXMgTm9kZVBhdGg7XG4gICAgfVxuICAgIGRlY2xhcmF0aW9uLnNjb3BlLnJlZ2lzdGVyQmluZGluZygnbW9kdWxlJywgYWRkZWQpO1xuICAgIHJldHVybiBsb2NhbDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTcGVjaWZpZXIoZXhwb3J0ZWROYW1lOiBzdHJpbmcsIGxvY2FsTmFtZTogdC5JZGVudGlmaWVyKSB7XG4gICAgc3dpdGNoIChleHBvcnRlZE5hbWUpIHtcbiAgICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgICByZXR1cm4gdGhpcy50LmltcG9ydERlZmF1bHRTcGVjaWZpZXIobG9jYWxOYW1lKTtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gdGhpcy50LmltcG9ydE5hbWVzcGFjZVNwZWNpZmllcihsb2NhbE5hbWUpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMudC5pbXBvcnRTcGVjaWZpZXIobG9jYWxOYW1lLCB0aGlzLnQuaWRlbnRpZmllcihleHBvcnRlZE5hbWUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRJbXBvcnRGcm9tKG1vZHVsZVNwZWNpZmllcjogc3RyaW5nKTogTm9kZVBhdGg8dC5JbXBvcnREZWNsYXJhdGlvbj4gfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IHBhdGggb2YgdGhpcy5wcm9ncmFtLmdldCgnYm9keScpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhdGguaXNJbXBvcnREZWNsYXJhdGlvbigpICYmXG4gICAgICAgIHBhdGgubm9kZS5zb3VyY2UudmFsdWUgPT09IG1vZHVsZVNwZWNpZmllciAmJlxuICAgICAgICBwYXRoLm5vZGUuaW1wb3J0S2luZCAhPT0gJ3R5cGUnXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGluc2VydEFmdGVyRXhpc3RpbmdJbXBvcnRzPFMgZXh0ZW5kcyB0LlN0YXRlbWVudD4oc3RhdGVtZW50OiBTKTogTm9kZVBhdGg8Uz4ge1xuICAgIGxldCBsYXN0SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBbaW5kZXgsIG5vZGVdIG9mIHRoaXMucHJvZ3JhbS5ub2RlLmJvZHkuZW50cmllcygpKSB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnSW1wb3J0RGVjbGFyYXRpb24nKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFzdEluZGV4ID09IG51bGwpIHtcbiAgICAgIC8vIHdlIGFyZSBpbnRlbnRpb25hbGx5IG5vdCB1c2luZyBiYWJlbCdzIGNvbnRhaW5lci1hd2FyZSBtZXRob2RzLCBiZWNhdXNlXG4gICAgICAvLyB3aGlsZSBpbiB0aGVvcnkgaXQncyBuaWNlIHRoYXQgdGhleSBzY2hlZHVsZSBvdGhlciBwbHVnaW5zIHRvIHJ1biBvblxuICAgICAgLy8gb3VyIG5vZGVzLCBpbiBwcmFjdGljZSB0aG9zZSBub2RlcyBtaWdodCBnZXQgbXV0YXRlZCBvciByZW1vdmVkIGJ5IHNvbWVcbiAgICAgIC8vIG90aGVyIHBsdWdpbiBpbiB0aGUgaW50ZXJ2ZW5pbmcgdGltZSBjYXVzaW5nIGZhaWx1cmVzLlxuICAgICAgdGhpcy5wcm9ncmFtLm5vZGUuYm9keS51bnNoaWZ0KHN0YXRlbWVudCk7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmFtLmdldCgnYm9keS4wJykgYXMgTm9kZVBhdGg8Uz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvZ3JhbS5ub2RlLmJvZHkuc3BsaWNlKGxhc3RJbmRleCArIDEsIDAsIHN0YXRlbWVudCk7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmFtLmdldChgYm9keS4ke2xhc3RJbmRleCArIDF9YCkgYXMgTm9kZVBhdGg8Uz47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVudXNlZE5hbWVMaWtlKHBhdGg6IE5vZGVQYXRoPHQuTm9kZT4sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBjYW5kaWRhdGUgPSBuYW1lO1xuICBsZXQgY291bnRlciA9IDA7XG4gIHdoaWxlIChwYXRoLnNjb3BlLmhhc0JpbmRpbmcoY2FuZGlkYXRlKSkge1xuICAgIGNhbmRpZGF0ZSA9IGAke25hbWV9JHtjb3VudGVyKyt9YDtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlO1xufVxuXG5mdW5jdGlvbiBuYW1lKG5vZGU6IHQuU3RyaW5nTGl0ZXJhbCB8IHQuSWRlbnRpZmllcik6IHN0cmluZyB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJykge1xuICAgIHJldHVybiBub2RlLnZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBub2RlLm5hbWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVzaXJlZE5hbWUoXG4gIG5hbWVIaW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGV4cG9ydGVkTmFtZTogc3RyaW5nLFxuICBkZWZhdWx0TmFtZUhpbnQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKSB7XG4gIGlmIChuYW1lSGludCkge1xuICAgIHJldHVybiBzYW5pdGl6ZShuYW1lSGludCk7XG4gIH1cbiAgaWYgKGV4cG9ydGVkTmFtZSA9PT0gJ2RlZmF1bHQnIHx8IGV4cG9ydGVkTmFtZSA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGRlZmF1bHROYW1lSGludCA/PyAnYSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV4cG9ydGVkTmFtZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0TmFtZUhpbnQodGFyZ2V0OiBOb2RlUGF0aCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0YXJnZXQ/LmlzSWRlbnRpZmllcigpKSB7XG4gICAgcmV0dXJuIHRhcmdldC5ub2RlLm5hbWU7XG4gIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRhcmdldC5zY29wZS5nZW5lcmF0ZVVpZElkZW50aWZpZXJCYXNlZE9uTm9kZSh0YXJnZXQubm9kZSkubmFtZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoU3BlY2lmaWVyKHNwZWM6IE5vZGVQYXRoPGFueT4sIGV4cG9ydGVkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoZXhwb3J0ZWROYW1lKSB7XG4gICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICByZXR1cm4gc3BlYy5pc0ltcG9ydERlZmF1bHRTcGVjaWZpZXIoKTtcbiAgICBjYXNlICcqJzpcbiAgICAgIHJldHVybiBzcGVjLmlzSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzcGVjLmlzSW1wb3J0U3BlY2lmaWVyKCkgJiYgbmFtZShzcGVjLm5vZGUuaW1wb3J0ZWQpID09PSBleHBvcnRlZE5hbWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hNb2R1bGUoXG4gIHBhdGg6IE5vZGVQYXRoPGFueT4sXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nXG4pOiBwYXRoIGlzIE5vZGVQYXRoPHQuSW1wb3J0RGVjbGFyYXRpb24+IHtcbiAgcmV0dXJuIHBhdGguaXNJbXBvcnREZWNsYXJhdGlvbigpICYmIHBhdGguZ2V0KCdzb3VyY2UnKS5ub2RlLnZhbHVlID09PSBtb2R1bGVTcGVjaWZpZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0ZXIge1xuICAvLyBJbXBvcnQgdGhlIGdpdmVuIHZhbHVlIChpZiBuZWVkZWQpIGFuZCByZXR1cm4gYW4gSWRlbnRpZmllciByZXByZXNlbnRpbmdcbiAgLy8gaXQuXG4gIGltcG9ydChcbiAgICAvLyB0aGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSdyZSBpbXBvcnRpbmcgZnJvbVxuICAgIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuXG4gICAgLy8gdGhlIG5hbWUgeW91J3JlIGltcG9ydGluZyBmcm9tIHRoYXQgbW9kdWxlLiBVc2UgXCJkZWZhdWx0XCIgZm9yIHRoZSBkZWZhdWx0XG4gICAgLy8gZXhwb3J0LiBVc2UgXCIqXCIgZm9yIHRoZSBuYW1lc3BhY2UuXG4gICAgZXhwb3J0ZWROYW1lOiBzdHJpbmcsXG5cbiAgICAvLyBPcHRpb25hbCBoaW50IGZvciBoZWxwaW5nIHVzIHBpY2sgYSBuYW1lIGZvciB0aGUgaW1wb3J0ZWQgYmluZGluZ1xuICAgIG5hbWVIaW50Pzogc3RyaW5nXG4gICk6IHQuSWRlbnRpZmllcjtcbn1cbiJdfQ==","import type * as Babel from '@babel/core';\nimport type { types as t, NodePath } from '@babel/core';\nimport { ImportUtil, type Importer } from 'babel-import-util';\nimport { globalId } from './global-id.ts';\n\ninterface State extends Babel.PluginPass {\n currentClassBodies: t.ClassBody[];\n currentObjectExpressions: {\n node: t.ObjectExpression;\n decorated: [\n 'field' | 'method',\n t.Expression, // for the property name\n t.Expression[], // for the decorators applied to it\n ][];\n }[];\n opts: Options;\n runtime: (i: Importer, fnName: string) => t.Expression;\n util: ImportUtil;\n optsWithDefaults: Required<Options>;\n}\n\nexport interface Options {\n runtime?: 'globals' | { import: string };\n runEarly?: boolean;\n}\n\nfunction makeVisitor(babel: typeof Babel): Babel.Visitor<State> {\n const t = babel.types;\n return {\n Program(path: NodePath<t.Program>, state: State) {\n state.currentClassBodies = [];\n state.currentObjectExpressions = [];\n state.optsWithDefaults = {\n runtime: 'globals',\n runEarly: false,\n ...state.opts,\n };\n state.util = new ImportUtil(babel, path);\n state.runtime = (i: Importer, fnName: string) => {\n const { runtime } = state.optsWithDefaults;\n if (runtime === 'globals') {\n return t.memberExpression(\n t.identifier(globalId),\n t.identifier(fnName),\n );\n } else {\n return i.import(runtime.import, fnName);\n }\n };\n },\n ClassBody: {\n enter(path, state) {\n state.currentClassBodies.unshift(path.node);\n },\n exit(path, state) {\n if (state.currentClassBodies[0] === path.node) {\n state.currentClassBodies.shift();\n }\n },\n },\n ClassExpression(path, state) {\n let decorators = path.get('decorators') as\n | NodePath<t.Decorator>[]\n | NodePath<null>;\n if (Array.isArray(decorators) && decorators.length > 0) {\n state.util.replaceWith(path, (i) => {\n let call = t.callExpression(state.runtime(i, 'c'), [\n path.node,\n t.arrayExpression(\n decorators\n .slice()\n .reverse()\n .map((d) => d.node.expression),\n ),\n ]);\n for (let decorator of decorators) {\n decorator.remove();\n }\n return call;\n });\n }\n },\n ClassDeclaration(path, state) {\n let decorators = path.get('decorators') as\n | NodePath<t.Decorator>[]\n | NodePath<null>;\n if (Array.isArray(decorators) && decorators.length > 0) {\n const buildCall = (i: Importer) => {\n return t.callExpression(state.runtime(i, 'c'), [\n t.classExpression(\n path.node.id,\n path.node.superClass,\n path.node.body,\n [], // decorators removed here\n ),\n t.arrayExpression(\n decorators\n .slice()\n .reverse()\n .map((d) => d.node.expression),\n ),\n ]);\n };\n\n if (path.parentPath.isExportDefaultDeclaration()) {\n let id = path.node.id;\n if (id) {\n state.util.insertBefore(path.parentPath, (i) =>\n t.variableDeclaration('const', [\n t.variableDeclarator(id, buildCall(i)),\n ]),\n );\n path.parentPath.replaceWith(t.exportDefaultDeclaration(id));\n } else {\n state.util.replaceWith(path.parentPath, (i) =>\n t.exportDefaultDeclaration(buildCall(i)),\n );\n }\n } else if (path.parentPath.isExportNamedDeclaration()) {\n let id = path.node.id;\n if (!id) {\n throw new Error(\n `bug: expected a class name is required in this context`,\n );\n }\n state.util.insertBefore(path.parentPath, (i) =>\n t.variableDeclaration('const', [\n t.variableDeclarator(id, buildCall(i)),\n ]),\n );\n path.parentPath.replaceWith(\n t.exportNamedDeclaration(null, [t.exportSpecifier(id, id)]),\n );\n } else {\n let id = path.node.id;\n if (!id) {\n throw new Error(\n `bug: expected a class name is required in this context`,\n );\n }\n state.util.replaceWith(path, (i) =>\n t.variableDeclaration('const', [\n t.variableDeclarator(id, buildCall(i)),\n ]),\n );\n }\n }\n },\n ClassProperty(path, state) {\n let decorators = path.get('decorators') as\n | NodePath<t.Decorator>[]\n | NodePath<null>;\n if (Array.isArray(decorators) && decorators.length > 0) {\n let prototype: t.Expression;\n if (path.node.static) {\n prototype = t.thisExpression();\n } else {\n prototype = t.memberExpression(\n t.thisExpression(),\n t.identifier('prototype'),\n );\n }\n let args: t.Expression[] = [\n prototype,\n valueForFieldKey(t, path.node.key),\n t.arrayExpression(\n decorators\n .slice()\n .reverse()\n .map((d) => d.node.expression),\n ),\n ];\n if (path.node.value) {\n args.push(\n t.functionExpression(\n null,\n [],\n t.blockStatement([t.returnStatement(path.node.value)]),\n ),\n );\n }\n state.util.insertBefore<t.ClassProperty, t.StaticBlock>(path, (i) =>\n t.staticBlock([\n t.expressionStatement(\n t.callExpression(state.runtime(i, 'g'), args),\n ),\n ]),\n );\n state.util.insertBefore<t.ClassProperty, t.ClassPrivateProperty>(\n path,\n (i) =>\n t.classPrivateProperty(\n t.privateName(\n t.identifier(\n unusedPrivateNameLike(state, propName(path.node.key)),\n ),\n ),\n t.sequenceExpression([\n t.callExpression(state.runtime(i, 'i'), [\n t.thisExpression(),\n valueForFieldKey(t, path.node.key),\n ]),\n t.unaryExpression('void', t.numericLiteral(0), true),\n ]),\n ),\n );\n path.remove();\n }\n },\n ClassMethod(path, state) {\n let decorators = path.get('decorators') as\n | NodePath<t.Decorator>[]\n | NodePath<null>;\n if (Array.isArray(decorators) && decorators.length > 0) {\n let prototype: t.Expression;\n if (path.node.static) {\n prototype = t.thisExpression();\n } else {\n prototype = t.memberExpression(\n t.thisExpression(),\n t.identifier('prototype'),\n );\n }\n state.util.insertAfter(path as NodePath<t.ClassMethod>, (i) =>\n t.staticBlock(