@glimmer/compiler
Version:
111 lines (89 loc) • 9.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.hasPath = hasPath;
exports.isHelperInvocation = isHelperInvocation;
exports.isSimplePath = isSimplePath;
exports.isStrictHelper = isStrictHelper;
exports.assertIsValidModifier = assertIsValidModifier;
exports.isTrustingNode = isTrustingNode;
var _syntax = require("@glimmer/syntax");
var _util = require("@glimmer/util");
function hasPath(node) {
return node.callee.type === 'Path';
}
function isHelperInvocation(node) {
if (!hasPath(node)) {
return false;
}
return !node.args.isEmpty();
}
function isSimplePath(path) {
if (path.type === 'Path') {
let {
ref: head,
tail: parts
} = path;
return head.type === 'Free' && head.resolution !== _syntax.ASTv2.STRICT_RESOLUTION && parts.length === 0;
} else {
return false;
}
}
function isStrictHelper(expr) {
if (expr.callee.type !== 'Path') {
return true;
}
if (expr.callee.ref.type !== 'Free') {
return true;
}
return expr.callee.ref.resolution === _syntax.ASTv2.STRICT_RESOLUTION;
}
function assertIsValidModifier(helper) {
if (isStrictHelper(helper) || isSimplePath(helper.callee)) {
return;
}
throw (0, _syntax.generateSyntaxError)(`\`${printPath(helper.callee)}\` is not a valid name for a modifier`, helper.loc);
}
function printPath(path) {
switch (path.type) {
case 'Literal':
return JSON.stringify(path.value);
case 'Path':
{
let printedPath = [printPathHead(path.ref)];
printedPath.push(...path.tail.map(t => t.chars));
return printedPath.join('.');
}
case 'Call':
return `(${printPath(path.callee)} ...)`;
case 'DeprecatedCall':
return `${path.callee.name}`;
case 'Interpolate':
throw (0, _util.unreachable)('a concat statement cannot appear as the head of an expression');
}
}
function printPathHead(head) {
switch (head.type) {
case 'Arg':
return head.name.chars;
case 'Free':
case 'Local':
return head.name;
case 'This':
return 'this';
}
}
/**
* This function is checking whether an AST node is a triple-curly, which means that it's
* a "trusting" node. In the Handlebars AST, this is indicated by the `escaped` flag, which
* is a bit of a double-negative, so we change the terminology here for clarity.
*/
function isTrustingNode(value) {
if (value.type === 'AppendContent') {
return value.trusting;
} else {
return false;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL3V0aWxzL2lzLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBbUJNLFNBQUEsT0FBQSxDQUFBLElBQUEsRUFBbUQ7QUFDdkQsU0FBTyxJQUFJLENBQUosTUFBQSxDQUFBLElBQUEsS0FBUCxNQUFBO0FBQ0Q7O0FBRUssU0FBQSxrQkFBQSxDQUFBLElBQUEsRUFDZ0I7QUFFcEIsTUFBSSxDQUFDLE9BQU8sQ0FBWixJQUFZLENBQVosRUFBb0I7QUFDbEIsV0FBQSxLQUFBO0FBQ0Q7O0FBRUQsU0FBTyxDQUFDLElBQUksQ0FBSixJQUFBLENBQVIsT0FBUSxFQUFSO0FBQ0Q7O0FBWUssU0FBQSxZQUFBLENBQUEsSUFBQSxFQUFpRDtBQUNyRCxNQUFJLElBQUksQ0FBSixJQUFBLEtBQUosTUFBQSxFQUEwQjtBQUN4QixRQUFJO0FBQUUsTUFBQSxHQUFHLEVBQUwsSUFBQTtBQUFhLE1BQUEsSUFBSSxFQUFFO0FBQW5CLFFBQUosSUFBQTtBQUVBLFdBQ0UsSUFBSSxDQUFKLElBQUEsS0FBQSxNQUFBLElBQXdCLElBQUksQ0FBSixVQUFBLEtBQW9CLGNBQTVDLGlCQUFBLElBQXVFLEtBQUssQ0FBTCxNQUFBLEtBRHpFLENBQUE7QUFIRixHQUFBLE1BTU87QUFDTCxXQUFBLEtBQUE7QUFDRDtBQUNGOztBQUVLLFNBQUEsY0FBQSxDQUFBLElBQUEsRUFBc0M7QUFDMUMsTUFBSSxJQUFJLENBQUosTUFBQSxDQUFBLElBQUEsS0FBSixNQUFBLEVBQWlDO0FBQy9CLFdBQUEsSUFBQTtBQUNEOztBQUVELE1BQUksSUFBSSxDQUFKLE1BQUEsQ0FBQSxHQUFBLENBQUEsSUFBQSxLQUFKLE1BQUEsRUFBcUM7QUFDbkMsV0FBQSxJQUFBO0FBQ0Q7O0FBRUQsU0FBTyxJQUFJLENBQUosTUFBQSxDQUFBLEdBQUEsQ0FBQSxVQUFBLEtBQStCLGNBQXRDLGlCQUFBO0FBQ0Q7O0FBRUssU0FBQSxxQkFBQSxDQUFBLE1BQUEsRUFDSztBQUVULE1BQUksY0FBYyxDQUFkLE1BQWMsQ0FBZCxJQUEwQixZQUFZLENBQUMsTUFBTSxDQUFqRCxNQUEwQyxDQUExQyxFQUEyRDtBQUN6RDtBQUNEOztBQUVELFFBQU0saUNBQ0osS0FBSyxTQUFTLENBQUMsTUFBTSxDQUFQLE1BQUEsQ0FEUyx1Q0FBbkIsRUFFSixNQUFNLENBRlIsR0FBTSxDQUFOO0FBSUQ7O0FBRUQsU0FBQSxTQUFBLENBQUEsSUFBQSxFQUE2QztBQUMzQyxVQUFRLElBQUksQ0FBWixJQUFBO0FBQ0UsU0FBQSxTQUFBO0FBQ0UsYUFBTyxJQUFJLENBQUosU0FBQSxDQUFlLElBQUksQ0FBMUIsS0FBTyxDQUFQOztBQUNGLFNBQUEsTUFBQTtBQUFhO0FBQ1gsWUFBSSxXQUFXLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFyQyxHQUFnQyxDQUFkLENBQWxCO0FBQ0EsUUFBQSxXQUFXLENBQVgsSUFBQSxDQUFpQixHQUFHLElBQUksQ0FBSixJQUFBLENBQUEsR0FBQSxDQUFlLENBQUQsSUFBTyxDQUFDLENBQTFDLEtBQW9CLENBQXBCO0FBQ0EsZUFBTyxXQUFXLENBQVgsSUFBQSxDQUFQLEdBQU8sQ0FBUDtBQUNEOztBQUNELFNBQUEsTUFBQTtBQUNFLGFBQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFMLE1BQUEsQ0FBcEIsT0FBQTs7QUFDRixTQUFBLGdCQUFBO0FBQ0UsYUFBTyxHQUFHLElBQUksQ0FBSixNQUFBLENBQVksSUFBdEIsRUFBQTs7QUFDRixTQUFBLGFBQUE7QUFDRSxZQUFNLHVCQUFOLCtEQUFNLENBQU47QUFiSjtBQWVEOztBQUVELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBb0Q7QUFDbEQsVUFBUSxJQUFJLENBQVosSUFBQTtBQUNFLFNBQUEsS0FBQTtBQUNFLGFBQU8sSUFBSSxDQUFKLElBQUEsQ0FBUCxLQUFBOztBQUNGLFNBQUEsTUFBQTtBQUNBLFNBQUEsT0FBQTtBQUNFLGFBQU8sSUFBSSxDQUFYLElBQUE7O0FBQ0YsU0FBQSxNQUFBO0FBQ0UsYUFBQSxNQUFBO0FBUEo7QUFTRDtBQUVEOzs7Ozs7O0FBS00sU0FBQSxjQUFBLENBQUEsS0FBQSxFQUNxRTtBQUV6RSxNQUFJLEtBQUssQ0FBTCxJQUFBLEtBQUosZUFBQSxFQUFvQztBQUNsQyxXQUFPLEtBQUssQ0FBWixRQUFBO0FBREYsR0FBQSxNQUVPO0FBQ0wsV0FBQSxLQUFBO0FBQ0Q7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXNlbnRBcnJheSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQVNUdjIsIGdlbmVyYXRlU3ludGF4RXJyb3IsIFNvdXJjZVNsaWNlIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IHVucmVhY2hhYmxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmV4cG9ydCB0eXBlIEhhc1BhdGg8Tm9kZSBleHRlbmRzIEFTVHYyLkNhbGxOb2RlID0gQVNUdjIuQ2FsbE5vZGU+ID0gTm9kZSAmIHtcbiAgaGVhZDogQVNUdjIuUGF0aEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBIYXNBcmd1bWVudHMgPVxuICB8IHtcbiAgICAgIHBhcmFtczogUHJlc2VudEFycmF5PEFTVHYyLkV4cHJlc3Npb25Ob2RlPjtcbiAgICB9XG4gIHwge1xuICAgICAgaGFzaDoge1xuICAgICAgICBwYWlyczogUHJlc2VudEFycmF5PEFTVHYyLk5hbWVkQXJndW1lbnQ+O1xuICAgICAgfTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBIZWxwZXJJbnZvY2F0aW9uPE5vZGUgZXh0ZW5kcyBBU1R2Mi5DYWxsTm9kZSA9IEFTVHYyLkNhbGxOb2RlPiA9IEhhc1BhdGg8Tm9kZT4gJlxuICBIYXNBcmd1bWVudHM7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQYXRoPE4gZXh0ZW5kcyBBU1R2Mi5DYWxsTm9kZT4obm9kZTogTik6IG5vZGUgaXMgSGFzUGF0aDxOPiB7XG4gIHJldHVybiBub2RlLmNhbGxlZS50eXBlID09PSAnUGF0aCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hlbHBlckludm9jYXRpb248TiBleHRlbmRzIEFTVHYyLkNhbGxOb2RlPihcbiAgbm9kZTogQVNUdjIuQ2FsbE5vZGVcbik6IG5vZGUgaXMgSGVscGVySW52b2NhdGlvbjxOPiB7XG4gIGlmICghaGFzUGF0aChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhbm9kZS5hcmdzLmlzRW1wdHkoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVQYXRoIGV4dGVuZHMgQVNUdjIuUGF0aEV4cHJlc3Npb24ge1xuICB0YWlsOiBbU291cmNlU2xpY2VdO1xuICBkYXRhOiBmYWxzZTtcbiAgdGhpczogZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIFNpbXBsZUhlbHBlcjxOIGV4dGVuZHMgSGFzUGF0aD4gPSBOICYge1xuICBwYXRoOiBTaW1wbGVQYXRoO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2ltcGxlUGF0aChwYXRoOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSk6IHBhdGggaXMgU2ltcGxlUGF0aCB7XG4gIGlmIChwYXRoLnR5cGUgPT09ICdQYXRoJykge1xuICAgIGxldCB7IHJlZjogaGVhZCwgdGFpbDogcGFydHMgfSA9IHBhdGg7XG5cbiAgICByZXR1cm4gKFxuICAgICAgaGVhZC50eXBlID09PSAnRnJlZScgJiYgaGVhZC5yZXNvbHV0aW9uICE9PSBBU1R2Mi5TVFJJQ1RfUkVTT0xVVElPTiAmJiBwYXJ0cy5sZW5ndGggPT09IDBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpY3RIZWxwZXIoZXhwcjogSGFzUGF0aCk6IGJvb2xlYW4ge1xuICBpZiAoZXhwci5jYWxsZWUudHlwZSAhPT0gJ1BhdGgnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXhwci5jYWxsZWUucmVmLnR5cGUgIT09ICdGcmVlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGV4cHIuY2FsbGVlLnJlZi5yZXNvbHV0aW9uID09PSBBU1R2Mi5TVFJJQ1RfUkVTT0xVVElPTjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzVmFsaWRNb2RpZmllcjxOIGV4dGVuZHMgSGFzUGF0aD4oXG4gIGhlbHBlcjogTlxuKTogYXNzZXJ0cyBoZWxwZXIgaXMgU2ltcGxlSGVscGVyPE4+IHtcbiAgaWYgKGlzU3RyaWN0SGVscGVyKGhlbHBlcikgfHwgaXNTaW1wbGVQYXRoKGhlbHBlci5jYWxsZWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICBgXFxgJHtwcmludFBhdGgoaGVscGVyLmNhbGxlZSl9XFxgIGlzIG5vdCBhIHZhbGlkIG5hbWUgZm9yIGEgbW9kaWZpZXJgLFxuICAgIGhlbHBlci5sb2NcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJpbnRQYXRoKHBhdGg6IEFTVHYyLkV4cHJlc3Npb25Ob2RlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYXRoLnR5cGUpIHtcbiAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXRoLnZhbHVlKTtcbiAgICBjYXNlICdQYXRoJzoge1xuICAgICAgbGV0IHByaW50ZWRQYXRoID0gW3ByaW50UGF0aEhlYWQocGF0aC5yZWYpXTtcbiAgICAgIHByaW50ZWRQYXRoLnB1c2goLi4ucGF0aC50YWlsLm1hcCgodCkgPT4gdC5jaGFycykpO1xuICAgICAgcmV0dXJuIHByaW50ZWRQYXRoLmpvaW4oJy4nKTtcbiAgICB9XG4gICAgY2FzZSAnQ2FsbCc6XG4gICAgICByZXR1cm4gYCgke3ByaW50UGF0aChwYXRoLmNhbGxlZSl9IC4uLilgO1xuICAgIGNhc2UgJ0RlcHJlY2F0ZWRDYWxsJzpcbiAgICAgIHJldHVybiBgJHtwYXRoLmNhbGxlZS5uYW1lfWA7XG4gICAgY2FzZSAnSW50ZXJwb2xhdGUnOlxuICAgICAgdGhyb3cgdW5yZWFjaGFibGUoJ2EgY29uY2F0IHN0YXRlbWVudCBjYW5ub3QgYXBwZWFyIGFzIHRoZSBoZWFkIG9mIGFuIGV4cHJlc3Npb24nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFBhdGhIZWFkKGhlYWQ6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChoZWFkLnR5cGUpIHtcbiAgICBjYXNlICdBcmcnOlxuICAgICAgcmV0dXJuIGhlYWQubmFtZS5jaGFycztcbiAgICBjYXNlICdGcmVlJzpcbiAgICBjYXNlICdMb2NhbCc6XG4gICAgICByZXR1cm4gaGVhZC5uYW1lO1xuICAgIGNhc2UgJ1RoaXMnOlxuICAgICAgcmV0dXJuICd0aGlzJztcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2hlY2tpbmcgd2hldGhlciBhbiBBU1Qgbm9kZSBpcyBhIHRyaXBsZS1jdXJseSwgd2hpY2ggbWVhbnMgdGhhdCBpdCdzXG4gKiBhIFwidHJ1c3RpbmdcIiBub2RlLiBJbiB0aGUgSGFuZGxlYmFycyBBU1QsIHRoaXMgaXMgaW5kaWNhdGVkIGJ5IHRoZSBgZXNjYXBlZGAgZmxhZywgd2hpY2hcbiAqIGlzIGEgYml0IG9mIGEgZG91YmxlLW5lZ2F0aXZlLCBzbyB3ZSBjaGFuZ2UgdGhlIHRlcm1pbm9sb2d5IGhlcmUgZm9yIGNsYXJpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RydXN0aW5nTm9kZShcbiAgdmFsdWU6IEFTVHYyLkFwcGVuZENvbnRlbnQgfCBBU1R2Mi5IdG1sVGV4dCB8IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvblxuKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXBwZW5kQ29udGVudCcpIHtcbiAgICByZXR1cm4gdmFsdWUudHJ1c3Rpbmc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9