@angular/core 22.0.0-next.8 → 22.0.0-rc.0
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/fesm2022/_attribute-chunk.mjs +1 -1
- package/fesm2022/_debug_node-chunk.mjs +1051 -985
- package/fesm2022/_debug_node-chunk.mjs.map +1 -1
- package/fesm2022/_effect-chunk.mjs +1 -1
- package/fesm2022/_not_found-chunk.mjs +1 -1
- package/fesm2022/_pending_tasks-chunk.mjs +150 -36
- package/fesm2022/_pending_tasks-chunk.mjs.map +1 -1
- package/fesm2022/_resource-chunk.mjs +56 -18
- package/fesm2022/_resource-chunk.mjs.map +1 -1
- package/fesm2022/_untracked-chunk.mjs +1 -1
- package/fesm2022/_weak_ref-chunk.mjs +1 -1
- package/fesm2022/core.mjs +139 -79
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/primitives-di.mjs +1 -1
- package/fesm2022/primitives-event-dispatch.mjs +1 -1
- package/fesm2022/primitives-signals.mjs +1 -1
- package/fesm2022/rxjs-interop.mjs +1 -1
- package/fesm2022/rxjs-interop.mjs.map +1 -1
- package/fesm2022/testing.mjs +47 -3
- package/fesm2022/testing.mjs.map +1 -1
- package/package.json +7 -3
- package/schematics/bundles/apply_import_manager-CxA_YYgB.cjs +1 -1
- package/schematics/bundles/can-match-snapshot-required.cjs +1 -1
- package/schematics/bundles/change-detection-eager.cjs +1 -1
- package/schematics/bundles/cleanup-unused-imports.cjs +1 -1
- package/schematics/bundles/common-to-standalone-migration.cjs +1 -1
- package/schematics/bundles/compiler_host-CY14HvaP.cjs +1 -1
- package/schematics/bundles/control-flow-migration.cjs +1 -1
- package/schematics/bundles/http-xhr-backend.cjs +1 -1
- package/schematics/bundles/imports-CKV-ITqD.cjs +1 -1
- package/schematics/bundles/incremental-hydration.cjs +10 -7
- package/schematics/bundles/{index-DADA7AvC.cjs → index-DxFMpcXS.cjs} +7 -2
- package/schematics/bundles/inject-migration.cjs +1 -1
- package/schematics/bundles/json-file-Drblb4E1.cjs +1 -1
- package/schematics/bundles/leading_space-BTPRV0wu.cjs +1 -1
- package/schematics/bundles/{migrate_ts_type_references-B9LlDDUg.cjs → migrate_ts_type_references-DMv-GSuu.cjs} +28 -10
- package/schematics/bundles/model-output.cjs +200 -0
- package/schematics/bundles/ng_component_template-DPAF1aEA.cjs +1 -1
- package/schematics/bundles/ng_decorators-IVztR9rk.cjs +1 -1
- package/schematics/bundles/ngclass-to-class-migration.cjs +14 -6
- package/schematics/bundles/ngstyle-to-style-migration.cjs +1 -1
- package/schematics/bundles/nodes-ZSQ7WZRB.cjs +1 -1
- package/schematics/bundles/output-migration.cjs +2 -2
- package/schematics/bundles/parse_html-C8eKA9px.cjs +1 -1
- package/schematics/bundles/project_paths-D2V-Uh2L.cjs +1 -1
- package/schematics/bundles/project_tsconfig_paths-DkkMibv-.cjs +1 -1
- package/schematics/bundles/property_name-BCpALNpZ.cjs +1 -1
- package/schematics/bundles/route-lazy-loading.cjs +1 -1
- package/schematics/bundles/router-testing-module-migration.cjs +1 -1
- package/schematics/bundles/safe-optional-chaining.cjs +570 -0
- package/schematics/bundles/self-closing-tags-migration.cjs +1 -1
- package/schematics/bundles/signal-input-migration.cjs +3 -3
- package/schematics/bundles/signal-queries-migration.cjs +3 -3
- package/schematics/bundles/signals.cjs +3 -3
- package/schematics/bundles/standalone-migration.cjs +1 -1
- package/schematics/bundles/strict-safe-navigation-narrow.cjs +1 -1
- package/schematics/bundles/strict-templates-default.cjs +1 -1
- package/schematics/migrations.json +10 -0
- package/third_party/@mcp-b/webmcp-types/LICENSE +21 -0
- package/third_party/@mcp-b/webmcp-types/dist/common.d.ts +297 -0
- package/third_party/@mcp-b/webmcp-types/dist/json-schema.d.ts +196 -0
- package/third_party/@mcp-b/webmcp-types/index.d.ts +9 -0
- package/types/_api-chunk.d.ts +23 -14
- package/types/_chrome_dev_tools_performance-chunk.d.ts +1 -1
- package/types/_debug_node-chunk.d.ts +1 -1
- package/types/_effect-chunk.d.ts +1 -1
- package/types/_event_dispatcher-chunk.d.ts +1 -1
- package/types/_formatter-chunk.d.ts +1 -1
- package/types/_weak_ref-chunk.d.ts +1 -1
- package/types/core.d.ts +3379 -3064
- package/types/primitives-di.d.ts +1 -1
- package/types/primitives-event-dispatch.d.ts +1 -1
- package/types/primitives-signals.d.ts +1 -1
- package/types/rxjs-interop.d.ts +4 -4
- package/types/testing.d.ts +1 -1
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/core",
|
|
3
|
-
"version": "22.0.0-
|
|
3
|
+
"version": "22.0.0-rc.0",
|
|
4
4
|
"description": "Angular - the core framework",
|
|
5
5
|
"author": "angular",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"engines": {
|
|
8
|
-
"node": "^22.22.0 ||
|
|
8
|
+
"node": "^22.22.0 || ^24.13.1 || >=26.0.0"
|
|
9
9
|
},
|
|
10
10
|
"exports": {
|
|
11
11
|
"./schematics/*": {
|
|
@@ -45,8 +45,12 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"tslib": "^2.3.0"
|
|
47
47
|
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@mcp-b/webmcp-polyfill": "^2.2.0",
|
|
50
|
+
"@mcp-b/webmcp-types": "^2.2.0"
|
|
51
|
+
},
|
|
48
52
|
"peerDependencies": {
|
|
49
|
-
"@angular/compiler": "22.0.0-
|
|
53
|
+
"@angular/compiler": "22.0.0-rc.0",
|
|
50
54
|
"rxjs": "^6.5.3 || ^7.4.0",
|
|
51
55
|
"zone.js": "~0.15.0 || ~0.16.0"
|
|
52
56
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
|
-
* @license Angular v22.0.0-
|
|
3
|
+
* @license Angular v22.0.0-rc.0
|
|
4
4
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
5
5
|
* License: MIT
|
|
6
6
|
*/
|
|
@@ -30,15 +30,18 @@ class IncrementalHydrationMigration extends project_paths.TsurgeFunnelMigration
|
|
|
30
30
|
ts.isIdentifier(node.expression) &&
|
|
31
31
|
node.expression.text === 'provideClientHydration') {
|
|
32
32
|
let hasIncremental = false;
|
|
33
|
+
let hasNoIncremental = false;
|
|
33
34
|
for (const arg of node.arguments) {
|
|
34
|
-
if (ts.isCallExpression(arg) &&
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
if (ts.isCallExpression(arg) && ts.isIdentifier(arg.expression)) {
|
|
36
|
+
if (arg.expression.text === 'withIncrementalHydration') {
|
|
37
|
+
hasIncremental = true;
|
|
38
|
+
}
|
|
39
|
+
else if (arg.expression.text === 'withNoIncrementalHydration') {
|
|
40
|
+
hasNoIncremental = true;
|
|
41
|
+
}
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
|
-
if (!hasIncremental) {
|
|
44
|
+
if (!hasIncremental && !hasNoIncremental) {
|
|
42
45
|
// Add withNoIncrementalHydration()
|
|
43
46
|
const withNoIncrementalExpr = importManager.addImport({
|
|
44
47
|
exportModuleSpecifier: '@angular/platform-browser',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
|
-
* @license Angular v22.0.0-
|
|
3
|
+
* @license Angular v22.0.0-rc.0
|
|
4
4
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
5
5
|
* License: MIT
|
|
6
6
|
*/
|
|
@@ -265,7 +265,9 @@ class TemplateReferenceVisitor extends compiler.TmplAstRecursiveVisitor {
|
|
|
265
265
|
}
|
|
266
266
|
visitForLoopBlock(block) {
|
|
267
267
|
this.checkExpressionForReferencedFields(block, block.expression);
|
|
268
|
-
|
|
268
|
+
if (block.trackBy !== null) {
|
|
269
|
+
this.checkExpressionForReferencedFields(block, block.trackBy);
|
|
270
|
+
}
|
|
269
271
|
super.visitForLoopBlock(block);
|
|
270
272
|
}
|
|
271
273
|
visitSwitchBlock(block) {
|
|
@@ -308,6 +310,9 @@ class TemplateReferenceVisitor extends compiler.TmplAstRecursiveVisitor {
|
|
|
308
310
|
this.templateAttributeReferencedFields.push(...referencedFields);
|
|
309
311
|
}
|
|
310
312
|
}
|
|
313
|
+
visitLetDeclaration(decl) {
|
|
314
|
+
this.checkExpressionForReferencedFields(decl, decl.value);
|
|
315
|
+
}
|
|
311
316
|
}
|
|
312
317
|
/**
|
|
313
318
|
* Expression AST visitor that checks whether a given expression references
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
|
-
* @license Angular v22.0.0-
|
|
3
|
+
* @license Angular v22.0.0-rc.0
|
|
4
4
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
5
5
|
* License: MIT
|
|
6
6
|
*/
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
var assert = require('assert');
|
|
10
10
|
var ts = require('typescript');
|
|
11
11
|
var migrations = require('@angular/compiler-cli/private/migrations');
|
|
12
|
-
var index = require('./index-
|
|
12
|
+
var index = require('./index-DxFMpcXS.cjs');
|
|
13
13
|
var project_paths = require('./project_paths-D2V-Uh2L.cjs');
|
|
14
14
|
var leading_space = require('./leading_space-BTPRV0wu.cjs');
|
|
15
15
|
require('@angular/compiler-cli');
|
|
@@ -284,11 +284,13 @@ class InvokeFunctionExpr extends Expression {
|
|
|
284
284
|
fn;
|
|
285
285
|
args;
|
|
286
286
|
pure;
|
|
287
|
-
|
|
287
|
+
isOptional;
|
|
288
|
+
constructor(fn, args, type, sourceSpan, pure = false, leadingComments, isOptional = false) {
|
|
288
289
|
super(type, sourceSpan, leadingComments);
|
|
289
290
|
this.fn = fn;
|
|
290
291
|
this.args = args;
|
|
291
292
|
this.pure = pure;
|
|
293
|
+
this.isOptional = isOptional;
|
|
292
294
|
}
|
|
293
295
|
// An alias for fn, which allows other logic to handle calls and property reads together.
|
|
294
296
|
get receiver() {
|
|
@@ -307,7 +309,7 @@ class InvokeFunctionExpr extends Expression {
|
|
|
307
309
|
return visitor.visitInvokeFunctionExpr(this, context);
|
|
308
310
|
}
|
|
309
311
|
clone() {
|
|
310
|
-
return new InvokeFunctionExpr(this.fn.clone(), this.args.map((arg) => arg.clone()), this.type, this.sourceSpan, this.pure);
|
|
312
|
+
return new InvokeFunctionExpr(this.fn.clone(), this.args.map((arg) => arg.clone()), this.type, this.sourceSpan, this.pure, [], this.isOptional);
|
|
311
313
|
}
|
|
312
314
|
}
|
|
313
315
|
class InstantiateExpr extends Expression {
|
|
@@ -420,17 +422,26 @@ class BinaryOperatorExpr extends Expression {
|
|
|
420
422
|
class ReadPropExpr extends Expression {
|
|
421
423
|
receiver;
|
|
422
424
|
name;
|
|
423
|
-
|
|
425
|
+
isOptional;
|
|
426
|
+
constructor(receiver, name, type, sourceSpan, leadingComments,
|
|
427
|
+
/**
|
|
428
|
+
* Whether the property access uses the optional-chaining operator (`?.`).
|
|
429
|
+
*/
|
|
430
|
+
isOptional = false) {
|
|
424
431
|
super(type, sourceSpan, leadingComments);
|
|
425
432
|
this.receiver = receiver;
|
|
426
433
|
this.name = name;
|
|
434
|
+
this.isOptional = isOptional;
|
|
427
435
|
}
|
|
428
436
|
// An alias for name, which allows other logic to handle property reads and keyed reads together.
|
|
429
437
|
get index() {
|
|
430
438
|
return this.name;
|
|
431
439
|
}
|
|
432
440
|
isEquivalent(e) {
|
|
433
|
-
return (e instanceof ReadPropExpr &&
|
|
441
|
+
return (e instanceof ReadPropExpr &&
|
|
442
|
+
this.receiver.isEquivalent(e.receiver) &&
|
|
443
|
+
this.name === e.name &&
|
|
444
|
+
this.isOptional === e.isOptional);
|
|
434
445
|
}
|
|
435
446
|
isConstant() {
|
|
436
447
|
return false;
|
|
@@ -442,21 +453,28 @@ class ReadPropExpr extends Expression {
|
|
|
442
453
|
return new BinaryOperatorExpr(BinaryOperator.Assign, this.receiver.prop(this.name), value, null, this.sourceSpan);
|
|
443
454
|
}
|
|
444
455
|
clone() {
|
|
445
|
-
return new ReadPropExpr(this.receiver.clone(), this.name, this.type, this.sourceSpan);
|
|
456
|
+
return new ReadPropExpr(this.receiver.clone(), this.name, this.type, this.sourceSpan, [], this.isOptional);
|
|
446
457
|
}
|
|
447
458
|
}
|
|
448
459
|
class ReadKeyExpr extends Expression {
|
|
449
460
|
receiver;
|
|
450
461
|
index;
|
|
451
|
-
|
|
462
|
+
isOptional;
|
|
463
|
+
constructor(receiver, index, type, sourceSpan, leadingComments,
|
|
464
|
+
/**
|
|
465
|
+
* Whether the property access uses the optional-chaining operator (`?.[`).
|
|
466
|
+
*/
|
|
467
|
+
isOptional = false) {
|
|
452
468
|
super(type, sourceSpan, leadingComments);
|
|
453
469
|
this.receiver = receiver;
|
|
454
470
|
this.index = index;
|
|
471
|
+
this.isOptional = isOptional;
|
|
455
472
|
}
|
|
456
473
|
isEquivalent(e) {
|
|
457
474
|
return (e instanceof ReadKeyExpr &&
|
|
458
475
|
this.receiver.isEquivalent(e.receiver) &&
|
|
459
|
-
this.index.isEquivalent(e.index)
|
|
476
|
+
this.index.isEquivalent(e.index) &&
|
|
477
|
+
this.isOptional === e.isOptional);
|
|
460
478
|
}
|
|
461
479
|
isConstant() {
|
|
462
480
|
return false;
|
|
@@ -468,7 +486,7 @@ class ReadKeyExpr extends Expression {
|
|
|
468
486
|
return new BinaryOperatorExpr(BinaryOperator.Assign, this.receiver.key(this.index), value, null, this.sourceSpan);
|
|
469
487
|
}
|
|
470
488
|
clone() {
|
|
471
|
-
return new ReadKeyExpr(this.receiver.clone(), this.index.clone(), this.type, this.sourceSpan);
|
|
489
|
+
return new ReadKeyExpr(this.receiver.clone(), this.index.clone(), this.type, this.sourceSpan, [], this.isOptional);
|
|
472
490
|
}
|
|
473
491
|
}
|
|
474
492
|
const NULL_EXPR = new LiteralExpr(null, null, null);
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* @license Angular v22.0.0-rc.0
|
|
4
|
+
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
5
|
+
* License: MIT
|
|
6
|
+
*/
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
require('@angular/compiler-cli');
|
|
10
|
+
var migrations = require('@angular/compiler-cli/private/migrations');
|
|
11
|
+
var ts = require('typescript');
|
|
12
|
+
require('node:path');
|
|
13
|
+
var project_paths = require('./project_paths-D2V-Uh2L.cjs');
|
|
14
|
+
var imports = require('./imports-CKV-ITqD.cjs');
|
|
15
|
+
var apply_import_manager = require('./apply_import_manager-CxA_YYgB.cjs');
|
|
16
|
+
require('@angular-devkit/core');
|
|
17
|
+
require('node:path/posix');
|
|
18
|
+
require('@angular-devkit/schematics');
|
|
19
|
+
require('./project_tsconfig_paths-DkkMibv-.cjs');
|
|
20
|
+
|
|
21
|
+
class ModelOutputMigration extends project_paths.TsurgeFunnelMigration {
|
|
22
|
+
config;
|
|
23
|
+
constructor(config = {}) {
|
|
24
|
+
super();
|
|
25
|
+
this.config = config;
|
|
26
|
+
}
|
|
27
|
+
async analyze(info) {
|
|
28
|
+
const replacements = [];
|
|
29
|
+
for (const sourceFile of info.sourceFiles) {
|
|
30
|
+
if (this.config.shouldMigrate && !this.config.shouldMigrate(project_paths.projectFile(sourceFile, info))) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const importManager = new migrations.ImportManager();
|
|
34
|
+
const visit = (node) => {
|
|
35
|
+
if (ts.isClassDeclaration(node)) {
|
|
36
|
+
this.analyzeClass(node, info.program.getTypeChecker(), importManager, replacements, sourceFile, info);
|
|
37
|
+
}
|
|
38
|
+
ts.forEachChild(node, visit);
|
|
39
|
+
};
|
|
40
|
+
visit(sourceFile);
|
|
41
|
+
apply_import_manager.applyImportManagerChanges(importManager, replacements, [sourceFile], info);
|
|
42
|
+
}
|
|
43
|
+
return project_paths.confirmAsSerializable({
|
|
44
|
+
replacements,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
analyzeClass(classNode, typeChecker, importManager, replacements, sourceFile, info) {
|
|
48
|
+
const modelProperties = [];
|
|
49
|
+
const outputProperties = new Map();
|
|
50
|
+
for (const member of classNode.members) {
|
|
51
|
+
if (!ts.isPropertyDeclaration(member) || !ts.isIdentifier(member.name)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// Check for @Output() decorators
|
|
55
|
+
const decorators = ts.getDecorators(member);
|
|
56
|
+
if (decorators) {
|
|
57
|
+
for (const decorator of decorators) {
|
|
58
|
+
if (ts.isCallExpression(decorator.expression) &&
|
|
59
|
+
ts.isIdentifier(decorator.expression.expression) &&
|
|
60
|
+
decorator.expression.expression.text === 'Output') {
|
|
61
|
+
const name = member.name.text;
|
|
62
|
+
outputProperties.set(name, member);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!member.initializer || !ts.isCallExpression(member.initializer)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const call = member.initializer;
|
|
70
|
+
let identifier = null;
|
|
71
|
+
if (ts.isIdentifier(call.expression)) {
|
|
72
|
+
identifier = call.expression;
|
|
73
|
+
}
|
|
74
|
+
else if (ts.isPropertyAccessExpression(call.expression)) {
|
|
75
|
+
let current = call.expression;
|
|
76
|
+
while (ts.isPropertyAccessExpression(current)) {
|
|
77
|
+
if (ts.isIdentifier(current.name) && current.name.text === 'model') {
|
|
78
|
+
identifier = current.name;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
current = current.expression;
|
|
82
|
+
}
|
|
83
|
+
if (!identifier && ts.isIdentifier(current) && current.text === 'model') {
|
|
84
|
+
identifier = current;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!identifier)
|
|
88
|
+
continue;
|
|
89
|
+
const imp = imports.getImportOfIdentifier(typeChecker, identifier);
|
|
90
|
+
if (!imp || imp.importModule !== '@angular/core')
|
|
91
|
+
continue;
|
|
92
|
+
if (imp.name === 'model') {
|
|
93
|
+
modelProperties.push(member);
|
|
94
|
+
}
|
|
95
|
+
else if (imp.name === 'output') {
|
|
96
|
+
const name = member.name.text;
|
|
97
|
+
outputProperties.set(name, member);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const modelProp of modelProperties) {
|
|
101
|
+
const modelName = modelProp.name.text;
|
|
102
|
+
const expectedOutputName = `${modelName}Change`;
|
|
103
|
+
if (outputProperties.has(expectedOutputName)) {
|
|
104
|
+
const update = this.migrateModelProperty(modelProp, importManager, sourceFile);
|
|
105
|
+
replacements.push(new project_paths.Replacement(project_paths.projectFile(sourceFile, info), update));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
migrateModelProperty(modelProp, importManager, sourceFile) {
|
|
110
|
+
const modelName = modelProp.name.text;
|
|
111
|
+
const call = modelProp.initializer;
|
|
112
|
+
const isRequired = ts.isPropertyAccessExpression(call.expression) && call.expression.name.text === 'required';
|
|
113
|
+
const typeArgs = call.typeArguments
|
|
114
|
+
? `<${call.typeArguments.map((t) => t.getText()).join(', ')}>`
|
|
115
|
+
: '';
|
|
116
|
+
// Use input and linkedSignal
|
|
117
|
+
importManager.addImport({
|
|
118
|
+
exportModuleSpecifier: '@angular/core',
|
|
119
|
+
exportSymbolName: 'input',
|
|
120
|
+
requestedFile: sourceFile,
|
|
121
|
+
});
|
|
122
|
+
importManager.addImport({
|
|
123
|
+
exportModuleSpecifier: '@angular/core',
|
|
124
|
+
exportSymbolName: 'linkedSignal',
|
|
125
|
+
requestedFile: sourceFile,
|
|
126
|
+
});
|
|
127
|
+
const inputName = `${modelName}Input`;
|
|
128
|
+
const initialValue = isRequired ? undefined : (call.arguments[0]?.getText() ?? 'undefined');
|
|
129
|
+
const optionsNode = isRequired ? call.arguments[0] : call.arguments[1];
|
|
130
|
+
const aliasProperty = `alias: '${modelName}'`;
|
|
131
|
+
let inputArgs;
|
|
132
|
+
if (!optionsNode) {
|
|
133
|
+
inputArgs = `{${aliasProperty}}`;
|
|
134
|
+
}
|
|
135
|
+
else if (ts.isObjectLiteralExpression(optionsNode)) {
|
|
136
|
+
const hasAlias = optionsNode.properties.some((p) => {
|
|
137
|
+
if (!ts.isPropertyAssignment(p) && !ts.isShorthandPropertyAssignment(p)) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) && p.name.text === 'alias';
|
|
141
|
+
});
|
|
142
|
+
if (hasAlias) {
|
|
143
|
+
inputArgs = optionsNode.getText();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const optionsText = optionsNode.getText();
|
|
147
|
+
const inner = optionsText.slice(1, -1).trim();
|
|
148
|
+
inputArgs = `{${aliasProperty}${inner ? `, ${inner}` : ''}}`;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
inputArgs = `{${aliasProperty}, ...${optionsNode.getText()}}`;
|
|
153
|
+
}
|
|
154
|
+
if (initialValue !== undefined) {
|
|
155
|
+
inputArgs = `${initialValue}, ${inputArgs}`;
|
|
156
|
+
}
|
|
157
|
+
const modifiers = modelProp.modifiers
|
|
158
|
+
? modelProp.modifiers.map((m) => m.getText()).join(' ') + ' '
|
|
159
|
+
: '';
|
|
160
|
+
// Detect indentation
|
|
161
|
+
const { character } = sourceFile.getLineAndCharacterOfPosition(modelProp.getStart());
|
|
162
|
+
const indent = sourceFile.text.substring(modelProp.getStart() - character, modelProp.getStart());
|
|
163
|
+
const inputCall = isRequired ? 'input.required' : 'input';
|
|
164
|
+
const newContent = `${modifiers}${inputName} = ${inputCall}${typeArgs}(${inputArgs});\n${indent}${modifiers}${modelName} = linkedSignal(this.${inputName});`;
|
|
165
|
+
return new project_paths.TextUpdate({
|
|
166
|
+
position: modelProp.getStart(),
|
|
167
|
+
end: modelProp.getEnd(),
|
|
168
|
+
toInsert: newContent,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async combine(unitA, unitB) {
|
|
172
|
+
return project_paths.confirmAsSerializable({
|
|
173
|
+
replacements: [...unitA.replacements, ...unitB.replacements],
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async globalMeta(combinedData) {
|
|
177
|
+
return project_paths.confirmAsSerializable({
|
|
178
|
+
replacements: combinedData.replacements,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
async migrate(globalData) {
|
|
182
|
+
return project_paths.confirmAsSerializable({
|
|
183
|
+
replacements: globalData.replacements,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async stats(globalMetadata) {
|
|
187
|
+
return project_paths.confirmAsSerializable({});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function migrate(options) {
|
|
192
|
+
return async (tree, context) => {
|
|
193
|
+
await project_paths.runMigrationInDevkit({
|
|
194
|
+
tree,
|
|
195
|
+
getMigration: (fs) => new ModelOutputMigration(),
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
exports.migrate = migrate;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
|
-
* @license Angular v22.0.0-
|
|
3
|
+
* @license Angular v22.0.0-rc.0
|
|
4
4
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
5
5
|
* License: MIT
|
|
6
6
|
*/
|
|
@@ -121,12 +121,20 @@ function getPropertyRemovalRange(property) {
|
|
|
121
121
|
}
|
|
122
122
|
const properties = parent.properties;
|
|
123
123
|
const propertyIndex = properties.indexOf(property);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
if (properties.length === 1) {
|
|
125
|
+
const sourceFile = property.getSourceFile();
|
|
126
|
+
let end = property.getEnd();
|
|
127
|
+
const textAfter = sourceFile.text.substring(end, parent.getEnd());
|
|
128
|
+
const commaIndex = textAfter.indexOf(',');
|
|
129
|
+
if (commaIndex !== -1) {
|
|
130
|
+
end += commaIndex + 1;
|
|
131
|
+
}
|
|
132
|
+
return { start: property.getFullStart(), end };
|
|
133
|
+
}
|
|
134
|
+
if (propertyIndex === 0) {
|
|
135
|
+
return { start: property.getFullStart(), end: properties[1].getFullStart() };
|
|
128
136
|
}
|
|
129
|
-
return { start:
|
|
137
|
+
return { start: properties[propertyIndex - 1].getEnd(), end: property.getEnd() };
|
|
130
138
|
}
|
|
131
139
|
function calculateImportReplacements(info, sourceFiles, filesToRemoveCommonModule) {
|
|
132
140
|
const importReplacements = {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
|
-
* @license Angular v22.0.0-
|
|
3
|
+
* @license Angular v22.0.0-rc.0
|
|
4
4
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
5
5
|
* License: MIT
|
|
6
6
|
*/
|
|
@@ -13,7 +13,7 @@ require('node:path');
|
|
|
13
13
|
var project_paths = require('./project_paths-D2V-Uh2L.cjs');
|
|
14
14
|
var compiler = require('@angular/compiler');
|
|
15
15
|
var apply_import_manager = require('./apply_import_manager-CxA_YYgB.cjs');
|
|
16
|
-
var index = require('./index-
|
|
16
|
+
var index = require('./index-DxFMpcXS.cjs');
|
|
17
17
|
require('@angular-devkit/core');
|
|
18
18
|
require('node:path/posix');
|
|
19
19
|
require('@angular-devkit/schematics');
|