@analogjs/vitest-angular 3.0.0-alpha.9 → 3.0.0-alpha.90
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/README.md +304 -0
- package/_virtual/_@oxc-project_runtime@0.124.0/helpers/decorate.js +9 -0
- package/package.json +24 -8
- package/setup-serializers.d.ts +1 -0
- package/setup-serializers.js +13 -0
- package/setup-serializers.js.map +1 -0
- package/setup-snapshots.d.ts +1 -26
- package/setup-snapshots.js +4 -73
- package/setup-snapshots.js.map +1 -1
- package/setup-testbed.d.ts +14 -12
- package/setup-testbed.js +11 -7
- package/setup-testbed.js.map +1 -1
- package/setup-zone.d.ts +6 -5
- package/setup-zone.js +84 -83
- package/setup-zone.js.map +1 -1
- package/src/index.d.ts +2 -2
- package/src/lib/builders/build/devkit.d.ts +2 -2
- package/src/lib/builders/build/devkit.js +4 -3
- package/src/lib/builders/build/devkit.js.map +1 -1
- package/src/lib/builders/build/plugins/angular-memory-plugin.d.ts +13 -20
- package/src/lib/builders/build/plugins/angular-memory-plugin.js.map +1 -1
- package/src/lib/builders/build/plugins/downlevel-plugin.d.ts +6 -6
- package/src/lib/builders/build/plugins/downlevel-plugin.js.map +1 -1
- package/src/lib/builders/build/schema.js.map +1 -1
- package/src/lib/builders/build/schema.json +47 -0
- package/src/lib/builders/build/utils.d.ts +3 -3
- package/src/lib/builders/build/vitest.impl.d.ts +5 -5
- package/src/lib/builders/build/vitest.impl.js +3 -2
- package/src/lib/builders/build/vitest.impl.js.map +1 -1
- package/src/lib/builders/test/schema.js.map +1 -1
- package/src/lib/builders/test/schema.json +47 -0
- package/src/lib/builders/test/vitest.impl.d.ts +1 -1
- package/src/lib/builders/test/vitest.impl.js +3 -3
- package/src/lib/builders/test/vitest.impl.js.map +1 -1
- package/src/lib/snapshot-serializers/angular-fixture.d.ts +2 -0
- package/src/lib/snapshot-serializers/angular-fixture.js +71 -0
- package/src/lib/snapshot-serializers/angular-fixture.js.map +1 -0
- package/src/lib/snapshot-serializers/html-comment.d.ts +2 -0
- package/src/lib/snapshot-serializers/html-comment.js +11 -0
- package/src/lib/snapshot-serializers/html-comment.js.map +1 -0
- package/src/lib/snapshot-serializers/index.d.ts +3 -0
- package/src/lib/snapshot-serializers/no-ng-attributes.d.ts +4 -0
- package/src/lib/snapshot-serializers/no-ng-attributes.js +63 -0
- package/src/lib/snapshot-serializers/no-ng-attributes.js.map +1 -0
- package/src/lib/tools/collection.json +2 -2
- package/src/lib/tools/index.d.ts +1 -0
- package/src/lib/tools/package.json +1 -3
- package/src/lib/tools/{src/schematics → schematics}/setup/files/src/test-setup.ts.template +1 -0
- package/src/lib/tools/{src/schematics → schematics}/setup/files/vite.config.mts.template +2 -7
- package/src/lib/tools/schematics/setup/index.d.ts +3 -0
- package/src/lib/tools/schematics/setup/index.js.map +1 -0
- package/src/lib/tools/schematics/utils/angular.d.ts +3 -0
- package/src/lib/tools/schematics/utils/angular.js.map +1 -0
- package/src/lib/tools/schematics/utils/dependencies.d.ts +6 -0
- package/src/lib/tools/schematics/utils/dependencies.js.map +1 -0
- package/src/lib/tools/schematics/utils/index.d.ts +4 -0
- package/src/lib/tools/schematics/utils/versions.d.ts +7 -0
- package/src/lib/tools/{src/schematics → schematics}/utils/versions.js +1 -1
- package/src/lib/tools/schematics/utils/versions.js.map +1 -0
- package/src/lib/tools/schematics/utils/workspace.d.ts +15 -0
- package/src/lib/tools/schematics/utils/workspace.js.map +1 -0
- package/src/lib/tools/src/index.d.ts +1 -1
- package/src/lib/tools/src/schematics/setup/index.d.ts +2 -2
- package/src/lib/tools/src/schematics/utils/angular.d.ts +1 -1
- package/src/lib/tools/src/schematics/utils/dependencies.d.ts +2 -2
- package/src/lib/tools/src/schematics/utils/index.d.ts +4 -4
- package/src/lib/tools/src/schematics/utils/versions.d.ts +1 -1
- package/src/lib/tools/src/schematics/utils/workspace.d.ts +8 -8
- package/src/test-setup.d.ts +3 -0
- package/_virtual/_rolldown/runtime.js +0 -7
- package/src/lib/tools/src/schematics/setup/index.js.map +0 -1
- package/src/lib/tools/src/schematics/utils/angular.js.map +0 -1
- package/src/lib/tools/src/schematics/utils/dependencies.js.map +0 -1
- package/src/lib/tools/src/schematics/utils/versions.js.map +0 -1
- package/src/lib/tools/src/schematics/utils/workspace.js.map +0 -1
- /package/src/lib/tools/{src/index.js → index.js} +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/jsonc-parser.d.ts +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/semver.d.ts +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/setup/index.js +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/setup/schema.d.ts +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/setup/schema.json +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/utils/angular.js +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/utils/dependencies.js +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/utils/index.js +0 -0
- /package/src/lib/tools/{src/schematics → schematics}/utils/workspace.js +0 -0
|
@@ -31,9 +31,9 @@ async function vitestBuilder(options, context) {
|
|
|
31
31
|
else process.exit(0);
|
|
32
32
|
};
|
|
33
33
|
if (options.watch) {
|
|
34
|
-
process.
|
|
35
|
-
process.
|
|
36
|
-
process.
|
|
34
|
+
process.once("SIGINT", processExit);
|
|
35
|
+
process.once("SIGTERM", processExit);
|
|
36
|
+
process.once("exit", processExit);
|
|
37
37
|
}
|
|
38
38
|
hasErrors = process.exitCode && process.exitCode !== 0;
|
|
39
39
|
return { success: !hasErrors };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.impl.js","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"vitest.impl.js","names":[],"sources":["../../../../../src/lib/builders/test/vitest.impl.ts"],"sourcesContent":["import {\n BuilderContext,\n BuilderOutput,\n createBuilder,\n} from '@angular-devkit/architect';\n\nimport { VitestSchema } from './schema';\n\nasync function vitestBuilder(\n options: VitestSchema,\n context: BuilderContext,\n): Promise<BuilderOutput> {\n process.env['TEST'] = 'true';\n process.env['VITEST'] = 'true';\n\n const { startVitest } = await (Function(\n 'return import(\"vitest/node\")',\n )() as Promise<typeof import('vitest/node')>);\n\n const projectConfig = await context.getProjectMetadata(\n context.target as unknown as string,\n );\n const { coverageArgs, ...extraArgs } = await getExtraArgs(options);\n const watch = options.watch === true;\n const ui = options.ui === true;\n const coverageEnabled = options.coverage === true;\n const update = options.update === true;\n const config = {\n root: `${projectConfig['root'] || '.'}`,\n watch,\n ui,\n config: options.configFile,\n coverage: {\n enabled: coverageEnabled,\n ...coverageArgs,\n },\n update,\n ...extraArgs,\n };\n const viteOverrides: any = {\n test: { watch },\n };\n\n const server = await startVitest(\n 'test',\n options.testFiles ?? [],\n config,\n viteOverrides,\n );\n\n let hasErrors = false;\n\n const processExit = () => {\n server?.exit();\n if (hasErrors) {\n process.exit(1);\n } else {\n process.exit(0);\n }\n };\n\n // .once() prevents listener stacking across repeated Nx executor runs\n // that share the same host process (avoids MaxListenersExceededWarning).\n if (options.watch) {\n process.once('SIGINT', processExit);\n process.once('SIGTERM', processExit);\n process.once('exit', processExit);\n }\n\n // vitest sets the exitCode = 1 when code coverage isn't met\n hasErrors = (process.exitCode && process.exitCode !== 0) as boolean;\n\n return {\n success: !hasErrors,\n };\n}\n\nexport async function getExtraArgs(\n options: VitestSchema,\n): Promise<Record<string, any>> {\n // support passing extra args to Vitest CLI\n const schema = await import('./schema.json', { with: { type: 'json' } });\n const extraArgs: Record<string, any> = {};\n for (const key of Object.keys(options)) {\n if (!(schema as any).default.properties[key]) {\n extraArgs[key] = (options as any)[key];\n }\n }\n\n return extraArgs;\n}\n\nexport default createBuilder(vitestBuilder) as any;\n"],"mappings":";;AAQA,eAAe,cACb,SACA,SACwB;AACxB,SAAQ,IAAI,UAAU;AACtB,SAAQ,IAAI,YAAY;CAExB,MAAM,EAAE,gBAAgB,MAAO,SAC7B,iCACD,EAAE;CAEH,MAAM,gBAAgB,MAAM,QAAQ,mBAClC,QAAQ,OACT;CACD,MAAM,EAAE,cAAc,GAAG,cAAc,MAAM,aAAa,QAAQ;CAClE,MAAM,QAAQ,QAAQ,UAAU;CAChC,MAAM,KAAK,QAAQ,OAAO;CAC1B,MAAM,kBAAkB,QAAQ,aAAa;CAC7C,MAAM,SAAS,QAAQ,WAAW;CAClC,MAAM,SAAS;EACb,MAAM,GAAG,cAAc,WAAW;EAClC;EACA;EACA,QAAQ,QAAQ;EAChB,UAAU;GACR,SAAS;GACT,GAAG;GACJ;EACD;EACA,GAAG;EACJ;CACD,MAAM,gBAAqB,EACzB,MAAM,EAAE,OAAO,EAChB;CAED,MAAM,SAAS,MAAM,YACnB,QACA,QAAQ,aAAa,EAAE,EACvB,QACA,cACD;CAED,IAAI,YAAY;CAEhB,MAAM,oBAAoB;AACxB,UAAQ,MAAM;AACd,MAAI,UACF,SAAQ,KAAK,EAAE;MAEf,SAAQ,KAAK,EAAE;;AAMnB,KAAI,QAAQ,OAAO;AACjB,UAAQ,KAAK,UAAU,YAAY;AACnC,UAAQ,KAAK,WAAW,YAAY;AACpC,UAAQ,KAAK,QAAQ,YAAY;;AAInC,aAAa,QAAQ,YAAY,QAAQ,aAAa;AAEtD,QAAO,EACL,SAAS,CAAC,WACX;;AAGH,eAAsB,aACpB,SAC8B;CAE9B,MAAM,SAAS,MAAM,OAAO,iBAAiB,EAAE,MAAM,EAAE,MAAM,QAAQ,EAAE;CACvE,MAAM,YAAiC,EAAE;AACzC,MAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,CACpC,KAAI,CAAE,OAAe,QAAQ,WAAW,KACtC,WAAU,OAAQ,QAAgB;AAItC,QAAO;;AAGT,IAAA,sBAAe,cAAc,cAAc"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
//#region packages/vitest-angular/src/lib/snapshot-serializers/angular-fixture.ts
|
|
2
|
+
/**
|
|
3
|
+
* Check if is an Angular fixture
|
|
4
|
+
*
|
|
5
|
+
* @param val Angular fixture
|
|
6
|
+
* @returns boolean who check if is an angular fixture
|
|
7
|
+
*/
|
|
8
|
+
function isAngularFixture(val) {
|
|
9
|
+
if (typeof val !== "object") return false;
|
|
10
|
+
if (val["componentRef"] || val["componentInstance"]) return true;
|
|
11
|
+
if (val["componentType"]) return true;
|
|
12
|
+
return JSON.stringify(Object.keys(val)) === JSON.stringify([
|
|
13
|
+
"componentRef",
|
|
14
|
+
"ngZone",
|
|
15
|
+
"effectRunner",
|
|
16
|
+
"_autoDetect",
|
|
17
|
+
"_isStable",
|
|
18
|
+
"_isDestroyed",
|
|
19
|
+
"_resolve",
|
|
20
|
+
"_promise",
|
|
21
|
+
"_onUnstableSubscription",
|
|
22
|
+
"_onStableSubscription",
|
|
23
|
+
"_onMicrotaskEmptySubscription",
|
|
24
|
+
"_onErrorSubscription",
|
|
25
|
+
"changeDetectorRef",
|
|
26
|
+
"elementRef",
|
|
27
|
+
"debugElement",
|
|
28
|
+
"componentInstance",
|
|
29
|
+
"nativeElement"
|
|
30
|
+
]) || JSON.stringify(Object.keys(val)) === JSON.stringify([
|
|
31
|
+
"location",
|
|
32
|
+
"_rootLView",
|
|
33
|
+
"_tNode",
|
|
34
|
+
"previousInputValues",
|
|
35
|
+
"instance",
|
|
36
|
+
"changeDetectorRef",
|
|
37
|
+
"hostView",
|
|
38
|
+
"componentType"
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Serialize Angular fixture for Vitest
|
|
43
|
+
*
|
|
44
|
+
* @param fixture Angular Fixture Component
|
|
45
|
+
* @returns HTML Child Node
|
|
46
|
+
*/
|
|
47
|
+
function fixtureVitestSerializer(fixture) {
|
|
48
|
+
const componentType = fixture && fixture.componentType ? fixture.componentType : fixture.componentRef.componentType;
|
|
49
|
+
let inputsData = "";
|
|
50
|
+
const selector = Reflect.getOwnPropertyDescriptor(componentType, "__annotations__")?.value[0]?.selector ?? componentType.ɵcmp?.selectors[0]?.[0];
|
|
51
|
+
if (componentType && componentType.propDecorators) inputsData = Object.entries(componentType.propDecorators).map(([key, value]) => `${key}="${value}"`).join("");
|
|
52
|
+
const divElement = fixture && fixture.nativeElement ? fixture.nativeElement : fixture.location.nativeElement;
|
|
53
|
+
return new DOMParser().parseFromString(`<${selector} ${inputsData}>${divElement.innerHTML}</${selector}>`, "text/html").body.childNodes[0];
|
|
54
|
+
}
|
|
55
|
+
function normalizeSnapshotOutput(value) {
|
|
56
|
+
return value.replace(/[ \t]+$/gm, "").replace(/\n{3,}/g, "\n\n");
|
|
57
|
+
}
|
|
58
|
+
function createAngularFixtureSnapshotSerializer() {
|
|
59
|
+
return {
|
|
60
|
+
serialize(val, config, indentation, depth, refs, printer) {
|
|
61
|
+
return normalizeSnapshotOutput(printer(fixtureVitestSerializer(val), config, indentation, depth, refs));
|
|
62
|
+
},
|
|
63
|
+
test(val) {
|
|
64
|
+
return val && isAngularFixture(val);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { createAngularFixtureSnapshotSerializer };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=angular-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-fixture.js","names":[],"sources":["../../../../src/lib/snapshot-serializers/angular-fixture.ts"],"sourcesContent":["import type { ComponentFixture } from '@angular/core/testing';\nimport type { SnapshotSerializer } from 'vitest';\n\n/**\n * Check if is an Angular fixture\n *\n * @param val Angular fixture\n * @returns boolean who check if is an angular fixture\n */\nfunction isAngularFixture(val: any): boolean {\n if (typeof val !== 'object') {\n return false;\n }\n\n if (val['componentRef'] || val['componentInstance']) {\n return true;\n }\n\n if (val['componentType']) {\n return true;\n }\n\n // * Angular fixture keys in Fixture component Object\n const fixtureKeys = [\n 'componentRef',\n 'ngZone',\n 'effectRunner',\n '_autoDetect',\n '_isStable',\n '_isDestroyed',\n '_resolve',\n '_promise',\n '_onUnstableSubscription',\n '_onStableSubscription',\n '_onMicrotaskEmptySubscription',\n '_onErrorSubscription',\n 'changeDetectorRef',\n 'elementRef',\n 'debugElement',\n 'componentInstance',\n 'nativeElement',\n ];\n\n // * Angular fixture keys in Fixture componentRef Object\n const fixtureComponentRefKeys = [\n 'location',\n '_rootLView',\n '_tNode',\n 'previousInputValues',\n 'instance',\n 'changeDetectorRef',\n 'hostView',\n 'componentType',\n ];\n\n return (\n JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureKeys) ||\n JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureComponentRefKeys)\n );\n}\n\n/**\n * Serialize Angular fixture for Vitest\n *\n * @param fixture Angular Fixture Component\n * @returns HTML Child Node\n */\nfunction fixtureVitestSerializer(fixture: any) {\n // * Get Component meta data\n const componentType = (\n fixture && fixture.componentType\n ? fixture.componentType\n : fixture.componentRef.componentType\n ) as any;\n\n let inputsData = '';\n\n const selector =\n Reflect.getOwnPropertyDescriptor(componentType, '__annotations__')?.value[0]\n ?.selector ?? componentType.ɵcmp?.selectors[0]?.[0];\n\n if (componentType && componentType.propDecorators) {\n inputsData = Object.entries(componentType.propDecorators)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join('');\n }\n\n // * Get DOM Elements\n const divElement =\n fixture && fixture.nativeElement\n ? fixture.nativeElement\n : fixture.location.nativeElement;\n\n // * Convert string data to HTML data\n const doc = new DOMParser().parseFromString(\n `<${selector} ${inputsData}>${divElement.innerHTML}</${selector}>`,\n 'text/html',\n );\n\n return doc.body.childNodes[0];\n}\n\nfunction normalizeSnapshotOutput(value: string): string {\n return (\n value\n // Inline snapshots should not fail after formatters strip trailing spaces.\n .replace(/[ \\t]+$/gm, '')\n // Comment removal can leave repeated empty lines in pretty-printed output.\n .replace(/\\n{3,}/g, '\\n\\n')\n );\n}\n\nexport function createAngularFixtureSnapshotSerializer(): SnapshotSerializer {\n return {\n serialize(val, config, indentation, depth, refs, printer) {\n return normalizeSnapshotOutput(\n printer(fixtureVitestSerializer(val), config, indentation, depth, refs),\n );\n },\n test(val) {\n return val && isAngularFixture(val);\n },\n };\n}\n"],"mappings":";;;;;;;AASA,SAAS,iBAAiB,KAAmB;AAC3C,KAAI,OAAO,QAAQ,SACjB,QAAO;AAGT,KAAI,IAAI,mBAAmB,IAAI,qBAC7B,QAAO;AAGT,KAAI,IAAI,iBACN,QAAO;AAoCT,QACE,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC,KAAK,KAAK,UAjCxB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAeiE,IAChE,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC,KAAK,KAAK,UAbZ;EAC9B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAI6E;;;;;;;;AAUhF,SAAS,wBAAwB,SAAc;CAE7C,MAAM,gBACJ,WAAW,QAAQ,gBACf,QAAQ,gBACR,QAAQ,aAAa;CAG3B,IAAI,aAAa;CAEjB,MAAM,WACJ,QAAQ,yBAAyB,eAAe,kBAAkB,EAAE,MAAM,IACtE,YAAY,cAAc,MAAM,UAAU,KAAK;AAErD,KAAI,iBAAiB,cAAc,eACjC,cAAa,OAAO,QAAQ,cAAc,eAAe,CACtD,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,MAAM,GAAG,CAC1C,KAAK,GAAG;CAIb,MAAM,aACJ,WAAW,QAAQ,gBACf,QAAQ,gBACR,QAAQ,SAAS;AAQvB,QALY,IAAI,WAAW,CAAC,gBAC1B,IAAI,SAAS,GAAG,WAAW,GAAG,WAAW,UAAU,IAAI,SAAS,IAChE,YACD,CAEU,KAAK,WAAW;;AAG7B,SAAS,wBAAwB,OAAuB;AACtD,QACE,MAEG,QAAQ,aAAa,GAAG,CAExB,QAAQ,WAAW,OAAO;;AAIjC,SAAgB,yCAA6D;AAC3E,QAAO;EACL,UAAU,KAAK,QAAQ,aAAa,OAAO,MAAM,SAAS;AACxD,UAAO,wBACL,QAAQ,wBAAwB,IAAI,EAAE,QAAQ,aAAa,OAAO,KAAK,CACxE;;EAEH,KAAK,KAAK;AACR,UAAO,OAAO,iBAAiB,IAAI;;EAEtC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region packages/vitest-angular/src/lib/snapshot-serializers/html-comment.ts
|
|
2
|
+
function createHtmlCommentSnapshotSerializer() {
|
|
3
|
+
return {
|
|
4
|
+
serialize: () => "",
|
|
5
|
+
test: (val) => typeof Comment !== "undefined" && val instanceof Comment
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { createHtmlCommentSnapshotSerializer };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=html-comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-comment.js","names":[],"sources":["../../../../src/lib/snapshot-serializers/html-comment.ts"],"sourcesContent":["import { type SnapshotSerializer } from 'vitest';\n\nexport function createHtmlCommentSnapshotSerializer(): SnapshotSerializer {\n return {\n serialize: () => '',\n test: (val: any): boolean =>\n typeof Comment !== 'undefined' && val instanceof Comment,\n };\n}\n"],"mappings":";AAEA,SAAgB,sCAA0D;AACxE,QAAO;EACL,iBAAiB;EACjB,OAAO,QACL,OAAO,YAAY,eAAe,eAAe;EACpD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
//#region packages/vitest-angular/src/lib/snapshot-serializers/no-ng-attributes.ts
|
|
2
|
+
var CLEANED_ELEMENT_MARKER = "__analogSnapshotCleaned__";
|
|
3
|
+
var attributesToRemovePatterns = [
|
|
4
|
+
"ng-reflect",
|
|
5
|
+
"_nghost",
|
|
6
|
+
"_ngcontent",
|
|
7
|
+
"ng-version"
|
|
8
|
+
];
|
|
9
|
+
var attributesToClean = {
|
|
10
|
+
class: [/^(?:mat|cdk|ng).*-\w*\d+-\d+$/, /^ng-star-inserted$/],
|
|
11
|
+
id: [/^(?:mat|cdk|ng).*-\w*\d+$/],
|
|
12
|
+
for: [/^(?:mat|cdk|ng).*-\d+$/],
|
|
13
|
+
"aria-owns": [/^(?:mat|cdk|ng).*-\d+$/],
|
|
14
|
+
"aria-labelledby": [/^(?:mat|cdk|ng).*-\d+$/],
|
|
15
|
+
"aria-controls": [/^(?:mat|cdk|ng).*-\d+$/],
|
|
16
|
+
"aria-describedby": [/^(?:mat|cdk|ng).*-\d+$/]
|
|
17
|
+
};
|
|
18
|
+
var hasAttributesToRemove = (attribute) => attributesToRemovePatterns.some((removePattern) => attribute.name.startsWith(removePattern));
|
|
19
|
+
var hasAttributesToClean = (attribute) => Object.prototype.hasOwnProperty.call(attributesToClean, attribute.name);
|
|
20
|
+
var attributeNeedsCleaning = (attribute) => hasAttributesToClean(attribute) && attribute.value.split(" ").some((attrValue) => attributesToClean[attribute.name].some((attributeCleanRegex) => attributeCleanRegex.test(attrValue)));
|
|
21
|
+
var shouldSerializeElement = (node) => {
|
|
22
|
+
if (node.parentElement?.tagName === "BODY" && node.hasAttribute("id")) return true;
|
|
23
|
+
return Array.from(node.attributes).some((attribute) => hasAttributesToRemove(attribute) || attributeNeedsCleaning(attribute));
|
|
24
|
+
};
|
|
25
|
+
function cleanAngularElementAttributes(node) {
|
|
26
|
+
const nodeCopy = node.cloneNode(true);
|
|
27
|
+
Object.defineProperty(nodeCopy, CLEANED_ELEMENT_MARKER, {
|
|
28
|
+
configurable: true,
|
|
29
|
+
value: true
|
|
30
|
+
});
|
|
31
|
+
if (node.parentElement?.tagName === "BODY") nodeCopy.removeAttribute("id");
|
|
32
|
+
Array.from(nodeCopy.attributes).forEach((attribute) => {
|
|
33
|
+
if (hasAttributesToRemove(attribute)) {
|
|
34
|
+
nodeCopy.removeAttribute(attribute.name);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (hasAttributesToClean(attribute)) {
|
|
38
|
+
const cleanedValue = attribute.value.split(" ").filter((attrValue) => !attributesToClean[attribute.name].some((attributeCleanRegex) => attributeCleanRegex.test(attrValue))).join(" ");
|
|
39
|
+
if (cleanedValue === "") {
|
|
40
|
+
nodeCopy.removeAttribute(attribute.name);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
nodeCopy.setAttribute(attribute.name, cleanedValue);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return nodeCopy;
|
|
47
|
+
}
|
|
48
|
+
function createNoNgAttributesSnapshotSerializer() {
|
|
49
|
+
return {
|
|
50
|
+
serialize(val, config, indentation, depth, refs, printer) {
|
|
51
|
+
const cleanedNode = cleanAngularElementAttributes(val);
|
|
52
|
+
if (shouldSerializeElement(cleanedNode)) throw new Error(`NoNgAttributes serializer did not stabilize for <${cleanedNode.tagName.toLowerCase()}>`);
|
|
53
|
+
return printer(cleanedNode, config, indentation, depth, refs);
|
|
54
|
+
},
|
|
55
|
+
test(val) {
|
|
56
|
+
return typeof Element !== "undefined" && val instanceof Element && !val[CLEANED_ELEMENT_MARKER] && shouldSerializeElement(val);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { createNoNgAttributesSnapshotSerializer };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=no-ng-attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-ng-attributes.js","names":[],"sources":["../../../../src/lib/snapshot-serializers/no-ng-attributes.ts"],"sourcesContent":["import { type SnapshotSerializer } from 'vitest';\n\nconst CLEANED_ELEMENT_MARKER = '__analogSnapshotCleaned__';\n\nexport const attributesToRemovePatterns = [\n 'ng-reflect',\n '_nghost',\n '_ngcontent',\n 'ng-version',\n];\n\nexport const attributesToClean: Record<string, RegExp[]> = {\n class: [/^(?:mat|cdk|ng).*-\\w*\\d+-\\d+$/, /^ng-star-inserted$/],\n id: [/^(?:mat|cdk|ng).*-\\w*\\d+$/],\n for: [/^(?:mat|cdk|ng).*-\\d+$/],\n 'aria-owns': [/^(?:mat|cdk|ng).*-\\d+$/],\n 'aria-labelledby': [/^(?:mat|cdk|ng).*-\\d+$/],\n 'aria-controls': [/^(?:mat|cdk|ng).*-\\d+$/],\n 'aria-describedby': [/^(?:mat|cdk|ng).*-\\d+$/],\n};\n\nconst hasAttributesToRemove = (attribute: Attr): boolean =>\n attributesToRemovePatterns.some((removePattern) =>\n attribute.name.startsWith(removePattern),\n );\n\nconst hasAttributesToClean = (attribute: Attr): boolean =>\n Object.prototype.hasOwnProperty.call(attributesToClean, attribute.name);\n\nconst attributeNeedsCleaning = (attribute: Attr): boolean =>\n hasAttributesToClean(attribute) &&\n attribute.value\n .split(' ')\n .some((attrValue) =>\n attributesToClean[attribute.name].some((attributeCleanRegex) =>\n attributeCleanRegex.test(attrValue),\n ),\n );\n\nconst shouldSerializeElement = (node: Element): boolean => {\n if (node.parentElement?.tagName === 'BODY' && node.hasAttribute('id')) {\n return true;\n }\n\n return Array.from(node.attributes).some(\n (attribute) =>\n hasAttributesToRemove(attribute) || attributeNeedsCleaning(attribute),\n );\n};\n\nfunction cleanAngularElementAttributes(node: Element): Element {\n const nodeCopy = node.cloneNode(true) as Element;\n\n Object.defineProperty(nodeCopy, CLEANED_ELEMENT_MARKER, {\n configurable: true,\n value: true,\n });\n\n if (node.parentElement?.tagName === 'BODY') {\n nodeCopy.removeAttribute('id');\n }\n\n Array.from(nodeCopy.attributes).forEach((attribute) => {\n if (hasAttributesToRemove(attribute)) {\n nodeCopy.removeAttribute(attribute.name);\n return;\n }\n\n if (hasAttributesToClean(attribute)) {\n const cleanedValue = attribute.value\n .split(' ')\n .filter(\n (attrValue) =>\n !attributesToClean[attribute.name].some((attributeCleanRegex) =>\n attributeCleanRegex.test(attrValue),\n ),\n )\n .join(' ');\n\n if (cleanedValue === '') {\n nodeCopy.removeAttribute(attribute.name);\n return;\n }\n\n nodeCopy.setAttribute(attribute.name, cleanedValue);\n }\n });\n\n return nodeCopy;\n}\n\nexport function createNoNgAttributesSnapshotSerializer(): SnapshotSerializer {\n return {\n serialize(val, config, indentation, depth, refs, printer): string {\n const cleanedNode = cleanAngularElementAttributes(val);\n\n if (shouldSerializeElement(cleanedNode)) {\n throw new Error(\n `NoNgAttributes serializer did not stabilize for <${cleanedNode.tagName.toLowerCase()}>`,\n );\n }\n\n return printer(cleanedNode, config, indentation, depth, refs);\n },\n test(val): boolean {\n const matches =\n typeof Element !== 'undefined' &&\n val instanceof Element &&\n !(val as Element & Record<string, unknown>)[CLEANED_ELEMENT_MARKER] &&\n shouldSerializeElement(val);\n\n return matches;\n },\n };\n}\n"],"mappings":";AAEA,IAAM,yBAAyB;AAE/B,IAAa,6BAA6B;CACxC;CACA;CACA;CACA;CACD;AAED,IAAa,oBAA8C;CACzD,OAAO,CAAC,iCAAiC,qBAAqB;CAC9D,IAAI,CAAC,4BAA4B;CACjC,KAAK,CAAC,yBAAyB;CAC/B,aAAa,CAAC,yBAAyB;CACvC,mBAAmB,CAAC,yBAAyB;CAC7C,iBAAiB,CAAC,yBAAyB;CAC3C,oBAAoB,CAAC,yBAAyB;CAC/C;AAED,IAAM,yBAAyB,cAC7B,2BAA2B,MAAM,kBAC/B,UAAU,KAAK,WAAW,cAAc,CACzC;AAEH,IAAM,wBAAwB,cAC5B,OAAO,UAAU,eAAe,KAAK,mBAAmB,UAAU,KAAK;AAEzE,IAAM,0BAA0B,cAC9B,qBAAqB,UAAU,IAC/B,UAAU,MACP,MAAM,IAAI,CACV,MAAM,cACL,kBAAkB,UAAU,MAAM,MAAM,wBACtC,oBAAoB,KAAK,UAAU,CACpC,CACF;AAEL,IAAM,0BAA0B,SAA2B;AACzD,KAAI,KAAK,eAAe,YAAY,UAAU,KAAK,aAAa,KAAK,CACnE,QAAO;AAGT,QAAO,MAAM,KAAK,KAAK,WAAW,CAAC,MAChC,cACC,sBAAsB,UAAU,IAAI,uBAAuB,UAAU,CACxE;;AAGH,SAAS,8BAA8B,MAAwB;CAC7D,MAAM,WAAW,KAAK,UAAU,KAAK;AAErC,QAAO,eAAe,UAAU,wBAAwB;EACtD,cAAc;EACd,OAAO;EACR,CAAC;AAEF,KAAI,KAAK,eAAe,YAAY,OAClC,UAAS,gBAAgB,KAAK;AAGhC,OAAM,KAAK,SAAS,WAAW,CAAC,SAAS,cAAc;AACrD,MAAI,sBAAsB,UAAU,EAAE;AACpC,YAAS,gBAAgB,UAAU,KAAK;AACxC;;AAGF,MAAI,qBAAqB,UAAU,EAAE;GACnC,MAAM,eAAe,UAAU,MAC5B,MAAM,IAAI,CACV,QACE,cACC,CAAC,kBAAkB,UAAU,MAAM,MAAM,wBACvC,oBAAoB,KAAK,UAAU,CACpC,CACJ,CACA,KAAK,IAAI;AAEZ,OAAI,iBAAiB,IAAI;AACvB,aAAS,gBAAgB,UAAU,KAAK;AACxC;;AAGF,YAAS,aAAa,UAAU,MAAM,aAAa;;GAErD;AAEF,QAAO;;AAGT,SAAgB,yCAA6D;AAC3E,QAAO;EACL,UAAU,KAAK,QAAQ,aAAa,OAAO,MAAM,SAAiB;GAChE,MAAM,cAAc,8BAA8B,IAAI;AAEtD,OAAI,uBAAuB,YAAY,CACrC,OAAM,IAAI,MACR,oDAAoD,YAAY,QAAQ,aAAa,CAAC,GACvF;AAGH,UAAO,QAAQ,aAAa,QAAQ,aAAa,OAAO,KAAK;;EAE/D,KAAK,KAAc;AAOjB,UALE,OAAO,YAAY,eACnB,eAAe,WACf,CAAE,IAA0C,2BAC5C,uBAAuB,IAAI;;EAIhC"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"schematics": {
|
|
4
4
|
"setup": {
|
|
5
5
|
"description": "Configure Vitest for an Angular project",
|
|
6
|
-
"factory": "./
|
|
7
|
-
"schema": "./
|
|
6
|
+
"factory": "./schematics/setup/index#setupSchematic",
|
|
7
|
+
"schema": "./schematics/setup/schema.json"
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { setupSchematic } from "./schematics/setup/index";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<% if (majorAngularVersion > 20) { %>
|
|
2
2
|
import '@angular/compiler';
|
|
3
3
|
import '@analogjs/vitest-angular/setup-snapshots';
|
|
4
|
+
import '@analogjs/vitest-angular/setup-serializers';
|
|
4
5
|
import { setupTestBed } from '@analogjs/vitest-angular/setup-testbed';
|
|
5
6
|
|
|
6
7
|
<% if (browserMode) { %>
|
|
@@ -2,17 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import { defineConfig } from 'vite';
|
|
4
4
|
import angular from '@analogjs/vite-plugin-angular';
|
|
5
|
-
<% if (isNx) { %>import
|
|
6
|
-
<% } else { %>import viteTsConfigPaths from 'vite-tsconfig-paths';<% } %>
|
|
5
|
+
<% if (!isNx) { %>import viteTsConfigPaths from 'vite-tsconfig-paths';<% } %>
|
|
7
6
|
<% if (browserMode) { %>import { playwright } from '@vitest/browser-playwright';<% } %>
|
|
8
7
|
|
|
9
8
|
// https://vitejs.dev/config/
|
|
10
9
|
export default defineConfig(({ mode }) => ({
|
|
11
|
-
<% if (isNx) { %>
|
|
12
|
-
plugins: [angular(), nxViteTsPaths()],
|
|
13
|
-
<% } else { %>
|
|
14
|
-
plugins: [angular(), viteTsConfigPaths()],
|
|
15
|
-
<% } %>
|
|
10
|
+
plugins: [angular()<% if (!isNx) { %>, viteTsConfigPaths()<% } %>],
|
|
16
11
|
test: {
|
|
17
12
|
globals: true,
|
|
18
13
|
<% if (browserMode) { %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../../vitest-angular-tools/src/schematics/setup/index.ts"],"sourcesContent":["import {\n Rule,\n Tree,\n apply,\n url,\n applyTemplates,\n move,\n chain,\n mergeWith,\n SchematicContext,\n} from '@angular-devkit/schematics';\nimport { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';\nimport { parse } from 'jsonc-parser';\nimport {\n getAngularVersion,\n getMajorAngularVersion,\n getWorkspace,\n getProject,\n addDevDependencies,\n isNxWorkspace,\n} from '../utils';\nimport { Schema } from './schema';\n\nfunction updateTsConfigSpec(tree: Tree, projectRoot: string): void {\n const tsConfigPath = projectRoot\n ? `${projectRoot}/tsconfig.spec.json`\n : 'tsconfig.spec.json';\n\n if (!tree.exists(tsConfigPath)) {\n return;\n }\n\n const tsConfigContent = tree.read(tsConfigPath);\n if (!tsConfigContent) {\n return;\n }\n\n const tsConfig = parse(tsConfigContent.toString('utf-8')) as Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >;\n\n tsConfig.compilerOptions = tsConfig.compilerOptions || {};\n\n // Remove module (let Vite handle it)\n delete tsConfig.compilerOptions.module;\n\n // Set target to es2022\n tsConfig.compilerOptions.target = 'es2022';\n\n // Update types: remove jest, add vitest/globals\n const types: string[] = tsConfig.compilerOptions.types || ['node'];\n const filteredTypes = types.filter(\n (t: string) => t !== 'jest' && t !== 'jasmine',\n );\n if (!filteredTypes.includes('vitest/globals')) {\n filteredTypes.push('vitest/globals');\n }\n tsConfig.compilerOptions.types = filteredTypes;\n\n // Set files to include test-setup.ts\n tsConfig.files = ['src/test-setup.ts'];\n\n tree.overwrite(tsConfigPath, JSON.stringify(tsConfig, null, 2) + '\\n');\n}\n\nfunction updateAngularJson(tree: Tree, projectName: string): void {\n const workspace = getWorkspace(tree);\n const project = workspace.projects[projectName];\n\n if (!project.architect) {\n project.architect = {};\n }\n\n project.architect['test'] = {\n builder: '@analogjs/vitest-angular:test',\n };\n\n tree.overwrite('angular.json', JSON.stringify(workspace, null, 2) + '\\n');\n}\n\nfunction generateFiles(\n projectRoot: string,\n majorAngularVersion: number,\n isNx: boolean,\n browserMode: boolean,\n): Rule {\n return mergeWith(\n apply(url('./files'), [\n applyTemplates({\n majorAngularVersion,\n isNx,\n browserMode,\n }),\n move(projectRoot),\n ]),\n );\n}\n\nexport function setupSchematic(options: Schema): Rule {\n return (tree: Tree, context: SchematicContext) => {\n const angularVersion = getAngularVersion(tree);\n const majorAngularVersion = getMajorAngularVersion(angularVersion);\n\n const workspace = getWorkspace(tree);\n const project = getProject(workspace, options.project);\n const projectRoot = project.root || '';\n const isNx = isNxWorkspace(tree);\n\n const browserMode = options.browserMode ?? false;\n\n // Add devDependencies\n addDevDependencies(tree, angularVersion, { browserMode });\n\n // Update tsconfig.spec.json (if exists)\n updateTsConfigSpec(tree, projectRoot);\n\n // Update angular.json test target\n updateAngularJson(tree, options.project);\n\n // Schedule package install\n context.addTask(new NodePackageInstallTask());\n\n // Generate files\n return chain([\n generateFiles(projectRoot, majorAngularVersion, isNx, browserMode),\n ]);\n };\n}\n"],"mappings":";;;;;;;;AAuBA,SAAS,mBAAmB,MAAY,aAA2B;CACjE,MAAM,eAAe,cACjB,GAAG,YAAY,uBACf;AAEJ,KAAI,CAAC,KAAK,OAAO,aAAa,CAC5B;CAGF,MAAM,kBAAkB,KAAK,KAAK,aAAa;AAC/C,KAAI,CAAC,gBACH;CAGF,MAAM,YAAA,GAAA,aAAA,OAAiB,gBAAgB,SAAS,QAAQ,CAAC;AAMzD,UAAS,kBAAkB,SAAS,mBAAmB,EAAE;AAGzD,QAAO,SAAS,gBAAgB;AAGhC,UAAS,gBAAgB,SAAS;CAIlC,MAAM,iBADkB,SAAS,gBAAgB,SAAS,CAAC,OAAO,EACtC,QACzB,MAAc,MAAM,UAAU,MAAM,UACtC;AACD,KAAI,CAAC,cAAc,SAAS,iBAAiB,CAC3C,eAAc,KAAK,iBAAiB;AAEtC,UAAS,gBAAgB,QAAQ;AAGjC,UAAS,QAAQ,CAAC,oBAAoB;AAEtC,MAAK,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,EAAE,GAAG,KAAK;;AAGxE,SAAS,kBAAkB,MAAY,aAA2B;CAChE,MAAM,YAAY,kBAAA,aAAa,KAAK;CACpC,MAAM,UAAU,UAAU,SAAS;AAEnC,KAAI,CAAC,QAAQ,UACX,SAAQ,YAAY,EAAE;AAGxB,SAAQ,UAAU,UAAU,EAC1B,SAAS,iCACV;AAED,MAAK,UAAU,gBAAgB,KAAK,UAAU,WAAW,MAAM,EAAE,GAAG,KAAK;;AAG3E,SAAS,cACP,aACA,qBACA,MACA,aACM;AACN,SAAA,GAAA,2BAAA,YAAA,GAAA,2BAAA,QAAA,GAAA,2BAAA,KACY,UAAU,EAAE,EAAA,GAAA,2BAAA,gBACL;EACb;EACA;EACA;EACD,CAAC,GAAA,GAAA,2BAAA,MACG,YAAY,CAClB,CAAC,CACH;;AAGH,SAAgB,eAAe,SAAuB;AACpD,SAAQ,MAAY,YAA8B;EAChD,MAAM,iBAAiB,gBAAA,kBAAkB,KAAK;EAC9C,MAAM,sBAAsB,gBAAA,uBAAuB,eAAe;EAIlE,MAAM,cADU,kBAAA,WADE,kBAAA,aAAa,KAAK,EACE,QAAQ,QAAQ,CAC1B,QAAQ;EACpC,MAAM,OAAO,kBAAA,cAAc,KAAK;EAEhC,MAAM,cAAc,QAAQ,eAAe;AAG3C,uBAAA,mBAAmB,MAAM,gBAAgB,EAAE,aAAa,CAAC;AAGzD,qBAAmB,MAAM,YAAY;AAGrC,oBAAkB,MAAM,QAAQ,QAAQ;AAGxC,UAAQ,QAAQ,IAAI,iCAAA,wBAAwB,CAAC;AAG7C,UAAA,GAAA,2BAAA,OAAa,CACX,cAAc,aAAa,qBAAqB,MAAM,YAAY,CACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular.js","names":[],"sources":["../../../../../../../vitest-angular-tools/src/schematics/utils/angular.ts"],"sourcesContent":["import { Tree, SchematicsException } from '@angular-devkit/schematics';\nimport { coerce, major } from 'semver';\n\nexport function getAngularVersion(tree: Tree): string {\n const packageJson = tree.read('package.json');\n if (!packageJson) {\n throw new SchematicsException('Could not find package.json');\n }\n\n const pkg = JSON.parse(packageJson.toString('utf-8'));\n const angularVersion =\n pkg.dependencies?.['@angular/core'] ||\n pkg.devDependencies?.['@angular/core'];\n\n if (!angularVersion) {\n throw new SchematicsException(\n 'Could not find @angular/core in package.json',\n );\n }\n\n return angularVersion;\n}\n\nexport function getMajorAngularVersion(angularVersion: string): number {\n const coerced = coerce(angularVersion);\n if (!coerced) {\n throw new SchematicsException(\n `Could not parse Angular version: ${angularVersion}`,\n );\n }\n return major(coerced);\n}\n"],"mappings":";;;AAGA,SAAgB,kBAAkB,MAAoB;CACpD,MAAM,cAAc,KAAK,KAAK,eAAe;AAC7C,KAAI,CAAC,YACH,OAAM,IAAI,2BAAA,oBAAoB,8BAA8B;CAG9D,MAAM,MAAM,KAAK,MAAM,YAAY,SAAS,QAAQ,CAAC;CACrD,MAAM,iBACJ,IAAI,eAAe,oBACnB,IAAI,kBAAkB;AAExB,KAAI,CAAC,eACH,OAAM,IAAI,2BAAA,oBACR,+CACD;AAGH,QAAO;;AAGT,SAAgB,uBAAuB,gBAAgC;CACrE,MAAM,WAAA,GAAA,OAAA,QAAiB,eAAe;AACtC,KAAI,CAAC,QACH,OAAM,IAAI,2BAAA,oBACR,oCAAoC,iBACrC;AAEH,SAAA,GAAA,OAAA,OAAa,QAAQ"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Tree } from "@angular-devkit/schematics";
|
|
2
|
+
export interface DependencyOptions {
|
|
3
|
+
browserMode?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function getDevDependencies(angularVersion: string, options?: DependencyOptions): Record<string, string>;
|
|
6
|
+
export declare function addDevDependencies(tree: Tree, angularVersion: string, options?: DependencyOptions): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","names":[],"sources":["../../../../../../../vitest-angular-tools/src/schematics/utils/dependencies.ts"],"sourcesContent":["import { Tree, SchematicsException } from '@angular-devkit/schematics';\nimport { lt } from 'semver';\nimport {\n ANALOG_JS_VITE_PLUGIN_ANGULAR,\n JSDOM,\n PLAYWRIGHT,\n VITE,\n VITE_TSCONFIG_PATHS,\n VITEST_BROWSER_PLAYWRIGHT,\n VITEST_V4,\n} from './versions';\n\nexport interface DependencyOptions {\n browserMode?: boolean;\n}\n\nexport function getDevDependencies(\n angularVersion: string,\n options: DependencyOptions = {},\n): Record<string, string> {\n const escapedVersion = angularVersion.replace(/[~^]/, '');\n\n if (lt(escapedVersion, '17.0.0')) {\n throw new SchematicsException('Angular v17.0.0 or newer is required.');\n }\n\n const deps: Record<string, string> = {\n '@analogjs/vite-plugin-angular': ANALOG_JS_VITE_PLUGIN_ANGULAR,\n vite: VITE,\n vitest: VITEST_V4,\n 'vite-tsconfig-paths': VITE_TSCONFIG_PATHS,\n };\n\n if (options.browserMode) {\n deps['@vitest/browser-playwright'] = VITEST_BROWSER_PLAYWRIGHT;\n deps['playwright'] = PLAYWRIGHT;\n } else {\n deps['jsdom'] = JSDOM;\n }\n\n return deps;\n}\n\nexport function addDevDependencies(\n tree: Tree,\n angularVersion: string,\n options: DependencyOptions = {},\n): void {\n const packageJsonPath = 'package.json';\n const packageJson = tree.read(packageJsonPath);\n if (!packageJson) {\n throw new SchematicsException('Could not find package.json');\n }\n\n const pkg = JSON.parse(packageJson.toString('utf-8'));\n const devDeps = getDevDependencies(angularVersion, options);\n\n pkg.devDependencies = pkg.devDependencies || {};\n Object.entries(devDeps).forEach(([name, version]) => {\n pkg.devDependencies[name] = version;\n });\n\n // Sort devDependencies alphabetically\n pkg.devDependencies = Object.keys(pkg.devDependencies)\n .sort()\n .reduce((acc: Record<string, string>, key) => {\n acc[key] = pkg.devDependencies[key];\n return acc;\n }, {});\n\n tree.overwrite(packageJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n}\n"],"mappings":";;;;AAgBA,SAAgB,mBACd,gBACA,UAA6B,EAAE,EACP;AAGxB,MAAA,GAAA,OAAA,IAFuB,eAAe,QAAQ,QAAQ,GAAG,EAElC,SAAS,CAC9B,OAAM,IAAI,2BAAA,oBAAoB,wCAAwC;CAGxE,MAAM,OAA+B;EACnC,iCAAiC,iBAAA;EACjC,MAAM,iBAAA;EACN,QAAQ,iBAAA;EACR,uBAAuB,iBAAA;EACxB;AAED,KAAI,QAAQ,aAAa;AACvB,OAAK,gCAAgC,iBAAA;AACrC,OAAK,gBAAgB,iBAAA;OAErB,MAAK,WAAW,iBAAA;AAGlB,QAAO;;AAGT,SAAgB,mBACd,MACA,gBACA,UAA6B,EAAE,EACzB;CACN,MAAM,kBAAkB;CACxB,MAAM,cAAc,KAAK,KAAK,gBAAgB;AAC9C,KAAI,CAAC,YACH,OAAM,IAAI,2BAAA,oBAAoB,8BAA8B;CAG9D,MAAM,MAAM,KAAK,MAAM,YAAY,SAAS,QAAQ,CAAC;CACrD,MAAM,UAAU,mBAAmB,gBAAgB,QAAQ;AAE3D,KAAI,kBAAkB,IAAI,mBAAmB,EAAE;AAC/C,QAAO,QAAQ,QAAQ,CAAC,SAAS,CAAC,MAAM,aAAa;AACnD,MAAI,gBAAgB,QAAQ;GAC5B;AAGF,KAAI,kBAAkB,OAAO,KAAK,IAAI,gBAAgB,CACnD,MAAM,CACN,QAAQ,KAA6B,QAAQ;AAC5C,MAAI,OAAO,IAAI,gBAAgB;AAC/B,SAAO;IACN,EAAE,CAAC;AAER,MAAK,UAAU,iBAAiB,KAAK,UAAU,KAAK,MAAM,EAAE,GAAG,KAAK"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.90";
|
|
2
|
+
export declare const JSDOM = "^22.0.0";
|
|
3
|
+
export declare const VITE_TSCONFIG_PATHS = "^4.2.0";
|
|
4
|
+
export declare const VITE = "^7.0.0";
|
|
5
|
+
export declare const VITEST_V4 = "^4.0.0";
|
|
6
|
+
export declare const VITEST_BROWSER_PLAYWRIGHT = "^4.0.0";
|
|
7
|
+
export declare const PLAYWRIGHT = "^1.54.0";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region packages/vitest-angular-tools/src/schematics/utils/versions.ts
|
|
2
|
-
var ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.
|
|
2
|
+
var ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.90";
|
|
3
3
|
var JSDOM = "^22.0.0";
|
|
4
4
|
var VITE_TSCONFIG_PATHS = "^4.2.0";
|
|
5
5
|
var VITE = "^7.0.0";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../vitest-angular-tools/src/schematics/utils/versions.ts"],"sourcesContent":["// Version constants (Angular 20+)\nexport const ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.90';\nexport const JSDOM = '^22.0.0';\nexport const VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const VITE = '^7.0.0';\nexport const VITEST_V4 = '^4.0.0';\n\n// Browser mode dependencies\nexport const VITEST_BROWSER_PLAYWRIGHT = '^4.0.0';\nexport const PLAYWRIGHT = '^1.54.0';\n"],"mappings":";AACA,IAAa,gCAAgC;AAC7C,IAAa,QAAQ;AACrB,IAAa,sBAAsB;AACnC,IAAa,OAAO;AACpB,IAAa,YAAY;AAGzB,IAAa,4BAA4B;AACzC,IAAa,aAAa"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Tree } from "@angular-devkit/schematics";
|
|
2
|
+
export declare function isNxWorkspace(tree: Tree): boolean;
|
|
3
|
+
export interface WorkspaceProject {
|
|
4
|
+
root: string;
|
|
5
|
+
sourceRoot?: string;
|
|
6
|
+
architect?: Record<string, {
|
|
7
|
+
builder?: string;
|
|
8
|
+
options?: Record<string, unknown>;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkspaceSchema {
|
|
12
|
+
projects: Record<string, WorkspaceProject>;
|
|
13
|
+
}
|
|
14
|
+
export declare function getWorkspace(tree: Tree): WorkspaceSchema;
|
|
15
|
+
export declare function getProject(workspace: WorkspaceSchema, projectName: string): WorkspaceProject;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","names":[],"sources":["../../../../../../../vitest-angular-tools/src/schematics/utils/workspace.ts"],"sourcesContent":["import { Tree, SchematicsException } from '@angular-devkit/schematics';\n\nexport function isNxWorkspace(tree: Tree): boolean {\n return tree.exists('/nx.json');\n}\n\nexport interface WorkspaceProject {\n root: string;\n sourceRoot?: string;\n architect?: Record<\n string,\n { builder?: string; options?: Record<string, unknown> }\n >;\n}\n\nexport interface WorkspaceSchema {\n projects: Record<string, WorkspaceProject>;\n}\n\nexport function getWorkspace(tree: Tree): WorkspaceSchema {\n const workspaceFile = tree.read('angular.json');\n if (!workspaceFile) {\n throw new SchematicsException('Could not find angular.json');\n }\n return JSON.parse(workspaceFile.toString('utf-8'));\n}\n\nexport function getProject(\n workspace: WorkspaceSchema,\n projectName: string,\n): WorkspaceProject {\n const project = workspace.projects[projectName];\n if (!project) {\n throw new SchematicsException(\n `Project \"${projectName}\" not found in angular.json`,\n );\n }\n return project;\n}\n"],"mappings":";;AAEA,SAAgB,cAAc,MAAqB;AACjD,QAAO,KAAK,OAAO,WAAW;;AAgBhC,SAAgB,aAAa,MAA6B;CACxD,MAAM,gBAAgB,KAAK,KAAK,eAAe;AAC/C,KAAI,CAAC,cACH,OAAM,IAAI,2BAAA,oBAAoB,8BAA8B;AAE9D,QAAO,KAAK,MAAM,cAAc,SAAS,QAAQ,CAAC;;AAGpD,SAAgB,WACd,WACA,aACkB;CAClB,MAAM,UAAU,UAAU,SAAS;AACnC,KAAI,CAAC,QACH,OAAM,IAAI,2BAAA,oBACR,YAAY,YAAY,6BACzB;AAEH,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { setupSchematic } from
|
|
1
|
+
export { setupSchematic } from "./schematics/setup/index";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Rule } from
|
|
2
|
-
import { Schema } from
|
|
1
|
+
import { Rule } from "@angular-devkit/schematics";
|
|
2
|
+
import { Schema } from "./schema";
|
|
3
3
|
export declare function setupSchematic(options: Schema): Rule;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Tree } from
|
|
1
|
+
import { Tree } from "@angular-devkit/schematics";
|
|
2
2
|
export interface DependencyOptions {
|
|
3
|
-
|
|
3
|
+
browserMode?: boolean;
|
|
4
4
|
}
|
|
5
5
|
export declare function getDevDependencies(angularVersion: string, options?: DependencyOptions): Record<string, string>;
|
|
6
6
|
export declare function addDevDependencies(tree: Tree, angularVersion: string, options?: DependencyOptions): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
1
|
+
export * from "./versions";
|
|
2
|
+
export * from "./angular";
|
|
3
|
+
export * from "./workspace";
|
|
4
|
+
export * from "./dependencies";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.
|
|
1
|
+
export declare const ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.90";
|
|
2
2
|
export declare const JSDOM = "^22.0.0";
|
|
3
3
|
export declare const VITE_TSCONFIG_PATHS = "^4.2.0";
|
|
4
4
|
export declare const VITE = "^7.0.0";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { Tree } from
|
|
1
|
+
import { Tree } from "@angular-devkit/schematics";
|
|
2
2
|
export declare function isNxWorkspace(tree: Tree): boolean;
|
|
3
3
|
export interface WorkspaceProject {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
root: string;
|
|
5
|
+
sourceRoot?: string;
|
|
6
|
+
architect?: Record<string, {
|
|
7
|
+
builder?: string;
|
|
8
|
+
options?: Record<string, unknown>;
|
|
9
|
+
}>;
|
|
10
10
|
}
|
|
11
11
|
export interface WorkspaceSchema {
|
|
12
|
-
|
|
12
|
+
projects: Record<string, WorkspaceProject>;
|
|
13
13
|
}
|
|
14
14
|
export declare function getWorkspace(tree: Tree): WorkspaceSchema;
|
|
15
15
|
export declare function getProject(workspace: WorkspaceSchema, projectName: string): WorkspaceProject;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
//#region \0rolldown/runtime.js
|
|
2
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) {
|
|
3
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
4
|
-
throw Error("Calling `require` for \"" + x + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.");
|
|
5
|
-
});
|
|
6
|
-
//#endregion
|
|
7
|
-
export { __require };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../packages/vitest-angular-tools/src/schematics/setup/index.ts"],"sourcesContent":["import {\n Rule,\n Tree,\n apply,\n url,\n applyTemplates,\n move,\n chain,\n mergeWith,\n SchematicContext,\n} from '@angular-devkit/schematics';\nimport { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';\nimport { parse } from 'jsonc-parser';\nimport {\n getAngularVersion,\n getMajorAngularVersion,\n getWorkspace,\n getProject,\n addDevDependencies,\n isNxWorkspace,\n} from '../utils';\nimport { Schema } from './schema';\n\nfunction updateTsConfigSpec(tree: Tree, projectRoot: string): void {\n const tsConfigPath = projectRoot\n ? `${projectRoot}/tsconfig.spec.json`\n : 'tsconfig.spec.json';\n\n if (!tree.exists(tsConfigPath)) {\n return;\n }\n\n const tsConfigContent = tree.read(tsConfigPath);\n if (!tsConfigContent) {\n return;\n }\n\n const tsConfig = parse(tsConfigContent.toString('utf-8')) as Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >;\n\n tsConfig.compilerOptions = tsConfig.compilerOptions || {};\n\n // Remove module (let Vite handle it)\n delete tsConfig.compilerOptions.module;\n\n // Set target to es2022\n tsConfig.compilerOptions.target = 'es2022';\n\n // Update types: remove jest, add vitest/globals\n const types: string[] = tsConfig.compilerOptions.types || ['node'];\n const filteredTypes = types.filter(\n (t: string) => t !== 'jest' && t !== 'jasmine',\n );\n if (!filteredTypes.includes('vitest/globals')) {\n filteredTypes.push('vitest/globals');\n }\n tsConfig.compilerOptions.types = filteredTypes;\n\n // Set files to include test-setup.ts\n tsConfig.files = ['src/test-setup.ts'];\n\n tree.overwrite(tsConfigPath, JSON.stringify(tsConfig, null, 2) + '\\n');\n}\n\nfunction updateAngularJson(tree: Tree, projectName: string): void {\n const workspace = getWorkspace(tree);\n const project = workspace.projects[projectName];\n\n if (!project.architect) {\n project.architect = {};\n }\n\n project.architect['test'] = {\n builder: '@analogjs/vitest-angular:test',\n };\n\n tree.overwrite('angular.json', JSON.stringify(workspace, null, 2) + '\\n');\n}\n\nfunction generateFiles(\n projectRoot: string,\n majorAngularVersion: number,\n isNx: boolean,\n browserMode: boolean,\n): Rule {\n return mergeWith(\n apply(url('./files'), [\n applyTemplates({\n majorAngularVersion,\n isNx,\n browserMode,\n }),\n move(projectRoot),\n ]),\n );\n}\n\nexport function setupSchematic(options: Schema): Rule {\n return (tree: Tree, context: SchematicContext) => {\n const angularVersion = getAngularVersion(tree);\n const majorAngularVersion = getMajorAngularVersion(angularVersion);\n\n const workspace = getWorkspace(tree);\n const project = getProject(workspace, options.project);\n const projectRoot = project.root || '';\n const isNx = isNxWorkspace(tree);\n\n const browserMode = options.browserMode ?? false;\n\n // Add devDependencies\n addDevDependencies(tree, angularVersion, { browserMode });\n\n // Update tsconfig.spec.json (if exists)\n updateTsConfigSpec(tree, projectRoot);\n\n // Update angular.json test target\n updateAngularJson(tree, options.project);\n\n // Schedule package install\n context.addTask(new NodePackageInstallTask());\n\n // Generate files\n return chain([\n generateFiles(projectRoot, majorAngularVersion, isNx, browserMode),\n ]);\n };\n}\n"],"mappings":";;;;;;;;AAuBA,SAAS,mBAAmB,MAAY,aAA2B;CACjE,MAAM,eAAe,cACjB,GAAG,YAAY,uBACf;AAEJ,KAAI,CAAC,KAAK,OAAO,aAAa,CAC5B;CAGF,MAAM,kBAAkB,KAAK,KAAK,aAAa;AAC/C,KAAI,CAAC,gBACH;CAGF,MAAM,YAAA,GAAA,aAAA,OAAiB,gBAAgB,SAAS,QAAQ,CAAC;AAMzD,UAAS,kBAAkB,SAAS,mBAAmB,EAAE;AAGzD,QAAO,SAAS,gBAAgB;AAGhC,UAAS,gBAAgB,SAAS;CAIlC,MAAM,iBADkB,SAAS,gBAAgB,SAAS,CAAC,OAAO,EACtC,QACzB,MAAc,MAAM,UAAU,MAAM,UACtC;AACD,KAAI,CAAC,cAAc,SAAS,iBAAiB,CAC3C,eAAc,KAAK,iBAAiB;AAEtC,UAAS,gBAAgB,QAAQ;AAGjC,UAAS,QAAQ,CAAC,oBAAoB;AAEtC,MAAK,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,EAAE,GAAG,KAAK;;AAGxE,SAAS,kBAAkB,MAAY,aAA2B;CAChE,MAAM,YAAY,kBAAA,aAAa,KAAK;CACpC,MAAM,UAAU,UAAU,SAAS;AAEnC,KAAI,CAAC,QAAQ,UACX,SAAQ,YAAY,EAAE;AAGxB,SAAQ,UAAU,UAAU,EAC1B,SAAS,iCACV;AAED,MAAK,UAAU,gBAAgB,KAAK,UAAU,WAAW,MAAM,EAAE,GAAG,KAAK;;AAG3E,SAAS,cACP,aACA,qBACA,MACA,aACM;AACN,SAAA,GAAA,2BAAA,YAAA,GAAA,2BAAA,QAAA,GAAA,2BAAA,KACY,UAAU,EAAE,EAAA,GAAA,2BAAA,gBACL;EACb;EACA;EACA;EACD,CAAC,GAAA,GAAA,2BAAA,MACG,YAAY,CAClB,CAAC,CACH;;AAGH,SAAgB,eAAe,SAAuB;AACpD,SAAQ,MAAY,YAA8B;EAChD,MAAM,iBAAiB,gBAAA,kBAAkB,KAAK;EAC9C,MAAM,sBAAsB,gBAAA,uBAAuB,eAAe;EAIlE,MAAM,cADU,kBAAA,WADE,kBAAA,aAAa,KAAK,EACE,QAAQ,QAAQ,CAC1B,QAAQ;EACpC,MAAM,OAAO,kBAAA,cAAc,KAAK;EAEhC,MAAM,cAAc,QAAQ,eAAe;AAG3C,uBAAA,mBAAmB,MAAM,gBAAgB,EAAE,aAAa,CAAC;AAGzD,qBAAmB,MAAM,YAAY;AAGrC,oBAAkB,MAAM,QAAQ,QAAQ;AAGxC,UAAQ,QAAQ,IAAI,iCAAA,wBAAwB,CAAC;AAG7C,UAAA,GAAA,2BAAA,OAAa,CACX,cAAc,aAAa,qBAAqB,MAAM,YAAY,CACnE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"angular.js","names":[],"sources":["../../../../../../packages/vitest-angular-tools/src/schematics/utils/angular.ts"],"sourcesContent":["import { Tree, SchematicsException } from '@angular-devkit/schematics';\nimport { coerce, major } from 'semver';\n\nexport function getAngularVersion(tree: Tree): string {\n const packageJson = tree.read('package.json');\n if (!packageJson) {\n throw new SchematicsException('Could not find package.json');\n }\n\n const pkg = JSON.parse(packageJson.toString('utf-8'));\n const angularVersion =\n pkg.dependencies?.['@angular/core'] ||\n pkg.devDependencies?.['@angular/core'];\n\n if (!angularVersion) {\n throw new SchematicsException(\n 'Could not find @angular/core in package.json',\n );\n }\n\n return angularVersion;\n}\n\nexport function getMajorAngularVersion(angularVersion: string): number {\n const coerced = coerce(angularVersion);\n if (!coerced) {\n throw new SchematicsException(\n `Could not parse Angular version: ${angularVersion}`,\n );\n }\n return major(coerced);\n}\n"],"mappings":";;;AAGA,SAAgB,kBAAkB,MAAoB;CACpD,MAAM,cAAc,KAAK,KAAK,eAAe;AAC7C,KAAI,CAAC,YACH,OAAM,IAAI,2BAAA,oBAAoB,8BAA8B;CAG9D,MAAM,MAAM,KAAK,MAAM,YAAY,SAAS,QAAQ,CAAC;CACrD,MAAM,iBACJ,IAAI,eAAe,oBACnB,IAAI,kBAAkB;AAExB,KAAI,CAAC,eACH,OAAM,IAAI,2BAAA,oBACR,+CACD;AAGH,QAAO;;AAGT,SAAgB,uBAAuB,gBAAgC;CACrE,MAAM,WAAA,GAAA,OAAA,QAAiB,eAAe;AACtC,KAAI,CAAC,QACH,OAAM,IAAI,2BAAA,oBACR,oCAAoC,iBACrC;AAEH,SAAA,GAAA,OAAA,OAAa,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.js","names":[],"sources":["../../../../../../packages/vitest-angular-tools/src/schematics/utils/dependencies.ts"],"sourcesContent":["import { Tree, SchematicsException } from '@angular-devkit/schematics';\nimport { lt } from 'semver';\nimport {\n ANALOG_JS_VITE_PLUGIN_ANGULAR,\n JSDOM,\n PLAYWRIGHT,\n VITE,\n VITE_TSCONFIG_PATHS,\n VITEST_BROWSER_PLAYWRIGHT,\n VITEST_V4,\n} from './versions';\n\nexport interface DependencyOptions {\n browserMode?: boolean;\n}\n\nexport function getDevDependencies(\n angularVersion: string,\n options: DependencyOptions = {},\n): Record<string, string> {\n const escapedVersion = angularVersion.replace(/[~^]/, '');\n\n if (lt(escapedVersion, '17.0.0')) {\n throw new SchematicsException('Angular v17.0.0 or newer is required.');\n }\n\n const deps: Record<string, string> = {\n '@analogjs/vite-plugin-angular': ANALOG_JS_VITE_PLUGIN_ANGULAR,\n vite: VITE,\n vitest: VITEST_V4,\n 'vite-tsconfig-paths': VITE_TSCONFIG_PATHS,\n };\n\n if (options.browserMode) {\n deps['@vitest/browser-playwright'] = VITEST_BROWSER_PLAYWRIGHT;\n deps['playwright'] = PLAYWRIGHT;\n } else {\n deps['jsdom'] = JSDOM;\n }\n\n return deps;\n}\n\nexport function addDevDependencies(\n tree: Tree,\n angularVersion: string,\n options: DependencyOptions = {},\n): void {\n const packageJsonPath = 'package.json';\n const packageJson = tree.read(packageJsonPath);\n if (!packageJson) {\n throw new SchematicsException('Could not find package.json');\n }\n\n const pkg = JSON.parse(packageJson.toString('utf-8'));\n const devDeps = getDevDependencies(angularVersion, options);\n\n pkg.devDependencies = pkg.devDependencies || {};\n Object.entries(devDeps).forEach(([name, version]) => {\n pkg.devDependencies[name] = version;\n });\n\n // Sort devDependencies alphabetically\n pkg.devDependencies = Object.keys(pkg.devDependencies)\n .sort()\n .reduce((acc: Record<string, string>, key) => {\n acc[key] = pkg.devDependencies[key];\n return acc;\n }, {});\n\n tree.overwrite(packageJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n}\n"],"mappings":";;;;AAgBA,SAAgB,mBACd,gBACA,UAA6B,EAAE,EACP;AAGxB,MAAA,GAAA,OAAA,IAFuB,eAAe,QAAQ,QAAQ,GAAG,EAElC,SAAS,CAC9B,OAAM,IAAI,2BAAA,oBAAoB,wCAAwC;CAGxE,MAAM,OAA+B;EACnC,iCAAiC,iBAAA;EACjC,MAAM,iBAAA;EACN,QAAQ,iBAAA;EACR,uBAAuB,iBAAA;EACxB;AAED,KAAI,QAAQ,aAAa;AACvB,OAAK,gCAAgC,iBAAA;AACrC,OAAK,gBAAgB,iBAAA;OAErB,MAAK,WAAW,iBAAA;AAGlB,QAAO;;AAGT,SAAgB,mBACd,MACA,gBACA,UAA6B,EAAE,EACzB;CACN,MAAM,kBAAkB;CACxB,MAAM,cAAc,KAAK,KAAK,gBAAgB;AAC9C,KAAI,CAAC,YACH,OAAM,IAAI,2BAAA,oBAAoB,8BAA8B;CAG9D,MAAM,MAAM,KAAK,MAAM,YAAY,SAAS,QAAQ,CAAC;CACrD,MAAM,UAAU,mBAAmB,gBAAgB,QAAQ;AAE3D,KAAI,kBAAkB,IAAI,mBAAmB,EAAE;AAC/C,QAAO,QAAQ,QAAQ,CAAC,SAAS,CAAC,MAAM,aAAa;AACnD,MAAI,gBAAgB,QAAQ;GAC5B;AAGF,KAAI,kBAAkB,OAAO,KAAK,IAAI,gBAAgB,CACnD,MAAM,CACN,QAAQ,KAA6B,QAAQ;AAC5C,MAAI,OAAO,IAAI,gBAAgB;AAC/B,SAAO;IACN,EAAE,CAAC;AAER,MAAK,UAAU,iBAAiB,KAAK,UAAU,KAAK,MAAM,EAAE,GAAG,KAAK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../packages/vitest-angular-tools/src/schematics/utils/versions.ts"],"sourcesContent":["// Version constants (Angular 20+)\nexport const ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.9';\nexport const JSDOM = '^22.0.0';\nexport const VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const VITE = '^7.0.0';\nexport const VITEST_V4 = '^4.0.0';\n\n// Browser mode dependencies\nexport const VITEST_BROWSER_PLAYWRIGHT = '^4.0.0';\nexport const PLAYWRIGHT = '^1.54.0';\n"],"mappings":";AACA,IAAa,gCAAgC;AAC7C,IAAa,QAAQ;AACrB,IAAa,sBAAsB;AACnC,IAAa,OAAO;AACpB,IAAa,YAAY;AAGzB,IAAa,4BAA4B;AACzC,IAAa,aAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","names":[],"sources":["../../../../../../packages/vitest-angular-tools/src/schematics/utils/workspace.ts"],"sourcesContent":["import { Tree, SchematicsException } from '@angular-devkit/schematics';\n\nexport function isNxWorkspace(tree: Tree): boolean {\n return tree.exists('/nx.json');\n}\n\nexport interface WorkspaceProject {\n root: string;\n sourceRoot?: string;\n architect?: Record<\n string,\n { builder?: string; options?: Record<string, unknown> }\n >;\n}\n\nexport interface WorkspaceSchema {\n projects: Record<string, WorkspaceProject>;\n}\n\nexport function getWorkspace(tree: Tree): WorkspaceSchema {\n const workspaceFile = tree.read('angular.json');\n if (!workspaceFile) {\n throw new SchematicsException('Could not find angular.json');\n }\n return JSON.parse(workspaceFile.toString('utf-8'));\n}\n\nexport function getProject(\n workspace: WorkspaceSchema,\n projectName: string,\n): WorkspaceProject {\n const project = workspace.projects[projectName];\n if (!project) {\n throw new SchematicsException(\n `Project \"${projectName}\" not found in angular.json`,\n );\n }\n return project;\n}\n"],"mappings":";;AAEA,SAAgB,cAAc,MAAqB;AACjD,QAAO,KAAK,OAAO,WAAW;;AAgBhC,SAAgB,aAAa,MAA6B;CACxD,MAAM,gBAAgB,KAAK,KAAK,eAAe;AAC/C,KAAI,CAAC,cACH,OAAM,IAAI,2BAAA,oBAAoB,8BAA8B;AAE9D,QAAO,KAAK,MAAM,cAAc,SAAS,QAAQ,CAAC;;AAGpD,SAAgB,WACd,WACA,aACkB;CAClB,MAAM,UAAU,UAAU,SAAS;AACnC,KAAI,CAAC,QACH,OAAM,IAAI,2BAAA,oBACR,YAAY,YAAY,6BACzB;AAEH,QAAO"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|