Socket
Socket
Sign inDemoInstall

babel-plugin-ember-template-compilation

Package Overview
Dependencies
Maintainers
15
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

babel-plugin-ember-template-compilation - npm Package Compare versions

Comparing version 1.1.0-alpha.0 to 1.1.0-alpha.1

src/add-ast-plugin.d.ts

2

package.json
{
"name": "babel-plugin-ember-template-compilation",
"version": "1.1.0-alpha.0",
"version": "1.1.0-alpha.1",
"description": "Babel implementation of Ember's low-level template-compilation API",

@@ -5,0 +5,0 @@ "repository": "https://github.com/emberjs/babel-plugin-ember-template-compilation",

@@ -80,3 +80,3 @@ # babel-plugin-ember-template-compilation

// - we add `content`, which is the original string form of the template
// - we add `meta.jsutils: JSUtils`, which gives AST transform plugins access to methods for manipulating the outer Javascript scope. This only works in non-strict-mode templates on Ember 3.28+ because prior to that only strict-mode templates could use lexically scoped values.
// - we add `meta.jsutils`, which gives AST transform plugins access to methods for manipulating the surrounding javascript scope. See "JSUtils" below.
// - we have special parsing for `scope` which becomes `locals` when passed

@@ -103,4 +103,43 @@ // to your precompile

# JSUtils: Manipulating Javascript from within AST transforms
AST transforms are plugins for modifying HBS templates at build time. Because those templates are embedded in Javascript and can access the Javascript scope, an AST plugin may want to introduce some new things into Javascript scope. That is what the JSUtils API is for.
Your AST transform can access the JSUtils API via `env.meta.jsutils`. Here's an example transform.
```js
function myAstTransform(env) {
return {
name: 'my-ast-transform',
visitor: {
PathExpression(node, path) {
if (node.original === 'onePlusOne') {
let name = env.meta.jsutils.bindExpression('1+1', path, { nameHint: 'two' });
return env.syntax.builders.path(name);
}
},
},
};
}
```
The example transform above would rewrite:
```js
import { precompileTemplate } from '@ember/template-compilation';
precompileTemplate('<Counter @value={{onePlusOne}} />>');
```
To:
```js
import { precompileTemplate } from '@ember/template-compilation';
let two = 1 + 1;
precompileTemplate('<Counter @value={{two}} />', { scope: () => ({ two }) });
```
See the jsdoc comments in js-utils.js for details on the methods available.
# Acknowledgement / History
This repo derives from https://github.com/ember-cli/babel-plugin-htmlbars-inline-precompile
import type { types as t } from '@babel/core';
import type * as Babel from '@babel/core';
import type { NodePath } from '@babel/traverse';
import type { ASTv1, WalkerPath } from '@glimmer/syntax';
import type { ImportUtil } from 'babel-import-util';

@@ -8,9 +9,56 @@ export declare class JSUtils {

constructor(babel: typeof Babel, program: NodePath<t.Program>, template: NodePath<t.Expression>, locals: string[], importer: ImportUtil);
bindValue(expression: string, opts?: {
/**
* Create a new binding that you can use in your template, initialized with
* the given Javascript expression.
*
* @param { Expression } expression A javascript expression whose value will
* initialize your new binding. See docs on the Expression type for details.
* @param target The location within your template where the binding will be
* used. This matters so we can avoid naming collisions.
* @param opts.nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
*
* @return The name you can use in your template to access the binding.
*/
bindExpression(expression: Expression, target: WalkerPath<ASTv1.Node>, opts?: {
nameHint?: string;
}): string;
bindImport(moduleSpecifier: string, exportedName: string, opts?: {
/**
* Gain access to an imported value within your template.
*
* @param moduleSpecifier The path to import from.
* @param exportedName The named export you wish to access, or "default" for
* the default export, or "*" for the namespace export.
* @param target The location within your template where the binding will be
* used. This matters so we can avoid naming collisions.
* @param opts.nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
*
* @return The name you can use in your template to access the imported value.
*/
bindImport(moduleSpecifier: string, exportedName: string, target: WalkerPath<ASTv1.Node>, opts?: {
nameHint?: string;
}): string;
/**
* Add an import statement purely for side effect.
*
* @param moduleSpecifier the module to import
*/
importForSideEffect(moduleSpecifier: string): void;
/**
* Emit a javascript expresison for side-effect. This only accepts
* expressions, not statements, because you should not introduce new bindings.
* To introduce a binding see bindExpression or bindImport instead.
*
* @param { Expression } expression A javascript expression whose value will
* initialize your new binding. See docs on the Expression type below for
* details.
*/
emitExpression(expression: Expression): void;
}
/**
* This extends Glimmer's ASTPluginEnvironment type to put our jsutils into meta
*/
export declare type WithJSUtils<T extends {

@@ -23,1 +71,37 @@ meta?: object;

} & T;
/**
* Allows you to construct an expression that relies on imported values.
*/
declare class ExpressionContext {
#private;
constructor(importer: ImportUtil, target: NodePath<t.Node>);
/**
* Find or create a local binding for the given import.
*
* @param moduleSpecifier The path to import from.
* @param exportedName The named export you wish to access, or "default" for
* the default export, or "*" for the namespace export.
* @param nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
* @return the local identifier for the imported value
*/
import(moduleSpecifier: string, exportedName: string, nameHint?: string): string;
}
/**
* You can pass a Javascript expression as a string like:
*
* "new Date()"
*
* Or as a function that returns a string:
*
* () => "new Date()"
*
* When you use a function, it can use imported values:
*
* (context) => `new ${context.import("luxon", "DateTime")}()`
*
*/
export declare type Expression = string | ((context: ExpressionContext) => string);
export {};

@@ -13,3 +13,3 @@ "use strict";

};
var _JSUtils_instances, _JSUtils_babel, _JSUtils_program, _JSUtils_template, _JSUtils_locals, _JSUtils_importer, _JSUtils_parseExpression, _JSUtils_unusedNameLike;
var _JSUtils_instances, _JSUtils_babel, _JSUtils_program, _JSUtils_template, _JSUtils_locals, _JSUtils_importer, _JSUtils_lastInsertedPath, _JSUtils_emitStatement, _JSUtils_parseExpression, _ExpressionContext_importer, _ExpressionContext_target;
Object.defineProperty(exports, "__esModule", { value: true });

@@ -27,2 +27,3 @@ exports.JSUtils = void 0;

_JSUtils_importer.set(this, void 0);
_JSUtils_lastInsertedPath.set(this, void 0);
__classPrivateFieldSet(this, _JSUtils_babel, babel, "f");

@@ -34,8 +35,22 @@ __classPrivateFieldSet(this, _JSUtils_program, program, "f");

}
bindValue(expression, opts) {
/**
* Create a new binding that you can use in your template, initialized with
* the given Javascript expression.
*
* @param { Expression } expression A javascript expression whose value will
* initialize your new binding. See docs on the Expression type for details.
* @param target The location within your template where the binding will be
* used. This matters so we can avoid naming collisions.
* @param opts.nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
*
* @return The name you can use in your template to access the binding.
*/
bindExpression(expression, target, opts) {
var _a;
let name = __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_unusedNameLike).call(this, (_a = opts === null || opts === void 0 ? void 0 : opts.nameHint) !== null && _a !== void 0 ? _a : 'a');
let name = unusedNameLike((_a = opts === null || opts === void 0 ? void 0 : opts.nameHint) !== null && _a !== void 0 ? _a : 'a', (candidate) => __classPrivateFieldGet(this, _JSUtils_template, "f").scope.hasBinding(candidate) || astNodeHasBinding(target, candidate));
let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types;
__classPrivateFieldGet(this, _JSUtils_program, "f").unshiftContainer('body', t.variableDeclaration('let', [
t.variableDeclarator(t.identifier(name), __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_parseExpression).call(this, expression)),
__classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.variableDeclaration('let', [
t.variableDeclarator(t.identifier(name), __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_parseExpression).call(this, __classPrivateFieldGet(this, _JSUtils_program, "f"), expression)),
]));

@@ -45,31 +60,117 @@ __classPrivateFieldGet(this, _JSUtils_locals, "f").push(name);

}
bindImport(moduleSpecifier, exportedName, opts) {
let identifier = __classPrivateFieldGet(this, _JSUtils_importer, "f").import(__classPrivateFieldGet(this, _JSUtils_template, "f"), moduleSpecifier, exportedName, opts === null || opts === void 0 ? void 0 : opts.nameHint);
__classPrivateFieldGet(this, _JSUtils_locals, "f").push(identifier.name);
return identifier.name;
/**
* Gain access to an imported value within your template.
*
* @param moduleSpecifier The path to import from.
* @param exportedName The named export you wish to access, or "default" for
* the default export, or "*" for the namespace export.
* @param target The location within your template where the binding will be
* used. This matters so we can avoid naming collisions.
* @param opts.nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
*
* @return The name you can use in your template to access the imported value.
*/
bindImport(moduleSpecifier, exportedName, target, opts) {
// This will discover or create the local name for accessing the given import.
let importedIdentifier = __classPrivateFieldGet(this, _JSUtils_importer, "f").import(__classPrivateFieldGet(this, _JSUtils_template, "f"), moduleSpecifier, exportedName, opts === null || opts === void 0 ? void 0 : opts.nameHint);
let identifier = unusedNameLike(importedIdentifier.name, (candidate) => astNodeHasBinding(target, candidate));
if (identifier !== importedIdentifier.name) {
// The importedIdentifier that we have in Javascript is not usable within
// our HBS because it's shadowed by a block param. So we will introduce a
// second name via a variable declaration.
//
// The reason we don't force the import itself to have this name is that
// we might be re-using an existing import, and we don't want to go
// rewriting all of its callsites that are unrelated to us.
let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types;
__classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.variableDeclaration('let', [
t.variableDeclarator(t.identifier(identifier), importedIdentifier),
]));
}
__classPrivateFieldGet(this, _JSUtils_locals, "f").push(identifier);
return identifier;
}
/**
* Add an import statement purely for side effect.
*
* @param moduleSpecifier the module to import
*/
importForSideEffect(moduleSpecifier) {
__classPrivateFieldGet(this, _JSUtils_importer, "f").importForSideEffect(moduleSpecifier);
}
/**
* Emit a javascript expresison for side-effect. This only accepts
* expressions, not statements, because you should not introduce new bindings.
* To introduce a binding see bindExpression or bindImport instead.
*
* @param { Expression } expression A javascript expression whose value will
* initialize your new binding. See docs on the Expression type below for
* details.
*/
emitExpression(expression) {
let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types;
__classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.expressionStatement(__classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_parseExpression).call(this, __classPrivateFieldGet(this, _JSUtils_program, "f"), expression)));
}
}
exports.JSUtils = JSUtils;
_JSUtils_babel = new WeakMap(), _JSUtils_program = new WeakMap(), _JSUtils_template = new WeakMap(), _JSUtils_locals = new WeakMap(), _JSUtils_importer = new WeakMap(), _JSUtils_instances = new WeakSet(), _JSUtils_parseExpression = function _JSUtils_parseExpression(expressionString) {
_JSUtils_babel = new WeakMap(), _JSUtils_program = new WeakMap(), _JSUtils_template = new WeakMap(), _JSUtils_locals = new WeakMap(), _JSUtils_importer = new WeakMap(), _JSUtils_lastInsertedPath = new WeakMap(), _JSUtils_instances = new WeakSet(), _JSUtils_emitStatement = function _JSUtils_emitStatement(statement) {
if (__classPrivateFieldGet(this, _JSUtils_lastInsertedPath, "f")) {
__classPrivateFieldGet(this, _JSUtils_lastInsertedPath, "f").insertAfter(statement);
}
else {
__classPrivateFieldSet(this, _JSUtils_lastInsertedPath, __classPrivateFieldGet(this, _JSUtils_program, "f").unshiftContainer('body', statement)[0], "f");
}
}, _JSUtils_parseExpression = function _JSUtils_parseExpression(target, expression) {
let expressionString;
if (typeof expression === 'string') {
expressionString = expression;
}
else {
expressionString = expression(new ExpressionContext(__classPrivateFieldGet(this, _JSUtils_importer, "f"), target));
}
let parsed = __classPrivateFieldGet(this, _JSUtils_babel, "f").parse(expressionString);
if (!parsed) {
throw new Error(`JSUtils.bindValue could not understand the expression: ${expressionString}`);
throw new Error(`JSUtils.bindExpression could not understand the expression: ${expressionString}`);
}
let statements = body(parsed);
if (statements.length !== 1) {
throw new Error(`JSUtils.bindValue expected to find exactly one expression but found ${statements.length} in: ${expressionString}`);
throw new Error(`JSUtils.bindExpression expected to find exactly one expression but found ${statements.length} in: ${expressionString}`);
}
let statement = statements[0];
if (statement.type !== 'ExpressionStatement') {
throw new Error(`JSUtils.bindValue expected to find an expression but found ${statement.type} in: ${expressionString}`);
throw new Error(`JSUtils.bindExpression expected to find an expression but found ${statement.type} in: ${expressionString}`);
}
return statement.expression;
}, _JSUtils_unusedNameLike = function _JSUtils_unusedNameLike(desiredName) {
};
function unusedNameLike(desiredName, isUsed) {
let candidate = desiredName;
let counter = 0;
while (__classPrivateFieldGet(this, _JSUtils_template, "f").scope.hasBinding(candidate)) {
while (isUsed(candidate)) {
candidate = `${desiredName}${counter++}`;
}
return candidate;
};
}
function astNodeHasBinding(target, name) {
var _a;
let cursor = target;
while (cursor) {
let parentNode = (_a = cursor.parent) === null || _a === void 0 ? void 0 : _a.node;
if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.type) === 'ElementNode' &&
parentNode.blockParams.includes(name) &&
// an ElementNode's block params are valid only within its children
parentNode.children.includes(cursor.node)) {
return true;
}
if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.type) === 'Block' &&
parentNode.blockParams.includes(name) &&
// a Block's blockParams are valid only within its body
parentNode.body.includes(cursor.node)) {
return true;
}
cursor = cursor.parent;
}
return false;
}
function body(node) {

@@ -83,2 +184,29 @@ if (node.type === 'File') {

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqcy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFLQSw2RUFBNkU7QUFDN0UsK0JBQStCO0FBQy9CLE1BQWEsT0FBTztJQU9sQixZQUNFLEtBQW1CLEVBQ25CLE9BQTRCLEVBQzVCLFFBQWdDLEVBQ2hDLE1BQWdCLEVBQ2hCLFFBQW9COztRQVh0QixpQ0FBcUI7UUFDckIsbUNBQThCO1FBQzlCLG9DQUFrQztRQUNsQyxrQ0FBa0I7UUFDbEIsb0NBQXNCO1FBU3BCLHVCQUFBLElBQUksa0JBQVUsS0FBSyxNQUFBLENBQUM7UUFDcEIsdUJBQUEsSUFBSSxvQkFBWSxPQUFPLE1BQUEsQ0FBQztRQUN4Qix1QkFBQSxJQUFJLHFCQUFhLFFBQVEsTUFBQSxDQUFDO1FBQzFCLHVCQUFBLElBQUksbUJBQVcsTUFBTSxNQUFBLENBQUM7UUFDdEIsdUJBQUEsSUFBSSxxQkFBYSxRQUFRLE1BQUEsQ0FBQztJQUM1QixDQUFDO0lBRUQsU0FBUyxDQUFDLFVBQWtCLEVBQUUsSUFBNEI7O1FBQ3hELElBQUksSUFBSSxHQUFHLHVCQUFBLElBQUksbURBQWdCLE1BQXBCLElBQUksRUFBaUIsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxtQ0FBSSxHQUFHLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsR0FBRyx1QkFBQSxJQUFJLHNCQUFPLENBQUMsS0FBSyxDQUFDO1FBQzFCLHVCQUFBLElBQUksd0JBQVMsQ0FBQyxnQkFBZ0IsQ0FDNUIsTUFBTSxFQUNOLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7WUFDM0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsdUJBQUEsSUFBSSxvREFBaUIsTUFBckIsSUFBSSxFQUFrQixVQUFVLENBQUMsQ0FBQztTQUM1RSxDQUFDLENBQ0gsQ0FBQztRQUNGLHVCQUFBLElBQUksdUJBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLGVBQXVCLEVBQUUsWUFBb0IsRUFBRSxJQUE0QjtRQUNwRixJQUFJLFVBQVUsR0FBRyx1QkFBQSxJQUFJLHlCQUFVLENBQUMsTUFBTSxDQUNwQyx1QkFBQSxJQUFJLHlCQUFVLEVBQ2QsZUFBZSxFQUNmLFlBQVksRUFDWixJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxDQUNmLENBQUM7UUFDRix1QkFBQSxJQUFJLHVCQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDekIsQ0FBQztDQThCRjtBQXpFRCwwQkF5RUM7MFFBNUJrQixnQkFBd0I7SUFDdkMsSUFBSSxNQUFNLEdBQUcsdUJBQUEsSUFBSSxzQkFBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7S0FDL0Y7SUFDRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLHVFQUF1RSxVQUFVLENBQUMsTUFBTSxRQUFRLGdCQUFnQixFQUFFLENBQ25ILENBQUM7S0FDSDtJQUNELElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUU7UUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQsU0FBUyxDQUFDLElBQUksUUFBUSxnQkFBZ0IsRUFBRSxDQUN2RyxDQUFDO0tBQ0g7SUFDRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUM7QUFDOUIsQ0FBQyw2REFFZSxXQUFtQjtJQUNqQyxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUM7SUFDNUIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sdUJBQUEsSUFBSSx5QkFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDakQsU0FBUyxHQUFHLEdBQUcsV0FBVyxHQUFHLE9BQU8sRUFBRSxFQUFFLENBQUM7S0FDMUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBU0gsU0FBUyxJQUFJLENBQUMsSUFBd0I7SUFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0tBQzFCO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDbEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyB0eXBlcyBhcyB0IH0gZnJvbSAnQGJhYmVsL2NvcmUnO1xuaW1wb3J0IHR5cGUgKiBhcyBCYWJlbCBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgdHlwZSB7IE5vZGVQYXRoIH0gZnJvbSAnQGJhYmVsL3RyYXZlcnNlJztcbmltcG9ydCB0eXBlIHsgSW1wb3J0VXRpbCB9IGZyb20gJ2JhYmVsLWltcG9ydC11dGlsJztcblxuLy8gVGhpcyBleGlzdHMgdG8gZ2l2ZSBBU1QgcGx1Z2lucyBhIGNvbnRyb2xsZWQgaW50ZXJmYWNlIGZvciBpbmZsdWVuY2luZyB0aGVcbi8vIHN1cnJvdW5kaW5nIEphdmFzY3JpcHQgc2NvcGVcbmV4cG9ydCBjbGFzcyBKU1V0aWxzIHtcbiAgI2JhYmVsOiB0eXBlb2YgQmFiZWw7XG4gICNwcm9ncmFtOiBOb2RlUGF0aDx0LlByb2dyYW0+O1xuICAjdGVtcGxhdGU6IE5vZGVQYXRoPHQuRXhwcmVzc2lvbj47XG4gICNsb2NhbHM6IHN0cmluZ1tdO1xuICAjaW1wb3J0ZXI6IEltcG9ydFV0aWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFiZWw6IHR5cGVvZiBCYWJlbCxcbiAgICBwcm9ncmFtOiBOb2RlUGF0aDx0LlByb2dyYW0+LFxuICAgIHRlbXBsYXRlOiBOb2RlUGF0aDx0LkV4cHJlc3Npb24+LFxuICAgIGxvY2Fsczogc3RyaW5nW10sXG4gICAgaW1wb3J0ZXI6IEltcG9ydFV0aWxcbiAgKSB7XG4gICAgdGhpcy4jYmFiZWwgPSBiYWJlbDtcbiAgICB0aGlzLiNwcm9ncmFtID0gcHJvZ3JhbTtcbiAgICB0aGlzLiN0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMuI2xvY2FscyA9IGxvY2FscztcbiAgICB0aGlzLiNpbXBvcnRlciA9IGltcG9ydGVyO1xuICB9XG5cbiAgYmluZFZhbHVlKGV4cHJlc3Npb246IHN0cmluZywgb3B0cz86IHsgbmFtZUhpbnQ/OiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gICAgbGV0IG5hbWUgPSB0aGlzLiN1bnVzZWROYW1lTGlrZShvcHRzPy5uYW1lSGludCA/PyAnYScpO1xuICAgIGxldCB0ID0gdGhpcy4jYmFiZWwudHlwZXM7XG4gICAgdGhpcy4jcHJvZ3JhbS51bnNoaWZ0Q29udGFpbmVyKFxuICAgICAgJ2JvZHknLFxuICAgICAgdC52YXJpYWJsZURlY2xhcmF0aW9uKCdsZXQnLCBbXG4gICAgICAgIHQudmFyaWFibGVEZWNsYXJhdG9yKHQuaWRlbnRpZmllcihuYW1lKSwgdGhpcy4jcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pKSxcbiAgICAgIF0pXG4gICAgKTtcbiAgICB0aGlzLiNsb2NhbHMucHVzaChuYW1lKTtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIGJpbmRJbXBvcnQobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcsIGV4cG9ydGVkTmFtZTogc3RyaW5nLCBvcHRzPzogeyBuYW1lSGludD86IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgICBsZXQgaWRlbnRpZmllciA9IHRoaXMuI2ltcG9ydGVyLmltcG9ydChcbiAgICAgIHRoaXMuI3RlbXBsYXRlLFxuICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgZXhwb3J0ZWROYW1lLFxuICAgICAgb3B0cz8ubmFtZUhpbnRcbiAgICApO1xuICAgIHRoaXMuI2xvY2Fscy5wdXNoKGlkZW50aWZpZXIubmFtZSk7XG4gICAgcmV0dXJuIGlkZW50aWZpZXIubmFtZTtcbiAgfVxuXG4gICNwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvblN0cmluZzogc3RyaW5nKTogdC5FeHByZXNzaW9uIHtcbiAgICBsZXQgcGFyc2VkID0gdGhpcy4jYmFiZWwucGFyc2UoZXhwcmVzc2lvblN0cmluZyk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSlNVdGlscy5iaW5kVmFsdWUgY291bGQgbm90IHVuZGVyc3RhbmQgdGhlIGV4cHJlc3Npb246ICR7ZXhwcmVzc2lvblN0cmluZ31gKTtcbiAgICB9XG4gICAgbGV0IHN0YXRlbWVudHMgPSBib2R5KHBhcnNlZCk7XG4gICAgaWYgKHN0YXRlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBKU1V0aWxzLmJpbmRWYWx1ZSBleHBlY3RlZCB0byBmaW5kIGV4YWN0bHkgb25lIGV4cHJlc3Npb24gYnV0IGZvdW5kICR7c3RhdGVtZW50cy5sZW5ndGh9IGluOiAke2V4cHJlc3Npb25TdHJpbmd9YFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IHN0YXRlbWVudCA9IHN0YXRlbWVudHNbMF07XG4gICAgaWYgKHN0YXRlbWVudC50eXBlICE9PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEpTVXRpbHMuYmluZFZhbHVlIGV4cGVjdGVkIHRvIGZpbmQgYW4gZXhwcmVzc2lvbiBidXQgZm91bmQgJHtzdGF0ZW1lbnQudHlwZX0gaW46ICR7ZXhwcmVzc2lvblN0cmluZ31gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb247XG4gIH1cblxuICAjdW51c2VkTmFtZUxpa2UoZGVzaXJlZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNhbmRpZGF0ZSA9IGRlc2lyZWROYW1lO1xuICAgIGxldCBjb3VudGVyID0gMDtcbiAgICB3aGlsZSAodGhpcy4jdGVtcGxhdGUuc2NvcGUuaGFzQmluZGluZyhjYW5kaWRhdGUpKSB7XG4gICAgICBjYW5kaWRhdGUgPSBgJHtkZXNpcmVkTmFtZX0ke2NvdW50ZXIrK31gO1xuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG59XG5cbi8vIFRoaXMgZXh0ZW5kcyBHbGltbWVyJ3MgQVNUUGx1Z2luRW52aXJvbm1lbnQgdHlwZSB0byBwdXQgb3VyIGpzdXRpbHMgaW50b1xuLy8gbWV0YS5cbmV4cG9ydCB0eXBlIFdpdGhKU1V0aWxzPFQgZXh0ZW5kcyB7IG1ldGE/OiBvYmplY3QgfT4gPSB7XG4gIG1ldGE6IFRbJ21ldGEnXSAmIHsganN1dGlsczogSlNVdGlscyB9O1xufSAmIFQ7XG5cbmZ1bmN0aW9uIGJvZHkobm9kZTogdC5Qcm9ncmFtIHwgdC5GaWxlKSB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdGaWxlJykge1xuICAgIHJldHVybiBub2RlLnByb2dyYW0uYm9keTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZS5ib2R5O1xuICB9XG59XG4iXX0=
/**
* Allows you to construct an expression that relies on imported values.
*/
class ExpressionContext {
constructor(importer, target) {
_ExpressionContext_importer.set(this, void 0);
_ExpressionContext_target.set(this, void 0);
__classPrivateFieldSet(this, _ExpressionContext_importer, importer, "f");
__classPrivateFieldSet(this, _ExpressionContext_target, target, "f");
}
/**
* Find or create a local binding for the given import.
*
* @param moduleSpecifier The path to import from.
* @param exportedName The named export you wish to access, or "default" for
* the default export, or "*" for the namespace export.
* @param nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
* @return the local identifier for the imported value
*/
import(moduleSpecifier, exportedName, nameHint) {
return __classPrivateFieldGet(this, _ExpressionContext_importer, "f").import(__classPrivateFieldGet(this, _ExpressionContext_target, "f"), moduleSpecifier, exportedName, nameHint).name;
}
}
_ExpressionContext_importer = new WeakMap(), _ExpressionContext_target = new WeakMap();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqcy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFNQSw2RUFBNkU7QUFDN0UsK0JBQStCO0FBQy9CLE1BQWEsT0FBTztJQVFsQixZQUNFLEtBQW1CLEVBQ25CLE9BQTRCLEVBQzVCLFFBQWdDLEVBQ2hDLE1BQWdCLEVBQ2hCLFFBQW9COztRQVp0QixpQ0FBcUI7UUFDckIsbUNBQThCO1FBQzlCLG9DQUFrQztRQUNsQyxrQ0FBa0I7UUFDbEIsb0NBQXNCO1FBQ3RCLDRDQUFnRDtRQVM5Qyx1QkFBQSxJQUFJLGtCQUFVLEtBQUssTUFBQSxDQUFDO1FBQ3BCLHVCQUFBLElBQUksb0JBQVksT0FBTyxNQUFBLENBQUM7UUFDeEIsdUJBQUEsSUFBSSxxQkFBYSxRQUFRLE1BQUEsQ0FBQztRQUMxQix1QkFBQSxJQUFJLG1CQUFXLE1BQU0sTUFBQSxDQUFDO1FBQ3RCLHVCQUFBLElBQUkscUJBQWEsUUFBUSxNQUFBLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxjQUFjLENBQ1osVUFBc0IsRUFDdEIsTUFBOEIsRUFDOUIsSUFBNEI7O1FBRTVCLElBQUksSUFBSSxHQUFHLGNBQWMsQ0FDdkIsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxtQ0FBSSxHQUFHLEVBQ3JCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDWix1QkFBQSxJQUFJLHlCQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQ3JGLENBQUM7UUFDRixJQUFJLENBQUMsR0FBRyx1QkFBQSxJQUFJLHNCQUFPLENBQUMsS0FBSyxDQUFDO1FBQzFCLHVCQUFBLElBQUksa0RBQWUsTUFBbkIsSUFBSSxFQUNGLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFL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SUFDSCxNQUFNLENBQUMsZUFBdUIsRUFBRSxZQUFvQixFQUFFLFFBQWlCO1FBQ3JFLE9BQU8sdUJBQUEsSUFBSSxtQ0FBVSxDQUFDLE1BQU0sQ0FBQyx1QkFBQSxJQUFJLGlDQUFRLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyB0eXBlcyBhcyB0IH0gZnJvbSAnQGJhYmVsL2NvcmUnO1xuaW1wb3J0IHR5cGUgKiBhcyBCYWJlbCBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgdHlwZSB7IE5vZGVQYXRoIH0gZnJvbSAnQGJhYmVsL3RyYXZlcnNlJztcbmltcG9ydCB0eXBlIHsgQVNUdjEsIFdhbGtlclBhdGggfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuaW1wb3J0IHR5cGUgeyBJbXBvcnRVdGlsIH0gZnJvbSAnYmFiZWwtaW1wb3J0LXV0aWwnO1xuXG4vLyBUaGlzIGV4aXN0cyB0byBnaXZlIEFTVCBwbHVnaW5zIGEgY29udHJvbGxlZCBpbnRlcmZhY2UgZm9yIGluZmx1ZW5jaW5nIHRoZVxuLy8gc3Vycm91bmRpbmcgSmF2YXNjcmlwdCBzY29wZVxuZXhwb3J0IGNsYXNzIEpTVXRpbHMge1xuICAjYmFiZWw6IHR5cGVvZiBCYWJlbDtcbiAgI3Byb2dyYW06IE5vZGVQYXRoPHQuUHJvZ3JhbT47XG4gICN0ZW1wbGF0ZTogTm9kZVBhdGg8dC5FeHByZXNzaW9uPjtcbiAgI2xvY2Fsczogc3RyaW5nW107XG4gICNpbXBvcnRlcjogSW1wb3J0VXRpbDtcbiAgI2xhc3RJbnNlcnRlZFBhdGg6IE5vZGVQYXRoPHQuTm9kZT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFiZWw6IHR5cGVvZiBCYWJlbCxcbiAgICBwcm9ncmFtOiBOb2RlUGF0aDx0LlByb2dyYW0+LFxuICAgIHRlbXBsYXRlOiBOb2RlUGF0aDx0LkV4cHJlc3Npb24+LFxuICAgIGxvY2Fsczogc3RyaW5nW10sXG4gICAgaW1wb3J0ZXI6IEltcG9ydFV0aWxcbiAgKSB7XG4gICAgdGhpcy4jYmFiZWwgPSBiYWJlbDtcbiAgICB0aGlzLiNwcm9ncmFtID0gcHJvZ3JhbTtcbiAgICB0aGlzLiN0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMuI2xvY2FscyA9IGxvY2FscztcbiAgICB0aGlzLiNpbXBvcnRlciA9IGltcG9ydGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIHRoYXQgeW91IGNhbiB1c2UgaW4geW91ciB0ZW1wbGF0ZSwgaW5pdGlhbGl6ZWQgd2l0aFxuICAgKiB0aGUgZ2l2ZW4gSmF2YXNjcmlwdCBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyBFeHByZXNzaW9uIH0gZXhwcmVzc2lvbiBBIGphdmFzY3JpcHQgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSB3aWxsXG4gICAqIGluaXRpYWxpemUgeW91ciBuZXcgYmluZGluZy4gU2VlIGRvY3Mgb24gdGhlIEV4cHJlc3Npb24gdHlwZSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgbG9jYXRpb24gd2l0aGluIHlvdXIgdGVtcGxhdGUgd2hlcmUgdGhlIGJpbmRpbmcgd2lsbCBiZVxuICAgKiB1c2VkLiBUaGlzIG1hdHRlcnMgc28gd2UgY2FuIGF2b2lkIG5hbWluZyBjb2xsaXNpb25zLlxuICAgKiBAcGFyYW0gb3B0cy5uYW1lSGludCBPcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBuZXdcbiAgICogYmluZGluZy4gV2Ugd2lsbCBtYW5nbGUgdGhpcyBuYW1lIGFzIG5lZWRlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBidXRcbiAgICogcGlja2luZyBhIGdvb2QgbmFtZSBoZXJlIGNhbiBhaWQgaW4gZGVidWdnaW5nLlxuICAgKlxuICAgKiBAcmV0dXJuIFRoZSBuYW1lIHlvdSBjYW4gdXNlIGluIHlvdXIgdGVtcGxhdGUgdG8gYWNjZXNzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgYmluZEV4cHJlc3Npb24oXG4gICAgZXhwcmVzc2lvbjogRXhwcmVzc2lvbixcbiAgICB0YXJnZXQ6IFdhbGtlclBhdGg8QVNUdjEuTm9kZT4sXG4gICAgb3B0cz86IHsgbmFtZUhpbnQ/OiBzdHJpbmcgfVxuICApOiBzdHJpbmcge1xuICAgIGxldCBuYW1lID0gdW51c2VkTmFtZUxpa2UoXG4gICAgICBvcHRzPy5uYW1lSGludCA/PyAnYScsXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICB0aGlzLiN0ZW1wbGF0ZS5zY29wZS5oYXNCaW5kaW5nKGNhbmRpZGF0ZSkgfHwgYXN0Tm9kZUhhc0JpbmRpbmcodGFyZ2V0LCBjYW5kaWRhdGUpXG4gICAgKTtcbiAgICBsZXQgdCA9IHRoaXMuI2JhYmVsLnR5cGVzO1xuICAgIHRoaXMuI2VtaXRTdGF0ZW1lbnQoXG4gICAgICB0LnZhcmlhYmxlRGVjbGFyYXRpb24oJ2xldCcsIFtcbiAgICAgICAgdC52YXJpYWJsZURlY2xhcmF0b3IodC5pZGVudGlmaWVyKG5hbWUpLCB0aGlzLiNwYXJzZUV4cHJlc3Npb24odGhpcy4jcHJvZ3JhbSwgZXhwcmVzc2lvbikpLFxuICAgICAgXSlcbiAgICApO1xuICAgIHRoaXMuI2xvY2Fscy5wdXNoKG5hbWUpO1xuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgI2VtaXRTdGF0ZW1lbnQoc3RhdGVtZW50OiB0LlN0YXRlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNsYXN0SW5zZXJ0ZWRQYXRoKSB7XG4gICAgICB0aGlzLiNsYXN0SW5zZXJ0ZWRQYXRoLmluc2VydEFmdGVyKHN0YXRlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2xhc3RJbnNlcnRlZFBhdGggPSB0aGlzLiNwcm9ncmFtLnVuc2hpZnRDb250YWluZXIoJ2JvZHknLCBzdGF0ZW1lbnQpWzBdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHYWluIGFjY2VzcyB0byBhbiBpbXBvcnRlZCB2YWx1ZSB3aXRoaW4geW91ciB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBUaGUgcGF0aCB0byBpbXBvcnQgZnJvbS5cbiAgICogQHBhcmFtIGV4cG9ydGVkTmFtZSBUaGUgbmFtZWQgZXhwb3J0IHlvdSB3aXNoIHRvIGFjY2Vzcywgb3IgXCJkZWZhdWx0XCIgZm9yXG4gICAqIHRoZSBkZWZhdWx0IGV4cG9ydCwgb3IgXCIqXCIgZm9yIHRoZSBuYW1lc3BhY2UgZXhwb3J0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBsb2NhdGlvbiB3aXRoaW4geW91ciB0ZW1wbGF0ZSB3aGVyZSB0aGUgYmluZGluZyB3aWxsIGJlXG4gICAqIHVzZWQuIFRoaXMgbWF0dGVycyBzbyB3ZSBjYW4gYXZvaWQgbmFtaW5nIGNvbGxpc2lvbnMuXG4gICAqIEBwYXJhbSBvcHRzLm5hbWVIaW50IE9wdGlvbmFsbHksIHByb3ZpZGUgYSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB5b3VyIG5ld1xuICAgKiBiaW5kaW5nLiBXZSB3aWxsIG1hbmdsZSB0aGlzIG5hbWUgYXMgbmVlZGVkIHRvIGF2b2lkIGNvbGxpc2lvbnMsIGJ1dFxuICAgKiBwaWNraW5nIGEgZ29vZCBuYW1lIGhlcmUgY2FuIGFpZCBpbiBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEByZXR1cm4gVGhlIG5hbWUgeW91IGNhbiB1c2UgaW4geW91ciB0ZW1wbGF0ZSB0byBhY2Nlc3MgdGhlIGltcG9ydGVkIHZhbHVlLlxuICAgKi9cbiAgYmluZEltcG9ydChcbiAgICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyxcbiAgICBleHBvcnRlZE5hbWU6IHN0cmluZyxcbiAgICB0YXJnZXQ6IFdhbGtlclBhdGg8QVNUdjEuTm9kZT4sXG4gICAgb3B0cz86IHsgbmFtZUhpbnQ/OiBzdHJpbmcgfVxuICApOiBzdHJpbmcge1xuICAgIC8vIFRoaXMgd2lsbCBkaXNjb3ZlciBvciBjcmVhdGUgdGhlIGxvY2FsIG5hbWUgZm9yIGFjY2Vzc2luZyB0aGUgZ2l2ZW4gaW1wb3J0LlxuICAgIGxldCBpbXBvcnRlZElkZW50aWZpZXIgPSB0aGlzLiNpbXBvcnRlci5pbXBvcnQoXG4gICAgICB0aGlzLiN0ZW1wbGF0ZSxcbiAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIGV4cG9ydGVkTmFtZSxcbiAgICAgIG9wdHM/Lm5hbWVIaW50XG4gICAgKTtcblxuICAgIGxldCBpZGVudGlmaWVyID0gdW51c2VkTmFtZUxpa2UoaW1wb3J0ZWRJZGVudGlmaWVyLm5hbWUsIChjYW5kaWRhdGUpID0+XG4gICAgICBhc3ROb2RlSGFzQmluZGluZyh0YXJnZXQsIGNhbmRpZGF0ZSlcbiAgICApO1xuICAgIGlmIChpZGVudGlmaWVyICE9PSBpbXBvcnRlZElkZW50aWZpZXIubmFtZSkge1xuICAgICAgLy8gVGhlIGltcG9ydGVkSWRlbnRpZmllciB0aGF0IHdlIGhhdmUgaW4gSmF2YXNjcmlwdCBpcyBub3QgdXNhYmxlIHdpdGhpblxuICAgICAgLy8gb3VyIEhCUyBiZWNhdXNlIGl0J3Mgc2hhZG93ZWQgYnkgYSBibG9jayBwYXJhbS4gU28gd2Ugd2lsbCBpbnRyb2R1Y2UgYVxuICAgICAgLy8gc2Vjb25kIG5hbWUgdmlhIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBmb3JjZSB0aGUgaW1wb3J0IGl0c2VsZiB0byBoYXZlIHRoaXMgbmFtZSBpcyB0aGF0XG4gICAgICAvLyB3ZSBtaWdodCBiZSByZS11c2luZyBhbiBleGlzdGluZyBpbXBvcnQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGdvXG4gICAgICAvLyByZXdyaXRpbmcgYWxsIG9mIGl0cyBjYWxsc2l0ZXMgdGhhdCBhcmUgdW5yZWxhdGVkIHRvIHVzLlxuICAgICAgbGV0IHQgPSB0aGlzLiNiYWJlbC50eXBlcztcbiAgICAgIHRoaXMuI2VtaXRTdGF0ZW1lbnQoXG4gICAgICAgIHQudmFyaWFibGVEZWNsYXJhdGlvbignbGV0JywgW1xuICAgICAgICAgIHQudmFyaWFibGVEZWNsYXJhdG9yKHQuaWRlbnRpZmllcihpZGVudGlmaWVyKSwgaW1wb3J0ZWRJZGVudGlmaWVyKSxcbiAgICAgICAgXSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuI2xvY2Fscy5wdXNoKGlkZW50aWZpZXIpO1xuICAgIHJldHVybiBpZGVudGlmaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBpbXBvcnQgc3RhdGVtZW50IHB1cmVseSBmb3Igc2lkZSBlZmZlY3QuXG4gICAqXG4gICAqIEBwYXJhbSBtb2R1bGVTcGVjaWZpZXIgdGhlIG1vZHVsZSB0byBpbXBvcnRcbiAgICovXG4gIGltcG9ydEZvclNpZGVFZmZlY3QobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiNpbXBvcnRlci5pbXBvcnRGb3JTaWRlRWZmZWN0KG1vZHVsZVNwZWNpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhIGphdmFzY3JpcHQgZXhwcmVzaXNvbiBmb3Igc2lkZS1lZmZlY3QuIFRoaXMgb25seSBhY2NlcHRzXG4gICAqIGV4cHJlc3Npb25zLCBub3Qgc3RhdGVtZW50cywgYmVjYXVzZSB5b3Ugc2hvdWxkIG5vdCBpbnRyb2R1Y2UgbmV3IGJpbmRpbmdzLlxuICAgKiBUbyBpbnRyb2R1Y2UgYSBiaW5kaW5nIHNlZSBiaW5kRXhwcmVzc2lvbiBvciBiaW5kSW1wb3J0IGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSB7IEV4cHJlc3Npb24gfSBleHByZXNzaW9uIEEgamF2YXNjcmlwdCBleHByZXNzaW9uIHdob3NlIHZhbHVlIHdpbGxcbiAgICogaW5pdGlhbGl6ZSB5b3VyIG5ldyBiaW5kaW5nLiBTZWUgZG9jcyBvbiB0aGUgRXhwcmVzc2lvbiB0eXBlIGJlbG93IGZvclxuICAgKiBkZXRhaWxzLlxuICAgKi9cbiAgZW1pdEV4cHJlc3Npb24oZXhwcmVzc2lvbjogRXhwcmVzc2lvbik6IHZvaWQge1xuICAgIGxldCB0ID0gdGhpcy4jYmFiZWwudHlwZXM7XG4gICAgdGhpcy4jZW1pdFN0YXRlbWVudCh0LmV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcy4jcGFyc2VFeHByZXNzaW9uKHRoaXMuI3Byb2dyYW0sIGV4cHJlc3Npb24pKSk7XG4gIH1cblxuICAjcGFyc2VFeHByZXNzaW9uKHRhcmdldDogTm9kZVBhdGg8dC5Ob2RlPiwgZXhwcmVzc2lvbjogRXhwcmVzc2lvbik6IHQuRXhwcmVzc2lvbiB7XG4gICAgbGV0IGV4cHJlc3Npb25TdHJpbmc6IHN0cmluZztcbiAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBleHByZXNzaW9uU3RyaW5nID0gZXhwcmVzc2lvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwcmVzc2lvblN0cmluZyA9IGV4cHJlc3Npb24obmV3IEV4cHJlc3Npb25Db250ZXh0KHRoaXMuI2ltcG9ydGVyLCB0YXJnZXQpKTtcbiAgICB9XG5cbiAgICBsZXQgcGFyc2VkID0gdGhpcy4jYmFiZWwucGFyc2UoZXhwcmVzc2lvblN0cmluZyk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEpTVXRpbHMuYmluZEV4cHJlc3Npb24gY291bGQgbm90IHVuZGVyc3RhbmQgdGhlIGV4cHJlc3Npb246ICR7ZXhwcmVzc2lvblN0cmluZ31gXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgc3RhdGVtZW50cyA9IGJvZHkocGFyc2VkKTtcbiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEpTVXRpbHMuYmluZEV4cHJlc3Npb24gZXhwZWN0ZWQgdG8gZmluZCBleGFjdGx5IG9uZSBleHByZXNzaW9uIGJ1dCBmb3VuZCAke3N0YXRlbWVudHMubGVuZ3RofSBpbjogJHtleHByZXNzaW9uU3RyaW5nfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzWzBdO1xuICAgIGlmIChzdGF0ZW1lbnQudHlwZSAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBKU1V0aWxzLmJpbmRFeHByZXNzaW9uIGV4cGVjdGVkIHRvIGZpbmQgYW4gZXhwcmVzc2lvbiBidXQgZm91bmQgJHtzdGF0ZW1lbnQudHlwZX0gaW46ICR7ZXhwcmVzc2lvblN0cmluZ31gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb247XG4gIH1cbn1cblxuZnVuY3Rpb24gdW51c2VkTmFtZUxpa2UoZGVzaXJlZE5hbWU6IHN0cmluZywgaXNVc2VkOiAobmFtZTogc3RyaW5nKSA9PiBib29sZWFuKTogc3RyaW5nIHtcbiAgbGV0IGNhbmRpZGF0ZSA9IGRlc2lyZWROYW1lO1xuICBsZXQgY291bnRlciA9IDA7XG4gIHdoaWxlIChpc1VzZWQoY2FuZGlkYXRlKSkge1xuICAgIGNhbmRpZGF0ZSA9IGAke2Rlc2lyZWROYW1lfSR7Y291bnRlcisrfWA7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZTtcbn1cblxuZnVuY3Rpb24gYXN0Tm9kZUhhc0JpbmRpbmcodGFyZ2V0OiBXYWxrZXJQYXRoPEFTVHYxLk5vZGU+LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGN1cnNvcjogV2Fsa2VyUGF0aDxBU1R2MS5Ob2RlPiB8IG51bGwgPSB0YXJnZXQ7XG4gIHdoaWxlIChjdXJzb3IpIHtcbiAgICBsZXQgcGFyZW50Tm9kZSA9IGN1cnNvci5wYXJlbnQ/Lm5vZGU7XG4gICAgaWYgKFxuICAgICAgcGFyZW50Tm9kZT8udHlwZSA9PT0gJ0VsZW1lbnROb2RlJyAmJlxuICAgICAgcGFyZW50Tm9kZS5ibG9ja1BhcmFtcy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICAgLy8gYW4gRWxlbWVudE5vZGUncyBibG9jayBwYXJhbXMgYXJlIHZhbGlkIG9ubHkgd2l0aGluIGl0cyBjaGlsZHJlblxuICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbi5pbmNsdWRlcyhjdXJzb3Iubm9kZSBhcyBBU1R2MS5TdGF0ZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwYXJlbnROb2RlPy50eXBlID09PSAnQmxvY2snICYmXG4gICAgICBwYXJlbnROb2RlLmJsb2NrUGFyYW1zLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAvLyBhIEJsb2NrJ3MgYmxvY2tQYXJhbXMgYXJlIHZhbGlkIG9ubHkgd2l0aGluIGl0cyBib2R5XG4gICAgICBwYXJlbnROb2RlLmJvZHkuaW5jbHVkZXMoY3Vyc29yLm5vZGUgYXMgQVNUdjEuU3RhdGVtZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY3Vyc29yID0gY3Vyc29yLnBhcmVudDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhpcyBleHRlbmRzIEdsaW1tZXIncyBBU1RQbHVnaW5FbnZpcm9ubWVudCB0eXBlIHRvIHB1dCBvdXIganN1dGlscyBpbnRvIG1ldGFcbiAqL1xuZXhwb3J0IHR5cGUgV2l0aEpTVXRpbHM8VCBleHRlbmRzIHsgbWV0YT86IG9iamVjdCB9PiA9IHtcbiAgbWV0YTogVFsnbWV0YSddICYgeyBqc3V0aWxzOiBKU1V0aWxzIH07XG59ICYgVDtcblxuZnVuY3Rpb24gYm9keShub2RlOiB0LlByb2dyYW0gfCB0LkZpbGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgcmV0dXJuIG5vZGUucHJvZ3JhbS5ib2R5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBub2RlLmJvZHk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbGxvd3MgeW91IHRvIGNvbnN0cnVjdCBhbiBleHByZXNzaW9uIHRoYXQgcmVsaWVzIG9uIGltcG9ydGVkIHZhbHVlcy5cbiAqL1xuY2xhc3MgRXhwcmVzc2lvbkNvbnRleHQge1xuICAjaW1wb3J0ZXI6IEltcG9ydFV0aWw7XG4gICN0YXJnZXQ6IE5vZGVQYXRoPHQuTm9kZT47XG5cbiAgY29uc3RydWN0b3IoaW1wb3J0ZXI6IEltcG9ydFV0aWwsIHRhcmdldDogTm9kZVBhdGg8dC5Ob2RlPikge1xuICAgIHRoaXMuI2ltcG9ydGVyID0gaW1wb3J0ZXI7XG4gICAgdGhpcy4jdGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgb3IgY3JlYXRlIGEgbG9jYWwgYmluZGluZyBmb3IgdGhlIGdpdmVuIGltcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBUaGUgcGF0aCB0byBpbXBvcnQgZnJvbS5cbiAgICogQHBhcmFtIGV4cG9ydGVkTmFtZSBUaGUgbmFtZWQgZXhwb3J0IHlvdSB3aXNoIHRvIGFjY2Vzcywgb3IgXCJkZWZhdWx0XCIgZm9yXG4gICAqIHRoZSBkZWZhdWx0IGV4cG9ydCwgb3IgXCIqXCIgZm9yIHRoZSBuYW1lc3BhY2UgZXhwb3J0LlxuICAgKiBAcGFyYW0gbmFtZUhpbnQgT3B0aW9uYWxseSwgcHJvdmlkZSBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHlvdXIgbmV3XG4gICAqIGJpbmRpbmcuIFdlIHdpbGwgbWFuZ2xlIHRoaXMgbmFtZSBhcyBuZWVkZWQgdG8gYXZvaWQgY29sbGlzaW9ucywgYnV0XG4gICAqIHBpY2tpbmcgYSBnb29kIG5hbWUgaGVyZSBjYW4gYWlkIGluIGRlYnVnZ2luZy5cblxuICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBpZGVudGlmaWVyIGZvciB0aGUgaW1wb3J0ZWQgdmFsdWVcbiAgICovXG4gIGltcG9ydChtb2R1bGVTcGVjaWZpZXI6IHN0cmluZywgZXhwb3J0ZWROYW1lOiBzdHJpbmcsIG5hbWVIaW50Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jaW1wb3J0ZXIuaW1wb3J0KHRoaXMuI3RhcmdldCwgbW9kdWxlU3BlY2lmaWVyLCBleHBvcnRlZE5hbWUsIG5hbWVIaW50KS5uYW1lO1xuICB9XG59XG5cbi8qKlxuICogWW91IGNhbiBwYXNzIGEgSmF2YXNjcmlwdCBleHByZXNzaW9uIGFzIGEgc3RyaW5nIGxpa2U6XG4gKlxuICogICBcIm5ldyBEYXRlKClcIlxuICpcbiAqIE9yIGFzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RyaW5nOlxuICpcbiAqICAgKCkgPT4gXCJuZXcgRGF0ZSgpXCJcbiAqXG4gKiBXaGVuIHlvdSB1c2UgYSBmdW5jdGlvbiwgaXQgY2FuIHVzZSBpbXBvcnRlZCB2YWx1ZXM6XG4gKlxuICogICAoY29udGV4dCkgPT4gYG5ldyAke2NvbnRleHQuaW1wb3J0KFwibHV4b25cIiwgXCJEYXRlVGltZVwiKX0oKWBcbiAqXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb24gPSBzdHJpbmcgfCAoKGNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0KSA9PiBzdHJpbmcpO1xuIl19
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc