babel-plugin-ember-template-compilation
Version:
Babel implementation of Ember's low-level template-compilation API
120 lines • 16.6 kB
JavaScript
;
/*
This class exists because:
- before template compilation starts, we need to pass a `locals` array to
ember-template-compiler
- the JSUtils API can mutate the scope during template compilation
- those scope mutations need to update both the original `locals` array and
our own name mapping, keeping them in sync.
*/
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _ScopeLocals_instances, _ScopeLocals_mapping, _ScopeLocals_locals, _ScopeLocals_params, _ScopeLocals_isInJsScope;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ScopeLocals = void 0;
const hbs_utils_1 = require("./hbs-utils");
const read_only_array_1 = require("./read-only-array");
class ScopeLocals {
constructor(params) {
_ScopeLocals_instances.add(this);
_ScopeLocals_mapping.set(this, {});
_ScopeLocals_locals.set(this, []);
_ScopeLocals_params.set(this, void 0);
__classPrivateFieldSet(this, _ScopeLocals_params, params, "f");
}
get locals() {
return (0, read_only_array_1.readOnlyArray)(__classPrivateFieldGet(this, _ScopeLocals_locals, "f"), 'The only supported way to manipulate locals is via the jsutils API\nhttps://github.com/emberjs/babel-plugin-ember-template-compilation#jsutils-manipulating-javascript-from-within-ast-transforms');
}
has(key) {
return key in __classPrivateFieldGet(this, _ScopeLocals_mapping, "f");
}
get(key) {
return __classPrivateFieldGet(this, _ScopeLocals_mapping, "f")[key];
}
isEmpty() {
return __classPrivateFieldGet(this, _ScopeLocals_locals, "f").length === 0;
}
entries() {
return Object.entries(__classPrivateFieldGet(this, _ScopeLocals_mapping, "f"));
}
add(hbsName, jsName) {
__classPrivateFieldGet(this, _ScopeLocals_mapping, "f")[hbsName] = jsName !== null && jsName !== void 0 ? jsName : hbsName;
if (!__classPrivateFieldGet(this, _ScopeLocals_locals, "f").includes(hbsName)) {
__classPrivateFieldGet(this, _ScopeLocals_locals, "f").push(hbsName);
}
}
// this AST transform discovers all possible upvars in HBS that refer to valid
// bindings in JS, and then depending on the mode adjusts our actual scope bag
// contents.
crawl() {
return (_env) => {
let seen;
return {
name: 'scope-locals-crawl',
visitor: {
Template: {
enter: () => {
seen = new Set();
},
exit: (_node, _path) => {
if (__classPrivateFieldGet(this, _ScopeLocals_params, "f").mode === 'implicit') {
// all hbs upvars that have matching JS bindings go into the
// scope
for (let name of seen) {
if (__classPrivateFieldGet(this, _ScopeLocals_instances, "m", _ScopeLocals_isInJsScope).call(this, name, __classPrivateFieldGet(this, _ScopeLocals_params, "f").jsPath)) {
this.add(name);
}
}
}
else {
// in explicit form, we might prune back the preexising scope in
// the case where another AST transform has eliminated the use
// of the original binding. But we don't add anything new. The
// only way for new bindings to be introduced into scope is for
// another AST transform to explicitly call the jsutils, which
// calls our `add`.
for (let name of Object.keys(__classPrivateFieldGet(this, _ScopeLocals_mapping, "f"))) {
if (!seen.has(name)) {
__classPrivateFieldGet(this, _ScopeLocals_locals, "f").splice(__classPrivateFieldGet(this, _ScopeLocals_locals, "f").indexOf(name), 1);
delete __classPrivateFieldGet(this, _ScopeLocals_mapping, "f")[name];
}
}
}
},
},
PathExpression: (node, path) => {
if (node.head.type !== 'VarHead') {
return;
}
const name = node.head.name;
if (!(0, hbs_utils_1.astNodeHasBinding)(path, name)) {
seen.add(name);
}
},
ElementNode: (node, path) => {
const name = node.tag.split('.')[0];
if (!(0, hbs_utils_1.astNodeHasBinding)(path, name)) {
seen.add(name);
}
},
},
};
};
}
}
exports.ScopeLocals = ScopeLocals;
_ScopeLocals_mapping = new WeakMap(), _ScopeLocals_locals = new WeakMap(), _ScopeLocals_params = new WeakMap(), _ScopeLocals_instances = new WeakSet(), _ScopeLocals_isInJsScope = function _ScopeLocals_isInJsScope(hbsName, jsPath) {
var _a;
let jsName = (_a = __classPrivateFieldGet(this, _ScopeLocals_mapping, "f")[hbsName]) !== null && _a !== void 0 ? _a : hbsName;
return ['globalThis'].includes(jsName) || jsPath.scope.getBinding(jsName);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcGUtbG9jYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NvcGUtbG9jYWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztFQU9FOzs7Ozs7Ozs7Ozs7Ozs7QUFJRiwyQ0FBZ0Q7QUFDaEQsdURBQWtEO0FBcUJsRCxNQUFhLFdBQVc7SUFDdEIsWUFBWSxNQUFjOztRQUkxQiwrQkFBbUMsRUFBRSxFQUFDO1FBQ3RDLDhCQUFvQixFQUFFLEVBQUM7UUFDdkIsc0NBQWdCO1FBTGQsdUJBQUEsSUFBSSx1QkFBVyxNQUFNLE1BQUEsQ0FBQztJQUN4QixDQUFDO0lBTUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFBLCtCQUFhLEVBQ2xCLHVCQUFBLElBQUksMkJBQVEsRUFDWixtTUFBbU0sQ0FDcE0sQ0FBQztJQUNKLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVztRQUNiLE9BQU8sR0FBRyxJQUFJLHVCQUFBLElBQUksNEJBQVMsQ0FBQztJQUM5QixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVc7UUFDYixPQUFPLHVCQUFBLElBQUksNEJBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sdUJBQUEsSUFBSSwyQkFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQUEsSUFBSSw0QkFBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEdBQUcsQ0FBQyxPQUFlLEVBQUUsTUFBZTtRQUNsQyx1QkFBQSxJQUFJLDRCQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxhQUFOLE1BQU0sY0FBTixNQUFNLEdBQUksT0FBTyxDQUFDO1FBQzNDLElBQUksQ0FBQyx1QkFBQSxJQUFJLDJCQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDcEMsdUJBQUEsSUFBSSwyQkFB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LENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGlzIGNsYXNzIGV4aXN0cyBiZWNhdXNlOlxuICAgLSBiZWZvcmUgdGVtcGxhdGUgY29tcGlsYXRpb24gc3RhcnRzLCB3ZSBuZWVkIHRvIHBhc3MgYSBgbG9jYWxzYCBhcnJheSB0b1xuICAgICBlbWJlci10ZW1wbGF0ZS1jb21waWxlclxuICAgLSB0aGUgSlNVdGlscyBBUEkgY2FuIG11dGF0ZSB0aGUgc2NvcGUgZHVyaW5nIHRlbXBsYXRlIGNvbXBpbGF0aW9uXG4gICAtIHRob3NlIHNjb3BlIG11dGF0aW9ucyBuZWVkIHRvIHVwZGF0ZSBib3RoIHRoZSBvcmlnaW5hbCBgbG9jYWxzYCBhcnJheSBhbmRcbiAgICAgb3VyIG93biBuYW1lIG1hcHBpbmcsIGtlZXBpbmcgdGhlbSBpbiBzeW5jLlxuKi9cblxuaW1wb3J0IHR5cGUgeyBOb2RlUGF0aCB9IGZyb20gJ0BiYWJlbC90cmF2ZXJzZSc7XG5pbXBvcnQgeyBBU1RQbHVnaW5FbnZpcm9ubWVudCwgTm9kZVZpc2l0b3IgfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuaW1wb3J0IHsgYXN0Tm9kZUhhc0JpbmRpbmcgfSBmcm9tICcuL2hicy11dGlscyc7XG5pbXBvcnQgeyByZWFkT25seUFycmF5IH0gZnJvbSAnLi9yZWFkLW9ubHktYXJyYXknO1xuXG4vKlxuICAgIGBtb2RlYCByZWZlcnMgdG8gdGhlIGltcGxpY2l0IGFuZCBleHBsaWNpdCBmb3JtYXRzIGRlZmluZWQgaGVyZTpcblxuICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2VtYmVyanMvcmZjcy9ibG9iLzlmZDZjZWFjMjU1OWJlZTFjMzNhY2YwZDc4MzRlNjc1MTI1YTRmMTYvdGV4dC8wOTMxLXRlbXBsYXRlLWNvbXBpbGVyLWFwaS5tZCNleHBsaWNpdC1mb3JtXG4gICAgICBodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9yZmNzL2Jsb2IvOWZkNmNlYWMyNTU5YmVlMWMzM2FjZjBkNzgzNGU2NzUxMjVhNGYxNi90ZXh0LzA5MzEtdGVtcGxhdGUtY29tcGlsZXItYXBpLm1kI2ltcGxpY2l0LWZvcm1cblxuICAgIFRoaXMgY2xhc3MgbmVlZHMgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIGltcGxpY2l0IGZvcm1hdCwgdXB2YXJzXG4gICAgaW4gaGJzIGFyZSBhdXRvbWFnaWNhbGx5IGNvbm5lY3RlZCB3aXRoIG91dGVyIEphdmFzY3JpcHQgYmluZGluZ3MsIGFuZCBpblxuICAgIGV4cGxpY2l0IGZvcm0gdGhleSBhcmUgbm90LlxuKi9cbnR5cGUgUGFyYW1zID1cbiAgfCB7XG4gICAgICBtb2RlOiAnZXhwbGljaXQnO1xuICAgIH1cbiAgfCB7XG4gICAgICBtb2RlOiAnaW1wbGljaXQnO1xuICAgICAganNQYXRoOiBOb2RlUGF0aDtcbiAgICB9O1xuXG5leHBvcnQgY2xhc3MgU2NvcGVMb2NhbHMge1xuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFBhcmFtcykge1xuICAgIHRoaXMuI3BhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gICNtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICNsb2NhbHM6IHN0cmluZ1tdID0gW107XG4gICNwYXJhbXM6IFBhcmFtcztcblxuICBnZXQgbG9jYWxzKCkge1xuICAgIHJldHVybiByZWFkT25seUFycmF5KFxuICAgICAgdGhpcy4jbG9jYWxzLFxuICAgICAgJ1RoZSBvbmx5IHN1cHBvcnRlZCB3YXkgdG8gbWFuaXB1bGF0ZSBsb2NhbHMgaXMgdmlhIHRoZSBqc3V0aWxzIEFQSVxcbmh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2JhYmVsLXBsdWdpbi1lbWJlci10ZW1wbGF0ZS1jb21waWxhdGlvbiNqc3V0aWxzLW1hbmlwdWxhdGluZy1qYXZhc2NyaXB0LWZyb20td2l0aGluLWFzdC10cmFuc2Zvcm1zJ1xuICAgICk7XG4gIH1cblxuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4ga2V5IGluIHRoaXMuI21hcHBpbmc7XG4gIH1cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNtYXBwaW5nW2tleV07XG4gIH1cblxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNsb2NhbHMubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgZW50cmllcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy4jbWFwcGluZyk7XG4gIH1cblxuICBhZGQoaGJzTmFtZTogc3RyaW5nLCBqc05hbWU/OiBzdHJpbmcpIHtcbiAgICB0aGlzLiNtYXBwaW5nW2hic05hbWVdID0ganNOYW1lID8/IGhic05hbWU7XG4gICAgaWYgKCF0aGlzLiNsb2NhbHMuaW5jbHVkZXMoaGJzTmFtZSkpIHtcbiAgICAgIHRoaXMuI2xvY2Fscy5wdXNoKGhic05hbWUpO1xuICAgIH1cbiAgfVxuXG4gICNpc0luSnNTY29wZShoYnNOYW1lOiBzdHJpbmcsIGpzUGF0aDogTm9kZVBhdGgpIHtcbiAgICBsZXQganNOYW1lID0gdGhpcy4jbWFwcGluZ1toYnNOYW1lXSA/PyBoYnNOYW1lO1xuICAgIHJldHVybiBbJ2dsb2JhbFRoaXMnXS5pbmNsdWRlcyhqc05hbWUpIHx8IGpzUGF0aC5zY29wZS5nZXRCaW5kaW5nKGpzTmFtZSk7XG4gIH1cblxuICAvLyB0aGlzIEFTVCB0cmFuc2Zvcm0gZGlzY292ZXJzIGFsbCBwb3NzaWJsZSB1cHZhcnMgaW4gSEJTIHRoYXQgcmVmZXIgdG8gdmFsaWRcbiAgLy8gYmluZGluZ3MgaW4gSlMsIGFuZCB0aGVuIGRlcGVuZGluZyBvbiB0aGUgbW9kZSBhZGp1c3RzIG91ciBhY3R1YWwgc2NvcGUgYmFnXG4gIC8vIGNvbnRlbnRzLlxuICBjcmF3bCgpIHtcbiAgICByZXR1cm4gKF9lbnY6IEFTVFBsdWdpbkVudmlyb25tZW50KTogeyBuYW1lOiBzdHJpbmc7IHZpc2l0b3I6IE5vZGVWaXNpdG9yIH0gPT4ge1xuICAgICAgbGV0IHNlZW46IFNldDxzdHJpbmc+O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3Njb3BlLWxvY2Fscy1jcmF3bCcsXG4gICAgICAgIHZpc2l0b3I6IHtcbiAgICAgICAgICBUZW1wbGF0ZToge1xuICAgICAgICAgICAgZW50ZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleGl0OiAoX25vZGUsIF9wYXRoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLiNwYXJhbXMubW9kZSA9PT0gJ2ltcGxpY2l0Jykge1xuICAgICAgICAgICAgICAgIC8vIGFsbCBoYnMgdXB2YXJzIHRoYXQgaGF2ZSBtYXRjaGluZyBKUyBiaW5kaW5ncyBnbyBpbnRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNjb3BlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBzZWVuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNJbkpzU2NvcGUobmFtZSwgdGhpcy4jcGFyYW1zLmpzUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGQobmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGluIGV4cGxpY2l0IGZvcm0sIHdlIG1pZ2h0IHBydW5lIGJhY2sgdGhlIHByZWV4aXNpbmcgc2NvcGUgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgY2FzZSB3aGVyZSBhbm90aGVyIEFTVCB0cmFuc2Zvcm0gaGFzIGVsaW1pbmF0ZWQgdGhlIHVzZVxuICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBiaW5kaW5nLiBCdXQgd2UgZG9uJ3QgYWRkIGFueXRoaW5nIG5ldy4gVGhlXG4gICAgICAgICAgICAgICAgLy8gb25seSB3YXkgZm9yIG5ldyBiaW5kaW5ncyB0byBiZSBpbnRyb2R1Y2VkIGludG8gc2NvcGUgaXMgZm9yXG4gICAgICAgICAgICAgICAgLy8gYW5vdGhlciBBU1QgdHJhbnNmb3JtIHRvIGV4cGxpY2l0bHkgY2FsbCB0aGUganN1dGlscywgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBjYWxscyBvdXIgYGFkZGAuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLiNtYXBwaW5nKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsb2NhbHMuc3BsaWNlKHRoaXMuI2xvY2Fscy5pbmRleE9mKG5hbWUpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuI21hcHBpbmdbbmFtZV07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUGF0aEV4cHJlc3Npb246IChub2RlLCBwYXRoKSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5oZWFkLnR5cGUgIT09ICdWYXJIZWFkJykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbm9kZS5oZWFkLm5hbWU7XG4gICAgICAgICAgICBpZiAoIWFzdE5vZGVIYXNCaW5kaW5nKHBhdGgsIG5hbWUpKSB7XG4gICAgICAgICAgICAgIHNlZW4uYWRkKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgRWxlbWVudE5vZGU6IChub2RlLCBwYXRoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbm9kZS50YWcuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgICAgIGlmICghYXN0Tm9kZUhhc0JpbmRpbmcocGF0aCwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgc2Vlbi5hZGQobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfTtcbiAgfVxufVxuIl19