dist/ember-runtime.js in ember-source-3.0.0.beta.1 vs dist/ember-runtime.js in ember-source-3.0.0.beta.2

- old
+ new

@@ -4,11 +4,11 @@ * @copyright Copyright 2011-2018 Tilde Inc. and contributors * Portions Copyright 2006-2011 Strobe Inc. * Portions Copyright 2008-2011 Apple Inc. All rights reserved. * @license Licensed under MIT license * See https://raw.github.com/emberjs/ember.js/master/LICENSE - * @version 3.0.0-beta.1 + * @version 3.0.0-beta.2 */ /*globals process */ var enifed, requireModule, Ember; @@ -1138,13 +1138,21 @@ var _console4; return (_console4 = console).info.apply(_console4, arguments); }, debug: function () { - var _console5, _console6; + var _console6; - return console.debug && (_console5 = console).debug.apply(_console5, arguments) || (_console6 = console).info.apply(_console6, arguments); // eslint-disable-line no-console + /* eslint-disable no-console */ + if (console.debug) { + var _console5; + + return (_console5 = console).debug.apply(_console5, arguments); + } + + return (_console6 = console).info.apply(_console6, arguments); + /* eslint-enable no-console */ }, assert: function () { var _console7; return (_console7 = console).assert.apply(_console7, arguments); @@ -1309,16 +1317,15 @@ exports.ENV = ENV; exports.context = context; exports.environment = environment; }); -enifed('ember-metal', ['exports', 'ember-environment', 'ember-utils', 'ember-debug', 'ember/features', 'ember-babel', '@glimmer/reference', 'require', 'backburner', 'ember-console'], function (exports, emberEnvironment, emberUtils, emberDebug, features, emberBabel, reference, require, Backburner, Logger) { +enifed('ember-metal', ['exports', 'ember-environment', 'ember-utils', 'ember-debug', 'ember/features', 'ember-babel', '@glimmer/reference', 'require', 'backburner'], function (exports, emberEnvironment, emberUtils, emberDebug, features, emberBabel, reference, require, Backburner) { 'use strict'; require = require && require.hasOwnProperty('default') ? require['default'] : require; Backburner = Backburner && Backburner.hasOwnProperty('default') ? Backburner['default'] : Backburner; - Logger = Logger && Logger.hasOwnProperty('default') ? Logger['default'] : Logger; /** @module ember */ @@ -2668,11 +2675,11 @@ } else if (features.DESCRIPTOR_TRAP) { // Future traveler, although this code looks scary. It merely exists in // development to aid in development asertions. Production builds of // ember strip this entire branch out. var messageFor = function (obj, keyName, property, value) { - return 'You attempted to access the `' + keyName + '.' + property + '` property ' + ('(of ' + obj + '). Due to certain internal implementation details of Ember, ') + ('the `' + keyName + '` property previously contained an internal "descriptor" ') + ('object (a private API), therefore `' + keyName + '.' + property + '` would have ') + ('been `' + String(value).replace(/\n/g, ' ') + '`. This internal implementation ') + 'detail was never intended to be a public (or even intimate) API.\n\n' + 'This internal implementation detail has now changed and the (still private) ' + '"descriptor" object has been relocated to the object\'s "meta" (also a ' + ('private API). Soon, accessing `' + keyName + '` on this object will ') + 'return the computed value (see RFC #281 for more details).\n\n' + 'If you are seeing this error, you are likely using an addon that ' + 'relies on this now-defunct private implementation detail. If you can, ' + 'find out which addon is doing this from the stack trace below and ' + 'report this bug to the addon authors. If you feel stuck, the Ember ' + 'Community Slack (https://ember-community-slackin.herokuapp.com/) ' + 'may be able to offer some help.\n\n' + 'If you are an addon author and need help transitioning your code, ' + 'please get in touch in the #dev-ember channel in the Ember Community ' + 'Slack.'; + return 'You attempted to access the `' + keyName + '.' + String(property) + '` property ' + ('(of ' + obj + '). Due to certain internal implementation details of Ember, ') + ('the `' + keyName + '` property previously contained an internal "descriptor" ') + ('object (a private API), therefore `' + keyName + '.' + String(property) + '` would have ') + ('been `' + String(value).replace(/\n/g, ' ') + '`. This internal implementation ') + 'detail was never intended to be a public (or even intimate) API.\n\n' + 'This internal implementation detail has now changed and the (still private) ' + '"descriptor" object has been relocated to the object\'s "meta" (also a ' + ('private API). Soon, accessing `' + keyName + '` on this object will ') + 'return the computed value (see RFC #281 for more details).\n\n' + 'If you are seeing this error, you are likely using an addon that ' + 'relies on this now-defunct private implementation detail. If you can, ' + 'find out which addon is doing this from the stack trace below and ' + 'report this bug to the addon authors. If you feel stuck, the Ember ' + 'Community Slack (https://ember-community-slackin.herokuapp.com/) ' + 'may be able to offer some help.\n\n' + 'If you are an addon author and need help transitioning your code, ' + 'please get in touch in the #dev-ember channel in the Ember Community ' + 'Slack.'; }; var trapFor = void 0; if (emberUtils.HAS_NATIVE_PROXY) { @@ -2680,11 +2687,13 @@ trapFor = function (obj, keyName, descriptor) { return new Proxy(descriptor, { get: function (descriptor, property) { if (property === DESCRIPTOR) { return descriptor; - } else if (property === 'toString' || property == 'valueOf' || Symbol && property === Symbol.toPrimitive) { + } else if (property === 'prototype' || property === 'constructor' || property === 'nodeType') { + return undefined; + } else if (property === 'toString' || property === 'valueOf' || property === 'inspect' || Symbol && property === Symbol.toPrimitive || Symbol && property === Symbol.toStringTag) { return function () { return '[COMPUTED PROPERTY]'; }; } @@ -3432,11 +3441,13 @@ this._descriptors = undefined; } this._watching = undefined; this._mixins = undefined; - this._bindings = undefined; + if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) { + this._bindings = undefined; + } this._values = undefined; this._deps = undefined; this._chainWatchers = undefined; this._chains = undefined; this._tag = undefined; @@ -3755,21 +3766,26 @@ pointer = pointer.parent; } }; Meta.prototype.writeBindings = function writeBindings(subkey, value) { + true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.writeBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT); true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot add a binding for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed()); var map = this._getOrCreateOwnMap('_bindings'); map[subkey] = value; }; Meta.prototype.peekBindings = function peekBindings(subkey) { + true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.peekBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT); + return this._findInherited('_bindings', subkey); }; Meta.prototype.forEachBindings = function forEachBindings(fn) { + true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.forEachBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT); + var pointer = this; var seen = void 0; while (pointer !== undefined) { var map = pointer._bindings; if (map !== undefined) { @@ -3784,10 +3800,11 @@ pointer = pointer.parent; } }; Meta.prototype.clearBindings = function clearBindings() { + true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.clearBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT); true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot clear bindings on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed()); this._bindings = undefined; }; @@ -4141,18 +4158,10 @@ function isPath(path) { return firstDotIndexCache.get(path) !== -1; } - function getFirstKey(path) { - return firstKeyCache.get(path); - } - - function getTailPath(path) { - return tailPathCache.get(path); - } - /** @module @ember/object */ var ALLOWABLE_TYPES = { @@ -7120,493 +7129,10 @@ }); return properties; } /** - @module ember - */ - - // .......................................................... - // BINDING - // - - var Binding = function () { - function Binding(toPath, fromPath) { - emberBabel.classCallCheck(this, Binding); - - // Configuration - this._from = fromPath; - this._to = toPath; - this._oneWay = undefined; - - // State - this._direction = undefined; - this._readyToSync = undefined; - this._fromObj = undefined; - this._fromPath = undefined; - this._toObj = undefined; - } - - /** - @class Binding - @namespace Ember - @deprecated See https://emberjs.com/deprecations/v2.x#toc_ember-binding - @public - */ - - /** - This copies the Binding so it can be connected to another object. - @method copy - @return {Ember.Binding} `this` - @public - */ - - Binding.prototype.copy = function copy() { - var copy = new Binding(this._to, this._from); - if (this._oneWay) { - copy._oneWay = true; - } - return copy; - }; - - // .......................................................... - // CONFIG - // - - /** - This will set `from` property path to the specified value. It will not - attempt to resolve this property path to an actual object until you - connect the binding. - The binding will search for the property path starting at the root object - you pass when you `connect()` the binding. It follows the same rules as - `get()` - see that method for more information. - @method from - @param {String} path The property path to connect to. - @return {Ember.Binding} `this` - @public - */ - - Binding.prototype.from = function from(path) { - this._from = path; - return this; - }; - - /** - This will set the `to` property path to the specified value. It will not - attempt to resolve this property path to an actual object until you - connect the binding. - The binding will search for the property path starting at the root object - you pass when you `connect()` the binding. It follows the same rules as - `get()` - see that method for more information. - @method to - @param {String|Tuple} path A property path or tuple. - @return {Ember.Binding} `this` - @public - */ - - Binding.prototype.to = function to(path) { - this._to = path; - return this; - }; - - /** - Configures the binding as one way. A one-way binding will relay changes - on the `from` side to the `to` side, but not the other way around. This - means that if you change the `to` side directly, the `from` side may have - a different value. - @method oneWay - @return {Ember.Binding} `this` - @public - */ - - Binding.prototype.oneWay = function oneWay() { - this._oneWay = true; - return this; - }; - - /** - @method toString - @return {String} string representation of binding - @public - */ - - Binding.prototype.toString = function toString$$1() { - var oneWay = this._oneWay ? '[oneWay]' : ''; - return 'Ember.Binding<' + emberUtils.guidFor(this) + '>(' + this._from + ' -> ' + this._to + ')' + oneWay; - }; - - // .......................................................... - // CONNECT AND SYNC - // - - /** - Attempts to connect this binding instance so that it can receive and relay - changes. This method will raise an exception if you have not set the - from/to properties yet. - @method connect - @param {Object} obj The root object for this binding. - @return {Ember.Binding} `this` - @public - */ - - Binding.prototype.connect = function connect(obj) { - true && !!!obj && emberDebug.assert('Must pass a valid object to Ember.Binding.connect()', !!obj); - - var fromObj = void 0, - fromPath = void 0, - possibleGlobal = void 0; - - // If the binding's "from" path could be interpreted as a global, verify - // whether the path refers to a global or not by consulting `Ember.lookup`. - if (isGlobalPath(this._from)) { - var name = getFirstKey(this._from); - possibleGlobal = emberEnvironment.context.lookup[name]; - - if (possibleGlobal) { - fromObj = possibleGlobal; - fromPath = getTailPath(this._from); - } - } - - if (fromObj === undefined) { - fromObj = obj; - fromPath = this._from; - } - - trySet(obj, this._to, get(fromObj, fromPath)); - - // Add an observer on the object to be notified when the binding should be updated. - addObserver(fromObj, fromPath, this, 'fromDidChange'); - - // If the binding is a two-way binding, also set up an observer on the target. - if (!this._oneWay) { - addObserver(obj, this._to, this, 'toDidChange'); - } - - addListener(obj, 'willDestroy', this, 'disconnect'); - - fireDeprecations(obj, this._to, this._from, possibleGlobal, this._oneWay, !possibleGlobal && !this._oneWay); - - this._readyToSync = true; - this._fromObj = fromObj; - this._fromPath = fromPath; - this._toObj = obj; - - return this; - }; - - /** - Disconnects the binding instance. Changes will no longer be relayed. You - will not usually need to call this method. - @method disconnect - @return {Ember.Binding} `this` - @public - */ - - Binding.prototype.disconnect = function disconnect() { - true && !!!this._toObj && emberDebug.assert('Must pass a valid object to Ember.Binding.disconnect()', !!this._toObj); - - // Remove an observer on the object so we're no longer notified of - // changes that should update bindings. - - removeObserver(this._fromObj, this._fromPath, this, 'fromDidChange'); - - // If the binding is two-way, remove the observer from the target as well. - if (!this._oneWay) { - removeObserver(this._toObj, this._to, this, 'toDidChange'); - } - - this._readyToSync = false; // Disable scheduled syncs... - return this; - }; - - // .......................................................... - // PRIVATE - // - - /* Called when the from side changes. */ - - Binding.prototype.fromDidChange = function fromDidChange(target) { - // eslint-disable-line no-unused-vars - this._scheduleSync('fwd'); - }; - - /* Called when the to side changes. */ - - Binding.prototype.toDidChange = function toDidChange(target) { - // eslint-disable-line no-unused-vars - this._scheduleSync('back'); - }; - - Binding.prototype._scheduleSync = function _scheduleSync(dir) { - var existingDir = this._direction; - - // If we haven't scheduled the binding yet, schedule it. - if (existingDir === undefined) { - run.schedule('sync', this, '_sync'); - this._direction = dir; - } - - // If both a 'back' and 'fwd' sync have been scheduled on the same object, - // default to a 'fwd' sync so that it remains deterministic. - if (existingDir === 'back' && dir === 'fwd') { - this._direction = 'fwd'; - } - }; - - Binding.prototype._sync = function _sync() { - var log = emberEnvironment.ENV.LOG_BINDINGS; - - var toObj = this._toObj; - - // Don't synchronize destroyed objects or disconnected bindings. - if (toObj.isDestroyed || !this._readyToSync) { - return; - } - - // Get the direction of the binding for the object we are - // synchronizing from. - var direction = this._direction; - - var fromObj = this._fromObj; - var fromPath = this._fromPath; - - this._direction = undefined; - - // If we're synchronizing from the remote object... - if (direction === 'fwd') { - var fromValue = get(fromObj, fromPath); - if (log) { - Logger.log(' ', this.toString(), '->', fromValue, fromObj); - } - if (this._oneWay) { - trySet(toObj, this._to, fromValue); - } else { - _suspendObserver(toObj, this._to, this, 'toDidChange', function () { - trySet(toObj, this._to, fromValue); - }); - } - // If we're synchronizing *to* the remote object. - } else if (direction === 'back') { - var toValue = get(toObj, this._to); - if (log) { - Logger.log(' ', this.toString(), '<-', toValue, toObj); - } - _suspendObserver(fromObj, fromPath, this, 'fromDidChange', function () { - trySet(fromObj, fromPath, toValue); - }); - } - }; - - return Binding; - }(); - - function fireDeprecations(obj, toPath, fromPath, deprecateGlobal, deprecateOneWay, deprecateAlias) { - var deprecateGlobalMessage = '`Ember.Binding` is deprecated. Since you' + ' are binding to a global consider using a service instead.'; - var deprecateOneWayMessage = '`Ember.Binding` is deprecated. Since you' + ' are using a `oneWay` binding consider using a `readOnly` computed' + ' property instead.'; - var deprecateAliasMessage = '`Ember.Binding` is deprecated. Consider' + ' using an `alias` computed property instead.'; - - var objectInfo = 'The `' + toPath + '` property of `' + obj + '` is an `Ember.Binding` connected to `' + fromPath + '`, but '; - true && !!deprecateGlobal && emberDebug.deprecate(objectInfo + deprecateGlobalMessage, !deprecateGlobal, { - id: 'ember-metal.binding', - until: '3.0.0', - url: 'https://emberjs.com/deprecations/v2.x#toc_ember-binding' - }); - true && !!deprecateOneWay && emberDebug.deprecate(objectInfo + deprecateOneWayMessage, !deprecateOneWay, { - id: 'ember-metal.binding', - until: '3.0.0', - url: 'https://emberjs.com/deprecations/v2.x#toc_ember-binding' - }); - true && !!deprecateAlias && emberDebug.deprecate(objectInfo + deprecateAliasMessage, !deprecateAlias, { - id: 'ember-metal.binding', - until: '3.0.0', - url: 'https://emberjs.com/deprecations/v2.x#toc_ember-binding' - }); - } - - function mixinProperties$1(to, from) { - for (var key in from) { - if (from.hasOwnProperty(key)) { - to[key] = from[key]; - } - } - } - - mixinProperties$1(Binding, { - - /* - See `Ember.Binding.from`. - @method from - @static - */ - from: function (from) { - var C = this; - return new C(undefined, from); - }, - - /* - See `Ember.Binding.to`. - @method to - @static - */ - to: function (to) { - var C = this; - return new C(to, undefined); - } - }); - /** - An `Ember.Binding` connects the properties of two objects so that whenever - the value of one property changes, the other property will be changed also. - - ## Automatic Creation of Bindings with `/^*Binding/`-named Properties. - - You do not usually create Binding objects directly but instead describe - bindings in your class or object definition using automatic binding - detection. - - Properties ending in a `Binding` suffix will be converted to `Ember.Binding` - instances. The value of this property should be a string representing a path - to another object or a custom binding instance created using Binding helpers - (see "One Way Bindings"): - - ``` - valueBinding: "MyApp.someController.title" - ``` - - This will create a binding from `MyApp.someController.title` to the `value` - property of your object instance automatically. Now the two values will be - kept in sync. - - ## One Way Bindings - - One especially useful binding customization you can use is the `oneWay()` - helper. This helper tells Ember that you are only interested in - receiving changes on the object you are binding from. For example, if you - are binding to a preference and you want to be notified if the preference - has changed, but your object will not be changing the preference itself, you - could do: - - ``` - bigTitlesBinding: Ember.Binding.oneWay("MyApp.preferencesController.bigTitles") - ``` - - This way if the value of `MyApp.preferencesController.bigTitles` changes the - `bigTitles` property of your object will change also. However, if you - change the value of your `bigTitles` property, it will not update the - `preferencesController`. - - One way bindings are almost twice as fast to setup and twice as fast to - execute because the binding only has to worry about changes to one side. - - You should consider using one way bindings anytime you have an object that - may be created frequently and you do not intend to change a property; only - to monitor it for changes (such as in the example above). - - ## Adding Bindings Manually - - All of the examples above show you how to configure a custom binding, but the - result of these customizations will be a binding template, not a fully active - Binding instance. The binding will actually become active only when you - instantiate the object the binding belongs to. It is useful, however, to - understand what actually happens when the binding is activated. - - For a binding to function it must have at least a `from` property and a `to` - property. The `from` property path points to the object/key that you want to - bind from while the `to` path points to the object/key you want to bind to. - - When you define a custom binding, you are usually describing the property - you want to bind from (such as `MyApp.someController.value` in the examples - above). When your object is created, it will automatically assign the value - you want to bind `to` based on the name of your binding key. In the - examples above, during init, Ember objects will effectively call - something like this on your binding: - - ```javascript - binding = Ember.Binding.from("valueBinding").to("value"); - ``` - - This creates a new binding instance based on the template you provide, and - sets the to path to the `value` property of the new object. Now that the - binding is fully configured with a `from` and a `to`, it simply needs to be - connected to become active. This is done through the `connect()` method: - - ```javascript - binding.connect(this); - ``` - - Note that when you connect a binding you pass the object you want it to be - connected to. This object will be used as the root for both the from and - to side of the binding when inspecting relative paths. This allows the - binding to be automatically inherited by subclassed objects as well. - - This also allows you to bind between objects using the paths you declare in - `from` and `to`: - - ```javascript - // Example 1 - binding = Ember.Binding.from("App.someObject.value").to("value"); - binding.connect(this); - - // Example 2 - binding = Ember.Binding.from("parentView.value").to("App.someObject.value"); - binding.connect(this); - ``` - - Now that the binding is connected, it will observe both the from and to side - and relay changes. - - If you ever needed to do so (you almost never will, but it is useful to - understand this anyway), you could manually create an active binding by - using the `Ember.bind()` helper method. (This is the same method used by - to setup your bindings on objects): - - ```javascript - Ember.bind(MyApp.anotherObject, "value", "MyApp.someController.value"); - ``` - - Both of these code fragments have the same effect as doing the most friendly - form of binding creation like so: - - ```javascript - MyApp.anotherObject = Ember.Object.create({ - valueBinding: "MyApp.someController.value", - - // OTHER CODE FOR THIS OBJECT... - }); - ``` - - Ember's built in binding creation method makes it easy to automatically - create bindings for you. You should always use the highest-level APIs - available, even if you understand how it works underneath. - - @class Binding - @namespace Ember - @since Ember 0.9 - @public - */ - // Ember.Binding = Binding; ES6TODO: where to put this? - - - /** - Global helper method to create a new binding. Just pass the root object - along with a `to` and `from` path to create and connect the binding. - - @method bind - @for Ember - @param {Object} obj The root object of the transform. - @param {String} to The path to the 'to' side of the binding. - Must be relative to obj. - @param {String} from The path to the 'from' side of the binding. - Must be relative to obj or a global path. - @return {Ember.Binding} binding instance - @public - */ - function bind(obj, to, from) { - return new Binding(to, from).connect(obj); - } - - /** @module @ember/object */ var a_concat = Array.prototype.concat; var isArray = Array.isArray; @@ -7836,44 +7362,10 @@ } } } } - function detectBinding(key) { - var length = key.length; - - return length > 7 && key.charCodeAt(length - 7) === 66 && key.indexOf('inding', length - 6) !== -1; - } - // warm both paths of above function - detectBinding('notbound'); - detectBinding('fooBinding'); - - function connectBindings(obj, meta$$1) { - // TODO Mixin.apply(instance) should disconnect binding if exists - meta$$1.forEachBindings(function (key, binding) { - if (binding) { - var to = key.slice(0, -7); // strip Binding off end - if (binding instanceof Binding) { - binding = binding.copy(); // copy prototypes' instance - binding.to(to); - } else { - // binding is string path - binding = new Binding(to, binding); - } - binding.connect(obj); - obj[key] = binding; - } - }); - // mark as applied - meta$$1.clearBindings(); - } - - function finishPartial(obj, meta$$1) { - connectBindings(obj, meta$$1 === undefined ? meta(obj) : meta$$1); - return obj; - } - function followAlias(obj, desc, descs, values) { var altKey = desc.methodName; var value = void 0; var possibleDesc = void 0; if (descs[altKey] || values[altKey]) { @@ -7959,20 +7451,20 @@ replaceObserversAndListeners(obj, key, null, value); } else { replaceObserversAndListeners(obj, key, obj[key], value); } - if (detectBinding(key)) { + if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && Mixin.detectBinding(key)) { meta$$1.writeBindings(key, value); } defineProperty(obj, key, desc, value, meta$$1); } - if (!partial) { + if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && !partial) { // don't apply to prototype - finishPartial(obj, meta$$1); + Mixin.finishPartial(obj, meta$$1); } return obj; } @@ -8247,11 +7739,16 @@ return Mixin; }(); Mixin._apply = applyMixin; - Mixin.finishPartial = finishPartial; + if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) { + // slotting this so that the legacy addon can add the function here + // without triggering an error due to the Object.seal done below + Mixin.finishPartial = null; + Mixin.detectBinding = null; + } var MixinPrototype = Mixin.prototype; MixinPrototype.toString = Object.toString; emberDebug.debugSeal(MixinPrototype); @@ -8670,12 +8167,9 @@ exports.observer = observer; exports.required = required; exports.REQUIRED = REQUIRED; exports.hasUnprocessedMixins = hasUnprocessedMixins; exports.clearUnprocessedMixins = clearUnprocessedMixins; - exports.detectBinding = detectBinding; - exports.Binding = Binding; - exports.bind = bind; exports.isGlobalPath = isGlobalPath; exports.InjectedProperty = InjectedProperty; exports.setHasViews = setHasViews; exports.tagForProperty = tagForProperty; exports.tagFor = tagFor;