From 552d2ac83b87b1f2b623046ad856fa06bd2756d1 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:57:19 -0400 Subject: [PATCH 1/5] refactor(@angular-devkit/schematics): remove usage of custom deepCopy --- .../schematics/tools/schema-option-transform.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/angular_devkit/schematics/tools/schema-option-transform.ts b/packages/angular_devkit/schematics/tools/schema-option-transform.ts index f8198039b7ec..79abe6da6af0 100644 --- a/packages/angular_devkit/schematics/tools/schema-option-transform.ts +++ b/packages/angular_devkit/schematics/tools/schema-option-transform.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { deepCopy, schema } from '@angular-devkit/core'; +import { schema } from '@angular-devkit/core'; import { Observable, from, of as observableOf } from 'rxjs'; import { first, map, mergeMap } from 'rxjs/operators'; import { FileSystemSchematicContext, FileSystemSchematicDescription } from './description'; @@ -28,7 +28,7 @@ export function validateOptionsWithSchema(registry: schema.SchemaRegistry) { context?: FileSystemSchematicContext, ): Observable => { // Prevent a schematic from changing the options object by making a copy of it. - options = deepCopy(options); + options = structuredClone(options); const withPrompts = context ? context.interactive : true; From 652c0fd95075a87dd9f2943672e8b521170c728d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:58:54 -0400 Subject: [PATCH 2/5] refactor(@angular-devkit/core): remove usage of custom deepCopy and deprecate it The custom deepCopy function in @angular-devkit/core is no longer used internally in this package after replacing its usage in registry.ts with the native structuredClone. The function is now marked as deprecated to encourage consumers to migrate to structuredClone, which is supported in modern Node.js versions. --- packages/angular_devkit/core/src/json/schema/registry.ts | 4 ++-- packages/angular_devkit/core/src/utils/object.ts | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/angular_devkit/core/src/json/schema/registry.ts b/packages/angular_devkit/core/src/json/schema/registry.ts index 11632b64f86a..bbdbf0026a2d 100644 --- a/packages/angular_devkit/core/src/json/schema/registry.ts +++ b/packages/angular_devkit/core/src/json/schema/registry.ts @@ -13,7 +13,7 @@ import * as https from 'node:https'; import * as Url from 'node:url'; import { Observable, from, isObservable, lastValueFrom } from 'rxjs'; import { BaseException } from '../../exception'; -import { PartiallyOrderedSet, deepCopy } from '../../utils'; +import { PartiallyOrderedSet } from '../../utils'; import { JsonArray, JsonObject, JsonValue, isJsonObject } from '../utils'; import { JsonPointer, @@ -257,7 +257,7 @@ export class CoreSchemaRegistry implements SchemaRegistry { } } - const schemaCopy = deepCopy(validate.schema as JsonObject); + const schemaCopy = structuredClone(validate.schema as JsonObject); visitJsonSchema(schemaCopy, visitor); return schemaCopy; diff --git a/packages/angular_devkit/core/src/utils/object.ts b/packages/angular_devkit/core/src/utils/object.ts index cc0218023bb0..9e7e5b78d3ad 100644 --- a/packages/angular_devkit/core/src/utils/object.ts +++ b/packages/angular_devkit/core/src/utils/object.ts @@ -8,6 +8,9 @@ const copySymbol = Symbol(); +/** + * @deprecated Use `structuredClone` instead. + */ export function deepCopy(value: T): T { if (Array.isArray(value)) { return value.map((o) => deepCopy(o)) as unknown as T; From d01152477ad647eb9ffa84f1cfd9c60a7fca0bce Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:12:17 -0400 Subject: [PATCH 3/5] refactor(@angular-devkit/architect): remove usage of isPromise The isPromise utility was only used in one place in create-job-handler.ts. It has been replaced with an inline check for thenables. The utility is now marked as deprecated in @angular-devkit/core. --- .../architect/src/jobs/create-job-handler.ts | 7 ++++++- packages/angular_devkit/core/src/utils/lang.ts | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/angular_devkit/architect/src/jobs/create-job-handler.ts b/packages/angular_devkit/architect/src/jobs/create-job-handler.ts index 06aabd61e5f3..6363b7b70767 100644 --- a/packages/angular_devkit/architect/src/jobs/create-job-handler.ts +++ b/packages/angular_devkit/architect/src/jobs/create-job-handler.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { BaseException, JsonValue, isPromise, logging } from '@angular-devkit/core'; +import { BaseException, JsonValue, logging } from '@angular-devkit/core'; import { Observable, Observer, @@ -27,6 +27,11 @@ import { JobOutboundMessageKind, } from './api'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isPromise(obj: any): obj is Promise { + return !!obj && typeof obj.then === 'function'; +} + export class ChannelAlreadyExistException extends BaseException { constructor(name: string) { super(`Channel ${JSON.stringify(name)} already exist.`); diff --git a/packages/angular_devkit/core/src/utils/lang.ts b/packages/angular_devkit/core/src/utils/lang.ts index ffa8f2d034ed..ca59b945cbc8 100644 --- a/packages/angular_devkit/core/src/utils/lang.ts +++ b/packages/angular_devkit/core/src/utils/lang.ts @@ -10,6 +10,8 @@ /** * Determine if the argument is shaped like a Promise + * + * @deprecated Use `typeof obj?.then === 'function'` instead. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export function isPromise(obj: any): obj is Promise { From a6062acdc672fdaf9402a52219f46af1f6180569 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:17:33 -0400 Subject: [PATCH 4/5] refactor(@angular-devkit/core): deprecate deps parameter in SchemaRegistry transforms The deps parameter in addPreTransform and addPostTransform is deprecated. Consumers should ensure that transforms are added in the desired execution order instead of relying on the dependency tracking system, which will be removed in a future version. --- packages/angular_devkit/core/src/json/schema/interface.ts | 4 ++-- packages/angular_devkit/core/src/json/schema/registry.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/angular_devkit/core/src/json/schema/interface.ts b/packages/angular_devkit/core/src/json/schema/interface.ts index 10f89efaf94e..8974746319f7 100644 --- a/packages/angular_devkit/core/src/json/schema/interface.ts +++ b/packages/angular_devkit/core/src/json/schema/interface.ts @@ -85,7 +85,7 @@ export interface SchemaRegistry { /** * Add a transformation step before the validation of any Json. * @param {JsonVisitor} visitor The visitor to transform every value. - * @param {JsonVisitor[]} deps A list of other visitors to run before. + * @param {JsonVisitor[]} deps [Deprecated] A list of other visitors to run before. Add transforms in the desired execution order instead. */ addPreTransform(visitor: JsonVisitor, deps?: JsonVisitor[]): void; @@ -94,7 +94,7 @@ export interface SchemaRegistry { * after the POST, so if transformations are not compatible with the Schema it will not result * in an error. * @param {JsonVisitor} visitor The visitor to transform every value. - * @param {JsonVisitor[]} deps A list of other visitors to run before. + * @param {JsonVisitor[]} deps [Deprecated] A list of other visitors to run before. Add transforms in the desired execution order instead. */ addPostTransform(visitor: JsonVisitor, deps?: JsonVisitor[]): void; } diff --git a/packages/angular_devkit/core/src/json/schema/registry.ts b/packages/angular_devkit/core/src/json/schema/registry.ts index bbdbf0026a2d..d433a41bd460 100644 --- a/packages/angular_devkit/core/src/json/schema/registry.ts +++ b/packages/angular_devkit/core/src/json/schema/registry.ts @@ -171,7 +171,7 @@ export class CoreSchemaRegistry implements SchemaRegistry { /** * Add a transformation step before the validation of any Json. * @param {JsonVisitor} visitor The visitor to transform every value. - * @param {JsonVisitor[]} deps A list of other visitors to run before. + * @param {JsonVisitor[]} deps [Deprecated] A list of other visitors to run before. Add transforms in the desired execution order instead. */ addPreTransform(visitor: JsonVisitor, deps?: JsonVisitor[]): void { this._pre.add(visitor, deps); @@ -182,7 +182,7 @@ export class CoreSchemaRegistry implements SchemaRegistry { * after the POST, so if transformations are not compatible with the Schema it will not result * in an error. * @param {JsonVisitor} visitor The visitor to transform every value. - * @param {JsonVisitor[]} deps A list of other visitors to run before. + * @param {JsonVisitor[]} deps [Deprecated] A list of other visitors to run before. Add transforms in the desired execution order instead. */ addPostTransform(visitor: JsonVisitor, deps?: JsonVisitor[]): void { this._post.add(visitor, deps); From b86b9a8e5818a2cc23767d9b5d1c302dbbf82e2c Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:44:03 -0400 Subject: [PATCH 5/5] refactor(@angular-devkit/core): deprecate PartiallyOrderedSet The PartiallyOrderedSet class was only used to handle dependencies in SchemaRegistry transforms. Since that feature is now deprecated, this class is also marked as deprecated. --- goldens/public-api/angular_devkit/core/index.api.md | 2 +- .../angular_devkit/core/src/utils/partially-ordered-set.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/goldens/public-api/angular_devkit/core/index.api.md b/goldens/public-api/angular_devkit/core/index.api.md index 748faf2bbeb4..a6810f5a8da8 100644 --- a/goldens/public-api/angular_devkit/core/index.api.md +++ b/goldens/public-api/angular_devkit/core/index.api.md @@ -553,7 +553,7 @@ function oneLine(strings: TemplateStringsArray, ...values: any[]): string; // @public (undocumented) function parseJsonPointer(pointer: JsonPointer): string[]; -// @public (undocumented) +// @public export class PartiallyOrderedSet { // (undocumented) [Symbol.iterator](): IterableIterator; diff --git a/packages/angular_devkit/core/src/utils/partially-ordered-set.ts b/packages/angular_devkit/core/src/utils/partially-ordered-set.ts index 297210c6ff89..21e3fb5c5410 100644 --- a/packages/angular_devkit/core/src/utils/partially-ordered-set.ts +++ b/packages/angular_devkit/core/src/utils/partially-ordered-set.ts @@ -19,6 +19,9 @@ export class CircularDependencyFoundException extends BaseException { } } +/** + * @deprecated Use standard arrays and ensure correct insertion order instead. + */ export class PartiallyOrderedSet { private _items = new Map>();