UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

116 lines (87 loc) 8.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _globalContext = require("@glimmer/global-context"); var _util = require("@glimmer/util"); var _reference = require("@glimmer/reference"); var _internalHelper = require("./internal-helper"); /** Dynamically look up a property on an object. The second argument to `{{get}}` should have a string value, although it can be bound. For example, these two usages are equivalent: ```app/components/developer-detail.js import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; export default class extends Component { @tracked developer = { name: "Sandi Metz", language: "Ruby" } } ``` ```handlebars {{this.developer.name}} {{get this.developer "name"}} ``` If there were several facts about a person, the `{{get}}` helper can dynamically pick one: ```app/templates/application.hbs <DeveloperDetail @factName="language" /> ``` ```handlebars {{get this.developer @factName}} ``` For a more complex example, this template would allow the user to switch between showing the user's height and weight with a click: ```app/components/developer-detail.js import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; export default class extends Component { @tracked developer = { name: "Sandi Metz", language: "Ruby" } @tracked currentFact = 'name' showFact = (fact) => { this.currentFact = fact; } } ``` ```app/components/developer-detail.js {{get this.developer this.currentFact}} <button {{on 'click' (fn this.showFact "name")}}>Show name</button> <button {{on 'click' (fn this.showFact "language")}}>Show language</button> ``` The `{{get}}` helper can also respect mutable values itself. For example: ```app/components/developer-detail.js <Input @value={{mut (get this.person this.currentFact)}} /> <button {{on 'click' (fn this.showFact "name")}}>Show name</button> <button {{on 'click' (fn this.showFact "language")}}>Show language</button> ``` Would allow the user to swap what fact is being displayed, and also edit that fact via a two-way mutable binding. @public @method get */ var _default = (0, _internalHelper.internalHelper)(({ positional }) => { var _a, _b; let sourceRef = (_a = positional[0]) !== null && _a !== void 0 ? _a : _reference.UNDEFINED_REFERENCE; let pathRef = (_b = positional[1]) !== null && _b !== void 0 ? _b : _reference.UNDEFINED_REFERENCE; return (0, _reference.createComputeRef)(() => { let source = (0, _reference.valueForRef)(sourceRef); if ((0, _util.isDict)(source)) { return (0, _globalContext.getPath)(source, String((0, _reference.valueForRef)(pathRef))); } }, value => { let source = (0, _reference.valueForRef)(sourceRef); if ((0, _util.isDict)(source)) { return (0, _globalContext.setPath)(source, String((0, _reference.valueForRef)(pathRef)), value); } }, 'get'); }); exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2hlbHBlcnMvZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUE2RWUsb0NBQWUsQ0FBQztBQUFFLEVBQUE7QUFBRixDQUFELEtBQXNDOzs7QUFDbEUsTUFBSSxTQUFTLEdBQUEsQ0FBQSxFQUFBLEdBQUcsVUFBVSxDQUFiLENBQWEsQ0FBYixNQUFBLElBQUEsSUFBZ0IsRUFBQSxLQUFBLEtBQWhCLENBQUEsR0FBQSxFQUFBLEdBQWIsOEJBQUE7QUFDQSxNQUFJLE9BQU8sR0FBQSxDQUFBLEVBQUEsR0FBRyxVQUFVLENBQWIsQ0FBYSxDQUFiLE1BQUEsSUFBQSxJQUFnQixFQUFBLEtBQUEsS0FBaEIsQ0FBQSxHQUFBLEVBQUEsR0FBWCw4QkFBQTtBQUVBLFNBQU8saUNBQ0wsTUFBSztBQUNILFFBQUksTUFBTSxHQUFHLDRCQUFiLFNBQWEsQ0FBYjs7QUFFQSxRQUFJLGtCQUFKLE1BQUksQ0FBSixFQUFvQjtBQUNsQixhQUFPLDRCQUFPLE1BQVAsRUFBZ0IsTUFBTSxDQUFDLDRCQUE5QixPQUE4QixDQUFELENBQXRCLENBQVA7QUFDRDtBQU5rQixHQUFoQixFQVFKLEtBQUQsSUFBVTtBQUNSLFFBQUksTUFBTSxHQUFHLDRCQUFiLFNBQWEsQ0FBYjs7QUFFQSxRQUFJLGtCQUFKLE1BQUksQ0FBSixFQUFvQjtBQUNsQixhQUFPLDRCQUFPLE1BQVAsRUFBZ0IsTUFBTSxDQUFDLDRCQUFoQixPQUFnQixDQUFELENBQXRCLEVBQVAsS0FBTyxDQUFQO0FBQ0Q7QUFia0IsR0FBaEIsRUFBUCxLQUFPLENBQVA7QUFKRixDQUFlLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRQYXRoLCBzZXRQYXRoIH0gZnJvbSAnQGdsaW1tZXIvZ2xvYmFsLWNvbnRleHQnO1xuaW1wb3J0IHsgaXNEaWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDYXB0dXJlZEFyZ3VtZW50cyB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcHV0ZVJlZiwgVU5ERUZJTkVEX1JFRkVSRU5DRSwgdmFsdWVGb3JSZWYgfSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgaW50ZXJuYWxIZWxwZXIgfSBmcm9tICcuL2ludGVybmFsLWhlbHBlcic7XG5cbi8qKlxuICBEeW5hbWljYWxseSBsb29rIHVwIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGB7e2dldH19YFxuICBzaG91bGQgaGF2ZSBhIHN0cmluZyB2YWx1ZSwgYWx0aG91Z2ggaXQgY2FuIGJlIGJvdW5kLlxuXG4gIEZvciBleGFtcGxlLCB0aGVzZSB0d28gdXNhZ2VzIGFyZSBlcXVpdmFsZW50OlxuXG4gIGBgYGFwcC9jb21wb25lbnRzL2RldmVsb3Blci1kZXRhaWwuanNcbiAgaW1wb3J0IENvbXBvbmVudCBmcm9tICdAZ2xpbW1lci9jb21wb25lbnQnO1xuICBpbXBvcnQgeyB0cmFja2VkIH0gZnJvbSAnQGdsaW1tZXIvdHJhY2tpbmcnO1xuXG4gIGV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBAdHJhY2tlZCBkZXZlbG9wZXIgPSB7XG4gICAgICBuYW1lOiBcIlNhbmRpIE1ldHpcIixcbiAgICAgIGxhbmd1YWdlOiBcIlJ1YnlcIlxuICAgIH1cbiAgfVxuICBgYGBcblxuICBgYGBoYW5kbGViYXJzXG4gIHt7dGhpcy5kZXZlbG9wZXIubmFtZX19XG4gIHt7Z2V0IHRoaXMuZGV2ZWxvcGVyIFwibmFtZVwifX1cbiAgYGBgXG5cbiAgSWYgdGhlcmUgd2VyZSBzZXZlcmFsIGZhY3RzIGFib3V0IGEgcGVyc29uLCB0aGUgYHt7Z2V0fX1gIGhlbHBlciBjYW4gZHluYW1pY2FsbHlcbiAgcGljayBvbmU6XG5cbiAgYGBgYXBwL3RlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnNcbiAgPERldmVsb3BlckRldGFpbCBAZmFjdE5hbWU9XCJsYW5ndWFnZVwiIC8+XG4gIGBgYFxuXG4gIGBgYGhhbmRsZWJhcnNcbiAge3tnZXQgdGhpcy5kZXZlbG9wZXIgQGZhY3ROYW1lfX1cbiAgYGBgXG5cbiAgRm9yIGEgbW9yZSBjb21wbGV4IGV4YW1wbGUsIHRoaXMgdGVtcGxhdGUgd291bGQgYWxsb3cgdGhlIHVzZXIgdG8gc3dpdGNoXG4gIGJldHdlZW4gc2hvd2luZyB0aGUgdXNlcidzIGhlaWdodCBhbmQgd2VpZ2h0IHdpdGggYSBjbGljazpcblxuICBgYGBhcHAvY29tcG9uZW50cy9kZXZlbG9wZXItZGV0YWlsLmpzXG4gIGltcG9ydCBDb21wb25lbnQgZnJvbSAnQGdsaW1tZXIvY29tcG9uZW50JztcbiAgaW1wb3J0IHsgdHJhY2tlZCB9IGZyb20gJ0BnbGltbWVyL3RyYWNraW5nJztcblxuICBleHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgQHRyYWNrZWQgZGV2ZWxvcGVyID0ge1xuICAgICAgbmFtZTogXCJTYW5kaSBNZXR6XCIsXG4gICAgICBsYW5ndWFnZTogXCJSdWJ5XCJcbiAgICB9XG5cbiAgICBAdHJhY2tlZCBjdXJyZW50RmFjdCA9ICduYW1lJ1xuXG4gICAgc2hvd0ZhY3QgPSAoZmFjdCkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50RmFjdCA9IGZhY3Q7XG4gICAgfVxuICB9XG4gIGBgYFxuXG4gIGBgYGFwcC9jb21wb25lbnRzL2RldmVsb3Blci1kZXRhaWwuanNcbiAge3tnZXQgdGhpcy5kZXZlbG9wZXIgdGhpcy5jdXJyZW50RmFjdH19XG5cbiAgPGJ1dHRvbiB7e29uICdjbGljaycgKGZuIHRoaXMuc2hvd0ZhY3QgXCJuYW1lXCIpfX0+U2hvdyBuYW1lPC9idXR0b24+XG4gIDxidXR0b24ge3tvbiAnY2xpY2snIChmbiB0aGlzLnNob3dGYWN0IFwibGFuZ3VhZ2VcIil9fT5TaG93IGxhbmd1YWdlPC9idXR0b24+XG4gIGBgYFxuXG4gIFRoZSBge3tnZXR9fWAgaGVscGVyIGNhbiBhbHNvIHJlc3BlY3QgbXV0YWJsZSB2YWx1ZXMgaXRzZWxmLiBGb3IgZXhhbXBsZTpcblxuICBgYGBhcHAvY29tcG9uZW50cy9kZXZlbG9wZXItZGV0YWlsLmpzXG4gIDxJbnB1dCBAdmFsdWU9e3ttdXQgKGdldCB0aGlzLnBlcnNvbiB0aGlzLmN1cnJlbnRGYWN0KX19IC8+XG5cbiAgPGJ1dHRvbiB7e29uICdjbGljaycgKGZuIHRoaXMuc2hvd0ZhY3QgXCJuYW1lXCIpfX0+U2hvdyBuYW1lPC9idXR0b24+XG4gIDxidXR0b24ge3tvbiAnY2xpY2snIChmbiB0aGlzLnNob3dGYWN0IFwibGFuZ3VhZ2VcIil9fT5TaG93IGxhbmd1YWdlPC9idXR0b24+XG4gIGBgYFxuXG4gIFdvdWxkIGFsbG93IHRoZSB1c2VyIHRvIHN3YXAgd2hhdCBmYWN0IGlzIGJlaW5nIGRpc3BsYXllZCwgYW5kIGFsc28gZWRpdFxuICB0aGF0IGZhY3QgdmlhIGEgdHdvLXdheSBtdXRhYmxlIGJpbmRpbmcuXG5cbiAgQHB1YmxpY1xuICBAbWV0aG9kIGdldFxuICovXG5leHBvcnQgZGVmYXVsdCBpbnRlcm5hbEhlbHBlcigoeyBwb3NpdGlvbmFsIH06IENhcHR1cmVkQXJndW1lbnRzKSA9PiB7XG4gIGxldCBzb3VyY2VSZWYgPSBwb3NpdGlvbmFsWzBdID8/IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gIGxldCBwYXRoUmVmID0gcG9zaXRpb25hbFsxXSA/PyBVTkRFRklORURfUkVGRVJFTkNFO1xuXG4gIHJldHVybiBjcmVhdGVDb21wdXRlUmVmKFxuICAgICgpID0+IHtcbiAgICAgIGxldCBzb3VyY2UgPSB2YWx1ZUZvclJlZihzb3VyY2VSZWYpO1xuXG4gICAgICBpZiAoaXNEaWN0KHNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhdGgoc291cmNlLCBTdHJpbmcodmFsdWVGb3JSZWYocGF0aFJlZikpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICh2YWx1ZSkgPT4ge1xuICAgICAgbGV0IHNvdXJjZSA9IHZhbHVlRm9yUmVmKHNvdXJjZVJlZik7XG5cbiAgICAgIGlmIChpc0RpY3Qoc291cmNlKSkge1xuICAgICAgICByZXR1cm4gc2V0UGF0aChzb3VyY2UsIFN0cmluZyh2YWx1ZUZvclJlZihwYXRoUmVmKSksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdnZXQnXG4gICk7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=