@analogjs/platform 3.0.0-alpha.96 → 3.0.0-alpha.98
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/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.d.ts +7 -0
- package/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.js +68 -0
- package/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.js.map +1 -0
- package/migrations/migrate-to-separated-plugins/migrate-to-separated-plugins.js +1 -6
- package/migrations/migrate-to-separated-plugins/migrate-to-separated-plugins.js.map +1 -1
- package/migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.d.ts +6 -0
- package/migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.js +62 -0
- package/migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.js.map +1 -0
- package/migrations/migration.json +10 -0
- package/migrations/utils/source-edits.d.ts +9 -0
- package/migrations/utils/source-edits.js +33 -0
- package/migrations/utils/source-edits.js.map +1 -0
- package/package.json +5 -5
- package/src/lib/nx-plugin/builders.json +1 -2
- package/src/lib/nx-plugin/executors.json +1 -7
- package/src/lib/nx-plugin/generators.json +0 -10
- package/src/lib/nx-plugin/src/generators/app/files/template-angular/src/app/app.config.ts__template__ +3 -10
- package/src/lib/nx-plugin/src/generators/app/generator.js +2 -5
- package/src/lib/nx-plugin/src/generators/app/generator.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.d.ts +1 -4
- package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js +2 -5
- package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.d.ts +6 -6
- package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/init/lib/add-analog-dependencies.js +1 -1
- package/src/lib/nx-plugin/src/generators/init/lib/add-analog-dependencies.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/preset/generator.js +2 -5
- package/src/lib/nx-plugin/src/generators/preset/generator.js.map +1 -1
- package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.d.ts +2 -2
- package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.js +7 -10
- package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.js.map +1 -1
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.d.ts +6 -10
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js +6 -12
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js.map +1 -1
- package/src/lib/options.d.ts +25 -14
- package/src/lib/route-file-discovery.js +4 -16
- package/src/lib/route-file-discovery.js.map +1 -1
- package/src/lib/route-idiom-diagnostics.js +2 -11
- package/src/lib/route-idiom-diagnostics.js.map +1 -1
- package/src/lib/route-manifest.d.ts +5 -5
- package/src/lib/route-manifest.js +8 -8
- package/src/lib/route-manifest.js.map +1 -1
- package/src/lib/router-plugin.js +2 -15
- package/src/lib/router-plugin.js.map +1 -1
- package/src/lib/ssr/inject-html-plugin.js +1 -2
- package/src/lib/ssr/inject-html-plugin.js.map +1 -1
- package/src/lib/nx-plugin/src/executors/vitest/compat.d.ts +0 -3
- package/src/lib/nx-plugin/src/executors/vitest/compat.js +0 -8
- package/src/lib/nx-plugin/src/executors/vitest/compat.js.map +0 -1
- package/src/lib/nx-plugin/src/executors/vitest/schema.d.ts +0 -1
- package/src/lib/nx-plugin/src/executors/vitest/schema.json +0 -35
- package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.d.ts +0 -2
- package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.js +0 -7
- package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/app/lib/add-analog-dependencies.d.ts +0 -2
- package/src/lib/nx-plugin/src/generators/app/lib/initialize-analog-workspace.d.ts +0 -3
- package/src/lib/nx-plugin/src/generators/app/versions/dependencies.d.ts +0 -5
- package/src/lib/nx-plugin/src/generators/app/versions/dev-dependencies.d.ts +0 -4
- package/src/lib/nx-plugin/src/generators/app/versions/nx-dependencies.d.ts +0 -4
- package/src/lib/nx-plugin/src/generators/setup-vitest/compat.d.ts +0 -9
- package/src/lib/nx-plugin/src/generators/setup-vitest/compat.js +0 -19
- package/src/lib/nx-plugin/src/generators/setup-vitest/compat.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/files/src/test-setup.ts__template__ +0 -22
- package/src/lib/nx-plugin/src/generators/setup-vitest/files/vite.config.mts__template__ +0 -23
- package/src/lib/nx-plugin/src/generators/setup-vitest/generator.d.ts +0 -4
- package/src/lib/nx-plugin/src/generators/setup-vitest/generator.js +0 -38
- package/src/lib/nx-plugin/src/generators/setup-vitest/generator.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.d.ts +0 -2
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.js +0 -11
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.d.ts +0 -3
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.js +0 -24
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.d.ts +0 -3
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.js +0 -23
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/schema.d.ts +0 -7
- package/src/lib/nx-plugin/src/generators/setup-vitest/schema.json +0 -19
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Rule } from "@angular-devkit/schematics";
|
|
2
|
+
/**
|
|
3
|
+
* Replaces `setupTestBed({ browserMode })` with the equivalent
|
|
4
|
+
* `teardown.destroyAfterEach` option.
|
|
5
|
+
*/
|
|
6
|
+
export declare function migrateSetupTestBedSource(filePath: string, source: string): string | null;
|
|
7
|
+
export default function migrateSetupTestBedBrowserMode(): Rule;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { applyEdits, rewriteSourceFiles } from "../utils/source-edits.js";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
//#region packages/platform/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.ts
|
|
4
|
+
var SETUP_TESTBED_PKG = "@analogjs/vitest-angular/setup-testbed";
|
|
5
|
+
var MIGRATION_DOC_URL = "https://analogjs.org/docs/guides/migrating-v2-to-v3#the-setuptestbed-browsermode-option-was-removed";
|
|
6
|
+
function getPropertyName(property) {
|
|
7
|
+
return property.name && ts.isIdentifier(property.name) ? property.name.text : void 0;
|
|
8
|
+
}
|
|
9
|
+
function toTeardown(value, sourceFile) {
|
|
10
|
+
if (value.kind === ts.SyntaxKind.TrueKeyword) return "teardown: { destroyAfterEach: false }";
|
|
11
|
+
return `teardown: { destroyAfterEach: !(${value.getText(sourceFile)}) }`;
|
|
12
|
+
}
|
|
13
|
+
function removeProperty(object, index, sourceFile) {
|
|
14
|
+
const properties = object.properties;
|
|
15
|
+
if (properties.length === 1) return {
|
|
16
|
+
start: object.getStart(sourceFile),
|
|
17
|
+
end: object.end,
|
|
18
|
+
text: ""
|
|
19
|
+
};
|
|
20
|
+
if (index < properties.length - 1) return {
|
|
21
|
+
start: properties[index].getStart(sourceFile),
|
|
22
|
+
end: properties[index + 1].getStart(sourceFile),
|
|
23
|
+
text: ""
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
start: properties[index - 1].end,
|
|
27
|
+
end: properties[index].end,
|
|
28
|
+
text: ""
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Replaces `setupTestBed({ browserMode })` with the equivalent
|
|
33
|
+
* `teardown.destroyAfterEach` option.
|
|
34
|
+
*/
|
|
35
|
+
function migrateSetupTestBedSource(filePath, source) {
|
|
36
|
+
if (!source.includes("browserMode")) return null;
|
|
37
|
+
const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
38
|
+
const edits = [];
|
|
39
|
+
function visit(node) {
|
|
40
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "setupTestBed" && node.arguments[0] && ts.isObjectLiteralExpression(node.arguments[0])) {
|
|
41
|
+
const options = node.arguments[0];
|
|
42
|
+
const index = options.properties.findIndex((property) => getPropertyName(property) === "browserMode");
|
|
43
|
+
const browserMode = options.properties[index];
|
|
44
|
+
const hasTeardown = options.properties.some((property) => getPropertyName(property) === "teardown");
|
|
45
|
+
const value = browserMode && ts.isPropertyAssignment(browserMode) ? browserMode.initializer : browserMode && ts.isShorthandPropertyAssignment(browserMode) ? browserMode.name : void 0;
|
|
46
|
+
if (browserMode && value) if (hasTeardown || value.kind === ts.SyntaxKind.FalseKeyword) edits.push(removeProperty(options, index, sourceFile));
|
|
47
|
+
else edits.push({
|
|
48
|
+
start: browserMode.getStart(sourceFile),
|
|
49
|
+
end: browserMode.end,
|
|
50
|
+
text: toTeardown(value, sourceFile)
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
ts.forEachChild(node, visit);
|
|
54
|
+
}
|
|
55
|
+
visit(sourceFile);
|
|
56
|
+
return edits.length > 0 ? applyEdits(source, edits) : null;
|
|
57
|
+
}
|
|
58
|
+
function migrateSetupTestBedBrowserMode() {
|
|
59
|
+
return (tree, context) => {
|
|
60
|
+
const rewritten = rewriteSourceFiles(tree, SETUP_TESTBED_PKG, migrateSetupTestBedSource);
|
|
61
|
+
if (rewritten.length > 0) context.logger.info(`Replaced setupTestBed({ browserMode }) with teardown.destroyAfterEach in:\n${rewritten.map((file) => ` - ${file}`).join("\n")}\nSee ${MIGRATION_DOC_URL}`);
|
|
62
|
+
return tree;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { migrateSetupTestBedBrowserMode as default, migrateSetupTestBedSource };
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=migrate-setup-testbed-browser-mode.js.map
|
package/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-setup-testbed-browser-mode.js","names":[],"sources":["../../../migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.ts"],"sourcesContent":["import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';\nimport * as ts from 'typescript';\n\nimport {\n applyEdits,\n rewriteSourceFiles,\n type Edit,\n} from '../utils/source-edits';\n\nconst SETUP_TESTBED_PKG = '@analogjs/vitest-angular/setup-testbed';\nconst MIGRATION_DOC_URL =\n 'https://analogjs.org/docs/guides/migrating-v2-to-v3#the-setuptestbed-browsermode-option-was-removed';\n\nfunction getPropertyName(\n property: ts.ObjectLiteralElementLike,\n): string | undefined {\n return property.name && ts.isIdentifier(property.name)\n ? property.name.text\n : undefined;\n}\n\nfunction toTeardown(value: ts.Expression, sourceFile: ts.SourceFile): string {\n if (value.kind === ts.SyntaxKind.TrueKeyword) {\n return 'teardown: { destroyAfterEach: false }';\n }\n return `teardown: { destroyAfterEach: !(${value.getText(sourceFile)}) }`;\n}\n\nfunction removeProperty(\n object: ts.ObjectLiteralExpression,\n index: number,\n sourceFile: ts.SourceFile,\n): Edit {\n const properties = object.properties;\n if (properties.length === 1) {\n return { start: object.getStart(sourceFile), end: object.end, text: '' };\n }\n if (index < properties.length - 1) {\n return {\n start: properties[index].getStart(sourceFile),\n end: properties[index + 1].getStart(sourceFile),\n text: '',\n };\n }\n return {\n start: properties[index - 1].end,\n end: properties[index].end,\n text: '',\n };\n}\n\n/**\n * Replaces `setupTestBed({ browserMode })` with the equivalent\n * `teardown.destroyAfterEach` option.\n */\nexport function migrateSetupTestBedSource(\n filePath: string,\n source: string,\n): string | null {\n if (!source.includes('browserMode')) return null;\n\n const sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const edits: Edit[] = [];\n\n function visit(node: ts.Node): void {\n if (\n ts.isCallExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === 'setupTestBed' &&\n node.arguments[0] &&\n ts.isObjectLiteralExpression(node.arguments[0])\n ) {\n const options = node.arguments[0];\n const index = options.properties.findIndex(\n (property) => getPropertyName(property) === 'browserMode',\n );\n const browserMode = options.properties[index];\n const hasTeardown = options.properties.some(\n (property) => getPropertyName(property) === 'teardown',\n );\n\n const value =\n browserMode && ts.isPropertyAssignment(browserMode)\n ? browserMode.initializer\n : browserMode && ts.isShorthandPropertyAssignment(browserMode)\n ? browserMode.name\n : undefined;\n if (browserMode && value) {\n if (hasTeardown || value.kind === ts.SyntaxKind.FalseKeyword) {\n edits.push(removeProperty(options, index, sourceFile));\n } else {\n edits.push({\n start: browserMode.getStart(sourceFile),\n end: browserMode.end,\n text: toTeardown(value, sourceFile),\n });\n }\n }\n }\n ts.forEachChild(node, visit);\n }\n visit(sourceFile);\n\n return edits.length > 0 ? applyEdits(source, edits) : null;\n}\n\nexport default function migrateSetupTestBedBrowserMode(): Rule {\n return (tree: Tree, context: SchematicContext) => {\n const rewritten = rewriteSourceFiles(\n tree,\n SETUP_TESTBED_PKG,\n migrateSetupTestBedSource,\n );\n if (rewritten.length > 0) {\n context.logger.info(\n `Replaced setupTestBed({ browserMode }) with teardown.destroyAfterEach in:\\n${rewritten\n .map((file) => ` - ${file}`)\n .join('\\n')}\\nSee ${MIGRATION_DOC_URL}`,\n );\n }\n return tree;\n };\n}\n"],"mappings":";;;AASA,IAAM,oBAAoB;AAC1B,IAAM,oBACJ;AAEF,SAAS,gBACP,UACoB;AACpB,QAAO,SAAS,QAAQ,GAAG,aAAa,SAAS,KAAK,GAClD,SAAS,KAAK,OACd,KAAA;;AAGN,SAAS,WAAW,OAAsB,YAAmC;AAC3E,KAAI,MAAM,SAAS,GAAG,WAAW,YAC/B,QAAO;AAET,QAAO,mCAAmC,MAAM,QAAQ,WAAW,CAAC;;AAGtE,SAAS,eACP,QACA,OACA,YACM;CACN,MAAM,aAAa,OAAO;AAC1B,KAAI,WAAW,WAAW,EACxB,QAAO;EAAE,OAAO,OAAO,SAAS,WAAW;EAAE,KAAK,OAAO;EAAK,MAAM;EAAI;AAE1E,KAAI,QAAQ,WAAW,SAAS,EAC9B,QAAO;EACL,OAAO,WAAW,OAAO,SAAS,WAAW;EAC7C,KAAK,WAAW,QAAQ,GAAG,SAAS,WAAW;EAC/C,MAAM;EACP;AAEH,QAAO;EACL,OAAO,WAAW,QAAQ,GAAG;EAC7B,KAAK,WAAW,OAAO;EACvB,MAAM;EACP;;;;;;AAOH,SAAgB,0BACd,UACA,QACe;AACf,KAAI,CAAC,OAAO,SAAS,cAAc,CAAE,QAAO;CAE5C,MAAM,aAAa,GAAG,iBACpB,UACA,QACA,GAAG,aAAa,QAChB,MACA,GAAG,WAAW,GACf;CACD,MAAM,QAAgB,EAAE;CAExB,SAAS,MAAM,MAAqB;AAClC,MACE,GAAG,iBAAiB,KAAK,IACzB,GAAG,aAAa,KAAK,WAAW,IAChC,KAAK,WAAW,SAAS,kBACzB,KAAK,UAAU,MACf,GAAG,0BAA0B,KAAK,UAAU,GAAG,EAC/C;GACA,MAAM,UAAU,KAAK,UAAU;GAC/B,MAAM,QAAQ,QAAQ,WAAW,WAC9B,aAAa,gBAAgB,SAAS,KAAK,cAC7C;GACD,MAAM,cAAc,QAAQ,WAAW;GACvC,MAAM,cAAc,QAAQ,WAAW,MACpC,aAAa,gBAAgB,SAAS,KAAK,WAC7C;GAED,MAAM,QACJ,eAAe,GAAG,qBAAqB,YAAY,GAC/C,YAAY,cACZ,eAAe,GAAG,8BAA8B,YAAY,GAC1D,YAAY,OACZ,KAAA;AACR,OAAI,eAAe,MACjB,KAAI,eAAe,MAAM,SAAS,GAAG,WAAW,aAC9C,OAAM,KAAK,eAAe,SAAS,OAAO,WAAW,CAAC;OAEtD,OAAM,KAAK;IACT,OAAO,YAAY,SAAS,WAAW;IACvC,KAAK,YAAY;IACjB,MAAM,WAAW,OAAO,WAAW;IACpC,CAAC;;AAIR,KAAG,aAAa,MAAM,MAAM;;AAE9B,OAAM,WAAW;AAEjB,QAAO,MAAM,SAAS,IAAI,WAAW,QAAQ,MAAM,GAAG;;AAGxD,SAAwB,iCAAuC;AAC7D,SAAQ,MAAY,YAA8B;EAChD,MAAM,YAAY,mBAChB,MACA,mBACA,0BACD;AACD,MAAI,UAAU,SAAS,EACrB,SAAQ,OAAO,KACb,8EAA8E,UAC3E,KAAK,SAAS,OAAO,OAAO,CAC5B,KAAK,KAAK,CAAC,QAAQ,oBACvB;AAEH,SAAO"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { applyEdits } from "../utils/source-edits.js";
|
|
1
2
|
import { NodePackageInstallTask } from "@angular-devkit/schematics/tasks/index.js";
|
|
2
3
|
import * as ts from "typescript";
|
|
3
4
|
//#region packages/platform/migrations/migrate-to-separated-plugins/migrate-to-separated-plugins.ts
|
|
@@ -61,12 +62,6 @@ function addDependencies(tree, context) {
|
|
|
61
62
|
context.addTask(new NodePackageInstallTask());
|
|
62
63
|
return true;
|
|
63
64
|
}
|
|
64
|
-
function applyEdits(source, edits) {
|
|
65
|
-
const sorted = [...edits].sort((a, b) => b.start - a.start);
|
|
66
|
-
let result = source;
|
|
67
|
-
for (const edit of sorted) result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
|
|
68
|
-
return result;
|
|
69
|
-
}
|
|
70
65
|
function getLineIndent(source, pos) {
|
|
71
66
|
let lineStart = pos;
|
|
72
67
|
while (lineStart > 0 && source[lineStart - 1] !== "\n") lineStart--;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-to-separated-plugins.js","names":[],"sources":["../../../migrations/migrate-to-separated-plugins/migrate-to-separated-plugins.ts"],"sourcesContent":["import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';\n// The explicit file path resolves when this runs as native ESM.\nimport { NodePackageInstallTask } from '@angular-devkit/schematics/tasks/index.js';\nimport * as ts from 'typescript';\n\nconst ANALOG_PLATFORM_IMPORT = `from '@analogjs/platform'`;\nconst ANGULAR_PLUGIN_IMPORT = `from '@analogjs/vite-plugin-angular'`;\nconst NITRO_IMPORTS = [\n `from '@analogjs/vite-plugin-nitro'`,\n `from 'nitro/vite'`,\n];\nconst ANGULAR_PLUGIN_PKG = '@analogjs/vite-plugin-angular';\nconst NITRO_PLUGIN_PKG = '@analogjs/vite-plugin-nitro';\nconst MIGRATION_DOC_URL =\n 'https://analogjs.org/docs/guides/migrating-v2-to-v3#analog-angular-and-nitro-are-now-separate-plugins';\n\nconst VITE_CONFIG_EXTENSIONS = ['.ts', '.mts', '.js', '.mjs'];\n\nfunction isViteConfig(filePath: string): boolean {\n const file = filePath.slice(filePath.lastIndexOf('/') + 1);\n if (!file.startsWith('vite.config.')) {\n return false;\n }\n return VITE_CONFIG_EXTENSIONS.some((ext) => file.endsWith(ext));\n}\n\nfunction usesLegacyPluginShape(source: string): boolean {\n if (!source.includes(ANALOG_PLATFORM_IMPORT)) {\n return false;\n }\n if (\n source.includes(ANGULAR_PLUGIN_IMPORT) &&\n NITRO_IMPORTS.some((nitroImport) => source.includes(nitroImport))\n ) {\n return false;\n }\n return /\\banalog\\s*\\(/.test(source);\n}\n\nfunction readPackageJson(\n tree: Tree,\n): { raw: string; pkg: Record<string, unknown> } | null {\n const content = tree.read('/package.json');\n if (!content) return null;\n const raw = content.toString('utf-8');\n try {\n return { raw, pkg: JSON.parse(raw) };\n } catch {\n return null;\n }\n}\n\nfunction getDepVersion(\n pkg: Record<string, unknown>,\n name: string,\n): string | undefined {\n const dev =\n (pkg['devDependencies'] as Record<string, string> | undefined) ?? {};\n const reg = (pkg['dependencies'] as Record<string, string> | undefined) ?? {};\n return dev[name] ?? reg[name];\n}\n\nfunction addDependencies(tree: Tree, context: SchematicContext): boolean {\n const info = readPackageJson(tree);\n if (!info) return false;\n\n const { pkg, raw } = info;\n const devDeps = {\n ...((pkg['devDependencies'] as Record<string, string> | undefined) ?? {}),\n };\n let changed = false;\n\n // Match the @analogjs/platform pin so the plugins stay aligned with the\n // rest of the Analog packages already in this workspace.\n const platformVersion = getDepVersion(pkg, '@analogjs/platform') ?? '*';\n const missingPlugins = [ANGULAR_PLUGIN_PKG, NITRO_PLUGIN_PKG].filter(\n (name) =>\n !getDepVersion(pkg, name) &&\n // Apps already on Nitro v3 keep `nitro()` from `nitro/vite`.\n !(name === NITRO_PLUGIN_PKG && getDepVersion(pkg, 'nitro')),\n );\n for (const name of missingPlugins) {\n devDeps[name] = platformVersion;\n changed = true;\n context.logger.info(\n `Added '${name}': '${platformVersion}' to devDependencies.`,\n );\n }\n\n if (!changed) return false;\n\n pkg['devDependencies'] = devDeps;\n const trailingNewline = raw.endsWith('\\n') ? '\\n' : '';\n tree.overwrite(\n '/package.json',\n JSON.stringify(pkg, null, 2) + trailingNewline,\n );\n context.addTask(new NodePackageInstallTask());\n return true;\n}\n\ninterface TransformResult {\n source: string;\n movedVite: boolean;\n movedNitro: boolean;\n}\n\ninterface Edit {\n start: number;\n end: number;\n text: string;\n}\n\nfunction applyEdits(source: string, edits: Edit[]): string {\n // Apply right-to-left so earlier offsets stay valid.\n const sorted = [...edits].sort((a, b) => b.start - a.start);\n let result = source;\n for (const edit of sorted) {\n result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);\n }\n return result;\n}\n\nfunction getLineIndent(source: string, pos: number): string {\n let lineStart = pos;\n while (lineStart > 0 && source[lineStart - 1] !== '\\n') {\n lineStart--;\n }\n let indent = '';\n for (let i = lineStart; i < source.length; i++) {\n const ch = source[i];\n if (ch === ' ' || ch === '\\t') indent += ch;\n else break;\n }\n return indent;\n}\n\n/**\n * Tries to lift `vite: {...}` and `nitro: {...}` properties off the\n * single `analog(...)` call into companion `angular(...)` / `nitro(...)`\n * calls. Returns the rewritten source on success, or null if the file\n * doesn't match the supported pattern (we then fall back to logging\n * instructions rather than risking a corrupted file).\n *\n * Supported pattern: exactly one `analog(...)` call whose argument is\n * an object literal. Properties named `vite` and `nitro` are recognized;\n * everything else stays on `analog`.\n */\nfunction tryTransformViteConfig(\n filePath: string,\n source: string,\n): TransformResult | null {\n let sourceFile: ts.SourceFile;\n try {\n sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n } catch {\n return null;\n }\n\n let analogImportEnd = -1;\n let angularImported = false;\n let nitroImported = false;\n const analogCalls: ts.CallExpression[] = [];\n\n function visit(node: ts.Node): void {\n if (ts.isImportDeclaration(node)) {\n const ml = node.moduleSpecifier;\n if (ts.isStringLiteral(ml)) {\n if (ml.text === '@analogjs/platform') {\n analogImportEnd = node.end;\n } else if (ml.text === '@analogjs/vite-plugin-angular') {\n angularImported = true;\n } else if (\n ml.text === '@analogjs/vite-plugin-nitro' ||\n ml.text === 'nitro/vite'\n ) {\n nitroImported = true;\n }\n }\n } else if (ts.isCallExpression(node)) {\n if (\n ts.isIdentifier(node.expression) &&\n node.expression.text === 'analog'\n ) {\n analogCalls.push(node);\n }\n }\n ts.forEachChild(node, visit);\n }\n visit(sourceFile);\n\n if (analogImportEnd === -1) return null;\n if (analogCalls.length !== 1) return null;\n\n const analogCall = analogCalls[0];\n const callStart = analogCall.getStart(sourceFile);\n const callEnd = analogCall.getEnd();\n\n let viteValueText: string | null = null;\n let nitroValueText: string | null = null;\n let remainingPropsText: string | null = null;\n\n const arg = analogCall.arguments[0];\n if (arg && ts.isObjectLiteralExpression(arg)) {\n const remaining: ts.ObjectLiteralElementLike[] = [];\n for (const prop of arg.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n (prop.name.text === 'vite' || prop.name.text === 'nitro')\n ) {\n const value = prop.initializer;\n const text = source.slice(value.getStart(sourceFile), value.getEnd());\n if (prop.name.text === 'vite') viteValueText = text;\n else nitroValueText = text;\n } else {\n remaining.push(prop);\n }\n }\n\n if (remaining.length > 0) {\n // Reconstruct the analog object literal from the remaining props,\n // preserving their original source text (comments, spacing).\n const propTexts = remaining.map((p) =>\n source.slice(p.getStart(sourceFile), p.getEnd()),\n );\n const objStart = arg.getStart(sourceFile);\n const indent = getLineIndent(source, objStart);\n const propIndent = indent + ' ';\n remainingPropsText = `{\\n${propTexts.map((t) => `${propIndent}${t}`).join(',\\n')},\\n${indent}}`;\n }\n } else if (arg !== undefined) {\n // analog(otherExpression) — can't statically split a variable or call\n // expression. Fall back to logging instructions.\n return null;\n }\n // analog() with no argument falls through to the rewrite below; we just\n // emit `analog(), angular(), nitro()` to scaffold the new plugin chain.\n\n const indent = getLineIndent(source, callStart);\n const newAnalogCall = remainingPropsText\n ? `analog(${remainingPropsText})`\n : `analog()`;\n const parts: string[] = [newAnalogCall];\n if (viteValueText !== null) parts.push(`angular(${viteValueText})`);\n else parts.push('angular()');\n if (nitroValueText !== null) parts.push(`nitro(${nitroValueText})`);\n else parts.push('nitro()');\n const replacement = parts.join(`,\\n${indent}`);\n\n const edits: Edit[] = [{ start: callStart, end: callEnd, text: replacement }];\n\n const importsToAdd: string[] = [];\n if (!angularImported) {\n importsToAdd.push(`import angular from '@analogjs/vite-plugin-angular';`);\n }\n if (!nitroImported) {\n importsToAdd.push(`import nitro from '@analogjs/vite-plugin-nitro';`);\n }\n if (importsToAdd.length > 0) {\n edits.push({\n start: analogImportEnd,\n end: analogImportEnd,\n text: `\\n${importsToAdd.join('\\n')}`,\n });\n }\n\n const rewritten = applyEdits(source, edits);\n\n return {\n source: rewritten,\n movedVite: viteValueText !== null,\n movedNitro: nitroValueText !== null,\n };\n}\n\nexport default function migrateToSeparatedPlugins(): Rule {\n return (tree: Tree, context: SchematicContext) => {\n const filesUsingLegacyShape: string[] = [];\n const rewrittenFiles: string[] = [];\n const unhandledFiles: string[] = [];\n\n tree.visit((filePath) => {\n if (filePath.includes('/node_modules/')) return;\n if (!isViteConfig(filePath)) return;\n\n const content = tree.read(filePath);\n if (!content) return;\n\n const source = content.toString('utf-8');\n if (!usesLegacyPluginShape(source)) return;\n\n filesUsingLegacyShape.push(filePath);\n\n const transformed = tryTransformViteConfig(filePath, source);\n if (transformed) {\n tree.overwrite(filePath, transformed.source);\n rewrittenFiles.push(filePath);\n } else {\n unhandledFiles.push(filePath);\n }\n });\n\n if (filesUsingLegacyShape.length === 0) {\n return tree;\n }\n\n if (rewrittenFiles.length > 0) {\n context.logger.info(\n `Rewrote ${rewrittenFiles.length} vite.config file(s) to the separated \\`analog() + angular() + nitro()\\` shape:`,\n );\n for (const file of rewrittenFiles) {\n context.logger.info(` - ${file}`);\n }\n context.logger.info(\n `Review the result — only \\`vite\\` and \\`nitro\\` were moved automatically. Other angular-passthrough options (\\`liveReload\\`, \\`fastCompile\\`, \\`fileReplacements\\`, etc.) still need to be relocated by hand.\\nSee ${MIGRATION_DOC_URL}`,\n );\n }\n\n if (unhandledFiles.length > 0) {\n context.logger.info(\n `Could not safely rewrite ${unhandledFiles.length} vite.config file(s); migrate them by hand:`,\n );\n for (const file of unhandledFiles) {\n context.logger.info(` - ${file}`);\n }\n context.logger.info(\n `Split \\`analog()\\` into \\`analog() + angular() + nitro()\\` and move each option to its owning plugin.\\nSee ${MIGRATION_DOC_URL}`,\n );\n }\n\n addDependencies(tree, context);\n\n return tree;\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrate-to-separated-plugins.js","names":[],"sources":["../../../migrations/migrate-to-separated-plugins/migrate-to-separated-plugins.ts"],"sourcesContent":["import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';\n// The explicit file path resolves when this runs as native ESM.\nimport { NodePackageInstallTask } from '@angular-devkit/schematics/tasks/index.js';\nimport * as ts from 'typescript';\n\nimport { applyEdits, type Edit } from '../utils/source-edits';\n\nconst ANALOG_PLATFORM_IMPORT = `from '@analogjs/platform'`;\nconst ANGULAR_PLUGIN_IMPORT = `from '@analogjs/vite-plugin-angular'`;\nconst NITRO_IMPORTS = [\n `from '@analogjs/vite-plugin-nitro'`,\n `from 'nitro/vite'`,\n];\nconst ANGULAR_PLUGIN_PKG = '@analogjs/vite-plugin-angular';\nconst NITRO_PLUGIN_PKG = '@analogjs/vite-plugin-nitro';\nconst MIGRATION_DOC_URL =\n 'https://analogjs.org/docs/guides/migrating-v2-to-v3#analog-angular-and-nitro-are-now-separate-plugins';\n\nconst VITE_CONFIG_EXTENSIONS = ['.ts', '.mts', '.js', '.mjs'];\n\nfunction isViteConfig(filePath: string): boolean {\n const file = filePath.slice(filePath.lastIndexOf('/') + 1);\n if (!file.startsWith('vite.config.')) {\n return false;\n }\n return VITE_CONFIG_EXTENSIONS.some((ext) => file.endsWith(ext));\n}\n\nfunction usesLegacyPluginShape(source: string): boolean {\n if (!source.includes(ANALOG_PLATFORM_IMPORT)) {\n return false;\n }\n if (\n source.includes(ANGULAR_PLUGIN_IMPORT) &&\n NITRO_IMPORTS.some((nitroImport) => source.includes(nitroImport))\n ) {\n return false;\n }\n return /\\banalog\\s*\\(/.test(source);\n}\n\nfunction readPackageJson(\n tree: Tree,\n): { raw: string; pkg: Record<string, unknown> } | null {\n const content = tree.read('/package.json');\n if (!content) return null;\n const raw = content.toString('utf-8');\n try {\n return { raw, pkg: JSON.parse(raw) };\n } catch {\n return null;\n }\n}\n\nfunction getDepVersion(\n pkg: Record<string, unknown>,\n name: string,\n): string | undefined {\n const dev =\n (pkg['devDependencies'] as Record<string, string> | undefined) ?? {};\n const reg = (pkg['dependencies'] as Record<string, string> | undefined) ?? {};\n return dev[name] ?? reg[name];\n}\n\nfunction addDependencies(tree: Tree, context: SchematicContext): boolean {\n const info = readPackageJson(tree);\n if (!info) return false;\n\n const { pkg, raw } = info;\n const devDeps = {\n ...((pkg['devDependencies'] as Record<string, string> | undefined) ?? {}),\n };\n let changed = false;\n\n // Match the @analogjs/platform pin so the plugins stay aligned with the\n // rest of the Analog packages already in this workspace.\n const platformVersion = getDepVersion(pkg, '@analogjs/platform') ?? '*';\n const missingPlugins = [ANGULAR_PLUGIN_PKG, NITRO_PLUGIN_PKG].filter(\n (name) =>\n !getDepVersion(pkg, name) &&\n // Apps already on Nitro v3 keep `nitro()` from `nitro/vite`.\n !(name === NITRO_PLUGIN_PKG && getDepVersion(pkg, 'nitro')),\n );\n for (const name of missingPlugins) {\n devDeps[name] = platformVersion;\n changed = true;\n context.logger.info(\n `Added '${name}': '${platformVersion}' to devDependencies.`,\n );\n }\n\n if (!changed) return false;\n\n pkg['devDependencies'] = devDeps;\n const trailingNewline = raw.endsWith('\\n') ? '\\n' : '';\n tree.overwrite(\n '/package.json',\n JSON.stringify(pkg, null, 2) + trailingNewline,\n );\n context.addTask(new NodePackageInstallTask());\n return true;\n}\n\ninterface TransformResult {\n source: string;\n movedVite: boolean;\n movedNitro: boolean;\n}\n\nfunction getLineIndent(source: string, pos: number): string {\n let lineStart = pos;\n while (lineStart > 0 && source[lineStart - 1] !== '\\n') {\n lineStart--;\n }\n let indent = '';\n for (let i = lineStart; i < source.length; i++) {\n const ch = source[i];\n if (ch === ' ' || ch === '\\t') indent += ch;\n else break;\n }\n return indent;\n}\n\n/**\n * Tries to lift `vite: {...}` and `nitro: {...}` properties off the\n * single `analog(...)` call into companion `angular(...)` / `nitro(...)`\n * calls. Returns the rewritten source on success, or null if the file\n * doesn't match the supported pattern (we then fall back to logging\n * instructions rather than risking a corrupted file).\n *\n * Supported pattern: exactly one `analog(...)` call whose argument is\n * an object literal. Properties named `vite` and `nitro` are recognized;\n * everything else stays on `analog`.\n */\nfunction tryTransformViteConfig(\n filePath: string,\n source: string,\n): TransformResult | null {\n let sourceFile: ts.SourceFile;\n try {\n sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n } catch {\n return null;\n }\n\n let analogImportEnd = -1;\n let angularImported = false;\n let nitroImported = false;\n const analogCalls: ts.CallExpression[] = [];\n\n function visit(node: ts.Node): void {\n if (ts.isImportDeclaration(node)) {\n const ml = node.moduleSpecifier;\n if (ts.isStringLiteral(ml)) {\n if (ml.text === '@analogjs/platform') {\n analogImportEnd = node.end;\n } else if (ml.text === '@analogjs/vite-plugin-angular') {\n angularImported = true;\n } else if (\n ml.text === '@analogjs/vite-plugin-nitro' ||\n ml.text === 'nitro/vite'\n ) {\n nitroImported = true;\n }\n }\n } else if (ts.isCallExpression(node)) {\n if (\n ts.isIdentifier(node.expression) &&\n node.expression.text === 'analog'\n ) {\n analogCalls.push(node);\n }\n }\n ts.forEachChild(node, visit);\n }\n visit(sourceFile);\n\n if (analogImportEnd === -1) return null;\n if (analogCalls.length !== 1) return null;\n\n const analogCall = analogCalls[0];\n const callStart = analogCall.getStart(sourceFile);\n const callEnd = analogCall.getEnd();\n\n let viteValueText: string | null = null;\n let nitroValueText: string | null = null;\n let remainingPropsText: string | null = null;\n\n const arg = analogCall.arguments[0];\n if (arg && ts.isObjectLiteralExpression(arg)) {\n const remaining: ts.ObjectLiteralElementLike[] = [];\n for (const prop of arg.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n (prop.name.text === 'vite' || prop.name.text === 'nitro')\n ) {\n const value = prop.initializer;\n const text = source.slice(value.getStart(sourceFile), value.getEnd());\n if (prop.name.text === 'vite') viteValueText = text;\n else nitroValueText = text;\n } else {\n remaining.push(prop);\n }\n }\n\n if (remaining.length > 0) {\n // Reconstruct the analog object literal from the remaining props,\n // preserving their original source text (comments, spacing).\n const propTexts = remaining.map((p) =>\n source.slice(p.getStart(sourceFile), p.getEnd()),\n );\n const objStart = arg.getStart(sourceFile);\n const indent = getLineIndent(source, objStart);\n const propIndent = indent + ' ';\n remainingPropsText = `{\\n${propTexts.map((t) => `${propIndent}${t}`).join(',\\n')},\\n${indent}}`;\n }\n } else if (arg !== undefined) {\n // analog(otherExpression) — can't statically split a variable or call\n // expression. Fall back to logging instructions.\n return null;\n }\n // analog() with no argument falls through to the rewrite below; we just\n // emit `analog(), angular(), nitro()` to scaffold the new plugin chain.\n\n const indent = getLineIndent(source, callStart);\n const newAnalogCall = remainingPropsText\n ? `analog(${remainingPropsText})`\n : `analog()`;\n const parts: string[] = [newAnalogCall];\n if (viteValueText !== null) parts.push(`angular(${viteValueText})`);\n else parts.push('angular()');\n if (nitroValueText !== null) parts.push(`nitro(${nitroValueText})`);\n else parts.push('nitro()');\n const replacement = parts.join(`,\\n${indent}`);\n\n const edits: Edit[] = [{ start: callStart, end: callEnd, text: replacement }];\n\n const importsToAdd: string[] = [];\n if (!angularImported) {\n importsToAdd.push(`import angular from '@analogjs/vite-plugin-angular';`);\n }\n if (!nitroImported) {\n importsToAdd.push(`import nitro from '@analogjs/vite-plugin-nitro';`);\n }\n if (importsToAdd.length > 0) {\n edits.push({\n start: analogImportEnd,\n end: analogImportEnd,\n text: `\\n${importsToAdd.join('\\n')}`,\n });\n }\n\n const rewritten = applyEdits(source, edits);\n\n return {\n source: rewritten,\n movedVite: viteValueText !== null,\n movedNitro: nitroValueText !== null,\n };\n}\n\nexport default function migrateToSeparatedPlugins(): Rule {\n return (tree: Tree, context: SchematicContext) => {\n const filesUsingLegacyShape: string[] = [];\n const rewrittenFiles: string[] = [];\n const unhandledFiles: string[] = [];\n\n tree.visit((filePath) => {\n if (filePath.includes('/node_modules/')) return;\n if (!isViteConfig(filePath)) return;\n\n const content = tree.read(filePath);\n if (!content) return;\n\n const source = content.toString('utf-8');\n if (!usesLegacyPluginShape(source)) return;\n\n filesUsingLegacyShape.push(filePath);\n\n const transformed = tryTransformViteConfig(filePath, source);\n if (transformed) {\n tree.overwrite(filePath, transformed.source);\n rewrittenFiles.push(filePath);\n } else {\n unhandledFiles.push(filePath);\n }\n });\n\n if (filesUsingLegacyShape.length === 0) {\n return tree;\n }\n\n if (rewrittenFiles.length > 0) {\n context.logger.info(\n `Rewrote ${rewrittenFiles.length} vite.config file(s) to the separated \\`analog() + angular() + nitro()\\` shape:`,\n );\n for (const file of rewrittenFiles) {\n context.logger.info(` - ${file}`);\n }\n context.logger.info(\n `Review the result — only \\`vite\\` and \\`nitro\\` were moved automatically. Other angular-passthrough options (\\`liveReload\\`, \\`fastCompile\\`, \\`fileReplacements\\`, etc.) still need to be relocated by hand.\\nSee ${MIGRATION_DOC_URL}`,\n );\n }\n\n if (unhandledFiles.length > 0) {\n context.logger.info(\n `Could not safely rewrite ${unhandledFiles.length} vite.config file(s); migrate them by hand:`,\n );\n for (const file of unhandledFiles) {\n context.logger.info(` - ${file}`);\n }\n context.logger.info(\n `Split \\`analog()\\` into \\`analog() + angular() + nitro()\\` and move each option to its owning plugin.\\nSee ${MIGRATION_DOC_URL}`,\n );\n }\n\n addDependencies(tree, context);\n\n return tree;\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { NodePackageInstallTask } from "@angular-devkit/schematics/tasks/index.js";
|
|
2
|
+
//#region packages/platform/migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.ts
|
|
3
|
+
var VITEST_BUILDER = "@analogjs/vitest-angular:test";
|
|
4
|
+
var VITEST_ANGULAR_PKG = "@analogjs/vitest-angular";
|
|
5
|
+
var REMOVED_ALIASES = [
|
|
6
|
+
"@analogjs/vite-plugin-angular:vitest",
|
|
7
|
+
"@analogjs/platform:vitest",
|
|
8
|
+
"@analogjs/storybook-angular:test-storybook"
|
|
9
|
+
];
|
|
10
|
+
var WORKSPACE_FILES = [
|
|
11
|
+
"angular.json",
|
|
12
|
+
"workspace.json",
|
|
13
|
+
"project.json",
|
|
14
|
+
"nx.json",
|
|
15
|
+
"package.json"
|
|
16
|
+
];
|
|
17
|
+
function isWorkspaceFile(filePath) {
|
|
18
|
+
const file = filePath.slice(filePath.lastIndexOf("/") + 1);
|
|
19
|
+
return WORKSPACE_FILES.includes(file);
|
|
20
|
+
}
|
|
21
|
+
function addVitestAngular(tree, context) {
|
|
22
|
+
const raw = tree.read("/package.json")?.toString("utf-8");
|
|
23
|
+
if (!raw) return;
|
|
24
|
+
const pkg = JSON.parse(raw);
|
|
25
|
+
if (pkg.dependencies?.[VITEST_ANGULAR_PKG] || pkg.devDependencies?.[VITEST_ANGULAR_PKG]) return;
|
|
26
|
+
const version = pkg.devDependencies?.["@analogjs/platform"] ?? pkg.dependencies?.["@analogjs/platform"] ?? "*";
|
|
27
|
+
pkg.devDependencies = {
|
|
28
|
+
...pkg.devDependencies,
|
|
29
|
+
[VITEST_ANGULAR_PKG]: version
|
|
30
|
+
};
|
|
31
|
+
const trailingNewline = raw.endsWith("\n") ? "\n" : "";
|
|
32
|
+
tree.overwrite("/package.json", JSON.stringify(pkg, null, 2) + trailingNewline);
|
|
33
|
+
context.addTask(new NodePackageInstallTask());
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Points targets that use the removed Vitest builder/executor aliases at
|
|
37
|
+
* `@analogjs/vitest-angular:test`.
|
|
38
|
+
*/
|
|
39
|
+
function migrateVitestBuilderAliases() {
|
|
40
|
+
return (tree, context) => {
|
|
41
|
+
const rewritten = [];
|
|
42
|
+
tree.visit((filePath) => {
|
|
43
|
+
if (filePath.includes("/node_modules/")) return;
|
|
44
|
+
if (!isWorkspaceFile(filePath)) return;
|
|
45
|
+
const source = tree.read(filePath)?.toString("utf-8");
|
|
46
|
+
if (!source) return;
|
|
47
|
+
const result = REMOVED_ALIASES.reduce((content, alias) => content.replaceAll(`"${alias}"`, `"${VITEST_BUILDER}"`), source);
|
|
48
|
+
if (result !== source) {
|
|
49
|
+
tree.overwrite(filePath, result);
|
|
50
|
+
rewritten.push(filePath);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
if (rewritten.length === 0) return tree;
|
|
54
|
+
context.logger.info(`Replaced removed Vitest builder aliases with ${VITEST_BUILDER} in:\n${rewritten.map((file) => ` - ${file}`).join("\n")}`);
|
|
55
|
+
addVitestAngular(tree, context);
|
|
56
|
+
return tree;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { migrateVitestBuilderAliases as default };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=migrate-vitest-builder-aliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-vitest-builder-aliases.js","names":[],"sources":["../../../migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.ts"],"sourcesContent":["import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';\n// The explicit file path resolves when this runs as native ESM.\nimport { NodePackageInstallTask } from '@angular-devkit/schematics/tasks/index.js';\n\nconst VITEST_BUILDER = '@analogjs/vitest-angular:test';\nconst VITEST_ANGULAR_PKG = '@analogjs/vitest-angular';\nconst REMOVED_ALIASES = [\n '@analogjs/vite-plugin-angular:vitest',\n '@analogjs/platform:vitest',\n '@analogjs/storybook-angular:test-storybook',\n];\nconst WORKSPACE_FILES = [\n 'angular.json',\n 'workspace.json',\n 'project.json',\n 'nx.json',\n 'package.json',\n];\n\nfunction isWorkspaceFile(filePath: string): boolean {\n const file = filePath.slice(filePath.lastIndexOf('/') + 1);\n return WORKSPACE_FILES.includes(file);\n}\n\nfunction addVitestAngular(tree: Tree, context: SchematicContext): void {\n const raw = tree.read('/package.json')?.toString('utf-8');\n if (!raw) return;\n\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n if (\n pkg.dependencies?.[VITEST_ANGULAR_PKG] ||\n pkg.devDependencies?.[VITEST_ANGULAR_PKG]\n ) {\n return;\n }\n\n const version =\n pkg.devDependencies?.['@analogjs/platform'] ??\n pkg.dependencies?.['@analogjs/platform'] ??\n '*';\n pkg.devDependencies = {\n ...pkg.devDependencies,\n [VITEST_ANGULAR_PKG]: version,\n };\n const trailingNewline = raw.endsWith('\\n') ? '\\n' : '';\n tree.overwrite(\n '/package.json',\n JSON.stringify(pkg, null, 2) + trailingNewline,\n );\n context.addTask(new NodePackageInstallTask());\n}\n\n/**\n * Points targets that use the removed Vitest builder/executor aliases at\n * `@analogjs/vitest-angular:test`.\n */\nexport default function migrateVitestBuilderAliases(): Rule {\n return (tree: Tree, context: SchematicContext) => {\n const rewritten: string[] = [];\n tree.visit((filePath) => {\n if (filePath.includes('/node_modules/')) return;\n if (!isWorkspaceFile(filePath)) return;\n\n const source = tree.read(filePath)?.toString('utf-8');\n if (!source) return;\n\n const result = REMOVED_ALIASES.reduce(\n (content, alias) =>\n content.replaceAll(`\"${alias}\"`, `\"${VITEST_BUILDER}\"`),\n source,\n );\n if (result !== source) {\n tree.overwrite(filePath, result);\n rewritten.push(filePath);\n }\n });\n\n if (rewritten.length === 0) {\n return tree;\n }\n\n context.logger.info(\n `Replaced removed Vitest builder aliases with ${VITEST_BUILDER} in:\\n${rewritten\n .map((file) => ` - ${file}`)\n .join('\\n')}`,\n );\n addVitestAngular(tree, context);\n return tree;\n };\n}\n"],"mappings":";;AAIA,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB;CACtB;CACA;CACA;CACD;AACD,IAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,gBAAgB,UAA2B;CAClD,MAAM,OAAO,SAAS,MAAM,SAAS,YAAY,IAAI,GAAG,EAAE;AAC1D,QAAO,gBAAgB,SAAS,KAAK;;AAGvC,SAAS,iBAAiB,MAAY,SAAiC;CACrE,MAAM,MAAM,KAAK,KAAK,gBAAgB,EAAE,SAAS,QAAQ;AACzD,KAAI,CAAC,IAAK;CAEV,MAAM,MAAM,KAAK,MAAM,IAAI;AAI3B,KACE,IAAI,eAAe,uBACnB,IAAI,kBAAkB,oBAEtB;CAGF,MAAM,UACJ,IAAI,kBAAkB,yBACtB,IAAI,eAAe,yBACnB;AACF,KAAI,kBAAkB;EACpB,GAAG,IAAI;GACN,qBAAqB;EACvB;CACD,MAAM,kBAAkB,IAAI,SAAS,KAAK,GAAG,OAAO;AACpD,MAAK,UACH,iBACA,KAAK,UAAU,KAAK,MAAM,EAAE,GAAG,gBAChC;AACD,SAAQ,QAAQ,IAAI,wBAAwB,CAAC;;;;;;AAO/C,SAAwB,8BAAoC;AAC1D,SAAQ,MAAY,YAA8B;EAChD,MAAM,YAAsB,EAAE;AAC9B,OAAK,OAAO,aAAa;AACvB,OAAI,SAAS,SAAS,iBAAiB,CAAE;AACzC,OAAI,CAAC,gBAAgB,SAAS,CAAE;GAEhC,MAAM,SAAS,KAAK,KAAK,SAAS,EAAE,SAAS,QAAQ;AACrD,OAAI,CAAC,OAAQ;GAEb,MAAM,SAAS,gBAAgB,QAC5B,SAAS,UACR,QAAQ,WAAW,IAAI,MAAM,IAAI,IAAI,eAAe,GAAG,EACzD,OACD;AACD,OAAI,WAAW,QAAQ;AACrB,SAAK,UAAU,UAAU,OAAO;AAChC,cAAU,KAAK,SAAS;;IAE1B;AAEF,MAAI,UAAU,WAAW,EACvB,QAAO;AAGT,UAAQ,OAAO,KACb,gDAAgD,eAAe,QAAQ,UACpE,KAAK,SAAS,OAAO,OAAO,CAC5B,KAAK,KAAK,GACd;AACD,mBAAiB,MAAM,QAAQ;AAC/B,SAAO"}
|
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
"version": "3.0.0-alpha.56",
|
|
6
6
|
"description": "Migrate Analog vite.config from a single analog() call to the separated analog() + angular() + nitro() plugin shape",
|
|
7
7
|
"factory": "./migrate-to-separated-plugins/migrate-to-separated-plugins"
|
|
8
|
+
},
|
|
9
|
+
"migrate-setup-testbed-browser-mode": {
|
|
10
|
+
"version": "3.0.0-alpha.97",
|
|
11
|
+
"description": "Replace the removed setupTestBed({ browserMode }) option with teardown.destroyAfterEach",
|
|
12
|
+
"factory": "./migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode"
|
|
13
|
+
},
|
|
14
|
+
"migrate-vitest-builder-aliases": {
|
|
15
|
+
"version": "3.0.0-alpha.97",
|
|
16
|
+
"description": "Replace the removed Vitest builder and executor aliases with @analogjs/vitest-angular:test",
|
|
17
|
+
"factory": "./migrate-vitest-builder-aliases/migrate-vitest-builder-aliases"
|
|
8
18
|
}
|
|
9
19
|
}
|
|
10
20
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Tree } from "@angular-devkit/schematics";
|
|
2
|
+
export interface Edit {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function applyEdits(source: string, edits: Edit[]): string;
|
|
8
|
+
/** Rewrites workspace TypeScript sources that contain `marker`. */
|
|
9
|
+
export declare function rewriteSourceFiles(tree: Tree, marker: string, rewrite: (filePath: string, source: string) => string | null): string[];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region packages/platform/migrations/utils/source-edits.ts
|
|
2
|
+
function applyEdits(source, edits) {
|
|
3
|
+
const sorted = [...edits].sort((a, b) => b.start - a.start);
|
|
4
|
+
let result = source;
|
|
5
|
+
for (const edit of sorted) result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
|
|
6
|
+
return result;
|
|
7
|
+
}
|
|
8
|
+
var SOURCE_EXTENSIONS = [
|
|
9
|
+
".ts",
|
|
10
|
+
".mts",
|
|
11
|
+
".cts",
|
|
12
|
+
".tsx"
|
|
13
|
+
];
|
|
14
|
+
/** Rewrites workspace TypeScript sources that contain `marker`. */
|
|
15
|
+
function rewriteSourceFiles(tree, marker, rewrite) {
|
|
16
|
+
const rewritten = [];
|
|
17
|
+
tree.visit((filePath) => {
|
|
18
|
+
if (filePath.includes("/node_modules/")) return;
|
|
19
|
+
if (!SOURCE_EXTENSIONS.some((ext) => filePath.endsWith(ext))) return;
|
|
20
|
+
const source = tree.read(filePath)?.toString("utf-8");
|
|
21
|
+
if (!source?.includes(marker)) return;
|
|
22
|
+
const result = rewrite(filePath, source);
|
|
23
|
+
if (result !== null && result !== source) {
|
|
24
|
+
tree.overwrite(filePath, result);
|
|
25
|
+
rewritten.push(filePath);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return rewritten;
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { applyEdits, rewriteSourceFiles };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=source-edits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-edits.js","names":[],"sources":["../../../migrations/utils/source-edits.ts"],"sourcesContent":["import type { Tree } from '@angular-devkit/schematics';\n\nexport interface Edit {\n start: number;\n end: number;\n text: string;\n}\n\nexport function applyEdits(source: string, edits: Edit[]): string {\n // Apply right-to-left so earlier offsets stay valid.\n const sorted = [...edits].sort((a, b) => b.start - a.start);\n let result = source;\n for (const edit of sorted) {\n result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);\n }\n return result;\n}\n\nconst SOURCE_EXTENSIONS = ['.ts', '.mts', '.cts', '.tsx'];\n\n/** Rewrites workspace TypeScript sources that contain `marker`. */\nexport function rewriteSourceFiles(\n tree: Tree,\n marker: string,\n rewrite: (filePath: string, source: string) => string | null,\n): string[] {\n const rewritten: string[] = [];\n tree.visit((filePath) => {\n if (filePath.includes('/node_modules/')) return;\n if (!SOURCE_EXTENSIONS.some((ext) => filePath.endsWith(ext))) return;\n\n const source = tree.read(filePath)?.toString('utf-8');\n if (!source?.includes(marker)) return;\n\n const result = rewrite(filePath, source);\n if (result !== null && result !== source) {\n tree.overwrite(filePath, result);\n rewritten.push(filePath);\n }\n });\n return rewritten;\n}\n"],"mappings":";AAQA,SAAgB,WAAW,QAAgB,OAAuB;CAEhE,MAAM,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;CAC3D,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,OACjB,UAAS,OAAO,MAAM,GAAG,KAAK,MAAM,GAAG,KAAK,OAAO,OAAO,MAAM,KAAK,IAAI;AAE3E,QAAO;;AAGT,IAAM,oBAAoB;CAAC;CAAO;CAAQ;CAAQ;CAAO;;AAGzD,SAAgB,mBACd,MACA,QACA,SACU;CACV,MAAM,YAAsB,EAAE;AAC9B,MAAK,OAAO,aAAa;AACvB,MAAI,SAAS,SAAS,iBAAiB,CAAE;AACzC,MAAI,CAAC,kBAAkB,MAAM,QAAQ,SAAS,SAAS,IAAI,CAAC,CAAE;EAE9D,MAAM,SAAS,KAAK,KAAK,SAAS,EAAE,SAAS,QAAQ;AACrD,MAAI,CAAC,QAAQ,SAAS,OAAO,CAAE;EAE/B,MAAM,SAAS,QAAQ,UAAU,OAAO;AACxC,MAAI,WAAW,QAAQ,WAAW,QAAQ;AACxC,QAAK,UAAU,UAAU,OAAO;AAChC,aAAU,KAAK,SAAS;;GAE1B;AACF,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analogjs/platform",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.98",
|
|
4
4
|
"description": "The fullstack meta-framework for Angular",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Brandon Roberts <robertsbt@gmail.com>",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"url": "https://github.com/sponsors/brandonroberts"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@analogjs/vite-plugin-angular": "3.0.0-alpha.
|
|
34
|
+
"@analogjs/vite-plugin-angular": "3.0.0-alpha.98",
|
|
35
35
|
"es-toolkit": "^1.45.1",
|
|
36
36
|
"front-matter": "^4.0.2",
|
|
37
37
|
"magic-string": "^0.30.21",
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
"nitro": "3.0.260903-beta"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"@nx/angular": "^
|
|
53
|
-
"@nx/devkit": "^
|
|
54
|
-
"@nx/vite": "^
|
|
52
|
+
"@nx/angular": "^23.2.0",
|
|
53
|
+
"@nx/devkit": "^23.2.0",
|
|
54
|
+
"@nx/vite": "^23.2.0",
|
|
55
55
|
"marked": "^18.0.0",
|
|
56
56
|
"marked-gfm-heading-id": "^4.1.3",
|
|
57
57
|
"marked-highlight": "^2.2.3",
|
|
@@ -9,19 +9,13 @@
|
|
|
9
9
|
"implementation": "./src/builders/vite/vite-build.js",
|
|
10
10
|
"schema": "./src/builders/vite/schema.json",
|
|
11
11
|
"description": "Build with Vite."
|
|
12
|
-
}
|
|
13
|
-
"vitest": "@analogjs/vitest-angular:test"
|
|
12
|
+
}
|
|
14
13
|
},
|
|
15
14
|
"executors": {
|
|
16
15
|
"vite-dev-server": {
|
|
17
16
|
"implementation": "./src/executors/vite-dev-server/vite-dev-server.impl",
|
|
18
17
|
"schema": "./src/executors/vite-dev-server/schema.json",
|
|
19
18
|
"description": "Vite dev server."
|
|
20
|
-
},
|
|
21
|
-
"vitest": {
|
|
22
|
-
"implementation": "./src/executors/vitest/vitest.impl",
|
|
23
|
-
"schema": "./src/executors/vitest/schema.json",
|
|
24
|
-
"description": "Test with Vitest"
|
|
25
19
|
}
|
|
26
20
|
}
|
|
27
21
|
}
|
|
@@ -22,11 +22,6 @@
|
|
|
22
22
|
"description": "Creates a new Analog page in the given or default project.",
|
|
23
23
|
"aliases": ["p"]
|
|
24
24
|
},
|
|
25
|
-
"setup-vitest": {
|
|
26
|
-
"factory": "./src/generators/setup-vitest/generator",
|
|
27
|
-
"schema": "./src/generators/setup-vitest/schema.json",
|
|
28
|
-
"description": "Setup the Vitest configuration."
|
|
29
|
-
},
|
|
30
25
|
"init": {
|
|
31
26
|
"factory": "./src/generators/init/generator",
|
|
32
27
|
"schema": "./src/generators/init/schema.json",
|
|
@@ -47,11 +42,6 @@
|
|
|
47
42
|
"description": "Creates a new Analog page in the given or default project.",
|
|
48
43
|
"aliases": ["p"]
|
|
49
44
|
},
|
|
50
|
-
"setup-vitest": {
|
|
51
|
-
"factory": "./src/generators/setup-vitest/compat#setupVitestSchematic",
|
|
52
|
-
"schema": "./src/generators/setup-vitest/schema.json",
|
|
53
|
-
"description": "Setup the Vitest configuration."
|
|
54
|
-
},
|
|
55
45
|
"init": {
|
|
56
46
|
"factory": "./src/generators/init/compat#initSchematic",
|
|
57
47
|
"schema": "./src/generators/init/schema.json",
|
|
@@ -3,22 +3,15 @@ import {
|
|
|
3
3
|
<% if (majorAngularVersion < 21) { %>provideZonelessChangeDetection,<% } %>
|
|
4
4
|
provideBrowserGlobalErrorListeners,
|
|
5
5
|
} from '@angular/core';
|
|
6
|
-
import {
|
|
7
|
-
provideHttpClient,
|
|
8
|
-
withFetch,
|
|
9
|
-
withInterceptors,
|
|
10
|
-
} from '@angular/common/http';
|
|
6
|
+
import { provideHttpClient, withFetch } from '@angular/common/http';
|
|
11
7
|
import { provideClientHydration } from '@angular/platform-browser';
|
|
12
|
-
import { provideFileRouter
|
|
8
|
+
import { provideFileRouter } from '@analogjs/router';
|
|
13
9
|
|
|
14
10
|
export const appConfig: ApplicationConfig = {
|
|
15
11
|
providers: [provideBrowserGlobalErrorListeners(),
|
|
16
12
|
<% if (majorAngularVersion < 21) { %>provideZonelessChangeDetection(),<% } %>
|
|
17
13
|
provideFileRouter(),
|
|
18
14
|
provideClientHydration(),
|
|
19
|
-
provideHttpClient(
|
|
20
|
-
withFetch(),
|
|
21
|
-
withInterceptors([requestContextInterceptor])
|
|
22
|
-
),
|
|
15
|
+
provideHttpClient(withFetch()),
|
|
23
16
|
],
|
|
24
17
|
};
|
|
@@ -41,11 +41,8 @@ function normalizeOptions(tree, options) {
|
|
|
41
41
|
}
|
|
42
42
|
async function appGenerator(tree, options) {
|
|
43
43
|
const nxVersion = require_version_utils.getInstalledPackageVersion(tree, "nx");
|
|
44
|
-
if (nxVersion && require_minimum_supported_versions.belowMinimumSupportedNxVersion(nxVersion)) throw new Error(_nx_devkit.stripIndents`Nx
|
|
45
|
-
if (options.linter === "oxlint")
|
|
46
|
-
if (!nxVersion) throw new Error(_nx_devkit.stripIndents`The oxlint linter is only supported in Nx workspaces`);
|
|
47
|
-
if (require_minimum_supported_versions.belowMinimumSupportedOxlintNxVersion(nxVersion)) throw new Error(_nx_devkit.stripIndents`Nx v${require_minimum_supported_versions.MINIMUM_SUPPORTED_OXLINT_NX_VERSION} or newer is required to use the oxlint linter`);
|
|
48
|
-
}
|
|
44
|
+
if (nxVersion && require_minimum_supported_versions.belowMinimumSupportedNxVersion(nxVersion)) throw new Error(_nx_devkit.stripIndents`Nx v${require_minimum_supported_versions.MINIMUM_SUPPORTED_NX_VERSION} or newer is required to install Analog`);
|
|
45
|
+
if (options.linter === "oxlint" && !nxVersion) throw new Error(_nx_devkit.stripIndents`The oxlint linter is only supported in Nx workspaces`);
|
|
49
46
|
const normalizedOptions = normalizeOptions(tree, options);
|
|
50
47
|
if (nxVersion) await require_add_angular_app.addAngularApp(tree, normalizedOptions);
|
|
51
48
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/app/generator.ts"],"sourcesContent":["import {\n formatFiles,\n getWorkspaceLayout,\n installPackagesTask,\n names,\n offsetFromRoot as determineOffsetFromRoot,\n stripIndents,\n Tree,\n addDependenciesToPackageJson,\n updateJson,\n} from '@nx/devkit';\nimport { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter';\nimport { AnalogNxApplicationGeneratorOptions } from './schema';\nimport { major, coerce } from 'semver';\nimport { getInstalledPackageVersion } from '../../utils/version-utils';\nimport { addHomePage } from './lib/add-home-page';\nimport {\n belowMinimumSupportedNxVersion,\n
|
|
1
|
+
{"version":3,"file":"generator.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/app/generator.ts"],"sourcesContent":["import {\n formatFiles,\n getWorkspaceLayout,\n installPackagesTask,\n names,\n offsetFromRoot as determineOffsetFromRoot,\n stripIndents,\n Tree,\n addDependenciesToPackageJson,\n updateJson,\n} from '@nx/devkit';\nimport { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter';\nimport { AnalogNxApplicationGeneratorOptions } from './schema';\nimport { major, coerce } from 'semver';\nimport { getInstalledPackageVersion } from '../../utils/version-utils';\nimport { addHomePage } from './lib/add-home-page';\nimport {\n belowMinimumSupportedNxVersion,\n MINIMUM_SUPPORTED_NX_VERSION,\n} from './versions/minimum-supported-versions';\nimport { addAngularApp } from './lib/add-angular-app';\nimport setupAnalogGenerator from '../init/generator';\nimport { addFiles } from './lib/add-files';\nimport { addAgentContext } from './lib/add-agent-context';\nimport { addTailwindConfig } from './lib/add-tailwind-config';\nimport { cleanupFiles } from './lib/cleanup-files';\nimport { addAnalogProjectConfig } from './lib/add-analog-project-config';\nimport { updateIndex } from './lib/update-index-html';\n\nexport interface NormalizedOptions\n extends AnalogNxApplicationGeneratorOptions, ReturnType<typeof names> {\n projectName: string;\n projectRoot: string;\n projectDirectory: string;\n parsedTags: string[];\n offsetFromRoot: string;\n appsDir: string;\n nxPackageNamespace: string;\n isNx: boolean;\n}\n\nfunction normalizeOptions(\n tree: Tree,\n options: AnalogNxApplicationGeneratorOptions,\n): NormalizedOptions {\n const isNx = tree.exists('/nx.json');\n const appsDir = isNx ? getWorkspaceLayout(tree).appsDir : 'projects';\n const allNames = names(options.analogAppName);\n const projectDirectory = allNames.fileName;\n const projectName = projectDirectory.replace(new RegExp('/', 'g'), '-');\n const projectRoot = `${appsDir}/${projectDirectory}`;\n const parsedTags = options.tags\n ? options.tags.split(',').map((s) => s.trim())\n : [];\n const offsetFromRoot = determineOffsetFromRoot(projectRoot);\n const nxPackageNamespace = '@nx';\n const addTailwind = options.addTailwind ?? true;\n\n return {\n ...options,\n ...allNames,\n projectName,\n projectRoot,\n projectDirectory,\n parsedTags,\n offsetFromRoot,\n appsDir,\n nxPackageNamespace,\n addTailwind,\n isNx,\n };\n}\n\nasync function appGenerator(\n tree: Tree,\n options: AnalogNxApplicationGeneratorOptions,\n): Promise<() => void> {\n const nxVersion = getInstalledPackageVersion(tree, 'nx');\n\n if (nxVersion && belowMinimumSupportedNxVersion(nxVersion)) {\n throw new Error(\n stripIndents`Nx v${MINIMUM_SUPPORTED_NX_VERSION} or newer is required to install Analog`,\n );\n }\n\n if (options.linter === 'oxlint' && !nxVersion) {\n throw new Error(\n stripIndents`The oxlint linter is only supported in Nx workspaces`,\n );\n }\n\n const normalizedOptions = normalizeOptions(tree, options);\n\n if (nxVersion) {\n await addAngularApp(tree, normalizedOptions);\n } else {\n const angularAppSchematic = wrapAngularDevkitSchematic(\n '@schematics/angular',\n 'application',\n );\n await angularAppSchematic(tree, {\n projectRoot: normalizedOptions.projectRoot,\n name: normalizedOptions.analogAppName,\n });\n addAnalogProjectConfig(\n tree,\n normalizedOptions.projectRoot,\n normalizedOptions.projectName,\n normalizedOptions.parsedTags,\n normalizedOptions.name,\n normalizedOptions.appsDir,\n normalizedOptions.nxPackageNamespace,\n );\n }\n\n await setupAnalogGenerator(tree, {\n project: normalizedOptions.analogAppName,\n vitest: true,\n });\n\n const angularVersion = getInstalledPackageVersion(tree, '@angular/core');\n const coercedAngularVersion = coerce(angularVersion ?? '');\n if (!coercedAngularVersion) {\n throw new Error('Could not determine installed Angular version.');\n }\n const majorAngularVersion = major(coercedAngularVersion);\n addFiles(tree, normalizedOptions, majorAngularVersion);\n addDependenciesToPackageJson(\n tree,\n {\n 'front-matter': '^4.0.2',\n marked: '^18.0.0',\n mermaid: '^10.2.4',\n prismjs: '^1.29.0',\n },\n {},\n );\n\n updateJson<{\n dependencies: Record<string, string>;\n overrides?: Record<string, unknown>;\n }>(tree, '/package.json', (json) => {\n json.dependencies['@angular/platform-server'] = `~${angularVersion}`;\n json.overrides = {\n ...json.overrides,\n vite: '$vite',\n vitest: '$vitest',\n };\n\n return json;\n });\n\n updateIndex(tree, normalizedOptions.analogAppName);\n\n if (normalizedOptions.addTailwind) {\n await addTailwindConfig(tree, normalizedOptions.projectName);\n }\n\n addHomePage(tree, normalizedOptions, majorAngularVersion);\n\n if (!normalizedOptions.skipAgentContext) {\n addAgentContext(tree, normalizedOptions.projectRoot);\n }\n\n cleanupFiles(tree, normalizedOptions);\n\n if (!normalizedOptions.skipFormat) {\n await formatFiles(tree);\n }\n\n return () => {\n installPackagesTask(tree);\n };\n}\n\nexport default appGenerator;\n"],"mappings":";;;;;;;;;;;;;;;;AAyCA,SAAS,iBACP,MACA,SACmB;CACnB,MAAM,OAAO,KAAK,OAAO,WAAW;CACpC,MAAM,UAAU,QAAA,GAAA,WAAA,oBAA0B,KAAK,CAAC,UAAU;CAC1D,MAAM,YAAA,GAAA,WAAA,OAAiB,QAAQ,cAAc;CAC7C,MAAM,mBAAmB,SAAS;CAClC,MAAM,cAAc,iBAAiB,wBAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,IAAI;CACvE,MAAM,cAAc,GAAG,QAAQ,GAAG;CAClC,MAAM,aAAa,QAAQ,OACvB,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,GAC5C,EAAE;CACN,MAAM,kBAAA,GAAA,WAAA,gBAAyC,YAAY;CAC3D,MAAM,qBAAqB;CAC3B,MAAM,cAAc,QAAQ,eAAe;AAE3C,QAAO;EACL,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,eAAe,aACb,MACA,SACqB;CACrB,MAAM,YAAY,sBAAA,2BAA2B,MAAM,KAAK;AAExD,KAAI,aAAa,mCAAA,+BAA+B,UAAU,CACxD,OAAM,IAAI,MACR,WAAA,YAAY,OAAO,mCAAA,6BAA6B,yCACjD;AAGH,KAAI,QAAQ,WAAW,YAAY,CAAC,UAClC,OAAM,IAAI,MACR,WAAA,YAAY,uDACb;CAGH,MAAM,oBAAoB,iBAAiB,MAAM,QAAQ;AAEzD,KAAI,UACF,OAAM,wBAAA,cAAc,MAAM,kBAAkB;MACvC;AAKL,SAAA,GAAA,yBAAA,4BAHE,uBACA,cACD,CACyB,MAAM;GAC9B,aAAa,kBAAkB;GAC/B,MAAM,kBAAkB;GACzB,CAAC;AACF,oCAAA,uBACE,MACA,kBAAkB,aAClB,kBAAkB,aAClB,kBAAkB,YAClB,kBAAkB,MAClB,kBAAkB,SAClB,kBAAkB,mBACnB;;AAGH,OAAM,sCAAqB,MAAM;EAC/B,SAAS,kBAAkB;EAC3B,QAAQ;EACT,CAAC;CAEF,MAAM,iBAAiB,sBAAA,2BAA2B,MAAM,gBAAgB;CACxE,MAAM,yBAAA,GAAA,OAAA,QAA+B,kBAAkB,GAAG;AAC1D,KAAI,CAAC,sBACH,OAAM,IAAI,MAAM,iDAAiD;CAEnE,MAAM,uBAAA,GAAA,OAAA,OAA4B,sBAAsB;AACxD,mBAAA,SAAS,MAAM,mBAAmB,oBAAoB;AACtD,EAAA,GAAA,WAAA,8BACE,MACA;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,SAAS;EACV,EACD,EAAE,CACH;AAED,EAAA,GAAA,WAAA,YAGG,MAAM,kBAAkB,SAAS;AAClC,OAAK,aAAa,8BAA8B,IAAI;AACpD,OAAK,YAAY;GACf,GAAG,KAAK;GACR,MAAM;GACN,QAAQ;GACT;AAED,SAAO;GACP;AAEF,2BAAA,YAAY,MAAM,kBAAkB,cAAc;AAElD,KAAI,kBAAkB,YACpB,OAAM,4BAAA,kBAAkB,MAAM,kBAAkB,YAAY;AAG9D,uBAAA,YAAY,MAAM,mBAAmB,oBAAoB;AAEzD,KAAI,CAAC,kBAAkB,iBACrB,2BAAA,gBAAgB,MAAM,kBAAkB,YAAY;AAGtD,uBAAA,aAAa,MAAM,kBAAkB;AAErC,KAAI,CAAC,kBAAkB,WACrB,QAAA,GAAA,WAAA,aAAkB,KAAK;AAGzB,cAAa;AACX,GAAA,GAAA,WAAA,qBAAoB,KAAK"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
export declare const MINIMUM_SUPPORTED_NX_VERSION = "
|
|
1
|
+
export declare const MINIMUM_SUPPORTED_NX_VERSION = "23.2.0";
|
|
2
2
|
export declare const MINIMUM_SUPPORTED_ANGULAR_VERSION = "20.0.0";
|
|
3
3
|
export declare const belowMinimumSupportedNxVersion: (nxVersion: string) => boolean;
|
|
4
|
-
export declare const belowMinimumSupportedAngularVersion: (angularVersion: string) => boolean;
|
|
5
|
-
export declare const MINIMUM_SUPPORTED_OXLINT_NX_VERSION = "23.2.0";
|
|
6
|
-
export declare const belowMinimumSupportedOxlintNxVersion: (nxVersion: string) => boolean;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
require("../../../../_virtual/_rolldown/runtime.js");
|
|
2
2
|
let semver = require("semver");
|
|
3
3
|
//#region packages/nx-plugin/src/generators/app/versions/minimum-supported-versions.ts
|
|
4
|
-
var MINIMUM_SUPPORTED_NX_VERSION = "
|
|
4
|
+
var MINIMUM_SUPPORTED_NX_VERSION = "23.2.0";
|
|
5
5
|
var belowMinimumSupportedNxVersion = (nxVersion) => (0, semver.lt)((0, semver.coerce)(nxVersion), MINIMUM_SUPPORTED_NX_VERSION);
|
|
6
|
-
var MINIMUM_SUPPORTED_OXLINT_NX_VERSION = "23.2.0";
|
|
7
|
-
var belowMinimumSupportedOxlintNxVersion = (nxVersion) => (0, semver.lt)((0, semver.coerce)(nxVersion), MINIMUM_SUPPORTED_OXLINT_NX_VERSION);
|
|
8
6
|
//#endregion
|
|
9
|
-
exports.
|
|
7
|
+
exports.MINIMUM_SUPPORTED_NX_VERSION = MINIMUM_SUPPORTED_NX_VERSION;
|
|
10
8
|
exports.belowMinimumSupportedNxVersion = belowMinimumSupportedNxVersion;
|
|
11
|
-
exports.belowMinimumSupportedOxlintNxVersion = belowMinimumSupportedOxlintNxVersion;
|
|
12
9
|
|
|
13
10
|
//# sourceMappingURL=minimum-supported-versions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimum-supported-versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/app/versions/minimum-supported-versions.ts"],"sourcesContent":["import { lt, coerce } from 'semver';\n\nexport const MINIMUM_SUPPORTED_NX_VERSION = '
|
|
1
|
+
{"version":3,"file":"minimum-supported-versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/app/versions/minimum-supported-versions.ts"],"sourcesContent":["import { lt, coerce } from 'semver';\n\nexport const MINIMUM_SUPPORTED_NX_VERSION = '23.2.0';\nexport const MINIMUM_SUPPORTED_ANGULAR_VERSION = '20.0.0';\n\nexport const belowMinimumSupportedNxVersion = (nxVersion: string): boolean =>\n lt(coerce(nxVersion)!, MINIMUM_SUPPORTED_NX_VERSION);\n"],"mappings":";;;AAEA,IAAa,+BAA+B;AAG5C,IAAa,kCAAkC,eAAA,GAAA,OAAA,KAAA,GAAA,OAAA,QACnC,UAAU,EAAG,6BAA6B"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export declare const V18_X_NX_DEVKIT = "^20.0.0";
|
|
2
2
|
export declare const V18_X_NX_ANGULAR = "^20.0.0";
|
|
3
|
-
export declare const V18_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.
|
|
4
|
-
export declare const V18_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.
|
|
5
|
-
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.
|
|
6
|
-
export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.
|
|
3
|
+
export declare const V18_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.98";
|
|
4
|
+
export declare const V18_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.98";
|
|
5
|
+
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.98";
|
|
6
|
+
export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.98";
|
|
7
7
|
export declare const V18_X_FRONT_MATTER = "^4.0.2";
|
|
8
8
|
export declare const V18_X_MARKED = "^18.0.0";
|
|
9
9
|
export declare const V18_X_MARKED_GFM_HEADING_ID = "^4.1.1";
|
|
@@ -15,8 +15,8 @@ export declare const V18_X_TAILWINDCSS = "^4.2.2";
|
|
|
15
15
|
export declare const V18_X_TAILWINDCSS_POSTCSS = "^4.2.2";
|
|
16
16
|
export declare const V18_X_TAILWINDCSS_VITE = "^4.2.2";
|
|
17
17
|
export declare const V18_X_POSTCSS = "^8.5.6";
|
|
18
|
-
export declare const V18_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.
|
|
19
|
-
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_NITRO = "^3.0.0-alpha.
|
|
18
|
+
export declare const V18_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.98";
|
|
19
|
+
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_NITRO = "^3.0.0-alpha.98";
|
|
20
20
|
export declare const V18_X_H3 = "^1.13.0";
|
|
21
21
|
export declare const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = "^20.0.0";
|
|
22
22
|
export declare const V18_X_NX_VITE = "^21.0.0";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../../nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"sourcesContent":["// V18_X\n// dependencies\nexport const V18_X_NX_DEVKIT = '^20.0.0';\nexport const V18_X_NX_ANGULAR = '^20.0.0';\nexport const V18_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.
|
|
1
|
+
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../../nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"sourcesContent":["// V18_X\n// dependencies\nexport const V18_X_NX_DEVKIT = '^20.0.0';\nexport const V18_X_NX_ANGULAR = '^20.0.0';\nexport const V18_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.98';\nexport const V18_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.98';\nexport const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.98';\nexport const V18_X_ANALOG_JS_VITEST_ANGULAR = '^3.0.0-alpha.98';\nexport const V18_X_FRONT_MATTER = '^4.0.2';\nexport const V18_X_MARKED = '^18.0.0';\nexport const V18_X_MARKED_GFM_HEADING_ID = '^4.1.1';\nexport const V18_X_MARKED_HIGHLIGHT = '^2.2.1';\nexport const V18_X_MARKED_MANGLE = '^1.1.10';\nexport const V18_X_MERMAID = '^10.2.4';\nexport const V18_X_PRISMJS = '^1.29.0';\nexport const V18_X_TAILWINDCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_POSTCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_VITE = '^4.2.2';\nexport const V18_X_POSTCSS = '^8.5.6';\n\n// devDependencies\nexport const V18_X_ANALOG_JS_PLATFORM = '^3.0.0-alpha.98';\nexport const V18_X_ANALOG_JS_VITE_PLUGIN_NITRO = '^3.0.0-alpha.98';\nexport const V18_X_H3 = '^1.13.0';\nexport const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = '^20.0.0';\nexport const V18_X_NX_VITE = '^21.0.0';\nexport const V18_X_NX_LINTER = '^21.0.0';\nexport const V18_X_JSDOM = '^22.1.0';\nexport const V18_X_VITE = '^8.0.0';\nexport const V18_X_VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const V18_X_VITEST = '^5.0.0';\nexport const V18_X_ZOD = '^3.21.4';\n"],"mappings":";AAeA,IAAa,oBAAoB;AACjC,IAAa,4BAA4B;AACzC,IAAa,yBAAyB;AACtC,IAAa,gBAAgB"}
|
|
@@ -4,7 +4,7 @@ const require_dependencies = require("../../../utils/versions/dependencies.js");
|
|
|
4
4
|
let _nx_devkit = require("@nx/devkit");
|
|
5
5
|
//#region packages/nx-plugin/src/generators/init/lib/add-analog-dependencies.ts
|
|
6
6
|
function addAnalogDependencies(tree, angularVersion, vitest, nxVersion) {
|
|
7
|
-
const devDependencies = require_dev_dependencies.getAnalogDevDependencies(angularVersion
|
|
7
|
+
const devDependencies = require_dev_dependencies.getAnalogDevDependencies(angularVersion);
|
|
8
8
|
const dependencies = require_dependencies.getAnalogDependencies(angularVersion);
|
|
9
9
|
if (!nxVersion) delete devDependencies["@nx/vite"];
|
|
10
10
|
if (!vitest) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-analog-dependencies.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/init/lib/add-analog-dependencies.ts"],"sourcesContent":["import { addDependenciesToPackageJson, Tree } from '@nx/devkit';\n\nimport { getAnalogDevDependencies } from '../../../utils/versions/dev-dependencies';\nimport { getAnalogDependencies } from '../../../utils/versions/dependencies';\n\nexport function addAnalogDependencies(\n tree: Tree,\n angularVersion: string,\n vitest: boolean,\n nxVersion?: string,\n): void {\n const devDependencies: Record<string, string>
|
|
1
|
+
{"version":3,"file":"add-analog-dependencies.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/init/lib/add-analog-dependencies.ts"],"sourcesContent":["import { addDependenciesToPackageJson, Tree } from '@nx/devkit';\n\nimport { getAnalogDevDependencies } from '../../../utils/versions/dev-dependencies';\nimport { getAnalogDependencies } from '../../../utils/versions/dependencies';\n\nexport function addAnalogDependencies(\n tree: Tree,\n angularVersion: string,\n vitest: boolean,\n nxVersion?: string,\n): void {\n const devDependencies: Record<string, string> =\n getAnalogDevDependencies(angularVersion);\n const dependencies = getAnalogDependencies(angularVersion);\n\n if (!nxVersion) {\n delete devDependencies['@nx/vite'];\n }\n\n if (!vitest) {\n delete devDependencies['vitest'];\n delete devDependencies['@vitest/coverage-v8'];\n delete devDependencies['@vitest/ui'];\n }\n\n addDependenciesToPackageJson(\n tree,\n {\n ...dependencies,\n '@angular/platform-server': `^${angularVersion}`,\n },\n devDependencies,\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,sBACd,MACA,gBACA,QACA,WACM;CACN,MAAM,kBACJ,yBAAA,yBAAyB,eAAe;CAC1C,MAAM,eAAe,qBAAA,sBAAsB,eAAe;AAE1D,KAAI,CAAC,UACH,QAAO,gBAAgB;AAGzB,KAAI,CAAC,QAAQ;AACX,SAAO,gBAAgB;AACvB,SAAO,gBAAgB;AACvB,SAAO,gBAAgB;;AAGzB,EAAA,GAAA,WAAA,8BACE,MACA;EACE,GAAG;EACH,4BAA4B,IAAI;EACjC,EACD,gBACD"}
|