ember-source 4.3.0-alpha.2 → 4.4.0-alpha.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/build-metadata.json +3 -3
- package/dist/dependencies/router_js.js +66 -31
- package/dist/ember-template-compiler.js +1169 -779
- package/dist/ember-template-compiler.map +1 -1
- package/dist/ember-testing.js +74 -43
- package/dist/ember-testing.map +1 -1
- package/dist/ember.debug.js +3290 -2760
- package/dist/ember.debug.map +1 -1
- package/dist/header/license.js +1 -1
- package/dist/packages/@ember/-internals/container/index.js +15 -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 +139 -103
- package/dist/packages/@ember/-internals/meta/lib/meta.js +8 -9
- package/dist/packages/@ember/-internals/metal/index.js +44 -45
- package/dist/packages/@ember/-internals/routing/lib/ext/controller.js +10 -8
- package/dist/packages/@ember/-internals/routing/lib/location/auto_location.js +3 -1
- package/dist/packages/@ember/-internals/routing/lib/services/router.js +155 -190
- 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 +110 -378
- package/dist/packages/@ember/-internals/routing/lib/system/router.js +74 -36
- package/dist/packages/@ember/-internals/routing/lib/utils.js +33 -21
- 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 +10 -8
- package/dist/packages/@ember/-internals/views/lib/system/utils.js +2 -0
- package/dist/packages/@ember/array/index.js +1 -1
- package/dist/packages/@ember/controller/index.js +3 -54
- package/dist/packages/@ember/instrumentation/index.js +9 -13
- package/dist/packages/@ember/object/compat.js +16 -7
- package/dist/packages/@ember/routing/router-service.js +1 -0
- package/dist/packages/@ember/service/index.js +6 -73
- package/dist/packages/ember/version.js +1 -1
- package/docs/data.json +571 -521
- package/package.json +13 -13
|
@@ -1505,7 +1505,11 @@ function installAttributeBinding(component, rootRef, parsed, operations) {
|
|
|
1505
1505
|
operations.setAttribute(attribute, reference, false, null);
|
|
1506
1506
|
}
|
|
1507
1507
|
function createClassNameBindingRef(rootRef, microsyntax, operations) {
|
|
1508
|
-
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
|
+
|
|
1509
1513
|
let isStatic = prop === '';
|
|
1510
1514
|
|
|
1511
1515
|
if (isStatic) {
|
|
@@ -1889,9 +1893,10 @@ var action$1 = internalHelper(args => {
|
|
|
1889
1893
|
// Anything else is an action argument.
|
|
1890
1894
|
|
|
1891
1895
|
let [context, action$$1, ...restArgs] = positional;
|
|
1896
|
+
assert('hash position arguments', context && action$$1);
|
|
1892
1897
|
let debugKey = action$$1.debugLabel;
|
|
1893
|
-
let target = 'target' in named ? named.target : context;
|
|
1894
|
-
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);
|
|
1895
1900
|
let fn$$1;
|
|
1896
1901
|
|
|
1897
1902
|
if (isInvokableRef(action$$1)) {
|
|
@@ -2001,6 +2006,7 @@ function processComponentArgs(namedArgs) {
|
|
|
2001
2006
|
|
|
2002
2007
|
for (let name in namedArgs) {
|
|
2003
2008
|
let ref = namedArgs[name];
|
|
2009
|
+
assert('expected ref', ref);
|
|
2004
2010
|
let value = valueForRef(ref);
|
|
2005
2011
|
let isAction = typeof value === 'function' && ACTIONS.has(value);
|
|
2006
2012
|
|
|
@@ -2064,6 +2070,7 @@ function applyAttributeBindings(attributeBindings, component, rootRef, operation
|
|
|
2064
2070
|
|
|
2065
2071
|
while (i !== -1) {
|
|
2066
2072
|
let binding = attributeBindings[i];
|
|
2073
|
+
assert('has binding', binding);
|
|
2067
2074
|
let parsed = parseAttributeBinding(binding);
|
|
2068
2075
|
let attribute = parsed[1];
|
|
2069
2076
|
|
|
@@ -2090,6 +2097,7 @@ class CurlyComponentManager {
|
|
|
2090
2097
|
layoutName
|
|
2091
2098
|
} = component;
|
|
2092
2099
|
let owner = getOwner(component);
|
|
2100
|
+
assert('Component is unexpectedly missing an owner', owner);
|
|
2093
2101
|
let factory;
|
|
2094
2102
|
|
|
2095
2103
|
if (layout === undefined) {
|
|
@@ -2142,8 +2150,9 @@ class CurlyComponentManager {
|
|
|
2142
2150
|
{
|
|
2143
2151
|
__ARGS__
|
|
2144
2152
|
} = _b,
|
|
2145
|
-
rest = __rest(_b, ["__ARGS__"]);
|
|
2153
|
+
rest = __rest(_b, ["__ARGS__"]);
|
|
2146
2154
|
|
|
2155
|
+
assert('[BUG] unexpectedly missing __ARGS__ after check', __ARGS__); // does this need to be untracked?
|
|
2147
2156
|
|
|
2148
2157
|
let __args__ = valueForRef(__ARGS__);
|
|
2149
2158
|
|
|
@@ -2177,14 +2186,8 @@ class CurlyComponentManager {
|
|
|
2177
2186
|
Object.assign(named, args.named.capture());
|
|
2178
2187
|
|
|
2179
2188
|
for (let i = 0; i < count; i++) {
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
// TS7022: 'name' implicitly has type 'any' because it does not have a type annotation and is
|
|
2183
|
-
// referenced directly or indirectly in its own initializer.
|
|
2184
|
-
//
|
|
2185
|
-
// This is almost certainly a TypeScript bug, feel free to try and remove the annotation after
|
|
2186
|
-
// upgrading if it is not needed anymore.
|
|
2187
|
-
const name = positionalParams[i];
|
|
2189
|
+
let name = positionalParams[i];
|
|
2190
|
+
assert('Expected at least one positional param', name);
|
|
2188
2191
|
assert(`You cannot specify both a positional param (at position ${i}) and the hash argument \`${name}\`.`, !args.named.has(name));
|
|
2189
2192
|
named[name] = args.positional.at(i);
|
|
2190
2193
|
}
|
|
@@ -2444,9 +2447,7 @@ function processComponentInitializationAssertions(component, props) {
|
|
|
2444
2447
|
classNameBindings
|
|
2445
2448
|
} = component;
|
|
2446
2449
|
|
|
2447
|
-
for (let
|
|
2448
|
-
let binding = classNameBindings[i];
|
|
2449
|
-
|
|
2450
|
+
for (let binding of classNameBindings) {
|
|
2450
2451
|
if (binding.split(' ').length > 1) {
|
|
2451
2452
|
return false;
|
|
2452
2453
|
}
|
|
@@ -3160,6 +3161,7 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
|
|
|
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
|
-
```
|
|
3429
|
-
|
|
3430
|
-
```app/components/cost.hbs
|
|
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.
|
|
3478
|
+
const IS_CLASSIC_HELPER = Symbol('IS_CLASSIC_HELPER');
|
|
3437
3479
|
|
|
3438
|
-
|
|
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
|
|
|
@@ -4541,14 +4555,14 @@ var disallowDynamicResolution = internalHelper(({
|
|
|
4541
4555
|
positional,
|
|
4542
4556
|
named
|
|
4543
4557
|
}) => {
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
assert(`[BUG] expecting \`type\` named argument`, 'type' in named);
|
|
4547
|
-
assert(`[BUG] expecting \`loc\` named argument`, 'loc' in named);
|
|
4548
|
-
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);
|
|
4549
4560
|
let typeRef = named.type;
|
|
4550
4561
|
let locRef = named.loc;
|
|
4551
|
-
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?
|
|
4552
4566
|
// assert('[BUG] expecting a string literal for the `type` argument', isConstRef(typeRef));
|
|
4553
4567
|
// assert('[BUG] expecting a string literal for the `loc` argument', isConstRef(locRef));
|
|
4554
4568
|
// assert('[BUG] expecting a string literal for the `original` argument', isConstRef(originalRef));
|
|
@@ -4570,7 +4584,8 @@ let helper$1;
|
|
|
4570
4584
|
|
|
4571
4585
|
if (DEBUG) {
|
|
4572
4586
|
helper$1 = args => {
|
|
4573
|
-
|
|
4587
|
+
const inner = args.positional[0];
|
|
4588
|
+
assert('expected at least one positional arg', inner);
|
|
4574
4589
|
return createComputeRef(() => {
|
|
4575
4590
|
let value = valueForRef(inner);
|
|
4576
4591
|
assert('You cannot pass a null or undefined destination element to in-element', value !== null && value !== undefined);
|
|
@@ -4578,7 +4593,11 @@ if (DEBUG) {
|
|
|
4578
4593
|
});
|
|
4579
4594
|
};
|
|
4580
4595
|
} else {
|
|
4581
|
-
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
|
+
};
|
|
4582
4601
|
}
|
|
4583
4602
|
|
|
4584
4603
|
var inElementNullCheckHelper = internalHelper(helper$1);
|
|
@@ -4587,9 +4606,14 @@ var normalizeClassHelper = internalHelper(({
|
|
|
4587
4606
|
positional
|
|
4588
4607
|
}) => {
|
|
4589
4608
|
return createComputeRef(() => {
|
|
4590
|
-
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('.');
|
|
4591
4613
|
let className = classNameParts[classNameParts.length - 1];
|
|
4592
|
-
|
|
4614
|
+
assert('has className', className); // Always at least one split result
|
|
4615
|
+
|
|
4616
|
+
let value = valueForRef(valueArg);
|
|
4593
4617
|
|
|
4594
4618
|
if (value === true) {
|
|
4595
4619
|
return dasherize(className);
|
|
@@ -4610,7 +4634,7 @@ var resolve = internalHelper(({
|
|
|
4610
4634
|
assert('[BUG] missing owner', owner);
|
|
4611
4635
|
assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1);
|
|
4612
4636
|
let fullNameRef = positional[0];
|
|
4613
|
-
assert('[BUG] expecting a string literal as argument', isConstRef(fullNameRef));
|
|
4637
|
+
assert('[BUG] expecting a string literal as argument', fullNameRef && isConstRef(fullNameRef));
|
|
4614
4638
|
let fullName = valueForRef(fullNameRef);
|
|
4615
4639
|
assert('[BUG] expecting a string literal as argument', typeof fullName === 'string');
|
|
4616
4640
|
assert('[BUG] expecting a valid full name', fullName.split(':').length === 2);
|
|
@@ -4635,7 +4659,8 @@ var resolve = internalHelper(({
|
|
|
4635
4659
|
var trackArray = internalHelper(({
|
|
4636
4660
|
positional
|
|
4637
4661
|
}) => {
|
|
4638
|
-
|
|
4662
|
+
const inner = positional[0];
|
|
4663
|
+
assert('expected at least one positional arg', inner);
|
|
4639
4664
|
return createComputeRef(() => {
|
|
4640
4665
|
let iterable = valueForRef(inner);
|
|
4641
4666
|
|
|
@@ -4727,7 +4752,8 @@ var trackArray = internalHelper(({
|
|
|
4727
4752
|
var mut = internalHelper(({
|
|
4728
4753
|
positional
|
|
4729
4754
|
}) => {
|
|
4730
|
-
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
|
|
4731
4757
|
// cases:
|
|
4732
4758
|
//
|
|
4733
4759
|
// 1. (mut "not a path") – passing a literal, result from a helper
|
|
@@ -4863,7 +4889,9 @@ var mut = internalHelper(({
|
|
|
4863
4889
|
var readonly = internalHelper(({
|
|
4864
4890
|
positional
|
|
4865
4891
|
}) => {
|
|
4866
|
-
|
|
4892
|
+
let firstArg = positional[0];
|
|
4893
|
+
assert('has first arg', firstArg);
|
|
4894
|
+
return createReadOnlyRef(firstArg);
|
|
4867
4895
|
});
|
|
4868
4896
|
|
|
4869
4897
|
/**
|
|
@@ -4902,7 +4930,7 @@ var unbound = internalHelper(({
|
|
|
4902
4930
|
named
|
|
4903
4931
|
}) => {
|
|
4904
4932
|
assert('unbound helper cannot be called with multiple params or hash params', positional.length === 1 && Object.keys(named).length === 0);
|
|
4905
|
-
return createUnboundRef(valueForRef(positional[0]), '(
|
|
4933
|
+
return createUnboundRef(valueForRef(positional[0]), '(result of an `unbound` helper)');
|
|
4906
4934
|
});
|
|
4907
4935
|
|
|
4908
4936
|
const MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];
|
|
@@ -5121,6 +5149,7 @@ class ActionModifierManager {
|
|
|
5121
5149
|
positional
|
|
5122
5150
|
} = actionState;
|
|
5123
5151
|
let actionNameRef = positional[1];
|
|
5152
|
+
assert('Expected at least one positional arg', actionNameRef);
|
|
5124
5153
|
|
|
5125
5154
|
if (!isInvokableRef(actionNameRef)) {
|
|
5126
5155
|
actionState.actionName = valueForRef(actionNameRef);
|
|
@@ -5414,7 +5443,9 @@ const outletHelper = internalHelper((args, owner, scope) => {
|
|
|
5414
5443
|
if (args.positional.length === 0) {
|
|
5415
5444
|
nameRef = createPrimitiveRef('main');
|
|
5416
5445
|
} else {
|
|
5417
|
-
|
|
5446
|
+
let maybeNameRef = args.positional[0];
|
|
5447
|
+
assert('Expected at least one positional arg', maybeNameRef);
|
|
5448
|
+
nameRef = maybeNameRef;
|
|
5418
5449
|
}
|
|
5419
5450
|
|
|
5420
5451
|
let outletRef = createComputeRef(() => {
|
|
@@ -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':
|
|
@@ -356,7 +356,8 @@ export class Meta {
|
|
|
356
356
|
sync
|
|
357
357
|
});
|
|
358
358
|
} else {
|
|
359
|
-
let listener = listeners[i];
|
|
359
|
+
let listener = listeners[i];
|
|
360
|
+
assert('has listener', listener); // If the listener is our own listener and we are trying to remove it, we
|
|
360
361
|
// want to splice it out entirely so we don't hold onto a reference.
|
|
361
362
|
|
|
362
363
|
if (kind === 2
|
|
@@ -447,8 +448,7 @@ export class Meta {
|
|
|
447
448
|
this._inheritedEnd = 0;
|
|
448
449
|
}
|
|
449
450
|
|
|
450
|
-
for (let
|
|
451
|
-
let listener = parentListeners[i];
|
|
451
|
+
for (let listener of parentListeners) {
|
|
452
452
|
let index = indexOfListener(listeners, listener.event, listener.target, listener.method);
|
|
453
453
|
|
|
454
454
|
if (index === -1) {
|
|
@@ -481,10 +481,9 @@ export class Meta {
|
|
|
481
481
|
}
|
|
482
482
|
|
|
483
483
|
if (listeners !== undefined) {
|
|
484
|
-
for (let
|
|
485
|
-
|
|
484
|
+
for (let listener of listeners) {
|
|
485
|
+
// REMOVE listeners are placeholders that tell us not to
|
|
486
486
|
// inherit, so they never match. Only ADD and ONCE can match.
|
|
487
|
-
|
|
488
487
|
if (listener.event === eventName && (listener.kind === 0
|
|
489
488
|
/* ADD */
|
|
490
489
|
|| listener.kind === 1
|
|
@@ -517,10 +516,9 @@ export class Meta {
|
|
|
517
516
|
}
|
|
518
517
|
|
|
519
518
|
if (listeners !== undefined) {
|
|
520
|
-
for (let
|
|
521
|
-
|
|
519
|
+
for (let listener of listeners) {
|
|
520
|
+
// REMOVE listeners are placeholders that tell us not to
|
|
522
521
|
// inherit, so they never match. Only ADD and ONCE can match.
|
|
523
|
-
|
|
524
522
|
if ((listener.kind === 0
|
|
525
523
|
/* ADD */
|
|
526
524
|
|| listener.kind === 1
|
|
@@ -642,6 +640,7 @@ export { counters };
|
|
|
642
640
|
function indexOfListener(listeners, event, target, method) {
|
|
643
641
|
for (let i = listeners.length - 1; i >= 0; i--) {
|
|
644
642
|
let listener = listeners[i];
|
|
643
|
+
assert('has listener', listener);
|
|
645
644
|
|
|
646
645
|
if (listener.event === event && listener.target === target && listener.method === method) {
|
|
647
646
|
return i;
|