UNPKG

ember-source

Version:

A JavaScript framework for creating ambitious web applications

101 lines (94 loc) 3.85 kB
import { meta } from '../../../meta/lib/meta.js'; import Mixin from '../../../../object/mixin.js'; import { t as tagForObject, c as computed, g as get, d as defineProperty, a as tagForProperty } from '../../../../../shared-chunks/cache-Djf2I3Za.js'; import '../../../../debug/index.js'; import { updateTag as UPDATE_TAG, tagMetaFor, tagFor, combine } from '../../../../../@glimmer/validator/index.js'; import { f as setupMandatorySetter, e as isObject } from '../../../../../shared-chunks/mandatory-setter-BiXq-dpN.js'; import { isDevelopingApp } from '@embroider/macros'; import { s as setProxy, i as isProxy } from '../../../../../shared-chunks/is_proxy-DjvCKvd5.js'; import { s as set } from '../../../../../shared-chunks/property_set-DS4X3Soy.js'; import '../../../../../shared-chunks/env-CwR5CFCu.js'; import { setCustomTagFor } from '../../../../../@glimmer/manager/index.js'; import { assert } from '../../../../debug/lib/assert.js'; /** @module ember */ function contentFor(proxy) { let content = get(proxy, 'content'); // SAFETY: Ideally we'd assert instead of casting, but @glimmer/validator doesn't give us // sufficient public types for this. Previously this code was .js and worked correctly so // hopefully this is sufficiently reliable. UPDATE_TAG(tagForObject(proxy), tagForObject(content)); return content; } function customTagForProxy(proxy, key, addMandatorySetter) { (isDevelopingApp() && !(isProxy(proxy)) && assert('Expected a proxy', isProxy(proxy))); let meta = tagMetaFor(proxy); let tag = tagFor(proxy, key, meta); if (isDevelopingApp()) { // TODO: Replace this with something more first class for tracking tags in DEBUG // SAFETY: This is not an officially supported property but setting shouldn't cause issues. tag._propertyKey = key; } if (key in proxy) { if (isDevelopingApp() && addMandatorySetter) { (isDevelopingApp() && !(setupMandatorySetter) && assert('[BUG] setupMandatorySetter should be set when debugging', setupMandatorySetter)); setupMandatorySetter(tag, proxy, key); } return tag; } else { let tags = [tag, tagFor(proxy, 'content', meta)]; let content = contentFor(proxy); if (isObject(content)) { tags.push(tagForProperty(content, key, addMandatorySetter)); } return combine(tags); } } /** `Ember.ProxyMixin` forwards all properties not defined by the proxy itself to a proxied `content` object. See ObjectProxy for more details. @class ProxyMixin @namespace Ember @private */ const ProxyMixin = Mixin.create({ /** The object whose properties will be forwarded. @property content @type {unknown} @default null @public */ content: null, init() { this._super(...arguments); setProxy(this); tagForObject(this); setCustomTagFor(this, customTagForProxy); }, willDestroy() { this.set('content', null); this._super(...arguments); }, isTruthy: computed('content', function () { return Boolean(get(this, 'content')); }), unknownProperty(key) { let content = contentFor(this); return content ? get(content, key) : undefined; }, setUnknownProperty(key, value) { let m = meta(this); if (m.isInitializing() || m.isPrototypeMeta(this)) { // if marked as prototype or object is initializing then just // defineProperty rather than delegate defineProperty(this, key, null, value); return value; } let content = contentFor(this); (isDevelopingApp() && !(content) && assert(`Cannot delegate set('${key}', ${value}) to the 'content' property of object proxy ${this}: its 'content' is undefined.`, content)); // SAFETY: We don't actually guarantee that this is an object, so this isn't necessarily safe :( return set(content, key, value); } }); export { contentFor, ProxyMixin as default };