UNPKG

@glimmer/compiler

Version:
93 lines (79 loc) 9.69 kB
import { ASTv2, generateSyntaxError } from '@glimmer/syntax'; import { unreachable } from '@glimmer/util'; export function hasPath(node) { return node.callee.type === 'Path'; } export function isHelperInvocation(node) { if (!hasPath(node)) { return false; } return !node.args.isEmpty(); } export function isSimplePath(path) { if (path.type === 'Path') { let { ref: head, tail: parts } = path; return head.type === 'Free' && head.resolution !== ASTv2.STRICT_RESOLUTION && parts.length === 0; } else { return false; } } export function isStrictHelper(expr) { if (expr.callee.type !== 'Path') { return true; } if (expr.callee.ref.type !== 'Free') { return true; } return expr.callee.ref.resolution === ASTv2.STRICT_RESOLUTION; } export function assertIsValidModifier(helper) { if (isStrictHelper(helper) || isSimplePath(helper.callee)) { return; } throw 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 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. */ export function isTrustingNode(value) { if (value.type === 'AppendContent') { return value.trusting; } else { return false; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL3V0aWxzL2lzLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBUyxLQUFULEVBQWdCLG1CQUFoQixRQUF3RCxpQkFBeEQ7QUFDQSxTQUFTLFdBQVQsUUFBNEIsZUFBNUI7QUFtQkEsT0FBTSxTQUFVLE9BQVYsQ0FBNEMsSUFBNUMsRUFBbUQ7QUFDdkQsU0FBTyxJQUFJLENBQUMsTUFBTCxDQUFZLElBQVosS0FBcUIsTUFBNUI7QUFDRDtBQUVELE9BQU0sU0FBVSxrQkFBVixDQUNKLElBREksRUFDZ0I7QUFFcEIsTUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFELENBQVosRUFBb0I7QUFDbEIsV0FBTyxLQUFQO0FBQ0Q7O0FBRUQsU0FBTyxDQUFDLElBQUksQ0FBQyxJQUFMLENBQVUsT0FBVixFQUFSO0FBQ0Q7QUFZRCxPQUFNLFNBQVUsWUFBVixDQUF1QixJQUF2QixFQUFpRDtBQUNyRCxNQUFJLElBQUksQ0FBQyxJQUFMLEtBQWMsTUFBbEIsRUFBMEI7QUFDeEIsUUFBSTtBQUFFLE1BQUEsR0FBRyxFQUFFLElBQVA7QUFBYSxNQUFBLElBQUksRUFBRTtBQUFuQixRQUE2QixJQUFqQztBQUVBLFdBQ0UsSUFBSSxDQUFDLElBQUwsS0FBYyxNQUFkLElBQXdCLElBQUksQ0FBQyxVQUFMLEtBQW9CLEtBQUssQ0FBQyxpQkFBbEQsSUFBdUUsS0FBSyxDQUFDLE1BQU4sS0FBaUIsQ0FEMUY7QUFHRCxHQU5ELE1BTU87QUFDTCxXQUFPLEtBQVA7QUFDRDtBQUNGO0FBRUQsT0FBTSxTQUFVLGNBQVYsQ0FBeUIsSUFBekIsRUFBc0M7QUFDMUMsTUFBSSxJQUFJLENBQUMsTUFBTCxDQUFZLElBQVosS0FBcUIsTUFBekIsRUFBaUM7QUFDL0IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsTUFBSSxJQUFJLENBQUMsTUFBTCxDQUFZLEdBQVosQ0FBZ0IsSUFBaEIsS0FBeUIsTUFBN0IsRUFBcUM7QUFDbkMsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxJQUFJLENBQUMsTUFBTCxDQUFZLEdBQVosQ0FBZ0IsVUFBaEIsS0FBK0IsS0FBSyxDQUFDLGlCQUE1QztBQUNEO0FBRUQsT0FBTSxTQUFVLHFCQUFWLENBQ0osTUFESSxFQUNLO0FBRVQsTUFBSSxjQUFjLENBQUMsTUFBRCxDQUFkLElBQTBCLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBUixDQUExQyxFQUEyRDtBQUN6RDtBQUNEOztBQUVELFFBQU0sbUJBQW1CLENBQ3ZCLEtBQUssU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFSLENBQWUsdUNBRE4sRUFFdkIsTUFBTSxDQUFDLEdBRmdCLENBQXpCO0FBSUQ7O0FBRUQsU0FBUyxTQUFULENBQW1CLElBQW5CLEVBQTZDO0FBQzNDLFVBQVEsSUFBSSxDQUFDLElBQWI7QUFDRSxTQUFLLFNBQUw7QUFDRSxhQUFPLElBQUksQ0FBQyxTQUFMLENBQWUsSUFBSSxDQUFDLEtBQXBCLENBQVA7O0FBQ0YsU0FBSyxNQUFMO0FBQWE7QUFDWCxZQUFJLFdBQVcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBTixDQUFkLENBQWxCO0FBQ0EsUUFBQSxXQUFXLENBQUMsSUFBWixDQUFpQixHQUFHLElBQUksQ0FBQyxJQUFMLENBQVUsR0FBVixDQUFlLENBQUQsSUFBTyxDQUFDLENBQUMsS0FBdkIsQ0FBcEI7QUFDQSxlQUFPLFdBQVcsQ0FBQyxJQUFaLENBQWlCLEdBQWpCLENBQVA7QUFDRDs7QUFDRCxTQUFLLE1BQUw7QUFDRSxhQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFOLENBQWEsT0FBakM7O0FBQ0YsU0FBSyxnQkFBTDtBQUNFLGFBQU8sR0FBRyxJQUFJLENBQUMsTUFBTCxDQUFZLElBQUksRUFBMUI7O0FBQ0YsU0FBSyxhQUFMO0FBQ0UsWUFBTSxXQUFXLENBQUMsK0RBQUQsQ0FBakI7QUFiSjtBQWVEOztBQUVELFNBQVMsYUFBVCxDQUF1QixJQUF2QixFQUFvRDtBQUNsRCxVQUFRLElBQUksQ0FBQyxJQUFiO0FBQ0UsU0FBSyxLQUFMO0FBQ0UsYUFBTyxJQUFJLENBQUMsSUFBTCxDQUFVLEtBQWpCOztBQUNGLFNBQUssTUFBTDtBQUNBLFNBQUssT0FBTDtBQUNFLGFBQU8sSUFBSSxDQUFDLElBQVo7O0FBQ0YsU0FBSyxNQUFMO0FBQ0UsYUFBTyxNQUFQO0FBUEo7QUFTRDtBQUVEOzs7Ozs7O0FBS0EsT0FBTSxTQUFVLGNBQVYsQ0FDSixLQURJLEVBQ3FFO0FBRXpFLE1BQUksS0FBSyxDQUFDLElBQU4sS0FBZSxlQUFuQixFQUFvQztBQUNsQyxXQUFPLEtBQUssQ0FBQyxRQUFiO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsV0FBTyxLQUFQO0FBQ0Q7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXNlbnRBcnJheSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQVNUdjIsIGdlbmVyYXRlU3ludGF4RXJyb3IsIFNvdXJjZVNsaWNlIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IHVucmVhY2hhYmxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmV4cG9ydCB0eXBlIEhhc1BhdGg8Tm9kZSBleHRlbmRzIEFTVHYyLkNhbGxOb2RlID0gQVNUdjIuQ2FsbE5vZGU+ID0gTm9kZSAmIHtcbiAgaGVhZDogQVNUdjIuUGF0aEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBIYXNBcmd1bWVudHMgPVxuICB8IHtcbiAgICAgIHBhcmFtczogUHJlc2VudEFycmF5PEFTVHYyLkV4cHJlc3Npb25Ob2RlPjtcbiAgICB9XG4gIHwge1xuICAgICAgaGFzaDoge1xuICAgICAgICBwYWlyczogUHJlc2VudEFycmF5PEFTVHYyLk5hbWVkQXJndW1lbnQ+O1xuICAgICAgfTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBIZWxwZXJJbnZvY2F0aW9uPE5vZGUgZXh0ZW5kcyBBU1R2Mi5DYWxsTm9kZSA9IEFTVHYyLkNhbGxOb2RlPiA9IEhhc1BhdGg8Tm9kZT4gJlxuICBIYXNBcmd1bWVudHM7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQYXRoPE4gZXh0ZW5kcyBBU1R2Mi5DYWxsTm9kZT4obm9kZTogTik6IG5vZGUgaXMgSGFzUGF0aDxOPiB7XG4gIHJldHVybiBub2RlLmNhbGxlZS50eXBlID09PSAnUGF0aCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hlbHBlckludm9jYXRpb248TiBleHRlbmRzIEFTVHYyLkNhbGxOb2RlPihcbiAgbm9kZTogQVNUdjIuQ2FsbE5vZGVcbik6IG5vZGUgaXMgSGVscGVySW52b2NhdGlvbjxOPiB7XG4gIGlmICghaGFzUGF0aChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhbm9kZS5hcmdzLmlzRW1wdHkoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVQYXRoIGV4dGVuZHMgQVNUdjIuUGF0aEV4cHJlc3Npb24ge1xuICB0YWlsOiBbU291cmNlU2xpY2VdO1xuICBkYXRhOiBmYWxzZTtcbiAgdGhpczogZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIFNpbXBsZUhlbHBlcjxOIGV4dGVuZHMgSGFzUGF0aD4gPSBOICYge1xuICBwYXRoOiBTaW1wbGVQYXRoO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2ltcGxlUGF0aChwYXRoOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSk6IHBhdGggaXMgU2ltcGxlUGF0aCB7XG4gIGlmIChwYXRoLnR5cGUgPT09ICdQYXRoJykge1xuICAgIGxldCB7IHJlZjogaGVhZCwgdGFpbDogcGFydHMgfSA9IHBhdGg7XG5cbiAgICByZXR1cm4gKFxuICAgICAgaGVhZC50eXBlID09PSAnRnJlZScgJiYgaGVhZC5yZXNvbHV0aW9uICE9PSBBU1R2Mi5TVFJJQ1RfUkVTT0xVVElPTiAmJiBwYXJ0cy5sZW5ndGggPT09IDBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpY3RIZWxwZXIoZXhwcjogSGFzUGF0aCk6IGJvb2xlYW4ge1xuICBpZiAoZXhwci5jYWxsZWUudHlwZSAhPT0gJ1BhdGgnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXhwci5jYWxsZWUucmVmLnR5cGUgIT09ICdGcmVlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGV4cHIuY2FsbGVlLnJlZi5yZXNvbHV0aW9uID09PSBBU1R2Mi5TVFJJQ1RfUkVTT0xVVElPTjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzVmFsaWRNb2RpZmllcjxOIGV4dGVuZHMgSGFzUGF0aD4oXG4gIGhlbHBlcjogTlxuKTogYXNzZXJ0cyBoZWxwZXIgaXMgU2ltcGxlSGVscGVyPE4+IHtcbiAgaWYgKGlzU3RyaWN0SGVscGVyKGhlbHBlcikgfHwgaXNTaW1wbGVQYXRoKGhlbHBlci5jYWxsZWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICBgXFxgJHtwcmludFBhdGgoaGVscGVyLmNhbGxlZSl9XFxgIGlzIG5vdCBhIHZhbGlkIG5hbWUgZm9yIGEgbW9kaWZpZXJgLFxuICAgIGhlbHBlci5sb2NcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJpbnRQYXRoKHBhdGg6IEFTVHYyLkV4cHJlc3Npb25Ob2RlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYXRoLnR5cGUpIHtcbiAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXRoLnZhbHVlKTtcbiAgICBjYXNlICdQYXRoJzoge1xuICAgICAgbGV0IHByaW50ZWRQYXRoID0gW3ByaW50UGF0aEhlYWQocGF0aC5yZWYpXTtcbiAgICAgIHByaW50ZWRQYXRoLnB1c2goLi4ucGF0aC50YWlsLm1hcCgodCkgPT4gdC5jaGFycykpO1xuICAgICAgcmV0dXJuIHByaW50ZWRQYXRoLmpvaW4oJy4nKTtcbiAgICB9XG4gICAgY2FzZSAnQ2FsbCc6XG4gICAgICByZXR1cm4gYCgke3ByaW50UGF0aChwYXRoLmNhbGxlZSl9IC4uLilgO1xuICAgIGNhc2UgJ0RlcHJlY2F0ZWRDYWxsJzpcbiAgICAgIHJldHVybiBgJHtwYXRoLmNhbGxlZS5uYW1lfWA7XG4gICAgY2FzZSAnSW50ZXJwb2xhdGUnOlxuICAgICAgdGhyb3cgdW5yZWFjaGFibGUoJ2EgY29uY2F0IHN0YXRlbWVudCBjYW5ub3QgYXBwZWFyIGFzIHRoZSBoZWFkIG9mIGFuIGV4cHJlc3Npb24nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFBhdGhIZWFkKGhlYWQ6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChoZWFkLnR5cGUpIHtcbiAgICBjYXNlICdBcmcnOlxuICAgICAgcmV0dXJuIGhlYWQubmFtZS5jaGFycztcbiAgICBjYXNlICdGcmVlJzpcbiAgICBjYXNlICdMb2NhbCc6XG4gICAgICByZXR1cm4gaGVhZC5uYW1lO1xuICAgIGNhc2UgJ1RoaXMnOlxuICAgICAgcmV0dXJuICd0aGlzJztcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2hlY2tpbmcgd2hldGhlciBhbiBBU1Qgbm9kZSBpcyBhIHRyaXBsZS1jdXJseSwgd2hpY2ggbWVhbnMgdGhhdCBpdCdzXG4gKiBhIFwidHJ1c3RpbmdcIiBub2RlLiBJbiB0aGUgSGFuZGxlYmFycyBBU1QsIHRoaXMgaXMgaW5kaWNhdGVkIGJ5IHRoZSBgZXNjYXBlZGAgZmxhZywgd2hpY2hcbiAqIGlzIGEgYml0IG9mIGEgZG91YmxlLW5lZ2F0aXZlLCBzbyB3ZSBjaGFuZ2UgdGhlIHRlcm1pbm9sb2d5IGhlcmUgZm9yIGNsYXJpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RydXN0aW5nTm9kZShcbiAgdmFsdWU6IEFTVHYyLkFwcGVuZENvbnRlbnQgfCBBU1R2Mi5IdG1sVGV4dCB8IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvblxuKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXBwZW5kQ29udGVudCcpIHtcbiAgICByZXR1cm4gdmFsdWUudHJ1c3Rpbmc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9