UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

82 lines (67 loc) 7.34 kB
import { createComputeRef } from '@glimmer/reference'; import { reifyNamed } from '@glimmer/runtime'; import { deprecate } from '@glimmer/global-context'; import { HAS_NATIVE_PROXY } from '@glimmer/util'; import { internalHelper } from './internal-helper'; import { DEBUG } from '@glimmer/env'; var wrapHashProxy; if (DEBUG) { wrapHashProxy = function wrapHashProxy(hash) { return new Proxy(hash, { set: function set(target, key, value) { deprecate("You set the '" + String(key) + "' property on a {{hash}} object. Setting properties on objects generated by {{hash}} is deprecated. Please update to use an object created with a tracked property or getter, or with a custom helper.", false, { id: 'setting-on-hash' }); target[key] = value; return true; } }); }; } /** Use the `{{hash}}` helper to create a hash to pass as an option to your components. This is specially useful for contextual components where you can just yield a hash: ```handlebars {{yield (hash name='Sarah' title=office )}} ``` Would result in an object such as: ```js { name: 'Sarah', title: this.get('office') } ``` Where the `title` is bound to updates of the `office` property. Note that the hash is an empty object with no prototype chain, therefore common methods like `toString` are not available in the resulting hash. If you need to use such a method, you can use the `call` or `apply` approach: ```js function toString(obj) { return Object.prototype.toString.apply(obj); } ``` @method hash @param {Object} options @return {Object} Hash @public */ export default internalHelper(function (_ref) { var named = _ref.named; var ref = createComputeRef(function () { var hash = reifyNamed(named); if (DEBUG && HAS_NATIVE_PROXY) { hash = wrapHashProxy(hash); } return hash; }, null, 'hash'); // Setup the children so that templates can bypass getting the value of // the reference and treat children lazily var children = new Map(); for (var name in named) { children.set(name, named[name]); } ref.children = children; return ref; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2hlbHBlcnMvaGFzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxTQUFBLGdCQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLFVBQUEsUUFBQSxrQkFBQTtBQUNBLFNBQUEsU0FBQSxRQUFBLHlCQUFBO0FBQ0EsU0FBQSxnQkFBQSxRQUFBLGVBQUE7QUFDQSxTQUFBLGNBQUEsUUFBQSxtQkFBQTtBQUNBLFNBQUEsS0FBQSxRQUFBLGNBQUE7QUFFQSxJQUFBLGFBQUE7O0FBRUEsSUFBQSxLQUFBLEVBQVc7QUFDVCxFQUFBLGFBQWEsR0FBSSx1QkFBQSxJQUFELEVBQWtDO0FBQ2hELFdBQU8sSUFBQSxLQUFBLENBQUEsSUFBQSxFQUFnQjtBQUNyQixNQUFBLEdBRHFCLGVBQ2xCLE1BRGtCLEVBQ2xCLEdBRGtCLEVBQ2xCLEtBRGtCLEVBQ0M7QUFDcEIsUUFBQSxTQUFTLG1CQUNTLE1BQU0sQ0FEZixHQUNlLENBRGYsNk1BQUEsS0FBQSxFQUtQO0FBQUUsVUFBQSxFQUFFLEVBQUU7QUFBTixTQUxPLENBQVQ7QUFRQSxRQUFBLE1BQU0sQ0FBTixHQUFNLENBQU4sR0FBQSxLQUFBO0FBRUEsZUFBQSxJQUFBO0FBQ0Q7QUFib0IsS0FBaEIsQ0FBUDtBQURGLEdBQUE7QUFpQkQ7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ0EsZUFBZSxjQUFjLENBQzNCLGdCQUEyRDtBQUFBLE1BQXhELEtBQXdELFFBQXhELEtBQXdEO0FBQ3pELE1BQUksR0FBRyxHQUFHLGdCQUFnQixDQUN4QixZQUFLO0FBQ0gsUUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFyQixLQUFxQixDQUFyQjs7QUFFQSxRQUFJLEtBQUssSUFBVCxnQkFBQSxFQUErQjtBQUM3QixNQUFBLElBQUksR0FBRyxhQUFhLENBQXBCLElBQW9CLENBQXBCO0FBQ0Q7O0FBRUQsV0FBQSxJQUFBO0FBUnNCLEdBQUEsRUFBQSxJQUFBLEVBRCtCLE1BQy9CLENBQTFCLENBRHlELENBZXpEO0FBQ0E7O0FBQ0EsTUFBSSxRQUFRLEdBQUcsSUFBZixHQUFlLEVBQWY7O0FBRUEsT0FBSyxJQUFMLElBQUEsSUFBQSxLQUFBLEVBQXdCO0FBQ3RCLElBQUEsUUFBUSxDQUFSLEdBQUEsQ0FBQSxJQUFBLEVBQW1CLEtBQUssQ0FBeEIsSUFBd0IsQ0FBeEI7QUFDRDs7QUFFRCxFQUFBLEdBQUcsQ0FBSCxRQUFBLEdBQUEsUUFBQTtBQUVBLFNBQUEsR0FBQTtBQTFCSixDQUE2QixDQUE3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhcHR1cmVkQXJndW1lbnRzLCBEaWN0IH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBjcmVhdGVDb21wdXRlUmVmLCBSZWZlcmVuY2UgfSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgcmVpZnlOYW1lZCB9IGZyb20gJ0BnbGltbWVyL3J1bnRpbWUnO1xuaW1wb3J0IHsgZGVwcmVjYXRlIH0gZnJvbSAnQGdsaW1tZXIvZ2xvYmFsLWNvbnRleHQnO1xuaW1wb3J0IHsgSEFTX05BVElWRV9QUk9YWSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgaW50ZXJuYWxIZWxwZXIgfSBmcm9tICcuL2ludGVybmFsLWhlbHBlcic7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5cbmxldCB3cmFwSGFzaFByb3h5OiAoaGFzaDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5pZiAoREVCVUcpIHtcbiAgd3JhcEhhc2hQcm94eSA9IChoYXNoOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkoaGFzaCwge1xuICAgICAgc2V0KHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBkZXByZWNhdGUoXG4gICAgICAgICAgYFlvdSBzZXQgdGhlICcke1N0cmluZyhcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9JyBwcm9wZXJ0eSBvbiBhIHt7aGFzaH19IG9iamVjdC4gU2V0dGluZyBwcm9wZXJ0aWVzIG9uIG9iamVjdHMgZ2VuZXJhdGVkIGJ5IHt7aGFzaH19IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1cGRhdGUgdG8gdXNlIGFuIG9iamVjdCBjcmVhdGVkIHdpdGggYSB0cmFja2VkIHByb3BlcnR5IG9yIGdldHRlciwgb3Igd2l0aCBhIGN1c3RvbSBoZWxwZXIuYCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB7IGlkOiAnc2V0dGluZy1vbi1oYXNoJyB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGFyZ2V0W2tleSBhcyBzdHJpbmddID0gdmFsdWU7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAgIFVzZSB0aGUgYHt7aGFzaH19YCBoZWxwZXIgdG8gY3JlYXRlIGEgaGFzaCB0byBwYXNzIGFzIGFuIG9wdGlvbiB0byB5b3VyXG4gICBjb21wb25lbnRzLiBUaGlzIGlzIHNwZWNpYWxseSB1c2VmdWwgZm9yIGNvbnRleHR1YWwgY29tcG9uZW50cyB3aGVyZSB5b3UgY2FuXG4gICBqdXN0IHlpZWxkIGEgaGFzaDpcblxuICAgYGBgaGFuZGxlYmFyc1xuICAge3t5aWVsZCAoaGFzaFxuICAgICAgbmFtZT0nU2FyYWgnXG4gICAgICB0aXRsZT1vZmZpY2VcbiAgICl9fVxuICAgYGBgXG5cbiAgIFdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3Qgc3VjaCBhczpcblxuICAgYGBganNcbiAgIHsgbmFtZTogJ1NhcmFoJywgdGl0bGU6IHRoaXMuZ2V0KCdvZmZpY2UnKSB9XG4gICBgYGBcblxuICAgV2hlcmUgdGhlIGB0aXRsZWAgaXMgYm91bmQgdG8gdXBkYXRlcyBvZiB0aGUgYG9mZmljZWAgcHJvcGVydHkuXG5cbiAgIE5vdGUgdGhhdCB0aGUgaGFzaCBpcyBhbiBlbXB0eSBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgY2hhaW4sIHRoZXJlZm9yZVxuICAgY29tbW9uIG1ldGhvZHMgbGlrZSBgdG9TdHJpbmdgIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSByZXN1bHRpbmcgaGFzaC5cbiAgIElmIHlvdSBuZWVkIHRvIHVzZSBzdWNoIGEgbWV0aG9kLCB5b3UgY2FuIHVzZSB0aGUgYGNhbGxgIG9yIGBhcHBseWBcbiAgIGFwcHJvYWNoOlxuXG4gICBgYGBqc1xuICAgZnVuY3Rpb24gdG9TdHJpbmcob2JqKSB7XG4gICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG9iaik7XG4gICB9XG4gICBgYGBcblxuICAgQG1ldGhvZCBoYXNoXG4gICBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgQHJldHVybiB7T2JqZWN0fSBIYXNoXG4gICBAcHVibGljXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGludGVybmFsSGVscGVyKFxuICAoeyBuYW1lZCB9OiBDYXB0dXJlZEFyZ3VtZW50cyk6IFJlZmVyZW5jZTxEaWN0PHVua25vd24+PiA9PiB7XG4gICAgbGV0IHJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGxldCBoYXNoID0gcmVpZnlOYW1lZChuYW1lZCk7XG5cbiAgICAgICAgaWYgKERFQlVHICYmIEhBU19OQVRJVkVfUFJPWFkpIHtcbiAgICAgICAgICBoYXNoID0gd3JhcEhhc2hQcm94eShoYXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgICAgfSxcbiAgICAgIG51bGwsXG4gICAgICAnaGFzaCdcbiAgICApO1xuXG4gICAgLy8gU2V0dXAgdGhlIGNoaWxkcmVuIHNvIHRoYXQgdGVtcGxhdGVzIGNhbiBieXBhc3MgZ2V0dGluZyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgcmVmZXJlbmNlIGFuZCB0cmVhdCBjaGlsZHJlbiBsYXppbHlcbiAgICBsZXQgY2hpbGRyZW4gPSBuZXcgTWFwKCk7XG5cbiAgICBmb3IgKGxldCBuYW1lIGluIG5hbWVkKSB7XG4gICAgICBjaGlsZHJlbi5zZXQobmFtZSwgbmFtZWRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJlZi5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=