@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
78 lines (62 loc) • 10.4 kB
JavaScript
import { DEBUG } from '@glimmer/env';
import { createCache, getValue } from '@glimmer/validator';
import { debugToString } from '@glimmer/util';
import { getInternalHelperManager, hasDestroyable, hasValue } from '@glimmer/manager';
import { EMPTY_ARGS, EMPTY_NAMED, EMPTY_POSITIONAL } from '../vm/arguments';
import { getOwner } from '@glimmer/owner';
import { associateDestroyableChild, isDestroyed, isDestroying } from '@glimmer/destroyable';
let ARGS_CACHES = DEBUG ? new WeakMap() : undefined;
function getArgs(proxy) {
return getValue(DEBUG ? ARGS_CACHES.get(proxy) : proxy.argsCache);
}
class SimpleArgsProxy {
constructor(context, computeArgs = () => EMPTY_ARGS) {
let argsCache = createCache(() => computeArgs(context));
if (DEBUG) {
ARGS_CACHES.set(this, argsCache);
Object.freeze(this);
} else {
this.argsCache = argsCache;
}
}
get named() {
return getArgs(this).named || EMPTY_NAMED;
}
get positional() {
return getArgs(this).positional || EMPTY_POSITIONAL;
}
} ////////////
export function invokeHelper(context, definition, computeArgs) {
if (DEBUG && (typeof context !== 'object' || context === null)) {
throw new Error(`Expected a context object to be passed as the first parameter to invokeHelper, got ${context}`);
}
const owner = getOwner(context);
const internalManager = getInternalHelperManager(definition); // TODO: figure out why assert isn't using the TS assert thing
if (DEBUG && !internalManager) {
throw new Error(`Expected a helper definition to be passed as the second parameter to invokeHelper, but no helper manager was found. The definition value that was passed was \`${debugToString(definition)}\`. Did you use setHelperManager to associate a helper manager with this value?`);
}
if (DEBUG && typeof internalManager === 'function') {
throw new Error('Found a helper manager, but it was an internal built-in helper manager. `invokeHelper` does not support internal helpers yet.');
}
const manager = internalManager.getDelegateFor(owner);
let args = new SimpleArgsProxy(context, computeArgs);
let bucket = manager.createHelper(definition, args);
let cache;
if (hasValue(manager)) {
cache = createCache(() => {
if (DEBUG && (isDestroying(cache) || isDestroyed(cache))) {
throw new Error(`You attempted to get the value of a helper after the helper was destroyed, which is not allowed`);
}
return manager.getValue(bucket);
});
associateDestroyableChild(context, cache);
} else {
throw new Error('TODO: unreachable, to be implemented with hasScheduledEffect');
}
if (hasDestroyable(manager)) {
let destroyable = manager.getDestroyable(bucket);
associateDestroyableChild(cache, destroyable);
}
return cache;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2hlbHBlcnMvaW52b2tlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVMsS0FBVCxRQUFzQixjQUF0QjtBQUNBLFNBQWdCLFdBQWhCLEVBQTZCLFFBQTdCLFFBQTZDLG9CQUE3QztBQUVBLFNBQVMsYUFBVCxRQUE4QixlQUE5QjtBQUNBLFNBQVMsd0JBQVQsRUFBbUMsY0FBbkMsRUFBbUQsUUFBbkQsUUFBbUUsa0JBQW5FO0FBRUEsU0FBUyxVQUFULEVBQXFCLFdBQXJCLEVBQWtDLGdCQUFsQyxRQUEwRCxpQkFBMUQ7QUFDQSxTQUFTLFFBQVQsUUFBeUIsZ0JBQXpCO0FBQ0EsU0FBUyx5QkFBVCxFQUFvQyxXQUFwQyxFQUFpRCxZQUFqRCxRQUFxRSxzQkFBckU7QUFFQSxJQUFJLFdBQVcsR0FBRyxLQUFLLEdBQUcsSUFBSSxPQUFKLEVBQUgsR0FBK0QsU0FBdEY7O0FBRUEsU0FBUyxPQUFULENBQWlCLEtBQWpCLEVBQXVDO0FBQ3JDLFNBQU8sUUFBUSxDQUFDLEtBQUssR0FBRyxXQUFZLENBQUMsR0FBYixDQUFpQixLQUFqQixDQUFILEdBQThCLEtBQUssQ0FBQyxTQUExQyxDQUFmO0FBQ0Q7O0FBRUQsTUFBTSxlQUFOLENBQXFCO0FBR25CLEVBQUEsV0FBQSxDQUNFLE9BREYsRUFFRSxXQUFBLEdBQXVELE1BQU0sVUFGL0QsRUFFeUU7QUFFdkUsUUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQUQsQ0FBbEIsQ0FBM0I7O0FBRUEsUUFBSSxLQUFKLEVBQVc7QUFDVCxNQUFBLFdBQVksQ0FBQyxHQUFiLENBQWlCLElBQWpCLEVBQXVCLFNBQXZCO0FBQ0EsTUFBQSxNQUFNLENBQUMsTUFBUCxDQUFjLElBQWQ7QUFDRCxLQUhELE1BR087QUFDTCxXQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDRDtBQUNGOztBQUVELE1BQUksS0FBSixHQUFTO0FBQ1AsV0FBTyxPQUFPLENBQUMsSUFBRCxDQUFQLENBQWMsS0FBZCxJQUF1QixXQUE5QjtBQUNEOztBQUVELE1BQUksVUFBSixHQUFjO0FBQ1osV0FBTyxPQUFPLENBQUMsSUFBRCxDQUFQLENBQWMsVUFBZCxJQUE0QixnQkFBbkM7QUFDRDs7QUF2QmtCLEMsQ0EwQnJCOzs7QUFFQSxPQUFNLFNBQVUsWUFBVixDQUNKLE9BREksRUFFSixVQUZJLEVBR0osV0FISSxFQUdpRDtBQUVyRCxNQUFJLEtBQUssS0FBSyxPQUFPLE9BQVAsS0FBbUIsUUFBbkIsSUFBK0IsT0FBTyxLQUFLLElBQWhELENBQVQsRUFBZ0U7QUFDOUQsVUFBTSxJQUFJLEtBQUosQ0FDSixzRkFBc0YsT0FBTyxFQUR6RixDQUFOO0FBR0Q7O0FBRUQsUUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQUQsQ0FBdEI7QUFDQSxRQUFNLGVBQWUsR0FBRyx3QkFBd0IsQ0FBQyxVQUFELENBQWhELENBVHFELENBV3JEOztBQUNBLE1BQUksS0FBSyxJQUFJLENBQUMsZUFBZCxFQUErQjtBQUM3QixVQUFNLElBQUksS0FBSixDQUNKLGtLQUFrSyxhQUFjLENBQzlLLFVBRDhLLENBRS9LLGlGQUhHLENBQU47QUFLRDs7QUFFRCxNQUFJLEtBQUssSUFBSSxPQUFPLGVBQVAsS0FBMkIsVUFBeEMsRUFBb0Q7QUFDbEQsVUFBTSxJQUFJLEtBQUosQ0FDSiwrSEFESSxDQUFOO0FBR0Q7O0FBRUQsUUFBTSxPQUFPLEdBQUksZUFBaUQsQ0FBQyxjQUFsRCxDQUFpRSxLQUFqRSxDQUFqQjtBQUNBLE1BQUksSUFBSSxHQUFHLElBQUksZUFBSixDQUFvQixPQUFwQixFQUE2QixXQUE3QixDQUFYO0FBQ0EsTUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVIsQ0FBcUIsVUFBckIsRUFBaUMsSUFBakMsQ0FBYjtBQUVBLE1BQUksS0FBSjs7QUFFQSxNQUFJLFFBQVEsQ0FBQyxPQUFELENBQVosRUFBdUI7QUFDckIsSUFBQSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQUs7QUFDdkIsVUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUQsQ0FBWixJQUF1QixXQUFXLENBQUMsS0FBRCxDQUF2QyxDQUFULEVBQTBEO0FBQ3hELGNBQU0sSUFBSSxLQUFKLENBQ0osaUdBREksQ0FBTjtBQUdEOztBQUVELGFBQU8sT0FBTyxDQUFDLFFBQVIsQ0FBaUIsTUFBakIsQ0FBUDtBQUNELEtBUmtCLENBQW5CO0FBVUEsSUFBQSx5QkFBeUIsQ0FBQyxPQUFELEVBQVUsS0FBVixDQUF6QjtBQUNELEdBWkQsTUFZTztBQUNMLFVBQU0sSUFBSSxLQUFKLENBQVUsOERBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksY0FBYyxDQUFDLE9BQUQsQ0FBbEIsRUFBNkI7QUFDM0IsUUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQVIsQ0FBdUIsTUFBdkIsQ0FBbEI7QUFFQSxJQUFBLHlCQUF5QixDQUFDLEtBQUQsRUFBUSxXQUFSLENBQXpCO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBDYWNoZSwgY3JlYXRlQ2FjaGUsIGdldFZhbHVlIH0gZnJvbSAnQGdsaW1tZXIvdmFsaWRhdG9yJztcbmltcG9ydCB7IEFyZ3VtZW50cywgSW50ZXJuYWxIZWxwZXJNYW5hZ2VyIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBkZWJ1Z1RvU3RyaW5nIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBnZXRJbnRlcm5hbEhlbHBlck1hbmFnZXIsIGhhc0Rlc3Ryb3lhYmxlLCBoYXNWYWx1ZSB9IGZyb20gJ0BnbGltbWVyL21hbmFnZXInO1xuXG5pbXBvcnQgeyBFTVBUWV9BUkdTLCBFTVBUWV9OQU1FRCwgRU1QVFlfUE9TSVRJT05BTCB9IGZyb20gJy4uL3ZtL2FyZ3VtZW50cyc7XG5pbXBvcnQgeyBnZXRPd25lciB9IGZyb20gJ0BnbGltbWVyL293bmVyJztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGlzRGVzdHJveWVkLCBpc0Rlc3Ryb3lpbmcgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5cbmxldCBBUkdTX0NBQ0hFUyA9IERFQlVHID8gbmV3IFdlYWtNYXA8U2ltcGxlQXJnc1Byb3h5LCBDYWNoZTxQYXJ0aWFsPEFyZ3VtZW50cz4+PigpIDogdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRBcmdzKHByb3h5OiBTaW1wbGVBcmdzUHJveHkpOiBQYXJ0aWFsPEFyZ3VtZW50cz4ge1xuICByZXR1cm4gZ2V0VmFsdWUoREVCVUcgPyBBUkdTX0NBQ0hFUyEuZ2V0KHByb3h5KSEgOiBwcm94eS5hcmdzQ2FjaGUhKSE7XG59XG5cbmNsYXNzIFNpbXBsZUFyZ3NQcm94eSB7XG4gIGFyZ3NDYWNoZT86IENhY2hlPFBhcnRpYWw8QXJndW1lbnRzPj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29udGV4dDogb2JqZWN0LFxuICAgIGNvbXB1dGVBcmdzOiAoY29udGV4dDogb2JqZWN0KSA9PiBQYXJ0aWFsPEFyZ3VtZW50cz4gPSAoKSA9PiBFTVBUWV9BUkdTXG4gICkge1xuICAgIGxldCBhcmdzQ2FjaGUgPSBjcmVhdGVDYWNoZSgoKSA9PiBjb21wdXRlQXJncyhjb250ZXh0KSk7XG5cbiAgICBpZiAoREVCVUcpIHtcbiAgICAgIEFSR1NfQ0FDSEVTIS5zZXQodGhpcywgYXJnc0NhY2hlKTtcbiAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXJnc0NhY2hlID0gYXJnc0NhY2hlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBuYW1lZCgpIHtcbiAgICByZXR1cm4gZ2V0QXJncyh0aGlzKS5uYW1lZCB8fCBFTVBUWV9OQU1FRDtcbiAgfVxuXG4gIGdldCBwb3NpdGlvbmFsKCkge1xuICAgIHJldHVybiBnZXRBcmdzKHRoaXMpLnBvc2l0aW9uYWwgfHwgRU1QVFlfUE9TSVRJT05BTDtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUhlbHBlcihcbiAgY29udGV4dDogb2JqZWN0LFxuICBkZWZpbml0aW9uOiBvYmplY3QsXG4gIGNvbXB1dGVBcmdzPzogKGNvbnRleHQ6IG9iamVjdCkgPT4gUGFydGlhbDxBcmd1bWVudHM+XG4pOiBDYWNoZTx1bmtub3duPiB7XG4gIGlmIChERUJVRyAmJiAodHlwZW9mIGNvbnRleHQgIT09ICdvYmplY3QnIHx8IGNvbnRleHQgPT09IG51bGwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4cGVjdGVkIGEgY29udGV4dCBvYmplY3QgdG8gYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gaW52b2tlSGVscGVyLCBnb3QgJHtjb250ZXh0fWBcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgb3duZXIgPSBnZXRPd25lcihjb250ZXh0KTtcbiAgY29uc3QgaW50ZXJuYWxNYW5hZ2VyID0gZ2V0SW50ZXJuYWxIZWxwZXJNYW5hZ2VyKGRlZmluaXRpb24pITtcblxuICAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoeSBhc3NlcnQgaXNuJ3QgdXNpbmcgdGhlIFRTIGFzc2VydCB0aGluZ1xuICBpZiAoREVCVUcgJiYgIWludGVybmFsTWFuYWdlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFeHBlY3RlZCBhIGhlbHBlciBkZWZpbml0aW9uIHRvIGJlIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBpbnZva2VIZWxwZXIsIGJ1dCBubyBoZWxwZXIgbWFuYWdlciB3YXMgZm91bmQuIFRoZSBkZWZpbml0aW9uIHZhbHVlIHRoYXQgd2FzIHBhc3NlZCB3YXMgXFxgJHtkZWJ1Z1RvU3RyaW5nIShcbiAgICAgICAgZGVmaW5pdGlvblxuICAgICAgKX1cXGAuIERpZCB5b3UgdXNlIHNldEhlbHBlck1hbmFnZXIgdG8gYXNzb2NpYXRlIGEgaGVscGVyIG1hbmFnZXIgd2l0aCB0aGlzIHZhbHVlP2BcbiAgICApO1xuICB9XG5cbiAgaWYgKERFQlVHICYmIHR5cGVvZiBpbnRlcm5hbE1hbmFnZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnRm91bmQgYSBoZWxwZXIgbWFuYWdlciwgYnV0IGl0IHdhcyBhbiBpbnRlcm5hbCBidWlsdC1pbiBoZWxwZXIgbWFuYWdlci4gYGludm9rZUhlbHBlcmAgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcm5hbCBoZWxwZXJzIHlldC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1hbmFnZXIgPSAoaW50ZXJuYWxNYW5hZ2VyIGFzIEludGVybmFsSGVscGVyTWFuYWdlcjxvYmplY3Q+KS5nZXREZWxlZ2F0ZUZvcihvd25lcik7XG4gIGxldCBhcmdzID0gbmV3IFNpbXBsZUFyZ3NQcm94eShjb250ZXh0LCBjb21wdXRlQXJncyk7XG4gIGxldCBidWNrZXQgPSBtYW5hZ2VyLmNyZWF0ZUhlbHBlcihkZWZpbml0aW9uLCBhcmdzKTtcblxuICBsZXQgY2FjaGU6IENhY2hlPHVua25vd24+O1xuXG4gIGlmIChoYXNWYWx1ZShtYW5hZ2VyKSkge1xuICAgIGNhY2hlID0gY3JlYXRlQ2FjaGUoKCkgPT4ge1xuICAgICAgaWYgKERFQlVHICYmIChpc0Rlc3Ryb3lpbmcoY2FjaGUpIHx8IGlzRGVzdHJveWVkKGNhY2hlKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBZb3UgYXR0ZW1wdGVkIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBoZWxwZXIgYWZ0ZXIgdGhlIGhlbHBlciB3YXMgZGVzdHJveWVkLCB3aGljaCBpcyBub3QgYWxsb3dlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hbmFnZXIuZ2V0VmFsdWUoYnVja2V0KTtcbiAgICB9KTtcblxuICAgIGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQoY29udGV4dCwgY2FjaGUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogdW5yZWFjaGFibGUsIHRvIGJlIGltcGxlbWVudGVkIHdpdGggaGFzU2NoZWR1bGVkRWZmZWN0Jyk7XG4gIH1cblxuICBpZiAoaGFzRGVzdHJveWFibGUobWFuYWdlcikpIHtcbiAgICBsZXQgZGVzdHJveWFibGUgPSBtYW5hZ2VyLmdldERlc3Ryb3lhYmxlKGJ1Y2tldCk7XG5cbiAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKGNhY2hlLCBkZXN0cm95YWJsZSk7XG4gIH1cblxuICByZXR1cm4gY2FjaGU7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9