Skip to content

Commit 942dca8

Browse files
authored
Merge pull request #19940 from wagenet/routing-types
Future public @ember/routing types
2 parents 0678c2d + a47efb0 commit 942dca8

95 files changed

Lines changed: 1671 additions & 854 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
"rollup-plugin-commonjs": "^9.3.4",
141141
"rollup-plugin-node-resolve": "^4.2.4",
142142
"route-recognizer": "^0.3.4",
143-
"router_js": "^7.3.0",
143+
"router_js": "^8.0.1",
144144
"rsvp": "^4.8.5",
145145
"serve-static": "^1.14.1",
146146
"simple-dom": "^1.4.0",

packages/@ember/-internals/container/lib/container.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,9 +407,9 @@ function destroyDestroyables(container: Container): void {
407407
let cache = container.cache;
408408
let keys = Object.keys(cache);
409409

410-
for (let i = 0; i < keys.length; i++) {
411-
let key = keys[i];
410+
for (let key of keys) {
412411
let value = cache[key];
412+
assert('has cached value', value);
413413

414414
if (value.destroy) {
415415
value.destroy();

packages/@ember/-internals/container/lib/registry.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ export interface IRegistry {
2828
fullName: string,
2929
optionName: K
3030
): TypeOptions[K] | undefined;
31-
getOptions(fullName: string): TypeOptions;
32-
getOptionsForType(type: string): TypeOptions;
31+
getOptions(fullName: string): TypeOptions | undefined;
32+
getOptionsForType(type: string): TypeOptions | undefined;
3333
knownForType(type: string): KnownForTypeResult;
3434
makeToString<T, C>(factory: Factory<T, C>, fullName: string): string;
3535
normalizeFullName(fullName: string): string;
@@ -396,7 +396,7 @@ export default class Registry implements IRegistry {
396396
this._typeOptions[type] = options;
397397
}
398398

399-
getOptionsForType(type: string): TypeOptions {
399+
getOptionsForType(type: string): TypeOptions | undefined {
400400
let optionsForType = this._typeOptions[type];
401401
if (optionsForType === undefined && this.fallback !== null) {
402402
optionsForType = this.fallback.getOptionsForType(type);
@@ -415,7 +415,7 @@ export default class Registry implements IRegistry {
415415
this._options[normalizedName] = options;
416416
}
417417

418-
getOptions(fullName: string): TypeOptions {
418+
getOptions(fullName: string): TypeOptions | undefined {
419419
let normalizedName = this.normalize(fullName);
420420
let options = this._options[normalizedName];
421421

@@ -436,6 +436,7 @@ export default class Registry implements IRegistry {
436436
}
437437

438438
let type = fullName.split(':')[0];
439+
assert('has type', type); // split always will have at least one value
439440
options = this._typeOptions[type];
440441

441442
if (options && options[optionName] !== undefined) {
@@ -484,8 +485,7 @@ export default class Registry implements IRegistry {
484485
knownForType(type: string): KnownForTypeResult {
485486
let localKnown = dictionary(null);
486487
let registeredNames = Object.keys(this.registrations);
487-
for (let index = 0; index < registeredNames.length; index++) {
488-
let fullName = registeredNames[index];
488+
for (let fullName of registeredNames) {
489489
let itemType = fullName.split(':')[0];
490490

491491
if (itemType === type) {
@@ -522,7 +522,9 @@ if (DEBUG) {
522522

523523
for (let key in hash) {
524524
if (Object.prototype.hasOwnProperty.call(hash, key)) {
525-
let { specifier } = hash[key];
525+
let value = hash[key];
526+
assert('has value', value);
527+
let { specifier } = value;
526528
assert(
527529
`Expected a proper full name, given '${specifier}'`,
528530
this.isValidFullName(specifier)
@@ -543,9 +545,8 @@ if (DEBUG) {
543545
return;
544546
}
545547

546-
for (let i = 0; i < injections.length; i++) {
547-
let { specifier } = injections[i];
548-
548+
for (let injection of injections) {
549+
let { specifier } = injection;
549550
assert(`Attempting to inject an unknown injection: '${specifier}'`, this.has(specifier));
550551
}
551552
};
@@ -589,6 +590,8 @@ const privateNames: { [key: string]: string } = dictionary(null);
589590
const privateSuffix = `${Math.random()}${Date.now()}`.replace('.', '');
590591

591592
export function privatize([fullName]: TemplateStringsArray): string {
593+
assert('has a single string argument', arguments.length === 1 && fullName);
594+
592595
let name = privateNames[fullName];
593596
if (name) {
594597
return name;

packages/@ember/-internals/glimmer/lib/component-managers/curly.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ function applyAttributeBindings(
8585

8686
while (i !== -1) {
8787
let binding = attributeBindings[i];
88+
assert('has binding', binding);
8889
let parsed: [string, string, boolean] = parseAttributeBinding(binding);
8990
let attribute = parsed[1];
9091

@@ -174,6 +175,7 @@ export default class CurlyComponentManager
174175
);
175176

176177
let { __ARGS__, ...rest } = args.named.capture();
178+
assert('[BUG] unexpectedly missing __ARGS__ after check', __ARGS__);
177179

178180
// does this need to be untracked?
179181
let __args__ = valueForRef(__ARGS__) as CapturedArguments;
@@ -215,14 +217,8 @@ export default class CurlyComponentManager
215217
Object.assign(named, args.named.capture());
216218

217219
for (let i = 0; i < count; i++) {
218-
// As of TS 3.7, tsc is giving us the following error on this line without the type annotation
219-
//
220-
// TS7022: 'name' implicitly has type 'any' because it does not have a type annotation and is
221-
// referenced directly or indirectly in its own initializer.
222-
//
223-
// This is almost certainly a TypeScript bug, feel free to try and remove the annotation after
224-
// upgrading if it is not needed anymore.
225-
const name: string = positionalParams[i];
220+
let name = positionalParams[i];
221+
assert('Expected at least one positional param', name);
226222

227223
assert(
228224
`You cannot specify both a positional param (at position ${i}) and the hash argument \`${name}\`.`,
@@ -495,8 +491,7 @@ export function processComponentInitializationAssertions(component: Component, p
495491
`classNameBindings must not have spaces in them: ${component}`,
496492
(() => {
497493
let { classNameBindings } = component;
498-
for (let i = 0; i < classNameBindings.length; i++) {
499-
let binding = classNameBindings[i];
494+
for (let binding of classNameBindings) {
500495
if (binding.split(' ').length > 1) {
501496
return false;
502497
}

packages/@ember/-internals/glimmer/lib/components/link-to.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Owner } from '@ember/-internals/owner';
2-
import { RouterState, RoutingService } from '@ember/-internals/routing';
2+
import { Route, RouterState, RoutingService } from '@ember/-internals/routing';
33
import { isSimpleClick } from '@ember/-internals/views';
44
import { assert, debugFreeze, inspect, warn } from '@ember/debug';
55
import { EngineInstance, getEngineParent } from '@ember/engine';
@@ -274,7 +274,7 @@ class LinkTo extends InternalComponent {
274274
return 'LinkTo';
275275
}
276276

277-
@service('-routing') private declare routing: RoutingService;
277+
@service('-routing') private declare routing: RoutingService<Route>;
278278

279279
validateArguments(): void {
280280
assert(
@@ -466,12 +466,12 @@ class LinkTo extends InternalComponent {
466466
}
467467

468468
private get isActive(): boolean {
469-
return this.isActiveForState(this.routing.currentState as Maybe<RouterState>);
469+
return this.isActiveForState(this.routing.currentState as Maybe<RouterState<Route>>);
470470
}
471471

472472
private get willBeActive(): Option<boolean> {
473-
let current = this.routing.currentState as Maybe<RouterState>;
474-
let target = this.routing.targetState as Maybe<RouterState>;
473+
let current = this.routing.currentState as Maybe<RouterState<Route>>;
474+
let target = this.routing.targetState as Maybe<RouterState<Route>>;
475475

476476
if (current === target) {
477477
return null;
@@ -525,7 +525,7 @@ class LinkTo extends InternalComponent {
525525
}
526526
}
527527

528-
private isActiveForState(state: Maybe<RouterState>): boolean {
528+
private isActiveForState(state: Maybe<RouterState<Route>>): boolean {
529529
if (!isPresent(state)) {
530530
return false;
531531
}

packages/@ember/-internals/glimmer/lib/helpers/-disallow-dynamic-resolution.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,21 @@ import { createComputeRef, valueForRef } from '@glimmer/reference';
77
import { internalHelper } from './internal-helper';
88

99
export default internalHelper(({ positional, named }: CapturedArguments) => {
10+
const nameOrValueRef = positional[0];
11+
1012
assert(
1113
`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`,
12-
positional.length === 1
14+
positional.length === 1 && nameOrValueRef
1315
);
1416

15-
let nameOrValueRef = positional[0];
16-
17-
assert(`[BUG] expecting \`type\` named argument`, 'type' in named);
18-
assert(`[BUG] expecting \`loc\` named argument`, 'loc' in named);
19-
assert(`[BUG] expecting \`original\` named argument`, 'original' in named);
20-
2117
let typeRef = named.type;
2218
let locRef = named.loc;
2319
let originalRef = named.original;
2420

21+
assert(`[BUG] expecting \`type\` named argument`, typeRef);
22+
assert(`[BUG] expecting \`loc\` named argument`, locRef);
23+
assert(`[BUG] expecting \`original\` named argument`, originalRef);
24+
2525
// Bug: why do these fail?
2626
// assert('[BUG] expecting a string literal for the `type` argument', isConstRef(typeRef));
2727
// assert('[BUG] expecting a string literal for the `loc` argument', isConstRef(locRef));

packages/@ember/-internals/glimmer/lib/helpers/-in-element-null-check.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ let helper: Helper;
88

99
if (DEBUG) {
1010
helper = (args: CapturedArguments) => {
11-
let inner = args.positional[0];
11+
const inner = args.positional[0];
12+
assert('expected at least one positional arg', inner);
1213

1314
return createComputeRef(() => {
1415
let value = valueForRef(inner);
@@ -22,7 +23,11 @@ if (DEBUG) {
2223
});
2324
};
2425
} else {
25-
helper = (args: CapturedArguments) => args.positional[0];
26+
helper = (args: CapturedArguments) => {
27+
let arg = args.positional[0];
28+
assert('expected at least one positional arg', arg);
29+
return arg;
30+
};
2631
}
2732

2833
export default internalHelper(helper);

packages/@ember/-internals/glimmer/lib/helpers/-normalize-class.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
1+
import { assert } from '@ember/debug';
12
import { dasherize } from '@ember/string';
23
import { CapturedArguments } from '@glimmer/interfaces';
34
import { createComputeRef, valueForRef } from '@glimmer/reference';
45
import { internalHelper } from './internal-helper';
56

67
export default internalHelper(({ positional }: CapturedArguments) => {
78
return createComputeRef(() => {
8-
let classNameParts = (valueForRef(positional[0]) as string).split('.');
9+
let classNameArg = positional[0];
10+
let valueArg = positional[1];
11+
assert('expected at least two positional args', classNameArg && valueArg);
12+
13+
let classNameParts = (valueForRef(classNameArg) as string).split('.');
914
let className = classNameParts[classNameParts.length - 1];
10-
let value = valueForRef(positional[1]);
15+
assert('has className', className); // Always at least one split result
16+
let value = valueForRef(valueArg);
1117

1218
if (value === true) {
1319
return dasherize(className);

packages/@ember/-internals/glimmer/lib/helpers/-resolve.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default internalHelper(({ positional }: CapturedArguments, owner: Owner |
1919

2020
let fullNameRef = positional[0];
2121

22-
assert('[BUG] expecting a string literal as argument', isConstRef(fullNameRef));
22+
assert('[BUG] expecting a string literal as argument', fullNameRef && isConstRef(fullNameRef));
2323

2424
let fullName = valueForRef(fullNameRef);
2525

packages/@ember/-internals/glimmer/lib/helpers/-track-array.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*/
44
import { tagForProperty } from '@ember/-internals/metal';
55
import { isObject } from '@ember/-internals/utils';
6+
import { assert } from '@ember/debug';
67
import { CapturedArguments } from '@glimmer/interfaces';
78
import { createComputeRef, valueForRef } from '@glimmer/reference';
89
import { consumeTag } from '@glimmer/validator';
@@ -14,7 +15,8 @@ import { internalHelper } from './internal-helper';
1415
transform at build time, similar to the (-each-in) helper
1516
*/
1617
export default internalHelper(({ positional }: CapturedArguments) => {
17-
let inner = positional[0];
18+
const inner = positional[0];
19+
assert('expected at least one positional arg', inner);
1820

1921
return createComputeRef(() => {
2022
let iterable = valueForRef(inner);

0 commit comments

Comments
 (0)