ember-source 4.3.0-alpha.1 → 4.3.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -2
- package/blueprints/component-addon/index.js +2 -3
- package/blueprints/component-class-addon/index.js +2 -3
- package/blueprints/controller/files/__root__/__path__/__name__.js +2 -2
- package/blueprints/controller/index.js +2 -4
- package/blueprints/route/files/__root__/__path__/__name__.js +3 -3
- package/blueprints/route/index.js +2 -3
- package/blueprints/service/files/__root__/__path__/__name__.js +2 -2
- package/blueprints/service/index.js +2 -4
- package/build-metadata.json +3 -3
- package/dist/dependencies/router_js.js +66 -31
- package/dist/ember-template-compiler.js +1250 -861
- package/dist/ember-template-compiler.map +1 -1
- package/dist/ember-testing.js +88 -56
- package/dist/ember-testing.map +1 -1
- package/dist/ember.debug.js +3712 -3159
- package/dist/ember.debug.map +1 -1
- package/dist/header/license.js +1 -1
- package/dist/header/loader.js +0 -1
- package/dist/packages/@ember/-internals/bootstrap/index.js +0 -2
- package/dist/packages/@ember/-internals/container/index.js +16 -11
- package/dist/packages/@ember/-internals/extension-support/lib/container_debug_adapter.js +3 -3
- package/dist/packages/@ember/-internals/extension-support/lib/data_adapter.js +52 -52
- package/dist/packages/@ember/-internals/glimmer/index.js +161 -125
- package/dist/packages/@ember/-internals/meta/lib/meta.js +67 -11
- package/dist/packages/@ember/-internals/metal/index.js +95 -121
- package/dist/packages/@ember/-internals/routing/lib/ext/controller.js +24 -12
- package/dist/packages/@ember/-internals/routing/lib/location/api.js +1 -0
- package/dist/packages/@ember/-internals/routing/lib/location/auto_location.js +3 -1
- package/dist/packages/@ember/-internals/routing/lib/services/router.js +117 -197
- package/dist/packages/@ember/-internals/routing/lib/services/routing.js +3 -1
- package/dist/packages/@ember/-internals/routing/lib/system/route-info.js +2 -2
- package/dist/packages/@ember/-internals/routing/lib/system/route.js +147 -402
- package/dist/packages/@ember/-internals/routing/lib/system/router.js +82 -40
- package/dist/packages/@ember/-internals/routing/lib/utils.js +48 -25
- package/dist/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +1 -1
- package/dist/packages/@ember/-internals/runtime/lib/mixins/array.js +1 -0
- package/dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js +4 -4
- package/dist/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js +29 -29
- package/dist/packages/@ember/-internals/runtime/lib/mixins/promise_proxy.js +16 -16
- package/dist/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js +48 -48
- package/dist/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +8 -8
- package/dist/packages/@ember/-internals/runtime/lib/system/namespace.js +1 -2
- package/dist/packages/@ember/-internals/runtime/lib/type-of.js +1 -1
- package/dist/packages/@ember/-internals/utils/index.js +11 -9
- package/dist/packages/@ember/-internals/views/lib/mixins/view_support.js +2 -4
- package/dist/packages/@ember/-internals/views/lib/system/utils.js +2 -0
- package/dist/packages/@ember/application/lib/application.js +0 -2
- package/dist/packages/@ember/array/index.js +1 -1
- package/dist/packages/@ember/canary-features/index.js +2 -2
- package/dist/packages/@ember/controller/index.js +3 -54
- package/dist/packages/@ember/debug/index.js +1 -1
- package/dist/packages/@ember/debug/lib/deprecate.js +12 -10
- package/dist/packages/@ember/instrumentation/index.js +9 -13
- package/dist/packages/@ember/object/compat.js +16 -7
- package/dist/packages/@ember/polyfills/lib/assign.js +1 -0
- package/dist/packages/@ember/routing/router-service.js +1 -0
- package/dist/packages/@ember/runloop/index.js +9 -9
- package/dist/packages/@ember/service/index.js +6 -73
- package/dist/packages/@ember/string/index.js +1 -0
- package/dist/packages/ember/index.js +1 -2
- package/dist/packages/ember/version.js +1 -1
- package/docs/data.json +2588 -1839
- package/package.json +27 -27
- package/blueprints/component-addon/native-files/__root__/__path__/__name__.js +0 -1
- package/blueprints/component-class-addon/native-files/__root__/__path__/__name__.js +0 -1
- package/blueprints/controller/native-files/__root__/__path__/__name__.js +0 -4
- package/blueprints/edition-detector.js +0 -13
- package/blueprints/route/native-files/__root__/__path__/__name__.js +0 -11
- package/blueprints/route/native-files/__root__/__templatepath__/__templatename__.hbs +0 -2
- package/blueprints/service/native-files/__root__/__path__/__name__.js +0 -4
|
@@ -2,11 +2,11 @@ import { templateFactory, programCompilationContext } from '@glimmer/opcode-comp
|
|
|
2
2
|
export { templateFactory as template, templateCacheCounters } from '@glimmer/opcode-compiler';
|
|
3
3
|
import { setOwner, getOwner } from '@ember/-internals/owner';
|
|
4
4
|
import { guidFor, symbol, enumerableSymbol, getDebugName, isProxy, isEmberArray, isObject, uuid } from '@ember/-internals/utils';
|
|
5
|
-
import { assert, warn, debugFreeze, deprecate } from '@ember/debug';
|
|
5
|
+
import { assert, warn, debugFreeze, inspect, deprecate } from '@ember/debug';
|
|
6
6
|
import { setComponentTemplate, setInternalComponentManager, setInternalHelperManager, getInternalHelperManager, helperCapabilities, setHelperManager, capabilityFlagsFrom, setInternalModifierManager, getComponentTemplate, getInternalComponentManager, componentCapabilities, modifierCapabilities, setComponentManager } from '@glimmer/manager';
|
|
7
7
|
import { createConstRef, isConstRef, valueForRef, isUpdatableRef, updateRef, childRefFor, childRefFromParts, createComputeRef, createPrimitiveRef, createUnboundRef, isInvokableRef, createInvokableRef, createReadOnlyRef, createDebugAliasRef, UNDEFINED_REFERENCE } from '@glimmer/reference';
|
|
8
8
|
import { untrack, consumeTag, createCache, getValue, tagFor, beginUntrackFrame, endUntrackFrame, valueForTag, beginTrackFrame, endTrackFrame, validateTag, createTag, dirtyTag, CONSTANT_TAG, isTracking, setTrackingTransactionEnv, createUpdatableTag, CURRENT_TAG } from '@glimmer/validator';
|
|
9
|
-
import { tracked, get, PROPERTY_DID_CHANGE, tagForObject, objectAt, tagForProperty, _getProp, _setProp
|
|
9
|
+
import { tracked, get, PROPERTY_DID_CHANGE, tagForObject, objectAt, tagForProperty, set, _getProp, _setProp } from '@ember/-internals/metal';
|
|
10
10
|
import { action } from '@ember/object';
|
|
11
11
|
import { hasDOM } from '@ember/-internals/browser-environment';
|
|
12
12
|
import { isSimpleClick, clearElementView, clearViewElement, getViewElement, MUTABLE_CELL, addChildView, setElementView, setViewElement, ActionSupport, ChildViewsSupport, ClassNamesSupport, CoreView, ViewMixin, ViewStateSupport, constructStyleDeprecationMessage, ActionManager, getViewId } from '@ember/-internals/views';
|
|
@@ -16,9 +16,9 @@ import { service } from '@ember/service';
|
|
|
16
16
|
import { DEBUG } from '@glimmer/env';
|
|
17
17
|
import { dasherize } from '@ember/string';
|
|
18
18
|
import { registerDestructor, associateDestroyableChild, destroy } from '@glimmer/destroyable';
|
|
19
|
-
import { join,
|
|
19
|
+
import { join, schedule, _backburner, _getCurrentRunLoop } from '@ember/runloop';
|
|
20
20
|
import { _WeakSet, EMPTY_ARRAY, unwrapTemplate, dict } from '@glimmer/util';
|
|
21
|
-
import { reifyPositional, normalizeProperty, EMPTY_ARGS, createCapturedArgs, curry, EMPTY_POSITIONAL, array, concat, fn, get as get$1, hash, on,
|
|
21
|
+
import { reifyPositional, normalizeProperty, EMPTY_ARGS, createCapturedArgs, curry, EMPTY_POSITIONAL, array, concat, fn, get as get$1, hash, on, templateOnlyComponent, TEMPLATE_ONLY_COMPONENT_MANAGER, clientBuilder, DOMChanges, DOMTreeConstruction, inTransaction, renderMain, runtimeContext, rehydrationBuilder } from '@glimmer/runtime';
|
|
22
22
|
export { DOMChanges, DOMTreeConstruction, isSerializationFirstNode } from '@glimmer/runtime';
|
|
23
23
|
import { TargetActionSupport, FrameworkObject, _contentFor, isArray } from '@ember/-internals/runtime';
|
|
24
24
|
import { ENV } from '@ember/-internals/environment';
|
|
@@ -975,9 +975,15 @@ class LinkTo extends InternalComponent {
|
|
|
975
975
|
try {
|
|
976
976
|
return routing.generateURL(route, models, query);
|
|
977
977
|
} catch (e) {
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
978
|
+
let details = e instanceof Error ? e.message : inspect(e);
|
|
979
|
+
let message = `While generating link to route "${route}": ${details}`;
|
|
980
|
+
|
|
981
|
+
if (e instanceof Error) {
|
|
982
|
+
e.message = message;
|
|
983
|
+
throw e;
|
|
984
|
+
} else {
|
|
985
|
+
throw message;
|
|
986
|
+
}
|
|
981
987
|
}
|
|
982
988
|
} else {
|
|
983
989
|
return routing.generateURL(route, models, query);
|
|
@@ -1023,8 +1029,7 @@ class LinkTo extends InternalComponent {
|
|
|
1023
1029
|
transition: undefined
|
|
1024
1030
|
};
|
|
1025
1031
|
flaggedInstrument('interaction.link-to', payload, () => {
|
|
1026
|
-
assert('[BUG] route can only be missing if isLoading is true', isPresent(route));
|
|
1027
|
-
|
|
1032
|
+
assert('[BUG] route can only be missing if isLoading is true', isPresent(route));
|
|
1028
1033
|
payload.transition = routing.transitionTo(route, models, query, replace);
|
|
1029
1034
|
});
|
|
1030
1035
|
}
|
|
@@ -1054,8 +1059,7 @@ class LinkTo extends InternalComponent {
|
|
|
1054
1059
|
} else {
|
|
1055
1060
|
return EMPTY_ARRAY$1;
|
|
1056
1061
|
}
|
|
1057
|
-
}
|
|
1058
|
-
|
|
1062
|
+
}
|
|
1059
1063
|
|
|
1060
1064
|
get query() {
|
|
1061
1065
|
if ('query' in this.args.named) {
|
|
@@ -1155,8 +1159,7 @@ class LinkTo extends InternalComponent {
|
|
|
1155
1159
|
query,
|
|
1156
1160
|
routing
|
|
1157
1161
|
} = this;
|
|
1158
|
-
assert('[BUG] route can only be missing if isLoading is true', isPresent(route));
|
|
1159
|
-
|
|
1162
|
+
assert('[BUG] route can only be missing if isLoading is true', isPresent(route));
|
|
1160
1163
|
return routing.isActiveForRoute(models, query, route, state);
|
|
1161
1164
|
}
|
|
1162
1165
|
}
|
|
@@ -1491,8 +1494,8 @@ function installAttributeBinding(component, rootRef, parsed, operations) {
|
|
|
1491
1494
|
elementId = component.elementId;
|
|
1492
1495
|
}
|
|
1493
1496
|
|
|
1494
|
-
|
|
1495
|
-
operations.setAttribute('id',
|
|
1497
|
+
let elementIdRef = createPrimitiveRef(elementId);
|
|
1498
|
+
operations.setAttribute('id', elementIdRef, true, null);
|
|
1496
1499
|
return;
|
|
1497
1500
|
}
|
|
1498
1501
|
|
|
@@ -1502,7 +1505,11 @@ function installAttributeBinding(component, rootRef, parsed, operations) {
|
|
|
1502
1505
|
operations.setAttribute(attribute, reference, false, null);
|
|
1503
1506
|
}
|
|
1504
1507
|
function createClassNameBindingRef(rootRef, microsyntax, operations) {
|
|
1505
|
-
let
|
|
1508
|
+
let parts = microsyntax.split(':');
|
|
1509
|
+
let [prop, truthy, falsy] = parts; // NOTE: This could be an empty string
|
|
1510
|
+
|
|
1511
|
+
assert('has prop', prop !== undefined); // Will always have at least one part
|
|
1512
|
+
|
|
1506
1513
|
let isStatic = prop === '';
|
|
1507
1514
|
|
|
1508
1515
|
if (isStatic) {
|
|
@@ -1886,9 +1893,10 @@ var action$1 = internalHelper(args => {
|
|
|
1886
1893
|
// Anything else is an action argument.
|
|
1887
1894
|
|
|
1888
1895
|
let [context, action$$1, ...restArgs] = positional;
|
|
1896
|
+
assert('hash position arguments', context && action$$1);
|
|
1889
1897
|
let debugKey = action$$1.debugLabel;
|
|
1890
|
-
let target = 'target' in named ? named.target : context;
|
|
1891
|
-
let processArgs = makeArgsProcessor('value' in named && named.value, restArgs);
|
|
1898
|
+
let target = 'target' in named && named.target ? named.target : context;
|
|
1899
|
+
let processArgs = makeArgsProcessor('value' in named && named.value || false, restArgs);
|
|
1892
1900
|
let fn$$1;
|
|
1893
1901
|
|
|
1894
1902
|
if (isInvokableRef(action$$1)) {
|
|
@@ -1962,7 +1970,6 @@ function makeClosureAction(context, target, action$$1, processArgs, debugKey) {
|
|
|
1962
1970
|
self = context;
|
|
1963
1971
|
fn$$1 = action$$1;
|
|
1964
1972
|
} else {
|
|
1965
|
-
// tslint:disable-next-line:max-line-length
|
|
1966
1973
|
assert(`An action could not be made for \`${debugKey || action$$1}\` in ${target}. Please confirm that you are using either a quoted action name (i.e. \`(action '${debugKey || 'myAction'}')\`) or a function available in ${target}.`, false);
|
|
1967
1974
|
}
|
|
1968
1975
|
|
|
@@ -1999,6 +2006,7 @@ function processComponentArgs(namedArgs) {
|
|
|
1999
2006
|
|
|
2000
2007
|
for (let name in namedArgs) {
|
|
2001
2008
|
let ref = namedArgs[name];
|
|
2009
|
+
assert('expected ref', ref);
|
|
2002
2010
|
let value = valueForRef(ref);
|
|
2003
2011
|
let isAction = typeof value === 'function' && ACTIONS.has(value);
|
|
2004
2012
|
|
|
@@ -2048,7 +2056,6 @@ const EMBER_VIEW_REF = createPrimitiveRef('ember-view');
|
|
|
2048
2056
|
|
|
2049
2057
|
function aliasIdToElementId(args, props) {
|
|
2050
2058
|
if (args.named.has('id')) {
|
|
2051
|
-
// tslint:disable-next-line:max-line-length
|
|
2052
2059
|
assert(`You cannot invoke a component with both 'id' and 'elementId' at the same time.`, !args.named.has('elementId'));
|
|
2053
2060
|
props.elementId = props.id;
|
|
2054
2061
|
}
|
|
@@ -2063,6 +2070,7 @@ function applyAttributeBindings(attributeBindings, component, rootRef, operation
|
|
|
2063
2070
|
|
|
2064
2071
|
while (i !== -1) {
|
|
2065
2072
|
let binding = attributeBindings[i];
|
|
2073
|
+
assert('has binding', binding);
|
|
2066
2074
|
let parsed = parseAttributeBinding(binding);
|
|
2067
2075
|
let attribute = parsed[1];
|
|
2068
2076
|
|
|
@@ -2089,6 +2097,7 @@ class CurlyComponentManager {
|
|
|
2089
2097
|
layoutName
|
|
2090
2098
|
} = component;
|
|
2091
2099
|
let owner = getOwner(component);
|
|
2100
|
+
assert('Component is unexpectedly missing an owner', owner);
|
|
2092
2101
|
let factory;
|
|
2093
2102
|
|
|
2094
2103
|
if (layout === undefined) {
|
|
@@ -2141,8 +2150,9 @@ class CurlyComponentManager {
|
|
|
2141
2150
|
{
|
|
2142
2151
|
__ARGS__
|
|
2143
2152
|
} = _b,
|
|
2144
|
-
rest = __rest(_b, ["__ARGS__"]);
|
|
2153
|
+
rest = __rest(_b, ["__ARGS__"]);
|
|
2145
2154
|
|
|
2155
|
+
assert('[BUG] unexpectedly missing __ARGS__ after check', __ARGS__); // does this need to be untracked?
|
|
2146
2156
|
|
|
2147
2157
|
let __args__ = valueForRef(__ARGS__);
|
|
2148
2158
|
|
|
@@ -2176,14 +2186,8 @@ class CurlyComponentManager {
|
|
|
2176
2186
|
Object.assign(named, args.named.capture());
|
|
2177
2187
|
|
|
2178
2188
|
for (let i = 0; i < count; i++) {
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
// TS7022: 'name' implicitly has type 'any' because it does not have a type annotation and is
|
|
2182
|
-
// referenced directly or indirectly in its own initializer.
|
|
2183
|
-
//
|
|
2184
|
-
// This is almost certainly a TypeScript bug, feel free to try and remove the annotation after
|
|
2185
|
-
// upgrading if it is not needed anymore.
|
|
2186
|
-
const name = positionalParams[i];
|
|
2189
|
+
let name = positionalParams[i];
|
|
2190
|
+
assert('Expected at least one positional param', name);
|
|
2187
2191
|
assert(`You cannot specify both a positional param (at position ${i}) and the hash argument \`${name}\`.`, !args.named.has(name));
|
|
2188
2192
|
named[name] = args.positional.at(i);
|
|
2189
2193
|
}
|
|
@@ -2443,9 +2447,7 @@ function processComponentInitializationAssertions(component, props) {
|
|
|
2443
2447
|
classNameBindings
|
|
2444
2448
|
} = component;
|
|
2445
2449
|
|
|
2446
|
-
for (let
|
|
2447
|
-
let binding = classNameBindings[i];
|
|
2448
|
-
|
|
2450
|
+
for (let binding of classNameBindings) {
|
|
2449
2451
|
if (binding.split(' ').length > 1) {
|
|
2450
2452
|
return false;
|
|
2451
2453
|
}
|
|
@@ -3141,7 +3143,7 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
|
|
|
3141
3143
|
|
|
3142
3144
|
if (DEBUG && eventDispatcher && this.renderer._isInteractive && this.tagName === '') {
|
|
3143
3145
|
let eventNames = [];
|
|
3144
|
-
let events = eventDispatcher.finalEventNameMapping;
|
|
3146
|
+
let events = eventDispatcher.finalEventNameMapping;
|
|
3145
3147
|
|
|
3146
3148
|
for (let key in events) {
|
|
3147
3149
|
let methodName = events[key];
|
|
@@ -3152,14 +3154,14 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
|
|
|
3152
3154
|
} // If in a tagless component, assert that no event handlers are defined
|
|
3153
3155
|
|
|
3154
3156
|
|
|
3155
|
-
assert(
|
|
3156
|
-
`You can not define \`${eventNames}\` function(s) to handle DOM event in the \`${this}\` tagless component since it doesn't have any DOM element.`, !eventNames.length);
|
|
3157
|
+
assert(`You can not define \`${eventNames}\` function(s) to handle DOM event in the \`${this}\` tagless component since it doesn't have any DOM element.`, !eventNames.length);
|
|
3157
3158
|
}
|
|
3158
3159
|
},
|
|
3159
3160
|
|
|
3160
3161
|
get _dispatcher() {
|
|
3161
3162
|
if (this.__dispatcher === undefined) {
|
|
3162
3163
|
let owner = getOwner(this);
|
|
3164
|
+
assert('Component is unexpectedly missing an owner', owner);
|
|
3163
3165
|
|
|
3164
3166
|
if (owner.lookup('-environment:main').isInteractive) {
|
|
3165
3167
|
this.__dispatcher = owner.lookup('event_dispatcher:main');
|
|
@@ -3404,6 +3406,59 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
|
|
|
3404
3406
|
@since 1.13.0
|
|
3405
3407
|
*/
|
|
3406
3408
|
didUpdate() {}
|
|
3409
|
+
/**
|
|
3410
|
+
Called when the component has updated and rerendered itself.
|
|
3411
|
+
Called only during a rerender, not during an initial render.
|
|
3412
|
+
@event didUpdate
|
|
3413
|
+
@public
|
|
3414
|
+
@since 1.13.0
|
|
3415
|
+
*/
|
|
3416
|
+
|
|
3417
|
+
/**
|
|
3418
|
+
Layout can be used to wrap content in a component.
|
|
3419
|
+
@property layout
|
|
3420
|
+
@type Function
|
|
3421
|
+
@public
|
|
3422
|
+
*/
|
|
3423
|
+
|
|
3424
|
+
/**
|
|
3425
|
+
The name of the layout to lookup if no layout is provided.
|
|
3426
|
+
By default `Component` will lookup a template with this name in
|
|
3427
|
+
`Ember.TEMPLATES` (a shared global object).
|
|
3428
|
+
@property layoutName
|
|
3429
|
+
@type String
|
|
3430
|
+
@default null
|
|
3431
|
+
@private
|
|
3432
|
+
*/
|
|
3433
|
+
|
|
3434
|
+
/**
|
|
3435
|
+
The HTML `id` of the component's element in the DOM. You can provide this
|
|
3436
|
+
value yourself but it must be unique (just as in HTML):
|
|
3437
|
+
```handlebars
|
|
3438
|
+
{{my-component elementId="a-really-cool-id"}}
|
|
3439
|
+
```
|
|
3440
|
+
```handlebars
|
|
3441
|
+
<MyComponent @elementId="a-really-cool-id" />
|
|
3442
|
+
```
|
|
3443
|
+
If not manually set a default value will be provided by the framework.
|
|
3444
|
+
Once rendered an element's `elementId` is considered immutable and you
|
|
3445
|
+
should never change it. If you need to compute a dynamic value for the
|
|
3446
|
+
`elementId`, you should do this when the component or element is being
|
|
3447
|
+
instantiated:
|
|
3448
|
+
```javascript
|
|
3449
|
+
export default Component.extend({
|
|
3450
|
+
init() {
|
|
3451
|
+
this._super(...arguments);
|
|
3452
|
+
var index = this.get('index');
|
|
3453
|
+
this.set('elementId', `component-id${index}`);
|
|
3454
|
+
}
|
|
3455
|
+
});
|
|
3456
|
+
```
|
|
3457
|
+
@property elementId
|
|
3458
|
+
@type String
|
|
3459
|
+
@public
|
|
3460
|
+
*/
|
|
3461
|
+
|
|
3407
3462
|
|
|
3408
3463
|
});
|
|
3409
3464
|
|
|
@@ -3418,60 +3473,15 @@ setInternalComponentManager(CURLY_COMPONENT_MANAGER, Component);
|
|
|
3418
3473
|
/**
|
|
3419
3474
|
@module @ember/component
|
|
3420
3475
|
*/
|
|
3476
|
+
var _a;
|
|
3421
3477
|
const RECOMPUTE_TAG = symbol('RECOMPUTE_TAG');
|
|
3422
|
-
|
|
3423
|
-
Ember Helpers are functions that can compute values, and are used in templates.
|
|
3424
|
-
For example, this code calls a helper named `format-currency`:
|
|
3425
|
-
|
|
3426
|
-
```app/templates/application.hbs
|
|
3427
|
-
<Cost @cents={{230}} />
|
|
3428
|
-
```
|
|
3478
|
+
const IS_CLASSIC_HELPER = Symbol('IS_CLASSIC_HELPER');
|
|
3429
3479
|
|
|
3430
|
-
|
|
3431
|
-
<div>{{format-currency @cents currency="$"}}</div>
|
|
3432
|
-
```
|
|
3433
|
-
|
|
3434
|
-
Additionally a helper can be called as a nested helper.
|
|
3435
|
-
In this example, we show the formatted currency value if the `showMoney`
|
|
3436
|
-
named argument is truthy.
|
|
3437
|
-
|
|
3438
|
-
```handlebars
|
|
3439
|
-
{{if @showMoney (format-currency @cents currency="$")}}
|
|
3440
|
-
```
|
|
3441
|
-
|
|
3442
|
-
Helpers defined using a class must provide a `compute` function. For example:
|
|
3443
|
-
|
|
3444
|
-
```app/helpers/format-currency.js
|
|
3445
|
-
import Helper from '@ember/component/helper';
|
|
3446
|
-
|
|
3447
|
-
export default class extends Helper {
|
|
3448
|
-
compute([cents], { currency }) {
|
|
3449
|
-
return `${currency}${cents * 0.01}`;
|
|
3450
|
-
}
|
|
3451
|
-
}
|
|
3452
|
-
```
|
|
3453
|
-
|
|
3454
|
-
Each time the input to a helper changes, the `compute` function will be
|
|
3455
|
-
called again.
|
|
3456
|
-
|
|
3457
|
-
As instances, these helpers also have access to the container and will accept
|
|
3458
|
-
injected dependencies.
|
|
3459
|
-
|
|
3460
|
-
Additionally, class helpers can call `recompute` to force a new computation.
|
|
3461
|
-
|
|
3462
|
-
@class Helper
|
|
3463
|
-
@extends CoreObject
|
|
3464
|
-
@public
|
|
3465
|
-
@since 1.13.0
|
|
3466
|
-
*/
|
|
3467
|
-
|
|
3468
|
-
let Helper = FrameworkObject.extend({
|
|
3480
|
+
class Helper extends FrameworkObject {
|
|
3469
3481
|
init() {
|
|
3470
|
-
|
|
3471
|
-
|
|
3482
|
+
super.init();
|
|
3472
3483
|
this[RECOMPUTE_TAG] = createTag();
|
|
3473
|
-
}
|
|
3474
|
-
|
|
3484
|
+
}
|
|
3475
3485
|
/**
|
|
3476
3486
|
On a class-based helper, it may be useful to force a recomputation of that
|
|
3477
3487
|
helpers value. This is akin to `rerender` on a component.
|
|
@@ -3495,14 +3505,17 @@ let Helper = FrameworkObject.extend({
|
|
|
3495
3505
|
@public
|
|
3496
3506
|
@since 1.13.0
|
|
3497
3507
|
*/
|
|
3508
|
+
|
|
3509
|
+
|
|
3498
3510
|
recompute() {
|
|
3499
3511
|
join(() => dirtyTag(this[RECOMPUTE_TAG]));
|
|
3500
3512
|
}
|
|
3501
3513
|
|
|
3502
|
-
}
|
|
3503
|
-
|
|
3514
|
+
}
|
|
3515
|
+
|
|
3516
|
+
_a = IS_CLASSIC_HELPER;
|
|
3504
3517
|
Helper.isHelperFactory = true;
|
|
3505
|
-
Helper[
|
|
3518
|
+
Helper[_a] = true;
|
|
3506
3519
|
function isClassicHelper(obj) {
|
|
3507
3520
|
return obj[IS_CLASSIC_HELPER] === true;
|
|
3508
3521
|
}
|
|
@@ -3519,7 +3532,7 @@ class ClassicHelperManager {
|
|
|
3519
3532
|
}
|
|
3520
3533
|
|
|
3521
3534
|
createHelper(definition, args) {
|
|
3522
|
-
let instance = definition
|
|
3535
|
+
let instance = isFactoryManager(definition) ? definition.create() : definition.create(this.ownerInjection);
|
|
3523
3536
|
return {
|
|
3524
3537
|
instance,
|
|
3525
3538
|
args
|
|
@@ -3551,6 +3564,10 @@ class ClassicHelperManager {
|
|
|
3551
3564
|
|
|
3552
3565
|
}
|
|
3553
3566
|
|
|
3567
|
+
function isFactoryManager(obj) {
|
|
3568
|
+
return obj != null && 'class' in obj;
|
|
3569
|
+
}
|
|
3570
|
+
|
|
3554
3571
|
setHelperManager(owner => {
|
|
3555
3572
|
return new ClassicHelperManager(owner);
|
|
3556
3573
|
}, Helper);
|
|
@@ -4131,7 +4148,8 @@ class EachInWrapper {
|
|
|
4131
4148
|
var eachIn = internalHelper(({
|
|
4132
4149
|
positional
|
|
4133
4150
|
}) => {
|
|
4134
|
-
|
|
4151
|
+
const inner = positional[0];
|
|
4152
|
+
assert('expected at least one positional arg', inner);
|
|
4135
4153
|
return createComputeRef(() => {
|
|
4136
4154
|
let iterable = valueForRef(inner);
|
|
4137
4155
|
consumeTag(tagForObject(iterable));
|
|
@@ -4270,18 +4288,14 @@ class ObjectIterator extends BoundedIterator {
|
|
|
4270
4288
|
|
|
4271
4289
|
static fromIndexable(obj) {
|
|
4272
4290
|
let keys = Object.keys(obj);
|
|
4273
|
-
let {
|
|
4274
|
-
length
|
|
4275
|
-
} = keys;
|
|
4276
4291
|
|
|
4277
|
-
if (length === 0) {
|
|
4292
|
+
if (keys.length === 0) {
|
|
4278
4293
|
return null;
|
|
4279
4294
|
} else {
|
|
4280
4295
|
let values = [];
|
|
4281
4296
|
|
|
4282
|
-
for (let
|
|
4297
|
+
for (let key of keys) {
|
|
4283
4298
|
let value;
|
|
4284
|
-
let key = keys[i];
|
|
4285
4299
|
value = obj[key]; // Add the tag of the returned value if it is an array, since arrays
|
|
4286
4300
|
// should always cause updates if they are consumed and then changed
|
|
4287
4301
|
|
|
@@ -4516,6 +4530,7 @@ const VM_DEPRECATION_OVERRIDES = [{
|
|
|
4516
4530
|
until: '4.4.0',
|
|
4517
4531
|
for: 'ember-source',
|
|
4518
4532
|
since: {
|
|
4533
|
+
available: '3.28.0',
|
|
4519
4534
|
enabled: '3.28.0'
|
|
4520
4535
|
}
|
|
4521
4536
|
}];
|
|
@@ -4540,14 +4555,14 @@ var disallowDynamicResolution = internalHelper(({
|
|
|
4540
4555
|
positional,
|
|
4541
4556
|
named
|
|
4542
4557
|
}) => {
|
|
4543
|
-
|
|
4544
|
-
|
|
4545
|
-
assert(`[BUG] expecting \`type\` named argument`, 'type' in named);
|
|
4546
|
-
assert(`[BUG] expecting \`loc\` named argument`, 'loc' in named);
|
|
4547
|
-
assert(`[BUG] expecting \`original\` named argument`, 'original' in named);
|
|
4558
|
+
const nameOrValueRef = positional[0];
|
|
4559
|
+
assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1 && nameOrValueRef);
|
|
4548
4560
|
let typeRef = named.type;
|
|
4549
4561
|
let locRef = named.loc;
|
|
4550
|
-
let originalRef = named.original;
|
|
4562
|
+
let originalRef = named.original;
|
|
4563
|
+
assert(`[BUG] expecting \`type\` named argument`, typeRef);
|
|
4564
|
+
assert(`[BUG] expecting \`loc\` named argument`, locRef);
|
|
4565
|
+
assert(`[BUG] expecting \`original\` named argument`, originalRef); // Bug: why do these fail?
|
|
4551
4566
|
// assert('[BUG] expecting a string literal for the `type` argument', isConstRef(typeRef));
|
|
4552
4567
|
// assert('[BUG] expecting a string literal for the `loc` argument', isConstRef(locRef));
|
|
4553
4568
|
// assert('[BUG] expecting a string literal for the `original` argument', isConstRef(originalRef));
|
|
@@ -4569,7 +4584,8 @@ let helper$1;
|
|
|
4569
4584
|
|
|
4570
4585
|
if (DEBUG) {
|
|
4571
4586
|
helper$1 = args => {
|
|
4572
|
-
|
|
4587
|
+
const inner = args.positional[0];
|
|
4588
|
+
assert('expected at least one positional arg', inner);
|
|
4573
4589
|
return createComputeRef(() => {
|
|
4574
4590
|
let value = valueForRef(inner);
|
|
4575
4591
|
assert('You cannot pass a null or undefined destination element to in-element', value !== null && value !== undefined);
|
|
@@ -4577,7 +4593,11 @@ if (DEBUG) {
|
|
|
4577
4593
|
});
|
|
4578
4594
|
};
|
|
4579
4595
|
} else {
|
|
4580
|
-
helper$1 = args =>
|
|
4596
|
+
helper$1 = args => {
|
|
4597
|
+
let arg = args.positional[0];
|
|
4598
|
+
assert('expected at least one positional arg', arg);
|
|
4599
|
+
return arg;
|
|
4600
|
+
};
|
|
4581
4601
|
}
|
|
4582
4602
|
|
|
4583
4603
|
var inElementNullCheckHelper = internalHelper(helper$1);
|
|
@@ -4586,9 +4606,14 @@ var normalizeClassHelper = internalHelper(({
|
|
|
4586
4606
|
positional
|
|
4587
4607
|
}) => {
|
|
4588
4608
|
return createComputeRef(() => {
|
|
4589
|
-
let
|
|
4609
|
+
let classNameArg = positional[0];
|
|
4610
|
+
let valueArg = positional[1];
|
|
4611
|
+
assert('expected at least two positional args', classNameArg && valueArg);
|
|
4612
|
+
let classNameParts = valueForRef(classNameArg).split('.');
|
|
4590
4613
|
let className = classNameParts[classNameParts.length - 1];
|
|
4591
|
-
|
|
4614
|
+
assert('has className', className); // Always at least one split result
|
|
4615
|
+
|
|
4616
|
+
let value = valueForRef(valueArg);
|
|
4592
4617
|
|
|
4593
4618
|
if (value === true) {
|
|
4594
4619
|
return dasherize(className);
|
|
@@ -4609,7 +4634,7 @@ var resolve = internalHelper(({
|
|
|
4609
4634
|
assert('[BUG] missing owner', owner);
|
|
4610
4635
|
assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1);
|
|
4611
4636
|
let fullNameRef = positional[0];
|
|
4612
|
-
assert('[BUG] expecting a string literal as argument', isConstRef(fullNameRef));
|
|
4637
|
+
assert('[BUG] expecting a string literal as argument', fullNameRef && isConstRef(fullNameRef));
|
|
4613
4638
|
let fullName = valueForRef(fullNameRef);
|
|
4614
4639
|
assert('[BUG] expecting a string literal as argument', typeof fullName === 'string');
|
|
4615
4640
|
assert('[BUG] expecting a valid full name', fullName.split(':').length === 2);
|
|
@@ -4634,7 +4659,8 @@ var resolve = internalHelper(({
|
|
|
4634
4659
|
var trackArray = internalHelper(({
|
|
4635
4660
|
positional
|
|
4636
4661
|
}) => {
|
|
4637
|
-
|
|
4662
|
+
const inner = positional[0];
|
|
4663
|
+
assert('expected at least one positional arg', inner);
|
|
4638
4664
|
return createComputeRef(() => {
|
|
4639
4665
|
let iterable = valueForRef(inner);
|
|
4640
4666
|
|
|
@@ -4726,7 +4752,8 @@ var trackArray = internalHelper(({
|
|
|
4726
4752
|
var mut = internalHelper(({
|
|
4727
4753
|
positional
|
|
4728
4754
|
}) => {
|
|
4729
|
-
let ref = positional[0];
|
|
4755
|
+
let ref = positional[0];
|
|
4756
|
+
assert('expected at least one positional arg', ref); // TODO: Improve this error message. This covers at least two distinct
|
|
4730
4757
|
// cases:
|
|
4731
4758
|
//
|
|
4732
4759
|
// 1. (mut "not a path") – passing a literal, result from a helper
|
|
@@ -4862,7 +4889,9 @@ var mut = internalHelper(({
|
|
|
4862
4889
|
var readonly = internalHelper(({
|
|
4863
4890
|
positional
|
|
4864
4891
|
}) => {
|
|
4865
|
-
|
|
4892
|
+
let firstArg = positional[0];
|
|
4893
|
+
assert('has first arg', firstArg);
|
|
4894
|
+
return createReadOnlyRef(firstArg);
|
|
4866
4895
|
});
|
|
4867
4896
|
|
|
4868
4897
|
/**
|
|
@@ -4901,7 +4930,7 @@ var unbound = internalHelper(({
|
|
|
4901
4930
|
named
|
|
4902
4931
|
}) => {
|
|
4903
4932
|
assert('unbound helper cannot be called with multiple params or hash params', positional.length === 1 && Object.keys(named).length === 0);
|
|
4904
|
-
return createUnboundRef(valueForRef(positional[0]), '(
|
|
4933
|
+
return createUnboundRef(valueForRef(positional[0]), '(result of an `unbound` helper)');
|
|
4905
4934
|
});
|
|
4906
4935
|
|
|
4907
4936
|
const MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];
|
|
@@ -5120,6 +5149,7 @@ class ActionModifierManager {
|
|
|
5120
5149
|
positional
|
|
5121
5150
|
} = actionState;
|
|
5122
5151
|
let actionNameRef = positional[1];
|
|
5152
|
+
assert('Expected at least one positional arg', actionNameRef);
|
|
5123
5153
|
|
|
5124
5154
|
if (!isInvokableRef(actionNameRef)) {
|
|
5125
5155
|
actionState.actionName = valueForRef(actionNameRef);
|
|
@@ -5413,7 +5443,9 @@ const outletHelper = internalHelper((args, owner, scope) => {
|
|
|
5413
5443
|
if (args.positional.length === 0) {
|
|
5414
5444
|
nameRef = createPrimitiveRef('main');
|
|
5415
5445
|
} else {
|
|
5416
|
-
|
|
5446
|
+
let maybeNameRef = args.positional[0];
|
|
5447
|
+
assert('Expected at least one positional arg', maybeNameRef);
|
|
5448
|
+
nameRef = maybeNameRef;
|
|
5417
5449
|
}
|
|
5418
5450
|
|
|
5419
5451
|
let outletRef = createComputeRef(() => {
|
|
@@ -5744,13 +5776,11 @@ class DynamicScope {
|
|
|
5744
5776
|
}
|
|
5745
5777
|
|
|
5746
5778
|
get(key) {
|
|
5747
|
-
// tslint:disable-next-line:max-line-length
|
|
5748
5779
|
assert(`Using \`-get-dynamic-scope\` is only supported for \`outletState\` (you used \`${key}\`).`, key === 'outletState');
|
|
5749
5780
|
return this.outletState;
|
|
5750
5781
|
}
|
|
5751
5782
|
|
|
5752
5783
|
set(key, value) {
|
|
5753
|
-
// tslint:disable-next-line:max-line-length
|
|
5754
5784
|
assert(`Using \`-with-dynamic-scope\` is only supported for \`outletState\` (you used \`${key}\`).`, key === 'outletState');
|
|
5755
5785
|
this.outletState = value;
|
|
5756
5786
|
return value;
|
|
@@ -5773,6 +5803,7 @@ function errorLoopTransaction(fn$$1) {
|
|
|
5773
5803
|
// Noop the function so that we won't keep calling it and causing
|
|
5774
5804
|
// infinite looping failures;
|
|
5775
5805
|
fn$$1 = () => {
|
|
5806
|
+
// eslint-disable-next-line no-console
|
|
5776
5807
|
console.warn('Attempted to rerender, but the Ember application has had an unrecoverable error occur during render. You should reload the application after fixing the cause of the error.');
|
|
5777
5808
|
};
|
|
5778
5809
|
}
|
|
@@ -5854,8 +5885,8 @@ function deregister(renderer) {
|
|
|
5854
5885
|
}
|
|
5855
5886
|
|
|
5856
5887
|
function loopBegin() {
|
|
5857
|
-
for (let
|
|
5858
|
-
|
|
5888
|
+
for (let renderer of renderers) {
|
|
5889
|
+
renderer._scheduleRevalidate();
|
|
5859
5890
|
}
|
|
5860
5891
|
}
|
|
5861
5892
|
|
|
@@ -5900,12 +5931,12 @@ function resolveRenderPromise() {
|
|
|
5900
5931
|
let loops = 0;
|
|
5901
5932
|
|
|
5902
5933
|
function loopEnd() {
|
|
5903
|
-
for (let
|
|
5904
|
-
if (!
|
|
5934
|
+
for (let renderer of renderers) {
|
|
5935
|
+
if (!renderer._isValid()) {
|
|
5905
5936
|
if (loops > ENV._RERENDER_LOOP_LIMIT) {
|
|
5906
5937
|
loops = 0; // TODO: do something better
|
|
5907
5938
|
|
|
5908
|
-
|
|
5939
|
+
renderer.destroy();
|
|
5909
5940
|
throw new Error('infinite rendering invalidation detected');
|
|
5910
5941
|
}
|
|
5911
5942
|
|
|
@@ -5949,12 +5980,13 @@ class Renderer {
|
|
|
5949
5980
|
let {
|
|
5950
5981
|
_viewRegistry
|
|
5951
5982
|
} = props;
|
|
5952
|
-
let document = getOwner(props).lookup('service:-document');
|
|
5953
|
-
let env = getOwner(props).lookup('-environment:main');
|
|
5954
5983
|
let owner = getOwner(props);
|
|
5984
|
+
assert('Renderer is unexpectedly missing an owner', owner);
|
|
5985
|
+
let document = owner.lookup('service:-document');
|
|
5986
|
+
let env = owner.lookup('-environment:main');
|
|
5955
5987
|
let rootTemplate = owner.lookup(privatize`template:-root`);
|
|
5956
5988
|
let builder = owner.lookup('service:-dom-builder');
|
|
5957
|
-
return new this(
|
|
5989
|
+
return new this(owner, document, env, rootTemplate, _viewRegistry, builder);
|
|
5958
5990
|
}
|
|
5959
5991
|
|
|
5960
5992
|
get debugRenderTree() {
|
|
@@ -6027,6 +6059,7 @@ class Renderer {
|
|
|
6027
6059
|
|
|
6028
6060
|
while (i--) {
|
|
6029
6061
|
let root = roots[i];
|
|
6062
|
+
assert('has root', root);
|
|
6030
6063
|
|
|
6031
6064
|
if (root.isFor(view)) {
|
|
6032
6065
|
root.destroy();
|
|
@@ -6098,6 +6131,7 @@ class Renderer {
|
|
|
6098
6131
|
// each root is processed
|
|
6099
6132
|
for (let i = 0; i < roots.length; i++) {
|
|
6100
6133
|
let root = roots[i];
|
|
6134
|
+
assert('has root', root);
|
|
6101
6135
|
|
|
6102
6136
|
if (root.destroyed) {
|
|
6103
6137
|
// add to the list of roots to be removed
|
|
@@ -6160,8 +6194,7 @@ class Renderer {
|
|
|
6160
6194
|
_clearAllRoots() {
|
|
6161
6195
|
let roots = this._roots;
|
|
6162
6196
|
|
|
6163
|
-
for (let
|
|
6164
|
-
let root = roots[i];
|
|
6197
|
+
for (let root of roots) {
|
|
6165
6198
|
root.destroy();
|
|
6166
6199
|
}
|
|
6167
6200
|
|
|
@@ -6282,6 +6315,7 @@ class OutletView {
|
|
|
6282
6315
|
template: templateFactory$$1
|
|
6283
6316
|
} = options;
|
|
6284
6317
|
let owner = getOwner(options);
|
|
6318
|
+
assert('OutletView is unexpectedly missing an owner', owner);
|
|
6285
6319
|
let template = templateFactory$$1(owner);
|
|
6286
6320
|
return new OutletView(_environment, owner, template, namespace);
|
|
6287
6321
|
}
|
|
@@ -6319,7 +6353,9 @@ function setupApplicationRegistry(registry) {
|
|
|
6319
6353
|
// association won't leak
|
|
6320
6354
|
registry.register('service:-dom-builder', {
|
|
6321
6355
|
create(props) {
|
|
6322
|
-
let
|
|
6356
|
+
let owner = getOwner(props);
|
|
6357
|
+
assert('DomBuilderService is unexpectedly missing an owner', owner);
|
|
6358
|
+
let env = owner.lookup('-environment:main');
|
|
6323
6359
|
|
|
6324
6360
|
switch (env._renderMode) {
|
|
6325
6361
|
case 'serialize':
|