@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
116 lines (87 loc) • 8.39 kB
JavaScript
;
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=