@analogjs/vite-plugin-angular 3.0.0-alpha.6 → 3.0.0-alpha.60
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 +30 -0
- package/migrations/migrate-setup-vitest/migrate-setup-vitest.d.ts +2 -0
- package/migrations/migrate-setup-vitest/migrate-setup-vitest.js +49 -0
- package/migrations/migrate-setup-vitest/migrate-setup-vitest.js.map +1 -0
- package/migrations/migration.json +7 -1
- package/migrations/migrations.json +9 -0
- package/migrations/update-3-0-0/migrate-setup-vitest.d.ts +2 -0
- package/migrations/update-3-0-0/migrate-setup-vitest.js +36 -0
- package/migrations/update-3-0-0/migrate-setup-vitest.js.map +1 -0
- package/package.json +51 -12
- package/src/index.d.ts +3 -2
- package/src/index.js +6 -2
- package/src/index.js.map +1 -1
- package/src/lib/angular-build-optimizer-plugin.d.ts +4 -4
- package/src/lib/angular-build-optimizer-plugin.js +48 -62
- package/src/lib/angular-build-optimizer-plugin.js.map +1 -1
- package/src/lib/angular-jit-plugin.d.ts +3 -3
- package/src/lib/angular-jit-plugin.js +39 -37
- package/src/lib/angular-jit-plugin.js.map +1 -1
- package/src/lib/angular-pending-tasks.plugin.d.ts +7 -7
- package/src/lib/angular-pending-tasks.plugin.js +17 -18
- package/src/lib/angular-pending-tasks.plugin.js.map +1 -1
- package/src/lib/angular-vite-plugin.d.ts +178 -70
- package/src/lib/angular-vite-plugin.js +1261 -1085
- package/src/lib/angular-vite-plugin.js.map +1 -1
- package/src/lib/angular-vitest-plugin.d.ts +26 -17
- package/src/lib/angular-vitest-plugin.js +105 -114
- package/src/lib/angular-vitest-plugin.js.map +1 -1
- package/src/lib/compilation-api/compilation-api-plugin.d.ts +29 -0
- package/src/lib/compilation-api/compilation-api-plugin.js +488 -0
- package/src/lib/compilation-api/compilation-api-plugin.js.map +1 -0
- package/src/lib/compilation-api/index.d.ts +1 -0
- package/src/lib/compilation-api/index.js +1 -0
- package/src/lib/compiler/angular-version.d.ts +19 -0
- package/src/lib/compiler/angular-version.js +31 -0
- package/src/lib/compiler/angular-version.js.map +1 -0
- package/src/lib/compiler/class-field-lowering.d.ts +23 -0
- package/src/lib/compiler/class-field-lowering.js +131 -0
- package/src/lib/compiler/class-field-lowering.js.map +1 -0
- package/src/lib/compiler/compile.d.ts +50 -0
- package/src/lib/compiler/compile.js +814 -0
- package/src/lib/compiler/compile.js.map +1 -0
- package/src/lib/compiler/constants.d.ts +24 -0
- package/src/lib/compiler/constants.js +59 -0
- package/src/lib/compiler/constants.js.map +1 -0
- package/src/lib/compiler/debug.d.ts +22 -0
- package/src/lib/compiler/debug.js +20 -0
- package/src/lib/compiler/debug.js.map +1 -0
- package/src/lib/compiler/defer.d.ts +57 -0
- package/src/lib/compiler/defer.js +154 -0
- package/src/lib/compiler/defer.js.map +1 -0
- package/src/lib/compiler/dts-reader.d.ts +45 -0
- package/src/lib/compiler/dts-reader.js +395 -0
- package/src/lib/compiler/dts-reader.js.map +1 -0
- package/src/lib/compiler/hmr.d.ts +16 -0
- package/src/lib/compiler/hmr.js +69 -0
- package/src/lib/compiler/hmr.js.map +1 -0
- package/src/lib/compiler/index.d.ts +8 -0
- package/src/lib/compiler/index.js +8 -0
- package/src/lib/compiler/jit-metadata.d.ts +14 -0
- package/src/lib/compiler/jit-metadata.js +168 -0
- package/src/lib/compiler/jit-metadata.js.map +1 -0
- package/src/lib/compiler/jit-transform.d.ts +24 -0
- package/src/lib/compiler/jit-transform.js +204 -0
- package/src/lib/compiler/jit-transform.js.map +1 -0
- package/src/lib/compiler/js-emitter.d.ts +10 -0
- package/src/lib/compiler/js-emitter.js +445 -0
- package/src/lib/compiler/js-emitter.js.map +1 -0
- package/src/lib/compiler/metadata.d.ts +36 -0
- package/src/lib/compiler/metadata.js +710 -0
- package/src/lib/compiler/metadata.js.map +1 -0
- package/src/lib/compiler/registry.d.ts +56 -0
- package/src/lib/compiler/registry.js +176 -0
- package/src/lib/compiler/registry.js.map +1 -0
- package/src/lib/compiler/resource-inliner.d.ts +43 -0
- package/src/lib/compiler/resource-inliner.js +230 -0
- package/src/lib/compiler/resource-inliner.js.map +1 -0
- package/src/lib/compiler/style-ast.d.ts +9 -0
- package/src/lib/compiler/style-ast.js +54 -0
- package/src/lib/compiler/style-ast.js.map +1 -0
- package/src/lib/compiler/styles.d.ts +13 -0
- package/src/lib/compiler/test-helpers.d.ts +7 -0
- package/src/lib/compiler/type-elision.d.ts +28 -0
- package/src/lib/compiler/type-elision.js +211 -0
- package/src/lib/compiler/type-elision.js.map +1 -0
- package/src/lib/compiler/utils.d.ts +40 -0
- package/src/lib/compiler/utils.js +76 -0
- package/src/lib/compiler/utils.js.map +1 -0
- package/src/lib/compiler-plugin.d.ts +13 -12
- package/src/lib/compiler-plugin.js +40 -44
- package/src/lib/compiler-plugin.js.map +1 -1
- package/src/lib/component-resolvers.d.ts +23 -5
- package/src/lib/component-resolvers.js +152 -63
- package/src/lib/component-resolvers.js.map +1 -1
- package/src/lib/encapsulation-plugin.d.ts +13 -0
- package/src/lib/encapsulation-plugin.js +48 -0
- package/src/lib/encapsulation-plugin.js.map +1 -0
- package/src/lib/fast-compile-plugin.d.ts +28 -0
- package/src/lib/fast-compile-plugin.js +414 -0
- package/src/lib/fast-compile-plugin.js.map +1 -0
- package/src/lib/host.d.ts +10 -8
- package/src/lib/host.js +113 -101
- package/src/lib/host.js.map +1 -1
- package/src/lib/live-reload-plugin.d.ts +5 -5
- package/src/lib/live-reload-plugin.js +61 -63
- package/src/lib/live-reload-plugin.js.map +1 -1
- package/src/lib/models.d.ts +9 -9
- package/src/lib/nx-folder-plugin.d.ts +5 -5
- package/src/lib/nx-folder-plugin.js +18 -16
- package/src/lib/nx-folder-plugin.js.map +1 -1
- package/src/lib/plugins/file-replacements.plugin.d.ts +4 -4
- package/src/lib/plugins/file-replacements.plugin.js +40 -62
- package/src/lib/plugins/file-replacements.plugin.js.map +1 -1
- package/src/lib/router-plugin.d.ts +1 -1
- package/src/lib/router-plugin.js +35 -23
- package/src/lib/router-plugin.js.map +1 -1
- package/src/lib/style-pipeline.d.ts +15 -0
- package/src/lib/style-pipeline.js +31 -0
- package/src/lib/style-pipeline.js.map +1 -0
- package/src/lib/style-preprocessor.d.ts +35 -0
- package/src/lib/style-preprocessor.js +35 -0
- package/src/lib/style-preprocessor.js.map +1 -0
- package/src/lib/stylesheet-registry.d.ts +74 -0
- package/src/lib/stylesheet-registry.js +174 -0
- package/src/lib/stylesheet-registry.js.map +1 -0
- package/src/lib/tailwind-plugin.d.ts +34 -0
- package/src/lib/tailwind-plugin.js +116 -0
- package/src/lib/tailwind-plugin.js.map +1 -0
- package/src/lib/template-class-binding-guard-plugin.d.ts +30 -0
- package/src/lib/template-class-binding-guard-plugin.js +237 -0
- package/src/lib/template-class-binding-guard-plugin.js.map +1 -0
- package/src/lib/tools/package.json +2 -7
- package/src/lib/tools/src/builders/vite/vite-build.impl.js +31 -38
- package/src/lib/tools/src/builders/vite/vite-build.impl.js.map +1 -1
- package/src/lib/tools/src/builders/vite-dev-server/dev-server.impl.js +51 -62
- package/src/lib/tools/src/builders/vite-dev-server/dev-server.impl.js.map +1 -1
- package/src/lib/tools/src/index.js +0 -2
- package/src/lib/utils/compilation-shared.d.ts +62 -0
- package/src/lib/utils/compilation-shared.js +138 -0
- package/src/lib/utils/compilation-shared.js.map +1 -0
- package/src/lib/utils/compiler-plugin-options.d.ts +11 -11
- package/src/lib/utils/css-extension-resolver.d.ts +32 -0
- package/src/lib/utils/css-extension-resolver.js +73 -0
- package/src/lib/utils/css-extension-resolver.js.map +1 -0
- package/src/lib/utils/debug-harness.d.ts +23 -0
- package/src/lib/utils/debug-harness.js +88 -0
- package/src/lib/utils/debug-harness.js.map +1 -0
- package/src/lib/utils/debug-log-file.d.ts +5 -0
- package/src/lib/utils/debug-log-file.js +56 -0
- package/src/lib/utils/debug-log-file.js.map +1 -0
- package/src/lib/utils/debug.d.ts +28 -0
- package/src/lib/utils/debug.js +39 -0
- package/src/lib/utils/debug.js.map +1 -0
- package/src/lib/utils/devkit.d.ts +6 -6
- package/src/lib/utils/devkit.js +34 -38
- package/src/lib/utils/devkit.js.map +1 -1
- package/src/lib/utils/hmr-candidates.d.ts +28 -28
- package/src/lib/utils/plugin-config.d.ts +34 -0
- package/src/lib/utils/plugin-config.js +71 -0
- package/src/lib/utils/plugin-config.js.map +1 -0
- package/src/lib/utils/rolldown.d.ts +2 -0
- package/src/lib/utils/rolldown.js +12 -0
- package/src/lib/utils/rolldown.js.map +1 -0
- package/src/lib/utils/safe-module-paths.d.ts +16 -0
- package/src/lib/utils/safe-module-paths.js +29 -0
- package/src/lib/utils/safe-module-paths.js.map +1 -0
- package/src/lib/utils/source-file-cache.d.ts +8 -15
- package/src/lib/utils/source-file-cache.js +35 -37
- package/src/lib/utils/source-file-cache.js.map +1 -1
- package/src/lib/utils/tailwind-reference.d.ts +12 -0
- package/src/lib/utils/tailwind-reference.js +99 -0
- package/src/lib/utils/tailwind-reference.js.map +1 -0
- package/src/lib/utils/transform-cache.d.ts +43 -0
- package/src/lib/utils/transform-cache.js +97 -0
- package/src/lib/utils/transform-cache.js.map +1 -0
- package/src/lib/utils/tsconfig-resolver.d.ts +28 -0
- package/src/lib/utils/tsconfig-resolver.js +191 -0
- package/src/lib/utils/tsconfig-resolver.js.map +1 -0
- package/src/lib/utils/virtual-ids.d.ts +4 -0
- package/src/lib/utils/virtual-ids.js +23 -0
- package/src/lib/utils/virtual-ids.js.map +1 -0
- package/src/lib/utils/virtual-resources.d.ts +19 -0
- package/src/lib/utils/virtual-resources.js +38 -0
- package/src/lib/utils/virtual-resources.js.map +1 -0
- package/src/lib/virtual-modules-plugin.d.ts +5 -0
- package/src/lib/virtual-modules-plugin.js +23 -0
- package/src/lib/virtual-modules-plugin.js.map +1 -0
- package/src/test-setup.d.ts +2 -0
- package/setup-vitest.d.ts +0 -4
- package/setup-vitest.js +0 -215
- package/setup-vitest.js.map +0 -1
- package/src/lib/models.js +0 -1
- package/src/lib/models.js.map +0 -1
- package/src/lib/tools/README.md +0 -3
- package/src/lib/tools/src/index.d.ts +0 -0
- package/src/lib/tools/src/index.js.map +0 -1
- package/src/lib/utils/compiler-plugin-options.js +0 -1
- package/src/lib/utils/compiler-plugin-options.js.map +0 -1
- package/src/lib/utils/hmr-candidates.js +0 -272
- package/src/lib/utils/hmr-candidates.js.map +0 -1
|
@@ -1,39 +1,37 @@
|
|
|
1
|
+
import * as path$1 from "node:path";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
//#region packages/vite-plugin-angular/src/lib/utils/source-file-cache.ts
|
|
1
5
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
this.delete(file);
|
|
35
|
-
this.modifiedFiles.add(file);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
6
|
+
* @license
|
|
7
|
+
* Copyright Google LLC All Rights Reserved.
|
|
8
|
+
*
|
|
9
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
10
|
+
* found in the LICENSE file at https://angular.io/license
|
|
11
|
+
*/
|
|
12
|
+
var USING_WINDOWS = platform() === "win32";
|
|
13
|
+
var WINDOWS_SEP_REGEXP = new RegExp(`\\${path$1.win32.sep}`, "g");
|
|
14
|
+
var SourceFileCache = class extends Map {
|
|
15
|
+
modifiedFiles = /* @__PURE__ */ new Set();
|
|
16
|
+
babelFileCache = /* @__PURE__ */ new Map();
|
|
17
|
+
typeScriptFileCache = /* @__PURE__ */ new Map();
|
|
18
|
+
referencedFiles;
|
|
19
|
+
constructor(persistentCachePath) {
|
|
20
|
+
super();
|
|
21
|
+
this.persistentCachePath = persistentCachePath;
|
|
22
|
+
}
|
|
23
|
+
invalidate(files) {
|
|
24
|
+
if (files !== this.modifiedFiles) this.modifiedFiles.clear();
|
|
25
|
+
for (let file of files) {
|
|
26
|
+
this.babelFileCache.delete(file);
|
|
27
|
+
this.typeScriptFileCache.delete(pathToFileURL(file).href);
|
|
28
|
+
if (USING_WINDOWS) file = file.replace(WINDOWS_SEP_REGEXP, path$1.posix.sep);
|
|
29
|
+
this.delete(file);
|
|
30
|
+
this.modifiedFiles.add(file);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { SourceFileCache };
|
|
36
|
+
|
|
39
37
|
//# sourceMappingURL=source-file-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-file-cache.js","
|
|
1
|
+
{"version":3,"file":"source-file-cache.js","names":[],"sources":["../../../../src/lib/utils/source-file-cache.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport { platform } from 'node:os';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type ts from 'typescript';\n\nconst USING_WINDOWS = platform() === 'win32';\nconst WINDOWS_SEP_REGEXP = new RegExp(`\\\\${path.win32.sep}`, 'g');\n\nexport class SourceFileCache extends Map<string, ts.SourceFile> {\n readonly modifiedFiles: Set<string> = new Set<string>();\n readonly babelFileCache: Map<string, Uint8Array> = new Map<\n string,\n Uint8Array\n >();\n readonly typeScriptFileCache: Map<string, string | Uint8Array> = new Map<\n string,\n string | Uint8Array\n >();\n\n referencedFiles?: readonly string[];\n\n constructor(readonly persistentCachePath?: string) {\n super();\n }\n\n invalidate(files: Iterable<string>): void {\n if (files !== this.modifiedFiles) {\n this.modifiedFiles.clear();\n }\n for (let file of files) {\n this.babelFileCache.delete(file);\n this.typeScriptFileCache.delete(pathToFileURL(file).href);\n\n // Normalize separators to allow matching TypeScript Host paths\n if (USING_WINDOWS) {\n file = file.replace(WINDOWS_SEP_REGEXP, path.posix.sep);\n }\n\n this.delete(file);\n this.modifiedFiles.add(file);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;AAaA,IAAM,gBAAgB,UAAU,KAAK;AACrC,IAAM,qBAAqB,IAAI,OAAO,KAAK,OAAK,MAAM,OAAO,IAAI;AAEjE,IAAa,kBAAb,cAAqC,IAA2B;CAC9D,gCAAsC,IAAI,KAAa;CACvD,iCAAmD,IAAI,KAGpD;CACH,sCAAiE,IAAI,KAGlE;CAEH;CAEA,YAAY,qBAAuC;AACjD,SAAO;AADY,OAAA,sBAAA;;CAIrB,WAAW,OAA+B;AACxC,MAAI,UAAU,KAAK,cACjB,MAAK,cAAc,OAAO;AAE5B,OAAK,IAAI,QAAQ,OAAO;AACtB,QAAK,eAAe,OAAO,KAAK;AAChC,QAAK,oBAAoB,OAAO,cAAc,KAAK,CAAC,KAAK;AAGzD,OAAI,cACF,QAAO,KAAK,QAAQ,oBAAoB,OAAK,MAAM,IAAI;AAGzD,QAAK,OAAO,KAAK;AACjB,QAAK,cAAc,IAAI,KAAK"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface CssTailwindDirectiveState {
|
|
2
|
+
commentlessCode: string;
|
|
3
|
+
hasReferenceDirective: boolean;
|
|
4
|
+
hasReferenceText: boolean;
|
|
5
|
+
hasTailwindImportDirective: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare class TailwindReferenceError extends Error {
|
|
8
|
+
readonly name = "TailwindReferenceError";
|
|
9
|
+
}
|
|
10
|
+
export declare function inspectCssTailwindDirectives(code: string): CssTailwindDirectiveState;
|
|
11
|
+
export declare function throwTailwindReferenceTextError(filename: string, rootStylesheet: string): never;
|
|
12
|
+
export declare function isTailwindReferenceError(error: unknown): error is TailwindReferenceError;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//#region packages/vite-plugin-angular/src/lib/utils/tailwind-reference.ts
|
|
2
|
+
var ANGULAR_TAILWIND_PREFIX = "[@analogjs/vite-plugin-angular]";
|
|
3
|
+
var CSS_REFERENCE_DIRECTIVE_REGEX = /(^|[;}\n\r])\s*@reference\b/m;
|
|
4
|
+
var CSS_TAILWIND_IMPORT_REGEX = /(^|[;}\n\r])\s*@import\s+["']tailwindcss["']/m;
|
|
5
|
+
var TailwindReferenceError = class extends Error {
|
|
6
|
+
name = "TailwindReferenceError";
|
|
7
|
+
};
|
|
8
|
+
function stripCssBlockComments(code) {
|
|
9
|
+
let result = "";
|
|
10
|
+
let quote = null;
|
|
11
|
+
for (let index = 0; index < code.length; index++) {
|
|
12
|
+
const character = code[index];
|
|
13
|
+
const nextCharacter = code[index + 1];
|
|
14
|
+
if (quote) {
|
|
15
|
+
if (character === "\\" && nextCharacter) {
|
|
16
|
+
result += character;
|
|
17
|
+
result += nextCharacter;
|
|
18
|
+
index++;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (character === quote) quote = null;
|
|
22
|
+
result += character;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (character === "\"" || character === "'" || character === "`") {
|
|
26
|
+
quote = character;
|
|
27
|
+
result += character;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (character === "/" && nextCharacter === "*") {
|
|
31
|
+
result += " ";
|
|
32
|
+
index += 2;
|
|
33
|
+
while (index < code.length) {
|
|
34
|
+
const commentCharacter = code[index];
|
|
35
|
+
const commentNextCharacter = code[index + 1];
|
|
36
|
+
if (commentCharacter === "*" && commentNextCharacter === "/") {
|
|
37
|
+
result += " ";
|
|
38
|
+
index++;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
result += commentCharacter === "\n" || commentCharacter === "\r" ? commentCharacter : " ";
|
|
42
|
+
index++;
|
|
43
|
+
}
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
result += character;
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
function hasReferenceTextInComments(code) {
|
|
51
|
+
let quote = null;
|
|
52
|
+
for (let index = 0; index < code.length; index++) {
|
|
53
|
+
const character = code[index];
|
|
54
|
+
const nextCharacter = code[index + 1];
|
|
55
|
+
if (quote) {
|
|
56
|
+
if (character === "\\" && nextCharacter) {
|
|
57
|
+
index++;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (character === quote) quote = null;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (character === "\"" || character === "'" || character === "`") {
|
|
64
|
+
quote = character;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (character === "/" && nextCharacter === "*") {
|
|
68
|
+
const commentStart = index + 2;
|
|
69
|
+
index += 2;
|
|
70
|
+
while (index < code.length) {
|
|
71
|
+
const commentCharacter = code[index];
|
|
72
|
+
const commentNextCharacter = code[index + 1];
|
|
73
|
+
if (commentCharacter === "*" && commentNextCharacter === "/") break;
|
|
74
|
+
index++;
|
|
75
|
+
}
|
|
76
|
+
if (code.slice(commentStart, index).includes("@reference")) return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
function inspectCssTailwindDirectives(code) {
|
|
82
|
+
const commentlessCode = stripCssBlockComments(code);
|
|
83
|
+
return {
|
|
84
|
+
commentlessCode,
|
|
85
|
+
hasReferenceDirective: CSS_REFERENCE_DIRECTIVE_REGEX.test(commentlessCode),
|
|
86
|
+
hasReferenceText: hasReferenceTextInComments(code),
|
|
87
|
+
hasTailwindImportDirective: CSS_TAILWIND_IMPORT_REGEX.test(commentlessCode)
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function throwTailwindReferenceTextError(filename, rootStylesheet) {
|
|
91
|
+
throw new TailwindReferenceError(`${ANGULAR_TAILWIND_PREFIX} Tailwind @reference auto-injection was blocked for "${filename}" because the stylesheet contains the text "@reference" but does not contain a real @reference directive.\n\nThis is usually caused by a CSS comment such as "/* ... @reference ... */".\n\nFix one of:\n - Reword the comment so it does not contain "@reference"\n - Add a real @reference "${rootStylesheet}"; directive\n`);
|
|
92
|
+
}
|
|
93
|
+
function isTailwindReferenceError(error) {
|
|
94
|
+
return error instanceof TailwindReferenceError;
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
export { inspectCssTailwindDirectives, isTailwindReferenceError, throwTailwindReferenceTextError };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=tailwind-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-reference.js","names":[],"sources":["../../../../src/lib/utils/tailwind-reference.ts"],"sourcesContent":["const ANGULAR_TAILWIND_PREFIX = '[@analogjs/vite-plugin-angular]';\nconst CSS_REFERENCE_DIRECTIVE_REGEX = /(^|[;}\\n\\r])\\s*@reference\\b/m;\nconst CSS_TAILWIND_IMPORT_REGEX =\n /(^|[;}\\n\\r])\\s*@import\\s+[\"']tailwindcss[\"']/m;\n\nexport interface CssTailwindDirectiveState {\n commentlessCode: string;\n hasReferenceDirective: boolean;\n hasReferenceText: boolean;\n hasTailwindImportDirective: boolean;\n}\n\nexport class TailwindReferenceError extends Error {\n readonly name = 'TailwindReferenceError';\n}\n\n// Match real CSS directives, not prose inside block comments. The scanner keeps\n// quoted CSS content intact so `/* ... */` sequences inside strings do not get\n// mistaken for real comments.\nfunction stripCssBlockComments(code: string): string {\n let result = '';\n let quote: '\"' | \"'\" | '`' | null = null;\n\n for (let index = 0; index < code.length; index++) {\n const character = code[index];\n const nextCharacter = code[index + 1];\n\n if (quote) {\n if (character === '\\\\' && nextCharacter) {\n result += character;\n result += nextCharacter;\n index++;\n continue;\n }\n if (character === quote) {\n quote = null;\n }\n result += character;\n continue;\n }\n\n if (character === '\"' || character === \"'\" || character === '`') {\n quote = character;\n result += character;\n continue;\n }\n\n if (character === '/' && nextCharacter === '*') {\n result += ' ';\n index += 2;\n\n while (index < code.length) {\n const commentCharacter = code[index];\n const commentNextCharacter = code[index + 1];\n\n if (commentCharacter === '*' && commentNextCharacter === '/') {\n result += ' ';\n index++;\n break;\n }\n\n result +=\n commentCharacter === '\\n' || commentCharacter === '\\r'\n ? commentCharacter\n : ' ';\n index++;\n }\n continue;\n }\n\n result += character;\n }\n\n return result;\n}\n\nfunction hasReferenceTextInComments(code: string): boolean {\n let quote: '\"' | \"'\" | '`' | null = null;\n\n for (let index = 0; index < code.length; index++) {\n const character = code[index];\n const nextCharacter = code[index + 1];\n\n if (quote) {\n if (character === '\\\\' && nextCharacter) {\n index++;\n continue;\n }\n if (character === quote) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\" || character === '`') {\n quote = character;\n continue;\n }\n\n if (character === '/' && nextCharacter === '*') {\n const commentStart = index + 2;\n index += 2;\n\n while (index < code.length) {\n const commentCharacter = code[index];\n const commentNextCharacter = code[index + 1];\n\n if (commentCharacter === '*' && commentNextCharacter === '/') {\n break;\n }\n index++;\n }\n\n if (code.slice(commentStart, index).includes('@reference')) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function inspectCssTailwindDirectives(\n code: string,\n): CssTailwindDirectiveState {\n const commentlessCode = stripCssBlockComments(code);\n\n return {\n commentlessCode,\n hasReferenceDirective: CSS_REFERENCE_DIRECTIVE_REGEX.test(commentlessCode),\n hasReferenceText: hasReferenceTextInComments(code),\n hasTailwindImportDirective: CSS_TAILWIND_IMPORT_REGEX.test(commentlessCode),\n };\n}\n\nexport function throwTailwindReferenceTextError(\n filename: string,\n rootStylesheet: string,\n): never {\n throw new TailwindReferenceError(\n `${ANGULAR_TAILWIND_PREFIX} Tailwind @reference auto-injection was ` +\n `blocked for \"${filename}\" because the stylesheet contains the ` +\n `text \"@reference\" but does not contain a real @reference ` +\n `directive.\\n\\n` +\n `This is usually caused by a CSS comment such as ` +\n `\"/* ... @reference ... */\".\\n\\n` +\n `Fix one of:\\n` +\n ` - Reword the comment so it does not contain \"@reference\"\\n` +\n ` - Add a real @reference \"${rootStylesheet}\"; directive\\n`,\n );\n}\n\nexport function isTailwindReferenceError(\n error: unknown,\n): error is TailwindReferenceError {\n return error instanceof TailwindReferenceError;\n}\n"],"mappings":";AAAA,IAAM,0BAA0B;AAChC,IAAM,gCAAgC;AACtC,IAAM,4BACJ;AASF,IAAa,yBAAb,cAA4C,MAAM;CAChD,OAAgB;;AAMlB,SAAS,sBAAsB,MAAsB;CACnD,IAAI,SAAS;CACb,IAAI,QAAgC;AAEpC,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;EAChD,MAAM,YAAY,KAAK;EACvB,MAAM,gBAAgB,KAAK,QAAQ;AAEnC,MAAI,OAAO;AACT,OAAI,cAAc,QAAQ,eAAe;AACvC,cAAU;AACV,cAAU;AACV;AACA;;AAEF,OAAI,cAAc,MAChB,SAAQ;AAEV,aAAU;AACV;;AAGF,MAAI,cAAc,QAAO,cAAc,OAAO,cAAc,KAAK;AAC/D,WAAQ;AACR,aAAU;AACV;;AAGF,MAAI,cAAc,OAAO,kBAAkB,KAAK;AAC9C,aAAU;AACV,YAAS;AAET,UAAO,QAAQ,KAAK,QAAQ;IAC1B,MAAM,mBAAmB,KAAK;IAC9B,MAAM,uBAAuB,KAAK,QAAQ;AAE1C,QAAI,qBAAqB,OAAO,yBAAyB,KAAK;AAC5D,eAAU;AACV;AACA;;AAGF,cACE,qBAAqB,QAAQ,qBAAqB,OAC9C,mBACA;AACN;;AAEF;;AAGF,YAAU;;AAGZ,QAAO;;AAGT,SAAS,2BAA2B,MAAuB;CACzD,IAAI,QAAgC;AAEpC,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;EAChD,MAAM,YAAY,KAAK;EACvB,MAAM,gBAAgB,KAAK,QAAQ;AAEnC,MAAI,OAAO;AACT,OAAI,cAAc,QAAQ,eAAe;AACvC;AACA;;AAEF,OAAI,cAAc,MAChB,SAAQ;AAEV;;AAGF,MAAI,cAAc,QAAO,cAAc,OAAO,cAAc,KAAK;AAC/D,WAAQ;AACR;;AAGF,MAAI,cAAc,OAAO,kBAAkB,KAAK;GAC9C,MAAM,eAAe,QAAQ;AAC7B,YAAS;AAET,UAAO,QAAQ,KAAK,QAAQ;IAC1B,MAAM,mBAAmB,KAAK;IAC9B,MAAM,uBAAuB,KAAK,QAAQ;AAE1C,QAAI,qBAAqB,OAAO,yBAAyB,IACvD;AAEF;;AAGF,OAAI,KAAK,MAAM,cAAc,MAAM,CAAC,SAAS,aAAa,CACxD,QAAO;;;AAKb,QAAO;;AAGT,SAAgB,6BACd,MAC2B;CAC3B,MAAM,kBAAkB,sBAAsB,KAAK;AAEnD,QAAO;EACL;EACA,uBAAuB,8BAA8B,KAAK,gBAAgB;EAC1E,kBAAkB,2BAA2B,KAAK;EAClD,4BAA4B,0BAA0B,KAAK,gBAAgB;EAC5E;;AAGH,SAAgB,gCACd,UACA,gBACO;AACP,OAAM,IAAI,uBACR,GAAG,wBAAwB,uDACT,SAAS,kSAOK,eAAe,gBAChD;;AAGH,SAAgB,yBACd,OACiC;AACjC,QAAO,iBAAiB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `{ get, put }` shape `@angular/build`'s `JavaScriptTransformer`
|
|
3
|
+
* accepts as its third constructor argument. Keys are SHA-256 digests the
|
|
4
|
+
* transformer derives from the file bytes plus every option that affects
|
|
5
|
+
* output, so entries are immutable and never need invalidation — but the
|
|
6
|
+
* digest does NOT cover the linker version, so stores must be namespaced
|
|
7
|
+
* by Angular version (see {@link resolveTransformCacheDir}).
|
|
8
|
+
*/
|
|
9
|
+
export interface TransformCacheStore {
|
|
10
|
+
get(key: string): Promise<Uint8Array | undefined> | Uint8Array | undefined;
|
|
11
|
+
put(key: string, value: Uint8Array): Promise<void> | void;
|
|
12
|
+
}
|
|
13
|
+
interface TransformCacheStats {
|
|
14
|
+
hits: number;
|
|
15
|
+
misses: number;
|
|
16
|
+
writes: number;
|
|
17
|
+
/** Approximate total ms spent in the linker worker for cache misses. */
|
|
18
|
+
workerMs: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Disk-backed content-addressed store for linked/transformed dependency
|
|
22
|
+
* output. Entries are written atomically (temp + rename) so concurrent
|
|
23
|
+
* dev servers can share a directory; all failures degrade to a miss.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createPersistentTransformCache(baseDir: string): TransformCacheStore & {
|
|
26
|
+
stats: TransformCacheStats;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Layer an unbounded in-memory map over a persistent store so repeat
|
|
30
|
+
* transforms in the same session never touch the disk.
|
|
31
|
+
*/
|
|
32
|
+
export declare function withMemoryLayer(store: TransformCacheStore): TransformCacheStore;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the shared on-disk cache directory: `node_modules/.cache` at the
|
|
35
|
+
* nearest `node_modules` above `startDir` — the conventional tool-cache
|
|
36
|
+
* location, so installs and `node_modules` cleans evict it without a
|
|
37
|
+
* separate eviction pass. Namespaced by the installed Angular version
|
|
38
|
+
* because the transformer's cache key does not cover the linker version.
|
|
39
|
+
* Returns `null` (caching disabled) when no `node_modules` exists or the
|
|
40
|
+
* `ANALOG_TRANSFORM_CACHE=0` kill switch is set.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveTransformCacheDir(startDir: string): string | null;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path$1 from "node:path";
|
|
3
|
+
import * as crypto from "node:crypto";
|
|
4
|
+
import { createDebug } from "obug";
|
|
5
|
+
import { VERSION } from "@angular/compiler";
|
|
6
|
+
//#region packages/vite-plugin-angular/src/lib/utils/transform-cache.ts
|
|
7
|
+
var debugCache = createDebug("analog-transform-cache");
|
|
8
|
+
/**
|
|
9
|
+
* Disk-backed content-addressed store for linked/transformed dependency
|
|
10
|
+
* output. Entries are written atomically (temp + rename) so concurrent
|
|
11
|
+
* dev servers can share a directory; all failures degrade to a miss.
|
|
12
|
+
*/
|
|
13
|
+
function createPersistentTransformCache(baseDir) {
|
|
14
|
+
const stats = {
|
|
15
|
+
hits: 0,
|
|
16
|
+
misses: 0,
|
|
17
|
+
writes: 0,
|
|
18
|
+
workerMs: 0
|
|
19
|
+
};
|
|
20
|
+
const missedAt = /* @__PURE__ */ new Map();
|
|
21
|
+
const entryPath = (key) => path$1.join(baseDir, key.slice(0, 2), key);
|
|
22
|
+
return {
|
|
23
|
+
stats,
|
|
24
|
+
async get(key) {
|
|
25
|
+
try {
|
|
26
|
+
const value = await fs.promises.readFile(entryPath(key));
|
|
27
|
+
stats.hits++;
|
|
28
|
+
debugCache("hit %s (hits=%d misses=%d)", key, stats.hits, stats.misses);
|
|
29
|
+
return value;
|
|
30
|
+
} catch {
|
|
31
|
+
stats.misses++;
|
|
32
|
+
missedAt.set(key, performance.now());
|
|
33
|
+
debugCache("miss %s (hits=%d misses=%d)", key, stats.hits, stats.misses);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
async put(key, value) {
|
|
38
|
+
const startedAt = missedAt.get(key);
|
|
39
|
+
if (startedAt !== void 0) {
|
|
40
|
+
missedAt.delete(key);
|
|
41
|
+
stats.workerMs += performance.now() - startedAt;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const file = entryPath(key);
|
|
45
|
+
await fs.promises.mkdir(path$1.dirname(file), { recursive: true });
|
|
46
|
+
const tmp = `${file}.${process.pid}.${crypto.randomBytes(4).toString("hex")}`;
|
|
47
|
+
await fs.promises.writeFile(tmp, value);
|
|
48
|
+
await fs.promises.rename(tmp, file);
|
|
49
|
+
stats.writes++;
|
|
50
|
+
debugCache("put %s (writes=%d workerMs=%d)", key, stats.writes, Math.round(stats.workerMs));
|
|
51
|
+
} catch (e) {
|
|
52
|
+
debugCache("put failed %s: %s", key, e?.message);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Layer an unbounded in-memory map over a persistent store so repeat
|
|
59
|
+
* transforms in the same session never touch the disk.
|
|
60
|
+
*/
|
|
61
|
+
function withMemoryLayer(store) {
|
|
62
|
+
const memory = /* @__PURE__ */ new Map();
|
|
63
|
+
return {
|
|
64
|
+
async get(key) {
|
|
65
|
+
const cached = memory.get(key) ?? await store.get(key);
|
|
66
|
+
if (cached) memory.set(key, cached);
|
|
67
|
+
return cached;
|
|
68
|
+
},
|
|
69
|
+
async put(key, value) {
|
|
70
|
+
memory.set(key, value);
|
|
71
|
+
await store.put(key, value);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolve the shared on-disk cache directory: `node_modules/.cache` at the
|
|
77
|
+
* nearest `node_modules` above `startDir` — the conventional tool-cache
|
|
78
|
+
* location, so installs and `node_modules` cleans evict it without a
|
|
79
|
+
* separate eviction pass. Namespaced by the installed Angular version
|
|
80
|
+
* because the transformer's cache key does not cover the linker version.
|
|
81
|
+
* Returns `null` (caching disabled) when no `node_modules` exists or the
|
|
82
|
+
* `ANALOG_TRANSFORM_CACHE=0` kill switch is set.
|
|
83
|
+
*/
|
|
84
|
+
function resolveTransformCacheDir(startDir) {
|
|
85
|
+
if (process.env["ANALOG_TRANSFORM_CACHE"] === "0") return null;
|
|
86
|
+
let dir = path$1.resolve(startDir);
|
|
87
|
+
for (;;) {
|
|
88
|
+
if (fs.existsSync(path$1.join(dir, "node_modules"))) return path$1.join(dir, "node_modules", ".cache", "analog", "transform-cache", VERSION.full);
|
|
89
|
+
const parent = path$1.dirname(dir);
|
|
90
|
+
if (parent === dir) return null;
|
|
91
|
+
dir = parent;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { createPersistentTransformCache, resolveTransformCacheDir, withMemoryLayer };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=transform-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-cache.js","names":[],"sources":["../../../../src/lib/utils/transform-cache.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { VERSION } from '@angular/compiler';\nimport { createDebug } from 'obug';\n\nconst debugCache = createDebug('analog-transform-cache');\n\n/**\n * The `{ get, put }` shape `@angular/build`'s `JavaScriptTransformer`\n * accepts as its third constructor argument. Keys are SHA-256 digests the\n * transformer derives from the file bytes plus every option that affects\n * output, so entries are immutable and never need invalidation — but the\n * digest does NOT cover the linker version, so stores must be namespaced\n * by Angular version (see {@link resolveTransformCacheDir}).\n */\nexport interface TransformCacheStore {\n get(key: string): Promise<Uint8Array | undefined> | Uint8Array | undefined;\n put(key: string, value: Uint8Array): Promise<void> | void;\n}\n\ninterface TransformCacheStats {\n hits: number;\n misses: number;\n writes: number;\n /** Approximate total ms spent in the linker worker for cache misses. */\n workerMs: number;\n}\n\n/**\n * Disk-backed content-addressed store for linked/transformed dependency\n * output. Entries are written atomically (temp + rename) so concurrent\n * dev servers can share a directory; all failures degrade to a miss.\n */\nexport function createPersistentTransformCache(\n baseDir: string,\n): TransformCacheStore & { stats: TransformCacheStats } {\n const stats: TransformCacheStats = {\n hits: 0,\n misses: 0,\n writes: 0,\n workerMs: 0,\n };\n // Miss timestamps by key: with the transformer's serialized worker, the\n // gap between a missed get and its put approximates linker time per file.\n const missedAt = new Map<string, number>();\n\n const entryPath = (key: string) => path.join(baseDir, key.slice(0, 2), key);\n\n return {\n stats,\n async get(key: string): Promise<Uint8Array | undefined> {\n try {\n const value = await fs.promises.readFile(entryPath(key));\n stats.hits++;\n debugCache('hit %s (hits=%d misses=%d)', key, stats.hits, stats.misses);\n return value;\n } catch {\n stats.misses++;\n missedAt.set(key, performance.now());\n debugCache(\n 'miss %s (hits=%d misses=%d)',\n key,\n stats.hits,\n stats.misses,\n );\n return undefined;\n }\n },\n async put(key: string, value: Uint8Array): Promise<void> {\n const startedAt = missedAt.get(key);\n if (startedAt !== undefined) {\n missedAt.delete(key);\n stats.workerMs += performance.now() - startedAt;\n }\n try {\n const file = entryPath(key);\n await fs.promises.mkdir(path.dirname(file), { recursive: true });\n const tmp = `${file}.${process.pid}.${crypto.randomBytes(4).toString('hex')}`;\n await fs.promises.writeFile(tmp, value);\n await fs.promises.rename(tmp, file);\n stats.writes++;\n debugCache(\n 'put %s (writes=%d workerMs=%d)',\n key,\n stats.writes,\n Math.round(stats.workerMs),\n );\n } catch (e) {\n debugCache('put failed %s: %s', key, (e as Error)?.message);\n }\n },\n };\n}\n\n/**\n * Layer an unbounded in-memory map over a persistent store so repeat\n * transforms in the same session never touch the disk.\n */\nexport function withMemoryLayer(\n store: TransformCacheStore,\n): TransformCacheStore {\n const memory = new Map<string, Uint8Array>();\n return {\n async get(key: string): Promise<Uint8Array | undefined> {\n const cached = memory.get(key) ?? (await store.get(key));\n if (cached) memory.set(key, cached);\n return cached;\n },\n async put(key: string, value: Uint8Array): Promise<void> {\n memory.set(key, value);\n await store.put(key, value);\n },\n };\n}\n\n/**\n * Resolve the shared on-disk cache directory: `node_modules/.cache` at the\n * nearest `node_modules` above `startDir` — the conventional tool-cache\n * location, so installs and `node_modules` cleans evict it without a\n * separate eviction pass. Namespaced by the installed Angular version\n * because the transformer's cache key does not cover the linker version.\n * Returns `null` (caching disabled) when no `node_modules` exists or the\n * `ANALOG_TRANSFORM_CACHE=0` kill switch is set.\n */\nexport function resolveTransformCacheDir(startDir: string): string | null {\n if (process.env['ANALOG_TRANSFORM_CACHE'] === '0') return null;\n let dir = path.resolve(startDir);\n for (;;) {\n if (fs.existsSync(path.join(dir, 'node_modules'))) {\n return path.join(\n dir,\n 'node_modules',\n '.cache',\n 'analog',\n 'transform-cache',\n VERSION.full,\n );\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n"],"mappings":";;;;;;AAMA,IAAM,aAAa,YAAY,yBAAyB;;;;;;AA4BxD,SAAgB,+BACd,SACsD;CACtD,MAAM,QAA6B;EACjC,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,UAAU;EACX;CAGD,MAAM,2BAAW,IAAI,KAAqB;CAE1C,MAAM,aAAa,QAAgB,OAAK,KAAK,SAAS,IAAI,MAAM,GAAG,EAAE,EAAE,IAAI;AAE3E,QAAO;EACL;EACA,MAAM,IAAI,KAA8C;AACtD,OAAI;IACF,MAAM,QAAQ,MAAM,GAAG,SAAS,SAAS,UAAU,IAAI,CAAC;AACxD,UAAM;AACN,eAAW,8BAA8B,KAAK,MAAM,MAAM,MAAM,OAAO;AACvE,WAAO;WACD;AACN,UAAM;AACN,aAAS,IAAI,KAAK,YAAY,KAAK,CAAC;AACpC,eACE,+BACA,KACA,MAAM,MACN,MAAM,OACP;AACD;;;EAGJ,MAAM,IAAI,KAAa,OAAkC;GACvD,MAAM,YAAY,SAAS,IAAI,IAAI;AACnC,OAAI,cAAc,KAAA,GAAW;AAC3B,aAAS,OAAO,IAAI;AACpB,UAAM,YAAY,YAAY,KAAK,GAAG;;AAExC,OAAI;IACF,MAAM,OAAO,UAAU,IAAI;AAC3B,UAAM,GAAG,SAAS,MAAM,OAAK,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;IAChE,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,IAAI,GAAG,OAAO,YAAY,EAAE,CAAC,SAAS,MAAM;AAC3E,UAAM,GAAG,SAAS,UAAU,KAAK,MAAM;AACvC,UAAM,GAAG,SAAS,OAAO,KAAK,KAAK;AACnC,UAAM;AACN,eACE,kCACA,KACA,MAAM,QACN,KAAK,MAAM,MAAM,SAAS,CAC3B;YACM,GAAG;AACV,eAAW,qBAAqB,KAAM,GAAa,QAAQ;;;EAGhE;;;;;;AAOH,SAAgB,gBACd,OACqB;CACrB,MAAM,yBAAS,IAAI,KAAyB;AAC5C,QAAO;EACL,MAAM,IAAI,KAA8C;GACtD,MAAM,SAAS,OAAO,IAAI,IAAI,IAAK,MAAM,MAAM,IAAI,IAAI;AACvD,OAAI,OAAQ,QAAO,IAAI,KAAK,OAAO;AACnC,UAAO;;EAET,MAAM,IAAI,KAAa,OAAkC;AACvD,UAAO,IAAI,KAAK,MAAM;AACtB,SAAM,MAAM,IAAI,KAAK,MAAM;;EAE9B;;;;;;;;;;;AAYH,SAAgB,yBAAyB,UAAiC;AACxE,KAAI,QAAQ,IAAI,8BAA8B,IAAK,QAAO;CAC1D,IAAI,MAAM,OAAK,QAAQ,SAAS;AAChC,UAAS;AACP,MAAI,GAAG,WAAW,OAAK,KAAK,KAAK,eAAe,CAAC,CAC/C,QAAO,OAAK,KACV,KACA,gBACA,UACA,UACA,mBACA,QAAQ,KACT;EAEH,MAAM,SAAS,OAAK,QAAQ,IAAI;AAChC,MAAI,WAAW,IAAK,QAAO;AAC3B,QAAM"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ResolvedConfig } from "vite";
|
|
2
|
+
export interface TsconfigResolverOptions {
|
|
3
|
+
workspaceRoot: string;
|
|
4
|
+
include: string[];
|
|
5
|
+
liveReload: boolean;
|
|
6
|
+
hasTailwindCss: boolean;
|
|
7
|
+
isTest: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class TsconfigResolver {
|
|
10
|
+
private options;
|
|
11
|
+
private includeCache;
|
|
12
|
+
private tsconfigOptionsCache;
|
|
13
|
+
private tsconfigGraphRootCache;
|
|
14
|
+
constructor(options: TsconfigResolverOptions);
|
|
15
|
+
invalidateIncludeCache(): void;
|
|
16
|
+
invalidateTsconfigCaches(): void;
|
|
17
|
+
invalidateAll(): void;
|
|
18
|
+
ensureIncludeCache(): string[];
|
|
19
|
+
readAngularTsconfigConfiguration(resolvedTsConfigPath: string, config: ResolvedConfig);
|
|
20
|
+
getCachedTsconfigOptions(resolvedTsConfigPath: string, config: ResolvedConfig): {
|
|
21
|
+
options: any;
|
|
22
|
+
rootNames: string[];
|
|
23
|
+
};
|
|
24
|
+
collectExpandedTsconfigRoots(resolvedTsConfigPath: string, config: ResolvedConfig, visited?): string[];
|
|
25
|
+
private getTsconfigCacheKey;
|
|
26
|
+
private findIncludes;
|
|
27
|
+
}
|
|
28
|
+
export declare function normalizeIncludeGlob(workspaceRoot: string, glob: string): string;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { debugEmit, debugEmitV } from "./debug.js";
|
|
2
|
+
import { existsSync, statSync } from "node:fs";
|
|
3
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
|
+
import * as compilerCli from "@angular/compiler-cli";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import { normalizePath } from "vite";
|
|
7
|
+
import { globSync } from "tinyglobby";
|
|
8
|
+
//#region packages/vite-plugin-angular/src/lib/utils/tsconfig-resolver.ts
|
|
9
|
+
/**
|
|
10
|
+
* Shared tsconfig resolution logic used by both the ngtsc and compilation-api
|
|
11
|
+
* compilation plugins. Encapsulates the caching, include-glob discovery,
|
|
12
|
+
* tsconfig-graph expansion, and path-root resolution that were previously
|
|
13
|
+
* duplicated across angular-vite-plugin.ts and compilation-api-plugin.ts.
|
|
14
|
+
*/
|
|
15
|
+
var ts = createRequire(import.meta.url)("typescript");
|
|
16
|
+
var TsconfigResolver = class {
|
|
17
|
+
includeCache = [];
|
|
18
|
+
tsconfigOptionsCache = /* @__PURE__ */ new Map();
|
|
19
|
+
tsconfigGraphRootCache = /* @__PURE__ */ new Map();
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
}
|
|
23
|
+
invalidateIncludeCache() {
|
|
24
|
+
this.includeCache = [];
|
|
25
|
+
}
|
|
26
|
+
invalidateTsconfigCaches() {
|
|
27
|
+
this.tsconfigOptionsCache.clear();
|
|
28
|
+
this.tsconfigGraphRootCache.clear();
|
|
29
|
+
}
|
|
30
|
+
invalidateAll() {
|
|
31
|
+
this.invalidateIncludeCache();
|
|
32
|
+
this.invalidateTsconfigCaches();
|
|
33
|
+
}
|
|
34
|
+
ensureIncludeCache() {
|
|
35
|
+
if (this.options.include.length > 0 && this.includeCache.length === 0) {
|
|
36
|
+
this.includeCache = this.findIncludes();
|
|
37
|
+
debugEmit("include cache populated", { fileCount: this.includeCache.length });
|
|
38
|
+
}
|
|
39
|
+
return this.includeCache;
|
|
40
|
+
}
|
|
41
|
+
readAngularTsconfigConfiguration(resolvedTsConfigPath, config) {
|
|
42
|
+
const isProd = config.mode === "production";
|
|
43
|
+
return compilerCli.readConfiguration(resolvedTsConfigPath, {
|
|
44
|
+
suppressOutputPathCheck: true,
|
|
45
|
+
outDir: void 0,
|
|
46
|
+
sourceMap: !isProd,
|
|
47
|
+
inlineSourceMap: false,
|
|
48
|
+
inlineSources: !isProd,
|
|
49
|
+
declaration: false,
|
|
50
|
+
declarationMap: false,
|
|
51
|
+
allowEmptyCodegenFiles: false,
|
|
52
|
+
annotationsAs: "decorators",
|
|
53
|
+
enableResourceInlining: false,
|
|
54
|
+
noEmitOnError: false,
|
|
55
|
+
mapRoot: "",
|
|
56
|
+
sourceRoot: "",
|
|
57
|
+
supportTestBed: false,
|
|
58
|
+
supportJitMode: false
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
getCachedTsconfigOptions(resolvedTsConfigPath, config) {
|
|
62
|
+
const tsconfigKey = this.getTsconfigCacheKey(resolvedTsConfigPath, config);
|
|
63
|
+
let cached = this.tsconfigOptionsCache.get(tsconfigKey);
|
|
64
|
+
if (!cached) {
|
|
65
|
+
const read = this.readAngularTsconfigConfiguration(resolvedTsConfigPath, config);
|
|
66
|
+
cached = {
|
|
67
|
+
options: read.options,
|
|
68
|
+
rootNames: read.rootNames
|
|
69
|
+
};
|
|
70
|
+
this.tsconfigOptionsCache.set(tsconfigKey, cached);
|
|
71
|
+
debugEmit("tsconfig root names loaded", {
|
|
72
|
+
resolvedTsConfigPath,
|
|
73
|
+
rootNameCount: read.rootNames.length
|
|
74
|
+
});
|
|
75
|
+
debugEmitV("tsconfig root names", {
|
|
76
|
+
resolvedTsConfigPath,
|
|
77
|
+
rootNames: read.rootNames.map((file) => normalizePath(file))
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return cached;
|
|
81
|
+
}
|
|
82
|
+
collectExpandedTsconfigRoots(resolvedTsConfigPath, config, visited = /* @__PURE__ */ new Set()) {
|
|
83
|
+
const normalizedTsConfigPath = normalizePath(resolvedTsConfigPath);
|
|
84
|
+
if (visited.has(normalizedTsConfigPath)) return [];
|
|
85
|
+
const tsconfigKey = `${this.getTsconfigCacheKey(normalizedTsConfigPath, config)}|graph`;
|
|
86
|
+
const cached = this.tsconfigGraphRootCache.get(tsconfigKey);
|
|
87
|
+
if (cached) return cached;
|
|
88
|
+
visited.add(normalizedTsConfigPath);
|
|
89
|
+
const read = this.readAngularTsconfigConfiguration(normalizedTsConfigPath, config);
|
|
90
|
+
const rawTsconfig = ts.readConfigFile(normalizedTsConfigPath, ts.sys.readFile).config ?? {};
|
|
91
|
+
const expandedRoots = new Set(read.rootNames.map((file) => normalizePath(file)));
|
|
92
|
+
const pathRoots = collectTsconfigPathRoots(normalizedTsConfigPath, read.options, rawTsconfig);
|
|
93
|
+
for (const pathRoot of pathRoots) expandedRoots.add(pathRoot);
|
|
94
|
+
const referenceConfigs = (rawTsconfig.references ?? []).flatMap((reference) => typeof reference.path === "string" ? [resolveReferenceTsconfigPath(reference.path, normalizedTsConfigPath)] : []).filter((reference) => !!reference);
|
|
95
|
+
for (const referenceConfig of referenceConfigs) for (const referenceRoot of this.collectExpandedTsconfigRoots(referenceConfig, config, visited)) expandedRoots.add(referenceRoot);
|
|
96
|
+
const expandedRootList = [...expandedRoots];
|
|
97
|
+
this.tsconfigGraphRootCache.set(tsconfigKey, expandedRootList);
|
|
98
|
+
debugEmit("expanded tsconfig graph roots", {
|
|
99
|
+
resolvedTsConfigPath: normalizedTsConfigPath,
|
|
100
|
+
directRootNameCount: read.rootNames.length,
|
|
101
|
+
pathRootCount: pathRoots.length,
|
|
102
|
+
referenceConfigCount: referenceConfigs.length,
|
|
103
|
+
expandedRootCount: expandedRootList.length
|
|
104
|
+
});
|
|
105
|
+
debugEmitV("expanded tsconfig graph root files", {
|
|
106
|
+
resolvedTsConfigPath: normalizedTsConfigPath,
|
|
107
|
+
pathRoots,
|
|
108
|
+
referenceConfigs,
|
|
109
|
+
rootNames: expandedRootList
|
|
110
|
+
});
|
|
111
|
+
return expandedRootList;
|
|
112
|
+
}
|
|
113
|
+
getTsconfigCacheKey(resolvedTsConfigPath, config) {
|
|
114
|
+
return [
|
|
115
|
+
resolvedTsConfigPath,
|
|
116
|
+
config.mode === "production" ? "prod" : "dev",
|
|
117
|
+
this.options.isTest ? "test" : "app",
|
|
118
|
+
config.build?.lib ? "lib" : "nolib",
|
|
119
|
+
this.options.liveReload ? "live-reload" : "no-live-reload",
|
|
120
|
+
this.options.hasTailwindCss ? "tw" : "notw"
|
|
121
|
+
].join("|");
|
|
122
|
+
}
|
|
123
|
+
findIncludes() {
|
|
124
|
+
const globs = this.options.include.map((glob) => normalizeIncludeGlob(this.options.workspaceRoot, glob));
|
|
125
|
+
const files = globSync(globs, {
|
|
126
|
+
dot: true,
|
|
127
|
+
absolute: true
|
|
128
|
+
});
|
|
129
|
+
debugEmit("include discovery", {
|
|
130
|
+
patternCount: globs.length,
|
|
131
|
+
fileCount: files.length
|
|
132
|
+
});
|
|
133
|
+
debugEmitV("include discovery files", {
|
|
134
|
+
globs,
|
|
135
|
+
files: files.map((file) => normalizePath(file))
|
|
136
|
+
});
|
|
137
|
+
return files;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
function normalizeIncludeGlob(workspaceRoot, glob) {
|
|
141
|
+
const normalizedWorkspaceRoot = normalizePath(resolve(workspaceRoot));
|
|
142
|
+
const normalizedGlob = normalizePath(glob);
|
|
143
|
+
if (normalizedGlob === normalizedWorkspaceRoot || normalizedGlob.startsWith(`${normalizedWorkspaceRoot}/`)) return normalizedGlob;
|
|
144
|
+
if (normalizedGlob.startsWith("/")) return `${normalizedWorkspaceRoot}${normalizedGlob}`;
|
|
145
|
+
return normalizePath(resolve(normalizedWorkspaceRoot, normalizedGlob));
|
|
146
|
+
}
|
|
147
|
+
function resolveReferenceTsconfigPath(referencePath, ownerTsconfigPath) {
|
|
148
|
+
const ownerDir = dirname(ownerTsconfigPath);
|
|
149
|
+
const resolvedReference = normalizePath(isAbsolute(referencePath) ? referencePath : resolve(ownerDir, referencePath));
|
|
150
|
+
if (existsSync(resolvedReference)) {
|
|
151
|
+
try {
|
|
152
|
+
if (statSync(resolvedReference).isDirectory()) {
|
|
153
|
+
const nestedTsconfig = join(resolvedReference, "tsconfig.json");
|
|
154
|
+
return existsSync(nestedTsconfig) ? normalizePath(nestedTsconfig) : void 0;
|
|
155
|
+
}
|
|
156
|
+
} catch {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
return resolvedReference;
|
|
160
|
+
}
|
|
161
|
+
if (!resolvedReference.endsWith(".json")) {
|
|
162
|
+
const asJson = `${resolvedReference}.json`;
|
|
163
|
+
if (existsSync(asJson)) return normalizePath(asJson);
|
|
164
|
+
const nestedTsconfig = join(resolvedReference, "tsconfig.json");
|
|
165
|
+
if (existsSync(nestedTsconfig)) return normalizePath(nestedTsconfig);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function collectTsconfigPathRoots(resolvedTsConfigPath, options, rawTsconfig) {
|
|
169
|
+
const tsPaths = rawTsconfig.compilerOptions?.paths ?? options.paths;
|
|
170
|
+
if (!tsPaths) return [];
|
|
171
|
+
const tsconfigDir = dirname(resolvedTsConfigPath);
|
|
172
|
+
const configuredBaseUrl = typeof options.baseUrl === "string" ? options.baseUrl : typeof rawTsconfig.compilerOptions?.baseUrl === "string" ? rawTsconfig.compilerOptions.baseUrl : void 0;
|
|
173
|
+
const resolvedBaseUrl = configuredBaseUrl ? isAbsolute(configuredBaseUrl) ? configuredBaseUrl : resolve(tsconfigDir, configuredBaseUrl) : tsconfigDir;
|
|
174
|
+
const discoveredRoots = /* @__PURE__ */ new Set();
|
|
175
|
+
for (const targets of Object.values(tsPaths)) for (const target of targets) {
|
|
176
|
+
const resolvedTarget = normalizePath(isAbsolute(target) ? target : resolve(resolvedBaseUrl, target));
|
|
177
|
+
if (target.includes("*")) {
|
|
178
|
+
for (const match of globSync(resolvedTarget, {
|
|
179
|
+
dot: true,
|
|
180
|
+
absolute: true
|
|
181
|
+
})) discoveredRoots.add(normalizePath(match));
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (existsSync(resolvedTarget)) discoveredRoots.add(resolvedTarget);
|
|
185
|
+
}
|
|
186
|
+
return [...discoveredRoots];
|
|
187
|
+
}
|
|
188
|
+
//#endregion
|
|
189
|
+
export { TsconfigResolver };
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=tsconfig-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsconfig-resolver.js","names":[],"sources":["../../../../src/lib/utils/tsconfig-resolver.ts"],"sourcesContent":["/**\n * Shared tsconfig resolution logic used by both the ngtsc and compilation-api\n * compilation plugins. Encapsulates the caching, include-glob discovery,\n * tsconfig-graph expansion, and path-root resolution that were previously\n * duplicated across angular-vite-plugin.ts and compilation-api-plugin.ts.\n */\n\nimport * as compilerCli from '@angular/compiler-cli';\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\nimport { createRequire } from 'node:module';\nimport { normalizePath, ResolvedConfig } from 'vite';\nimport { globSync } from 'tinyglobby';\nimport { debugEmit, debugEmitV } from './debug.js';\n\nconst require = createRequire(import.meta.url);\nconst ts = require('typescript');\n\nexport interface TsconfigResolverOptions {\n workspaceRoot: string;\n include: string[];\n liveReload: boolean;\n hasTailwindCss: boolean;\n isTest: boolean;\n}\n\nexport class TsconfigResolver {\n private includeCache: string[] = [];\n private tsconfigOptionsCache = new Map<\n string,\n { options: any; rootNames: string[] }\n >();\n private tsconfigGraphRootCache = new Map<string, string[]>();\n\n constructor(private options: TsconfigResolverOptions) {}\n\n invalidateIncludeCache(): void {\n this.includeCache = [];\n }\n\n invalidateTsconfigCaches(): void {\n this.tsconfigOptionsCache.clear();\n this.tsconfigGraphRootCache.clear();\n }\n\n invalidateAll(): void {\n this.invalidateIncludeCache();\n this.invalidateTsconfigCaches();\n }\n\n ensureIncludeCache(): string[] {\n if (this.options.include.length > 0 && this.includeCache.length === 0) {\n this.includeCache = this.findIncludes();\n debugEmit('include cache populated', {\n fileCount: this.includeCache.length,\n });\n }\n return this.includeCache;\n }\n\n readAngularTsconfigConfiguration(\n resolvedTsConfigPath: string,\n config: ResolvedConfig,\n ) {\n const isProd = config.mode === 'production';\n return compilerCli.readConfiguration(resolvedTsConfigPath, {\n suppressOutputPathCheck: true,\n outDir: undefined,\n sourceMap: !isProd,\n inlineSourceMap: false,\n inlineSources: !isProd,\n declaration: false,\n declarationMap: false,\n allowEmptyCodegenFiles: false,\n annotationsAs: 'decorators',\n enableResourceInlining: false,\n noEmitOnError: false,\n mapRoot: '',\n sourceRoot: '',\n supportTestBed: false,\n supportJitMode: false,\n });\n }\n\n getCachedTsconfigOptions(\n resolvedTsConfigPath: string,\n config: ResolvedConfig,\n ): { options: any; rootNames: string[] } {\n const tsconfigKey = this.getTsconfigCacheKey(resolvedTsConfigPath, config);\n let cached = this.tsconfigOptionsCache.get(tsconfigKey);\n\n if (!cached) {\n const read = this.readAngularTsconfigConfiguration(\n resolvedTsConfigPath,\n config,\n );\n cached = { options: read.options, rootNames: read.rootNames };\n this.tsconfigOptionsCache.set(tsconfigKey, cached);\n debugEmit('tsconfig root names loaded', {\n resolvedTsConfigPath,\n rootNameCount: read.rootNames.length,\n });\n debugEmitV('tsconfig root names', {\n resolvedTsConfigPath,\n rootNames: read.rootNames.map((file: string) => normalizePath(file)),\n });\n }\n\n return cached;\n }\n\n collectExpandedTsconfigRoots(\n resolvedTsConfigPath: string,\n config: ResolvedConfig,\n visited = new Set<string>(),\n ): string[] {\n const normalizedTsConfigPath = normalizePath(resolvedTsConfigPath);\n if (visited.has(normalizedTsConfigPath)) {\n return [];\n }\n\n const tsconfigKey = `${this.getTsconfigCacheKey(normalizedTsConfigPath, config)}|graph`;\n const cached = this.tsconfigGraphRootCache.get(tsconfigKey);\n if (cached) {\n return cached;\n }\n\n visited.add(normalizedTsConfigPath);\n\n const read = this.readAngularTsconfigConfiguration(\n normalizedTsConfigPath,\n config,\n );\n const rawTsconfig = (ts.readConfigFile(\n normalizedTsConfigPath,\n ts.sys.readFile,\n ).config ?? {}) as {\n compilerOptions?: {\n baseUrl?: unknown;\n paths?: Record<string, string[]>;\n };\n references?: Array<{ path?: unknown }>;\n };\n\n const expandedRoots = new Set(\n read.rootNames.map((file: string) => normalizePath(file)),\n );\n const pathRoots = collectTsconfigPathRoots(\n normalizedTsConfigPath,\n read.options,\n rawTsconfig,\n );\n for (const pathRoot of pathRoots) {\n expandedRoots.add(pathRoot);\n }\n\n const referenceConfigs = (rawTsconfig.references ?? [])\n .flatMap((reference) =>\n typeof reference.path === 'string'\n ? [\n resolveReferenceTsconfigPath(\n reference.path,\n normalizedTsConfigPath,\n ),\n ]\n : [],\n )\n .filter((reference): reference is string => !!reference);\n\n for (const referenceConfig of referenceConfigs) {\n for (const referenceRoot of this.collectExpandedTsconfigRoots(\n referenceConfig,\n config,\n visited,\n )) {\n expandedRoots.add(referenceRoot);\n }\n }\n\n const expandedRootList = [...expandedRoots];\n this.tsconfigGraphRootCache.set(tsconfigKey, expandedRootList);\n debugEmit('expanded tsconfig graph roots', {\n resolvedTsConfigPath: normalizedTsConfigPath,\n directRootNameCount: read.rootNames.length,\n pathRootCount: pathRoots.length,\n referenceConfigCount: referenceConfigs.length,\n expandedRootCount: expandedRootList.length,\n });\n debugEmitV('expanded tsconfig graph root files', {\n resolvedTsConfigPath: normalizedTsConfigPath,\n pathRoots,\n referenceConfigs,\n rootNames: expandedRootList,\n });\n\n return expandedRootList;\n }\n\n private getTsconfigCacheKey(\n resolvedTsConfigPath: string,\n config: ResolvedConfig,\n ): string {\n const isProd = config.mode === 'production';\n return [\n resolvedTsConfigPath,\n isProd ? 'prod' : 'dev',\n this.options.isTest ? 'test' : 'app',\n config.build?.lib ? 'lib' : 'nolib',\n this.options.liveReload ? 'live-reload' : 'no-live-reload',\n this.options.hasTailwindCss ? 'tw' : 'notw',\n ].join('|');\n }\n\n private findIncludes(): string[] {\n const globs = this.options.include.map((glob) =>\n normalizeIncludeGlob(this.options.workspaceRoot, glob),\n );\n const files = globSync(globs, { dot: true, absolute: true });\n debugEmit('include discovery', {\n patternCount: globs.length,\n fileCount: files.length,\n });\n debugEmitV('include discovery files', {\n globs,\n files: files.map((file) => normalizePath(file)),\n });\n return files;\n }\n}\n\nexport function normalizeIncludeGlob(\n workspaceRoot: string,\n glob: string,\n): string {\n const normalizedWorkspaceRoot = normalizePath(resolve(workspaceRoot));\n const normalizedGlob = normalizePath(glob);\n\n if (\n normalizedGlob === normalizedWorkspaceRoot ||\n normalizedGlob.startsWith(`${normalizedWorkspaceRoot}/`)\n ) {\n return normalizedGlob;\n }\n\n if (normalizedGlob.startsWith('/')) {\n return `${normalizedWorkspaceRoot}${normalizedGlob}`;\n }\n\n return normalizePath(resolve(normalizedWorkspaceRoot, normalizedGlob));\n}\n\nfunction resolveReferenceTsconfigPath(\n referencePath: string,\n ownerTsconfigPath: string,\n): string | undefined {\n const ownerDir = dirname(ownerTsconfigPath);\n const resolvedReference = normalizePath(\n isAbsolute(referencePath)\n ? referencePath\n : resolve(ownerDir, referencePath),\n );\n\n if (existsSync(resolvedReference)) {\n try {\n if (statSync(resolvedReference).isDirectory()) {\n const nestedTsconfig = join(resolvedReference, 'tsconfig.json');\n return existsSync(nestedTsconfig)\n ? normalizePath(nestedTsconfig)\n : undefined;\n }\n } catch {\n return undefined;\n }\n return resolvedReference;\n }\n\n if (!resolvedReference.endsWith('.json')) {\n const asJson = `${resolvedReference}.json`;\n if (existsSync(asJson)) {\n return normalizePath(asJson);\n }\n const nestedTsconfig = join(resolvedReference, 'tsconfig.json');\n if (existsSync(nestedTsconfig)) {\n return normalizePath(nestedTsconfig);\n }\n }\n\n return undefined;\n}\n\nfunction collectTsconfigPathRoots(\n resolvedTsConfigPath: string,\n options: any,\n rawTsconfig: {\n compilerOptions?: {\n baseUrl?: unknown;\n paths?: Record<string, string[]>;\n };\n },\n): string[] {\n const tsPaths = rawTsconfig.compilerOptions?.paths ?? options.paths;\n if (!tsPaths) {\n return [];\n }\n\n const tsconfigDir = dirname(resolvedTsConfigPath);\n const configuredBaseUrl =\n typeof options.baseUrl === 'string'\n ? options.baseUrl\n : typeof rawTsconfig.compilerOptions?.baseUrl === 'string'\n ? rawTsconfig.compilerOptions.baseUrl\n : undefined;\n const resolvedBaseUrl = configuredBaseUrl\n ? isAbsolute(configuredBaseUrl)\n ? configuredBaseUrl\n : resolve(tsconfigDir, configuredBaseUrl)\n : tsconfigDir;\n const discoveredRoots = new Set<string>();\n\n for (const targets of Object.values(tsPaths)) {\n for (const target of targets as string[]) {\n const resolvedTarget = normalizePath(\n isAbsolute(target) ? target : resolve(resolvedBaseUrl, target),\n );\n\n if (target.includes('*')) {\n for (const match of globSync(resolvedTarget, {\n dot: true,\n absolute: true,\n })) {\n discoveredRoots.add(normalizePath(match));\n }\n continue;\n }\n\n if (existsSync(resolvedTarget)) {\n discoveredRoots.add(resolvedTarget);\n }\n }\n }\n\n return [...discoveredRoots];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const VIRTUAL_RAW_PREFIX = "virtual:@analogjs/vite-plugin-angular:raw:";
|
|
2
|
+
export declare function toVirtualRawId(absPath: string): string;
|
|
3
|
+
export declare function isVirtualRawId(id: string): boolean;
|
|
4
|
+
export declare function fromVirtualRawId(id: string): string;
|