From bc85551bfce735493054489acb31426b4875e602 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Mon, 22 Jan 2024 09:12:44 -0800 Subject: [PATCH] fix(router): revert commit that replaced `last` helper with native `Array.at(-1)` (#54021) While `Array.at` is technically supported in all browsers we officially support, the change was needlessly breaking without any real benefit. PR Close #54021 --- .../core/test/bundling/router/bundle.golden_symbols.json | 3 +++ packages/router/src/create_url_tree.ts | 4 ++-- packages/router/src/utils/collection.ts | 7 +++++++ packages/router/src/utils/config_matching.ts | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index b3c9d87c001..10629a5ad93 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -1583,6 +1583,9 @@ { "name": "last" }, + { + "name": "last3" + }, { "name": "lastNodeWasCreated" }, diff --git a/packages/router/src/create_url_tree.ts b/packages/router/src/create_url_tree.ts index 42ef1222693..361c2e52a76 100644 --- a/packages/router/src/create_url_tree.ts +++ b/packages/router/src/create_url_tree.ts @@ -12,7 +12,7 @@ import {RuntimeErrorCode} from './errors'; import {ActivatedRouteSnapshot} from './router_state'; import {Params, PRIMARY_OUTLET} from './shared'; import {createRoot, squashSegmentGroup, UrlSegment, UrlSegmentGroup, UrlTree} from './url_tree'; -import {shallowEqual} from './utils/collection'; +import {last, shallowEqual} from './utils/collection'; /** @@ -187,7 +187,7 @@ class Navigation { } const cmdWithOutlet = commands.find(isCommandWithOutlets); - if (cmdWithOutlet && cmdWithOutlet !== commands.at(-1)) { + if (cmdWithOutlet && cmdWithOutlet !== last(commands)) { throw new RuntimeError( RuntimeErrorCode.MISPLACED_OUTLETS_COMMAND, (typeof ngDevMode === 'undefined' || ngDevMode) && diff --git a/packages/router/src/utils/collection.ts b/packages/router/src/utils/collection.ts index 7be405ec8d1..b6cd8ec59aa 100644 --- a/packages/router/src/utils/collection.ts +++ b/packages/router/src/utils/collection.ts @@ -57,6 +57,13 @@ export function equalArraysOrString(a: string|string[], b: string|string[]) { } } +/** + * Return the last element of an array. + */ +export function last(a: T[]): T|null { + return a.length > 0 ? a[a.length - 1] : null; +} + export function wrapIntoObservable(value: T|Promise|Observable): Observable { if (isObservable(value)) { return value; diff --git a/packages/router/src/utils/config_matching.ts b/packages/router/src/utils/config_matching.ts index 25b5b6a1e6c..14e81364084 100644 --- a/packages/router/src/utils/config_matching.ts +++ b/packages/router/src/utils/config_matching.ts @@ -15,6 +15,7 @@ import {runCanMatchGuards} from '../operators/check_guards'; import {defaultUrlMatcher, PRIMARY_OUTLET} from '../shared'; import {UrlSegment, UrlSegmentGroup, UrlSerializer} from '../url_tree'; +import {last} from './collection'; import {getOrCreateRouteInjectorIfNeeded, getOutlet} from './config'; export interface MatchResult { @@ -95,7 +96,7 @@ export function match( function createWildcardMatchResult(segments: UrlSegment[]): MatchResult { return { matched: true, - parameters: segments.at(-1)?.parameters ?? {}, + parameters: segments.length > 0 ? last(segments)!.parameters : {}, consumedSegments: segments, remainingSegments: [], positionalParamSegments: {},