@glimmer/compiler
Version:
149 lines (118 loc) • 14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.precompileJSON = precompileJSON;
exports.precompile = precompile;
exports.defaultId = void 0;
var _syntax = require("@glimmer/syntax");
var _util = require("@glimmer/util");
var _index = _interopRequireDefault(require("./passes/1-normalization/index"));
var _index2 = require("./passes/2-encoding/index");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var defaultId = function () {
var req = typeof module === 'object' && typeof module.require === 'function' ? module.require : require;
if (req) {
try {
var crypto = req('crypto');
var idFn = function idFn(src) {
var hash = crypto.createHash('sha1');
hash.update(src, 'utf8'); // trim to 6 bytes of data (2^48 - 1)
return hash.digest('base64').substring(0, 8);
};
idFn('test');
return idFn;
} catch (e) {}
}
return function idFn() {
return null;
};
}();
exports.defaultId = defaultId;
var defaultOptions = {
id: defaultId
};
/*
* Compile a string into a template javascript string.
*
* Example usage:
* import { precompile } from '@glimmer/compiler';
* import { templateFactory } from 'glimmer-runtime';
* let templateJs = precompile("Howdy {{name}}");
* let factory = templateFactory(new Function("return " + templateJs)());
* let template = factory.create(env);
*
* @method precompile
* @param {string} string a Glimmer template string
* @return {string} a template javascript string
*/
function precompileJSON(string, options) {
if (options === void 0) {
options = defaultOptions;
}
var _a, _b;
var source = new _syntax.Source(string, (_a = options.meta) === null || _a === void 0 ? void 0 : _a.moduleName);
var _normalize = (0, _syntax.normalize)(source, options),
ast = _normalize[0],
locals = _normalize[1];
var block = (0, _index.default)(source, ast, (_b = options.strictMode) !== null && _b !== void 0 ? _b : false).mapOk(function (pass2In) {
return (0, _index2.visit)(pass2In);
});
if (false
/* LOCAL_SHOULD_LOG */
) {
_util.LOCAL_LOGGER.log("Template ->", block);
}
if (block.isOk) {
return [block.value, locals];
} else {
throw block.reason;
}
} // UUID used as a unique placeholder for placing a snippet of JS code into
// the otherwise JSON stringified value below.
var SCOPE_PLACEHOLDER = '796d24e6-2450-4fb0-8cdf-b65638b5ef70';
/*
* Compile a string into a template javascript string.
*
* Example usage:
* import { precompile } from '@glimmer/compiler';
* import { templateFactory } from 'glimmer-runtime';
* let templateJs = precompile("Howdy {{name}}");
* let factory = templateFactory(new Function("return " + templateJs)());
* let template = factory.create(env);
*
* @method precompile
* @param {string} string a Glimmer template string
* @return {string} a template javascript string
*/
function precompile(source, options) {
if (options === void 0) {
options = defaultOptions;
}
var _a, _b;
var _precompileJSON = precompileJSON(source, options),
block = _precompileJSON[0],
usedLocals = _precompileJSON[1];
var moduleName = (_a = options.meta) === null || _a === void 0 ? void 0 : _a.moduleName;
var idFn = options.id || defaultId;
var blockJSON = JSON.stringify(block);
var templateJSONObject = {
id: idFn(JSON.stringify(options.meta) + blockJSON),
block: blockJSON,
moduleName: moduleName !== null && moduleName !== void 0 ? moduleName : '(unknown template module)',
// lying to the type checker here because we're going to
// replace it just below, after stringification
scope: SCOPE_PLACEHOLDER,
isStrictMode: (_b = options.strictMode) !== null && _b !== void 0 ? _b : false
};
if (usedLocals.length === 0) {
delete templateJSONObject.scope;
} // JSON is javascript
var stringified = JSON.stringify(templateJSONObject);
if (usedLocals.length > 0) {
var scopeFn = "()=>[" + usedLocals.join(',') + "]";
stringified = stringified.replace("\"" + SCOPE_PLACEHOLDER + "\"", scopeFn);
}
return stringified;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9jb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFNQTs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQWNPLElBQU0sU0FBUyxHQUFrQixZQUFLO0FBQzNDLE1BQUksR0FBRyxHQUNMLE9BQUEsTUFBQSxLQUFBLFFBQUEsSUFBOEIsT0FBTyxNQUFNLENBQWIsT0FBQSxLQUE5QixVQUFBLEdBQXFFLE1BQU0sQ0FBM0UsT0FBQSxHQURGLE9BQUE7O0FBR0EsTUFBQSxHQUFBLEVBQVM7QUFDUCxRQUFJO0FBQ0YsVUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFsQixRQUFrQixDQUFsQjs7QUFFQSxVQUFJLElBQUksR0FBa0IsU0FBdEIsSUFBc0IsQ0FBRCxHQUFDLEVBQU87QUFDL0IsWUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFOLFVBQUEsQ0FBWCxNQUFXLENBQVg7QUFDQSxRQUFBLElBQUksQ0FBSixNQUFBLENBQUEsR0FBQSxFQUYrQixNQUUvQixFQUYrQixDQUcvQjs7QUFDQSxlQUFPLElBQUksQ0FBSixNQUFBLENBQUEsUUFBQSxFQUFBLFNBQUEsQ0FBQSxDQUFBLEVBQVAsQ0FBTyxDQUFQO0FBSkYsT0FBQTs7QUFPQSxNQUFBLElBQUksQ0FBSixNQUFJLENBQUo7QUFFQSxhQUFBLElBQUE7QUFaRixLQUFBLENBYUUsT0FBQSxDQUFBLEVBQVUsQ0FBRTtBQUNmOztBQUVELFNBQU8sU0FBQSxJQUFBLEdBQWE7QUFDbEIsV0FBQSxJQUFBO0FBREYsR0FBQTtBQXJCSyxDQUFpQyxFQUFqQzs7O0FBMEJQLElBQU0sY0FBYyxHQUFzQjtBQUN4QyxFQUFBLEVBQUUsRUFBRTtBQURvQyxDQUExQztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7QUFjTSxTQUFBLGNBQUEsQ0FBQSxNQUFBLEVBQUEsT0FBQSxFQUV1QztBQUFBLE1BQTNDLE9BQTJDLEtBQUEsS0FBQSxDQUFBLEVBQUE7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QSxHQUFKLENBQUEsRUFBMkI7QUFDekIsUUFBSSxPQUFPLEdBQUEsVUFBVyxVQUFVLENBQVYsSUFBQSxDQUF0QixHQUFzQixDQUFYLEdBQVgsR0FBQTtBQUVBLElBQUEsV0FBVyxHQUFHLFdBQVcsQ0FBWCxPQUFBLENBQUEsT0FBQSxpQkFBQSxHQUFBLElBQUEsRUFBZCxPQUFjLENBQWQ7QUFDRDs7QUFFRCxTQUFBLFdBQUE7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrLFxuICBTZXJpYWxpemVkVGVtcGxhdGVXaXRoTGF6eUJsb2NrLFxuICBUZW1wbGF0ZUphdmFzY3JpcHQsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfU0hPVUxEX0xPRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IG5vcm1hbGl6ZSwgUHJlY29tcGlsZU9wdGlvbnMsIFNvdXJjZSwgVGVtcGxhdGVJZEZuIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IExPQ0FMX0xPR0dFUiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgcGFzczAgZnJvbSAnLi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2luZGV4JztcbmltcG9ydCB7IHZpc2l0IGFzIHBhc3MyIH0gZnJvbSAnLi9wYXNzZXMvMi1lbmNvZGluZy9pbmRleCc7XG5cbmRlY2xhcmUgZnVuY3Rpb24gcmVxdWlyZShpZDogJ2NyeXB0bycpOiBDcnlwdG87XG5kZWNsYXJlIGZ1bmN0aW9uIHJlcXVpcmUoaWQ6IHN0cmluZyk6IHVua25vd247XG5cbmludGVyZmFjZSBDcnlwdG8ge1xuICBjcmVhdGVIYXNoKFxuICAgIGFsZzogJ3NoYTEnXG4gICk6IHtcbiAgICB1cGRhdGUoc3JjOiBzdHJpbmcsIGVuY29kaW5nOiAndXRmOCcpOiB2b2lkO1xuICAgIGRpZ2VzdChlbmNvZGluZzogJ2Jhc2U2NCcpOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SWQ6IFRlbXBsYXRlSWRGbiA9ICgoKSA9PiB7XG4gIGxldCByZXE6IHR5cGVvZiByZXF1aXJlIHwgdW5kZWZpbmVkID1cbiAgICB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLnJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBtb2R1bGUucmVxdWlyZSA6IHJlcXVpcmU7XG5cbiAgaWYgKHJlcSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjcnlwdG8gPSByZXEoJ2NyeXB0bycpO1xuXG4gICAgICBsZXQgaWRGbjogVGVtcGxhdGVJZEZuID0gKHNyYykgPT4ge1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJyk7XG4gICAgICAgIGhhc2gudXBkYXRlKHNyYywgJ3V0ZjgnKTtcbiAgICAgICAgLy8gdHJpbSB0byA2IGJ5dGVzIG9mIGRhdGEgKDJeNDggLSAxKVxuICAgICAgICByZXR1cm4gaGFzaC5kaWdlc3QoJ2Jhc2U2NCcpLnN1YnN0cmluZygwLCA4KTtcbiAgICAgIH07XG5cbiAgICAgIGlkRm4oJ3Rlc3QnKTtcblxuICAgICAgcmV0dXJuIGlkRm47XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBpZEZuKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xufSkoKTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFByZWNvbXBpbGVPcHRpb25zID0ge1xuICBpZDogZGVmYXVsdElkLFxufTtcblxuLypcbiAqIENvbXBpbGUgYSBzdHJpbmcgaW50byBhIHRlbXBsYXRlIGphdmFzY3JpcHQgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiAgICAgaW1wb3J0IHsgcHJlY29tcGlsZSB9IGZyb20gJ0BnbGltbWVyL2NvbXBpbGVyJztcbiAqICAgICBpbXBvcnQgeyB0ZW1wbGF0ZUZhY3RvcnkgfSBmcm9tICdnbGltbWVyLXJ1bnRpbWUnO1xuICogICAgIGxldCB0ZW1wbGF0ZUpzID0gcHJlY29tcGlsZShcIkhvd2R5IHt7bmFtZX19XCIpO1xuICogICAgIGxldCBmYWN0b3J5ID0gdGVtcGxhdGVGYWN0b3J5KG5ldyBGdW5jdGlvbihcInJldHVybiBcIiArIHRlbXBsYXRlSnMpKCkpO1xuICogICAgIGxldCB0ZW1wbGF0ZSA9IGZhY3RvcnkuY3JlYXRlKGVudik7XG4gKlxuICogQG1ldGhvZCBwcmVjb21waWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIGEgR2xpbW1lciB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ30gYSB0ZW1wbGF0ZSBqYXZhc2NyaXB0IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlY29tcGlsZUpTT04oXG4gIHN0cmluZzogc3RyaW5nLFxuICBvcHRpb25zOiBQcmVjb21waWxlT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBbYmxvY2s6IFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrLCB1c2VkTG9jYWxzOiBzdHJpbmdbXV0ge1xuICBsZXQgc291cmNlID0gbmV3IFNvdXJjZShzdHJpbmcsIG9wdGlvbnMubWV0YT8ubW9kdWxlTmFtZSk7XG4gIGxldCBbYXN0LCBsb2NhbHNdID0gbm9ybWFsaXplKHNvdXJjZSwgb3B0aW9ucyk7XG4gIGxldCBibG9jayA9IHBhc3MwKHNvdXJjZSwgYXN0LCBvcHRpb25zLnN0cmljdE1vZGUgPz8gZmFsc2UpLm1hcE9rKChwYXNzMkluKSA9PiB7XG4gICAgcmV0dXJuIHBhc3MyKHBhc3MySW4pO1xuICB9KTtcblxuICBpZiAoTE9DQUxfU0hPVUxEX0xPRykge1xuICAgIExPQ0FMX0xPR0dFUi5sb2coYFRlbXBsYXRlIC0+YCwgYmxvY2spO1xuICB9XG5cbiAgaWYgKGJsb2NrLmlzT2spIHtcbiAgICByZXR1cm4gW2Jsb2NrLnZhbHVlLCBsb2NhbHNdO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGJsb2NrLnJlYXNvbjtcbiAgfVxufVxuXG4vLyBVVUlEIHVzZWQgYXMgYSB1bmlxdWUgcGxhY2Vob2xkZXIgZm9yIHBsYWNpbmcgYSBzbmlwcGV0IG9mIEpTIGNvZGUgaW50b1xuLy8gdGhlIG90aGVyd2lzZSBKU09OIHN0cmluZ2lmaWVkIHZhbHVlIGJlbG93LlxuY29uc3QgU0NPUEVfUExBQ0VIT0xERVIgPSAnNzk2ZDI0ZTYtMjQ1MC00ZmIwLThjZGYtYjY1NjM4YjVlZjcwJztcblxuLypcbiAqIENvbXBpbGUgYSBzdHJpbmcgaW50byBhIHRlbXBsYXRlIGphdmFzY3JpcHQgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiAgICAgaW1wb3J0IHsgcHJlY29tcGlsZSB9IGZyb20gJ0BnbGltbWVyL2NvbXBpbGVyJztcbiAqICAgICBpbXBvcnQgeyB0ZW1wbGF0ZUZhY3RvcnkgfSBmcm9tICdnbGltbWVyLXJ1bnRpbWUnO1xuICogICAgIGxldCB0ZW1wbGF0ZUpzID0gcHJlY29tcGlsZShcIkhvd2R5IHt7bmFtZX19XCIpO1xuICogICAgIGxldCBmYWN0b3J5ID0gdGVtcGxhdGVGYWN0b3J5KG5ldyBGdW5jdGlvbihcInJldHVybiBcIiArIHRlbXBsYXRlSnMpKCkpO1xuICogICAgIGxldCB0ZW1wbGF0ZSA9IGZhY3RvcnkuY3JlYXRlKGVudik7XG4gKlxuICogQG1ldGhvZCBwcmVjb21waWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIGEgR2xpbW1lciB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ30gYSB0ZW1wbGF0ZSBqYXZhc2NyaXB0IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlY29tcGlsZShcbiAgc291cmNlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByZWNvbXBpbGVPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFRlbXBsYXRlSmF2YXNjcmlwdCB7XG4gIGxldCBbYmxvY2ssIHVzZWRMb2NhbHNdID0gcHJlY29tcGlsZUpTT04oc291cmNlLCBvcHRpb25zKTtcblxuICBsZXQgbW9kdWxlTmFtZSA9IG9wdGlvbnMubWV0YT8ubW9kdWxlTmFtZTtcbiAgbGV0IGlkRm4gPSBvcHRpb25zLmlkIHx8IGRlZmF1bHRJZDtcbiAgbGV0IGJsb2NrSlNPTiA9IEpTT04uc3RyaW5naWZ5KGJsb2NrKTtcbiAgbGV0IHRlbXBsYXRlSlNPTk9iamVjdDogU2VyaWFsaXplZFRlbXBsYXRlV2l0aExhenlCbG9jayA9IHtcbiAgICBpZDogaWRGbihKU09OLnN0cmluZ2lmeShvcHRpb25zLm1ldGEpICsgYmxvY2tKU09OKSxcbiAgICBibG9jazogYmxvY2tKU09OLFxuICAgIG1vZHVsZU5hbWU6IG1vZHVsZU5hbWUgPz8gJyh1bmtub3duIHRlbXBsYXRlIG1vZHVsZSknLFxuICAgIC8vIGx5aW5nIHRvIHRoZSB0eXBlIGNoZWNrZXIgaGVyZSBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvXG4gICAgLy8gcmVwbGFjZSBpdCBqdXN0IGJlbG93LCBhZnRlciBzdHJpbmdpZmljYXRpb25cbiAgICBzY29wZTogKFNDT1BFX1BMQUNFSE9MREVSIGFzIHVua25vd24pIGFzIG51bGwsXG4gICAgaXNTdHJpY3RNb2RlOiBvcHRpb25zLnN0cmljdE1vZGUgPz8gZmFsc2UsXG4gIH07XG5cbiAgaWYgKHVzZWRMb2NhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIHRlbXBsYXRlSlNPTk9iamVjdC5zY29wZTtcbiAgfVxuXG4gIC8vIEpTT04gaXMgamF2YXNjcmlwdFxuICBsZXQgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZUpTT05PYmplY3QpO1xuXG4gIGlmICh1c2VkTG9jYWxzLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgc2NvcGVGbiA9IGAoKT0+WyR7dXNlZExvY2Fscy5qb2luKCcsJyl9XWA7XG5cbiAgICBzdHJpbmdpZmllZCA9IHN0cmluZ2lmaWVkLnJlcGxhY2UoYFwiJHtTQ09QRV9QTEFDRUhPTERFUn1cImAsIHNjb3BlRm4pO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmaWVkO1xufVxuXG5leHBvcnQgeyBQcmVjb21waWxlT3B0aW9ucyB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==