@analogjs/vite-plugin-angular 3.0.0-alpha.92 → 3.0.0-alpha.93

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.
Files changed (34) hide show
  1. package/README.md +16 -1
  2. package/package.json +1 -1
  3. package/src/lib/angular-vite-plugin.d.ts +1 -1
  4. package/src/lib/angular-vite-plugin.js +35 -18
  5. package/src/lib/angular-vite-plugin.js.map +1 -1
  6. package/src/lib/compilation-api/compilation-api-plugin.js +52 -34
  7. package/src/lib/compilation-api/compilation-api-plugin.js.map +1 -1
  8. package/src/lib/compiler/angular-version.d.ts +2 -0
  9. package/src/lib/compiler/angular-version.js +2 -1
  10. package/src/lib/compiler/angular-version.js.map +1 -1
  11. package/src/lib/compiler/defer.js +2 -0
  12. package/src/lib/compiler/defer.js.map +1 -1
  13. package/src/lib/compiler/js-emitter.js +15 -1
  14. package/src/lib/compiler/js-emitter.js.map +1 -1
  15. package/src/lib/compiler-plugin.js +18 -12
  16. package/src/lib/compiler-plugin.js.map +1 -1
  17. package/src/lib/fast-compile-plugin.js +0 -2
  18. package/src/lib/fast-compile-plugin.js.map +1 -1
  19. package/src/lib/host.d.ts +1 -0
  20. package/src/lib/host.js +19 -1
  21. package/src/lib/host.js.map +1 -1
  22. package/src/lib/hot-update-batch.d.ts +5 -0
  23. package/src/lib/hot-update-batch.js +176 -0
  24. package/src/lib/hot-update-batch.js.map +1 -0
  25. package/src/lib/router-plugin.js +6 -3
  26. package/src/lib/router-plugin.js.map +1 -1
  27. package/src/lib/utils/compilation-shared.d.ts +1 -0
  28. package/src/lib/utils/compilation-shared.js +15 -1
  29. package/src/lib/utils/compilation-shared.js.map +1 -1
  30. package/src/lib/utils/devkit.js +4 -1
  31. package/src/lib/utils/devkit.js.map +1 -1
  32. package/src/lib/utils/plugin-config.d.ts +1 -0
  33. package/src/lib/utils/plugin-config.js +2 -1
  34. package/src/lib/utils/plugin-config.js.map +1 -1
@@ -0,0 +1,176 @@
1
+ import { normalizePath } from "vite";
2
+ //#region packages/vite-plugin-angular/src/lib/hot-update-batch.ts
3
+ var HOT_UPDATE_DEBOUNCE_MS = 100;
4
+ function createHotUpdateBatcher(compile) {
5
+ let scheduledBatch;
6
+ let compileTimer;
7
+ const pendingCompilations = /* @__PURE__ */ new Set();
8
+ const notifications = createHotUpdateNotifications(() => pendingCompilations.size > 0);
9
+ async function run(batch) {
10
+ scheduledBatch = void 0;
11
+ compileTimer = void 0;
12
+ try {
13
+ await compile([...batch.ids]);
14
+ batch.resolve();
15
+ } catch (error) {
16
+ batch.reject(error);
17
+ } finally {
18
+ pendingCompilations.delete(batch.promise);
19
+ notifications.queueFlush();
20
+ }
21
+ }
22
+ return {
23
+ schedule(file, ids) {
24
+ notifications.track(file);
25
+ if (!scheduledBatch) {
26
+ let resolve;
27
+ let reject;
28
+ const promise = new Promise((res, rej) => {
29
+ resolve = res;
30
+ reject = rej;
31
+ });
32
+ scheduledBatch = {
33
+ ids: /* @__PURE__ */ new Set(),
34
+ promise,
35
+ resolve,
36
+ reject
37
+ };
38
+ pendingCompilations.add(promise);
39
+ }
40
+ const batch = scheduledBatch;
41
+ for (const id of ids) batch.ids.add(id);
42
+ clearTimeout(compileTimer);
43
+ compileTimer = setTimeout(() => run(batch), HOT_UPDATE_DEBOUNCE_MS);
44
+ return batch.promise;
45
+ },
46
+ async wait() {
47
+ while (pendingCompilations.size) await Promise.all(pendingCompilations);
48
+ },
49
+ configureServer: notifications.configureServer,
50
+ close() {
51
+ clearTimeout(compileTimer);
52
+ compileTimer = void 0;
53
+ if (scheduledBatch) {
54
+ pendingCompilations.delete(scheduledBatch.promise);
55
+ scheduledBatch.reject(/* @__PURE__ */ new Error("Angular hot update cancelled: server closed"));
56
+ scheduledBatch = void 0;
57
+ }
58
+ notifications.close();
59
+ }
60
+ };
61
+ }
62
+ function createHotUpdateNotifications(hasPendingCompilations) {
63
+ const changedFiles = /* @__PURE__ */ new Set();
64
+ const reloads = /* @__PURE__ */ new Map();
65
+ const components = /* @__PURE__ */ new Map();
66
+ const updates = /* @__PURE__ */ new Map();
67
+ const restoreChannels = [];
68
+ let sendUpdates;
69
+ let notificationTimer;
70
+ let sending = false;
71
+ let closed = false;
72
+ function clear() {
73
+ reloads.clear();
74
+ components.clear();
75
+ updates.clear();
76
+ sendUpdates = void 0;
77
+ }
78
+ function buffer(payload, send) {
79
+ switch (payload.type) {
80
+ case "full-reload":
81
+ if (!payload.triggeredBy || !changedFiles.has(normalizePath(payload.triggeredBy))) return false;
82
+ reloads.set(payload.path ?? "*", {
83
+ payload,
84
+ send
85
+ });
86
+ return true;
87
+ case "update":
88
+ sendUpdates = send;
89
+ for (const update of payload.updates) {
90
+ const key = `${update.type}:${update.path}:${update.acceptedPath}`;
91
+ const previous = updates.get(key);
92
+ if (!previous || update.timestamp >= previous.timestamp) updates.set(key, update);
93
+ }
94
+ return true;
95
+ case "custom":
96
+ if (payload.event !== "angular:component-update") return false;
97
+ components.set(payload.data.id, {
98
+ payload,
99
+ send
100
+ });
101
+ return true;
102
+ default: return false;
103
+ }
104
+ }
105
+ function flush() {
106
+ notificationTimer = void 0;
107
+ if (hasPendingCompilations()) return;
108
+ changedFiles.clear();
109
+ sending = true;
110
+ try {
111
+ const reload = reloads.get("*");
112
+ if (reload) {
113
+ reload.send(reload.payload);
114
+ return;
115
+ }
116
+ for (const { payload, send } of reloads.values()) send(payload);
117
+ for (const { payload, send } of components.values()) send(payload);
118
+ if (sendUpdates && updates.size) sendUpdates({
119
+ type: "update",
120
+ updates: [...updates.values()]
121
+ });
122
+ } finally {
123
+ sending = false;
124
+ clear();
125
+ }
126
+ }
127
+ function queueFlush() {
128
+ if (closed) return;
129
+ clearTimeout(notificationTimer);
130
+ notificationTimer = setTimeout(flush, 0);
131
+ }
132
+ return {
133
+ track(file) {
134
+ changedFiles.add(normalizePath(file));
135
+ },
136
+ queueFlush,
137
+ configureServer(server) {
138
+ closed = false;
139
+ const channels = new Set([server.ws, server.environments?.client.hot]);
140
+ for (const channel of channels) {
141
+ if (!channel) continue;
142
+ const original = channel.send;
143
+ const send = original.bind(channel);
144
+ const wrapped = (payload, data) => {
145
+ const message = typeof payload === "string" ? {
146
+ type: "custom",
147
+ event: payload,
148
+ data
149
+ } : payload;
150
+ if (!sending && changedFiles.size > 0 && buffer(message, send)) {
151
+ queueFlush();
152
+ return;
153
+ }
154
+ if (message.type === "error") clear();
155
+ send(message);
156
+ };
157
+ channel.send = wrapped;
158
+ restoreChannels.push(() => {
159
+ if (channel.send === wrapped) channel.send = original;
160
+ });
161
+ }
162
+ },
163
+ close() {
164
+ closed = true;
165
+ clearTimeout(notificationTimer);
166
+ notificationTimer = void 0;
167
+ changedFiles.clear();
168
+ clear();
169
+ for (const restore of restoreChannels.splice(0)) restore();
170
+ }
171
+ };
172
+ }
173
+ //#endregion
174
+ export { createHotUpdateBatcher };
175
+
176
+ //# sourceMappingURL=hot-update-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-update-batch.js","names":[],"sources":["../../../src/lib/hot-update-batch.ts"],"sourcesContent":["import {\n normalizePath,\n type HMRPayload,\n type Update,\n type ViteDevServer,\n} from 'vite';\n\nconst HOT_UPDATE_DEBOUNCE_MS = 100;\n\ntype Batch = {\n ids: Set<string>;\n promise: Promise<void>;\n resolve: () => void;\n reject: (error: unknown) => void;\n};\n\ntype Notification = {\n payload: HMRPayload;\n send: (payload: HMRPayload) => void;\n};\n\nexport function createHotUpdateBatcher(\n compile: (ids: string[]) => Promise<void>,\n) {\n let scheduledBatch: Batch | undefined;\n let compileTimer: ReturnType<typeof setTimeout> | undefined;\n const pendingCompilations = new Set<Promise<void>>();\n const notifications = createHotUpdateNotifications(\n () => pendingCompilations.size > 0,\n );\n\n async function run(batch: Batch) {\n scheduledBatch = undefined;\n compileTimer = undefined;\n try {\n await compile([...batch.ids]);\n batch.resolve();\n } catch (error) {\n batch.reject(error);\n } finally {\n pendingCompilations.delete(batch.promise);\n notifications.queueFlush();\n }\n }\n\n return {\n schedule(file: string, ids: string[]) {\n notifications.track(file);\n if (!scheduledBatch) {\n let resolve!: () => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n scheduledBatch = { ids: new Set(), promise, resolve, reject };\n pendingCompilations.add(promise);\n }\n const batch = scheduledBatch;\n for (const id of ids) batch.ids.add(id);\n clearTimeout(compileTimer);\n compileTimer = setTimeout(() => run(batch), HOT_UPDATE_DEBOUNCE_MS);\n return batch.promise;\n },\n async wait() {\n while (pendingCompilations.size) await Promise.all(pendingCompilations);\n },\n configureServer: notifications.configureServer,\n close() {\n clearTimeout(compileTimer);\n compileTimer = undefined;\n if (scheduledBatch) {\n pendingCompilations.delete(scheduledBatch.promise);\n scheduledBatch.reject(\n new Error('Angular hot update cancelled: server closed'),\n );\n scheduledBatch = undefined;\n }\n notifications.close();\n },\n };\n}\n\nfunction createHotUpdateNotifications(hasPendingCompilations: () => boolean) {\n const changedFiles = new Set<string>();\n const reloads = new Map<string, Notification>();\n const components = new Map<string, Notification>();\n const updates = new Map<string, Update>();\n const restoreChannels: (() => void)[] = [];\n let sendUpdates: Notification['send'] | undefined;\n let notificationTimer: ReturnType<typeof setTimeout> | undefined;\n let sending = false;\n let closed = false;\n\n function clear() {\n reloads.clear();\n components.clear();\n updates.clear();\n sendUpdates = undefined;\n }\n\n function buffer(payload: HMRPayload, send: Notification['send']) {\n switch (payload.type) {\n case 'full-reload':\n if (\n !payload.triggeredBy ||\n !changedFiles.has(normalizePath(payload.triggeredBy))\n ) {\n return false;\n }\n reloads.set(payload.path ?? '*', { payload, send });\n return true;\n case 'update':\n sendUpdates = send;\n for (const update of payload.updates) {\n const key = `${update.type}:${update.path}:${update.acceptedPath}`;\n const previous = updates.get(key);\n if (!previous || update.timestamp >= previous.timestamp) {\n updates.set(key, update);\n }\n }\n return true;\n case 'custom':\n if (payload.event !== 'angular:component-update') return false;\n components.set(payload.data.id, { payload, send });\n return true;\n default:\n return false;\n }\n }\n\n function flush() {\n notificationTimer = undefined;\n if (hasPendingCompilations()) return;\n changedFiles.clear();\n\n // A client channel can forward through server.ws; don't capture our flush again.\n sending = true;\n try {\n const reload = reloads.get('*');\n if (reload) {\n reload.send(reload.payload);\n return;\n }\n for (const { payload, send } of reloads.values()) send(payload);\n for (const { payload, send } of components.values()) send(payload);\n if (sendUpdates && updates.size) {\n sendUpdates({ type: 'update', updates: [...updates.values()] });\n }\n } finally {\n sending = false;\n clear();\n }\n }\n\n function queueFlush() {\n if (closed) return;\n clearTimeout(notificationTimer);\n // Vite propagates updates after the hot-update promises settle.\n notificationTimer = setTimeout(flush, 0);\n }\n\n return {\n track(file: string) {\n changedFiles.add(normalizePath(file));\n },\n queueFlush,\n configureServer(server: ViteDevServer) {\n closed = false;\n // Vite 6 can use a separate client channel; newer Vite shares server.ws.\n const channels = new Set([server.ws, server.environments?.client.hot]);\n for (const channel of channels) {\n if (!channel) continue;\n const original = channel.send;\n const send = original.bind(channel);\n const wrapped: typeof original = (\n payload: HMRPayload | string,\n data?: unknown,\n ) => {\n const message: HMRPayload =\n typeof payload === 'string'\n ? { type: 'custom', event: payload, data }\n : payload;\n if (!sending && changedFiles.size > 0 && buffer(message, send)) {\n queueFlush();\n return;\n }\n if (message.type === 'error') clear();\n send(message);\n };\n channel.send = wrapped;\n restoreChannels.push(() => {\n if (channel.send === wrapped) channel.send = original;\n });\n }\n },\n close() {\n closed = true;\n clearTimeout(notificationTimer);\n notificationTimer = undefined;\n changedFiles.clear();\n clear();\n for (const restore of restoreChannels.splice(0)) restore();\n },\n };\n}\n"],"mappings":"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"}
@@ -10,7 +10,10 @@ function routerPlugin() {
10
10
  }
11
11
  };
12
12
  const persistentDir = resolveTransformCacheDir(process.cwd());
13
- const javascriptTransformer = new JavaScriptTransformer({ jit: true }, 1, persistentDir ? withMemoryLayer(createPersistentTransformCache(persistentDir)) : memoryOnly);
13
+ let javascriptTransformer;
14
+ function getTransformer() {
15
+ return javascriptTransformer ??= new JavaScriptTransformer({ jit: true }, 1, persistentDir ? withMemoryLayer(createPersistentTransformCache(persistentDir)) : memoryOnly);
16
+ }
14
17
  /**
15
18
  * Transforms Angular packages the didn't get picked up by Vite's pre-optimization.
16
19
  */
@@ -19,13 +22,13 @@ function routerPlugin() {
19
22
  enforce: "pre",
20
23
  apply: "serve",
21
24
  buildEnd() {
22
- return javascriptTransformer.close();
25
+ return javascriptTransformer?.close();
23
26
  },
24
27
  transform: {
25
28
  filter: { id: /fesm(.*?)\.mjs/ },
26
29
  async handler(_code, id) {
27
30
  const path = id.split("?")[0];
28
- const contents = await javascriptTransformer.transformFile(path);
31
+ const contents = await getTransformer().transformFile(path);
29
32
  return { code: Buffer.from(contents).toString("utf-8") };
30
33
  }
31
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router-plugin.js","names":[],"sources":["../../../src/lib/router-plugin.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport { JavaScriptTransformer } from './utils/devkit.js';\nimport {\n createPersistentTransformCache,\n resolveTransformCacheDir,\n withMemoryLayer,\n type TransformCacheStore,\n} from './utils/transform-cache.js';\n\nexport function routerPlugin(): Plugin {\n const memoryCache = new Map<string, Uint8Array>();\n const memoryOnly: TransformCacheStore = {\n get: (key: string) => memoryCache.get(key),\n put: (key: string, value: Uint8Array) => {\n memoryCache.set(key, value);\n },\n };\n const persistentDir = resolveTransformCacheDir(process.cwd());\n const javascriptTransformer = new JavaScriptTransformer(\n { jit: true },\n 1,\n persistentDir\n ? withMemoryLayer(createPersistentTransformCache(persistentDir))\n : memoryOnly,\n );\n\n /**\n * Transforms Angular packages the didn't get picked up by Vite's pre-optimization.\n */\n return {\n name: 'analogjs-router-optimization',\n enforce: 'pre',\n apply: 'serve',\n buildEnd() {\n return javascriptTransformer.close();\n },\n transform: {\n filter: {\n id: /fesm(.*?)\\.mjs/,\n },\n async handler(_code: string, id: string) {\n const path = id.split('?')[0];\n const contents = await javascriptTransformer.transformFile(path);\n\n return {\n code: Buffer.from(contents).toString('utf-8'),\n };\n },\n },\n };\n}\n"],"mappings":";;;AASA,SAAgB,eAAuB;CACrC,MAAM,8BAAc,IAAI,KAAyB;CACjD,MAAM,aAAkC;EACtC,MAAM,QAAgB,YAAY,IAAI,IAAI;EAC1C,MAAM,KAAa,UAAsB;AACvC,eAAY,IAAI,KAAK,MAAM;;EAE9B;CACD,MAAM,gBAAgB,yBAAyB,QAAQ,KAAK,CAAC;CAC7D,MAAM,wBAAwB,IAAI,sBAChC,EAAE,KAAK,MAAM,EACb,GACA,gBACI,gBAAgB,+BAA+B,cAAc,CAAC,GAC9D,WACL;;;;AAKD,QAAO;EACL,MAAM;EACN,SAAS;EACT,OAAO;EACP,WAAW;AACT,UAAO,sBAAsB,OAAO;;EAEtC,WAAW;GACT,QAAQ,EACN,IAAI,kBACL;GACD,MAAM,QAAQ,OAAe,IAAY;IACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;IAC3B,MAAM,WAAW,MAAM,sBAAsB,cAAc,KAAK;AAEhE,WAAO,EACL,MAAM,OAAO,KAAK,SAAS,CAAC,SAAS,QAAQ,EAC9C;;GAEJ;EACF"}
1
+ {"version":3,"file":"router-plugin.js","names":[],"sources":["../../../src/lib/router-plugin.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport { JavaScriptTransformer } from './utils/devkit.js';\nimport {\n createPersistentTransformCache,\n resolveTransformCacheDir,\n withMemoryLayer,\n type TransformCacheStore,\n} from './utils/transform-cache.js';\n\nexport function routerPlugin(): Plugin {\n const memoryCache = new Map<string, Uint8Array>();\n const memoryOnly: TransformCacheStore = {\n get: (key: string) => memoryCache.get(key),\n put: (key: string, value: Uint8Array) => {\n memoryCache.set(key, value);\n },\n };\n const persistentDir = resolveTransformCacheDir(process.cwd());\n let javascriptTransformer: InstanceType<typeof JavaScriptTransformer>;\n function getTransformer() {\n return (javascriptTransformer ??= new JavaScriptTransformer(\n { jit: true },\n 1,\n persistentDir\n ? withMemoryLayer(createPersistentTransformCache(persistentDir))\n : memoryOnly,\n ));\n }\n\n /**\n * Transforms Angular packages the didn't get picked up by Vite's pre-optimization.\n */\n return {\n name: 'analogjs-router-optimization',\n enforce: 'pre',\n apply: 'serve',\n buildEnd() {\n return javascriptTransformer?.close();\n },\n transform: {\n filter: {\n id: /fesm(.*?)\\.mjs/,\n },\n async handler(_code: string, id: string) {\n const path = id.split('?')[0];\n const contents = await getTransformer().transformFile(path);\n\n return {\n code: Buffer.from(contents).toString('utf-8'),\n };\n },\n },\n };\n}\n"],"mappings":";;;AASA,SAAgB,eAAuB;CACrC,MAAM,8BAAc,IAAI,KAAyB;CACjD,MAAM,aAAkC;EACtC,MAAM,QAAgB,YAAY,IAAI,IAAI;EAC1C,MAAM,KAAa,UAAsB;AACvC,eAAY,IAAI,KAAK,MAAM;;EAE9B;CACD,MAAM,gBAAgB,yBAAyB,QAAQ,KAAK,CAAC;CAC7D,IAAI;CACJ,SAAS,iBAAiB;AACxB,SAAQ,0BAA0B,IAAI,sBACpC,EAAE,KAAK,MAAM,EACb,GACA,gBACI,gBAAgB,+BAA+B,cAAc,CAAC,GAC9D,WACL;;;;;AAMH,QAAO;EACL,MAAM;EACN,SAAS;EACT,OAAO;EACP,WAAW;AACT,UAAO,uBAAuB,OAAO;;EAEvC,WAAW;GACT,QAAQ,EACN,IAAI,kBACL;GACD,MAAM,QAAQ,OAAe,IAAY;IACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;IAC3B,MAAM,WAAW,MAAM,gBAAgB,CAAC,cAAc,KAAK;AAE3D,WAAO,EACL,MAAM,OAAO,KAAK,SAAS,CAAC,SAAS,QAAQ,EAC9C;;GAEJ;EACF"}
@@ -60,3 +60,4 @@ export declare function refreshStylesheetRegistryForFile(file: string, styleshee
60
60
  * @returns boolean
61
61
  */
62
62
  export declare function isTestWatchMode(args?): boolean;
63
+ export declare function getBrowserModeCliOverride(args?): boolean | undefined;
@@ -132,7 +132,21 @@ function isTestWatchMode(args = process.argv) {
132
132
  if (watchArg && watchArg === "false") return false;
133
133
  return true;
134
134
  }
135
+ function getBrowserModeCliOverride(args = process.argv.slice(2)) {
136
+ let enabled;
137
+ for (let i = 0; i < args.length; i++) {
138
+ if (args[i] === "--") break;
139
+ const [flag, inlineValue] = args[i].split("=", 2);
140
+ if (flag === "--no-browser" || flag === "--no-browser.enabled") enabled = false;
141
+ else if (flag === "--browser" || flag === "--browser.enabled") {
142
+ const value = inlineValue ?? args[i + 1];
143
+ if (value === "false" || flag === "--browser" && value === "no") enabled = false;
144
+ else if (flag === "--browser.enabled" || value === void 0 || value.startsWith("-") || value === "true" || value === "yes") enabled = true;
145
+ }
146
+ }
147
+ return enabled;
148
+ }
135
149
  //#endregion
136
- export { DiagnosticModes, describeStylesheetContent, injectViteIgnoreForHmrMetadata, isIgnoredHmrFile, isTestWatchMode, mapTemplateUpdatesToFiles, refreshStylesheetRegistryForFile, toAngularCompilationFileReplacements };
150
+ export { DiagnosticModes, describeStylesheetContent, getBrowserModeCliOverride, injectViteIgnoreForHmrMetadata, isIgnoredHmrFile, isTestWatchMode, mapTemplateUpdatesToFiles, refreshStylesheetRegistryForFile, toAngularCompilationFileReplacements };
137
151
 
138
152
  //# sourceMappingURL=compilation-shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compilation-shared.js","names":[],"sources":["../../../../src/lib/utils/compilation-shared.ts"],"sourcesContent":["/**\n * Shared utilities used by both angular-vite-plugin.ts and\n * compilation-api/compilation-api-plugin.ts.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename, isAbsolute, resolve } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { normalizePath } from 'vite';\n\nimport {\n AnalogStylesheetRegistry,\n preprocessStylesheetResult,\n rewriteRelativeCssImports,\n} from '../stylesheet-registry.js';\nimport { normalizeStylesheetDependencies } from '../style-preprocessor.js';\nimport type { StylePreprocessor } from '../style-preprocessor.js';\nimport type { FileReplacement } from '../plugins/file-replacements.plugin.js';\nimport { debugStylesV } from './debug.js';\n\nexport enum DiagnosticModes {\n None = 0,\n Option = 1 << 0,\n Syntactic = 1 << 1,\n Semantic = 1 << 2,\n All = Option | Syntactic | Semantic,\n}\n\nexport function injectViteIgnoreForHmrMetadata(code: string): string {\n let patched = code.replace(\n /\\bimport\\(([a-zA-Z_$][\\w$]*\\.\\u0275\\u0275getReplaceMetadataURL)/g,\n 'import(/* @vite-ignore */ $1',\n );\n\n if (patched === code) {\n patched = patched.replace(\n /import\\((\\S+getReplaceMetadataURL)/g,\n 'import(/* @vite-ignore */ $1',\n );\n }\n\n return patched;\n}\n\nexport function isIgnoredHmrFile(file: string): boolean {\n return file.endsWith('.tsbuildinfo');\n}\n\n/**\n * Convert Analog/Angular CLI-style file replacements into the flat record\n * expected by `AngularHostOptions.fileReplacements`.\n *\n * Only browser replacements (`{ replace, with }`) are converted. SSR-only\n * replacements (`{ replace, ssr }`) are left for the Vite runtime plugin to\n * handle — they should not be baked into the Angular compilation host because\n * that would apply them to both browser and server builds.\n *\n * Relative paths are resolved against `workspaceRoot` so that the host\n * receives the same absolute paths it would get from the Angular CLI.\n */\nexport function toAngularCompilationFileReplacements(\n replacements: FileReplacement[],\n workspaceRoot: string,\n): Record<string, string> | undefined {\n const mappedReplacements = replacements.flatMap((replacement) => {\n if (!('with' in replacement)) {\n return [];\n }\n\n return [\n [\n isAbsolute(replacement.replace)\n ? replacement.replace\n : resolve(workspaceRoot, replacement.replace),\n isAbsolute(replacement.with)\n ? replacement.with\n : resolve(workspaceRoot, replacement.with),\n ] as const,\n ];\n });\n\n return mappedReplacements.length\n ? Object.fromEntries(mappedReplacements)\n : undefined;\n}\n\n/**\n * Map Angular's `templateUpdates` (keyed by `encodedFilePath@ClassName`)\n * back to absolute file paths with their associated HMR code and component\n * class name.\n *\n * Angular's private Compilation API emits template update keys in the form\n * `encodeURIComponent(relativePath + '@' + className)`. We decode and resolve\n * them so the caller can look up updates by the same normalized absolute path\n * used elsewhere in the plugin (`outputFiles`, `classNames`, etc.).\n */\nexport function mapTemplateUpdatesToFiles(\n templateUpdates: ReadonlyMap<string, string> | undefined,\n): Map<\n string,\n {\n className: string;\n code: string;\n }\n> {\n const updatesByFile = new Map<string, { className: string; code: string }>();\n\n templateUpdates?.forEach((code, encodedUpdateId) => {\n const [file, className = ''] =\n decodeURIComponent(encodedUpdateId).split('@');\n const resolvedFile = normalizePath(resolve(process.cwd(), file));\n\n updatesByFile.set(resolvedFile, {\n className,\n code,\n });\n });\n\n return updatesByFile;\n}\n\nexport function describeStylesheetContent(code: string): {\n length: number;\n digest: string;\n preview: string;\n} {\n return {\n length: code.length,\n digest: createHash('sha256').update(code).digest('hex').slice(0, 12),\n preview: code.replace(/\\s+/g, ' ').trim().slice(0, 160),\n };\n}\n\n/**\n * Refreshes any already-served stylesheet records that map back to a changed\n * source file.\n *\n * This is the critical bridge for externalized Angular component styles during\n * HMR. Angular's resource watcher can notice that `/src/...component.css`\n * changed before Angular recompilation has had a chance to repopulate the\n * stylesheet registry. If we emit a CSS update against the existing virtual\n * stylesheet id without first refreshing the registry content, the browser gets\n * a hot update containing stale CSS. By rewriting the existing served records\n * from disk up front, HMR always pushes the latest source content.\n */\nexport function refreshStylesheetRegistryForFile(\n file: string,\n stylesheetRegistry?: AnalogStylesheetRegistry,\n stylePreprocessor?: StylePreprocessor,\n): void {\n const normalizedFile = normalizePath(file.split('?')[0]);\n if (!stylesheetRegistry || !existsSync(normalizedFile)) {\n return;\n }\n\n const publicIds = stylesheetRegistry.getPublicIdsForSource(normalizedFile);\n if (publicIds.length === 0) {\n return;\n }\n\n const rawCss = readFileSync(normalizedFile, 'utf-8');\n const preprocessed = preprocessStylesheetResult(\n rawCss,\n normalizedFile,\n stylePreprocessor,\n );\n const servedCss = rewriteRelativeCssImports(\n preprocessed.code,\n normalizedFile,\n );\n\n for (const publicId of publicIds) {\n stylesheetRegistry.registerServedStylesheet(\n {\n publicId,\n sourcePath: normalizedFile,\n originalCode: rawCss,\n normalizedCode: servedCss,\n dependencies: normalizeStylesheetDependencies(\n preprocessed.dependencies,\n ),\n diagnostics: preprocessed.diagnostics,\n tags: preprocessed.tags,\n },\n [\n normalizedFile,\n normalizePath(normalizedFile),\n basename(normalizedFile),\n normalizedFile.replace(/^\\//, ''),\n ],\n );\n }\n\n debugStylesV('stylesheet registry refreshed from source file', {\n file: normalizedFile,\n publicIds,\n dependencies: preprocessed.dependencies,\n diagnostics: preprocessed.diagnostics,\n tags: preprocessed.tags,\n source: describeStylesheetContent(rawCss),\n served: describeStylesheetContent(servedCss),\n });\n}\n\n/**\n * Checks for vitest run from the command line\n * @returns boolean\n */\nexport function isTestWatchMode(args = process.argv): boolean {\n // vitest --run\n const hasRun = args.find((arg) => arg.includes('--run'));\n if (hasRun) {\n return false;\n }\n\n // vitest run\n if (args.includes('run')) {\n return false;\n }\n\n // vitest --no-run\n const hasNoRun = args.find((arg) => arg.includes('--no-run'));\n if (hasNoRun) {\n return true;\n }\n\n // check for --watch=false or --no-watch\n const hasWatch = args.find((arg) => arg.includes('watch'));\n if (hasWatch && ['false', 'no'].some((neg) => hasWatch.includes(neg))) {\n return false;\n }\n\n // check for --watch false\n const watchIndex = args.findIndex((arg) => arg.includes('watch'));\n const watchArg = args[watchIndex + 1];\n if (watchArg && watchArg === 'false') {\n return false;\n }\n\n return true;\n}\n"],"mappings":";;;;;;;;;;;;AAoBA,IAAY,kBAAL,yBAAA,iBAAA;AACL,iBAAA,gBAAA,UAAA,KAAA;AACA,iBAAA,gBAAA,YAAA,KAAA;AACA,iBAAA,gBAAA,eAAA,KAAA;AACA,iBAAA,gBAAA,cAAA,KAAA;AACA,iBAAA,gBAAA,SAAA,KAAA;;KACD;AAED,SAAgB,+BAA+B,MAAsB;CACnE,IAAI,UAAU,KAAK,QACjB,oEACA,+BACD;AAED,KAAI,YAAY,KACd,WAAU,QAAQ,QAChB,uCACA,+BACD;AAGH,QAAO;;AAGT,SAAgB,iBAAiB,MAAuB;AACtD,QAAO,KAAK,SAAS,eAAe;;;;;;;;;;;;;;AAetC,SAAgB,qCACd,cACA,eACoC;CACpC,MAAM,qBAAqB,aAAa,SAAS,gBAAgB;AAC/D,MAAI,EAAE,UAAU,aACd,QAAO,EAAE;AAGX,SAAO,CACL,CACE,WAAW,YAAY,QAAQ,GAC3B,YAAY,UACZ,QAAQ,eAAe,YAAY,QAAQ,EAC/C,WAAW,YAAY,KAAK,GACxB,YAAY,OACZ,QAAQ,eAAe,YAAY,KAAK,CAC7C,CACF;GACD;AAEF,QAAO,mBAAmB,SACtB,OAAO,YAAY,mBAAmB,GACtC,KAAA;;;;;;;;;;;;AAaN,SAAgB,0BACd,iBAOA;CACA,MAAM,gCAAgB,IAAI,KAAkD;AAE5E,kBAAiB,SAAS,MAAM,oBAAoB;EAClD,MAAM,CAAC,MAAM,YAAY,MACvB,mBAAmB,gBAAgB,CAAC,MAAM,IAAI;EAChD,MAAM,eAAe,cAAc,QAAQ,QAAQ,KAAK,EAAE,KAAK,CAAC;AAEhE,gBAAc,IAAI,cAAc;GAC9B;GACA;GACD,CAAC;GACF;AAEF,QAAO;;AAGT,SAAgB,0BAA0B,MAIxC;AACA,QAAO;EACL,QAAQ,KAAK;EACb,QAAQ,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG;EACpE,SAAS,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI;EACxD;;;;;;;;;;;;;;AAeH,SAAgB,iCACd,MACA,oBACA,mBACM;CACN,MAAM,iBAAiB,cAAc,KAAK,MAAM,IAAI,CAAC,GAAG;AACxD,KAAI,CAAC,sBAAsB,CAAC,WAAW,eAAe,CACpD;CAGF,MAAM,YAAY,mBAAmB,sBAAsB,eAAe;AAC1E,KAAI,UAAU,WAAW,EACvB;CAGF,MAAM,SAAS,aAAa,gBAAgB,QAAQ;CACpD,MAAM,eAAe,2BACnB,QACA,gBACA,kBACD;CACD,MAAM,YAAY,0BAChB,aAAa,MACb,eACD;AAED,MAAK,MAAM,YAAY,UACrB,oBAAmB,yBACjB;EACE;EACA,YAAY;EACZ,cAAc;EACd,gBAAgB;EAChB,cAAc,gCACZ,aAAa,aACd;EACD,aAAa,aAAa;EAC1B,MAAM,aAAa;EACpB,EACD;EACE;EACA,cAAc,eAAe;EAC7B,SAAS,eAAe;EACxB,eAAe,QAAQ,OAAO,GAAG;EAClC,CACF;AAGH,cAAa,kDAAkD;EAC7D,MAAM;EACN;EACA,cAAc,aAAa;EAC3B,aAAa,aAAa;EAC1B,MAAM,aAAa;EACnB,QAAQ,0BAA0B,OAAO;EACzC,QAAQ,0BAA0B,UAAU;EAC7C,CAAC;;;;;;AAOJ,SAAgB,gBAAgB,OAAO,QAAQ,MAAe;AAG5D,KADe,KAAK,MAAM,QAAQ,IAAI,SAAS,QAAQ,CAAC,CAEtD,QAAO;AAIT,KAAI,KAAK,SAAS,MAAM,CACtB,QAAO;AAKT,KADiB,KAAK,MAAM,QAAQ,IAAI,SAAS,WAAW,CAAC,CAE3D,QAAO;CAIT,MAAM,WAAW,KAAK,MAAM,QAAQ,IAAI,SAAS,QAAQ,CAAC;AAC1D,KAAI,YAAY,CAAC,SAAS,KAAK,CAAC,MAAM,QAAQ,SAAS,SAAS,IAAI,CAAC,CACnE,QAAO;CAKT,MAAM,WAAW,KADE,KAAK,WAAW,QAAQ,IAAI,SAAS,QAAQ,CAAC,GAC9B;AACnC,KAAI,YAAY,aAAa,QAC3B,QAAO;AAGT,QAAO"}
1
+ {"version":3,"file":"compilation-shared.js","names":[],"sources":["../../../../src/lib/utils/compilation-shared.ts"],"sourcesContent":["/**\n * Shared utilities used by both angular-vite-plugin.ts and\n * compilation-api/compilation-api-plugin.ts.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename, isAbsolute, resolve } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { normalizePath } from 'vite';\n\nimport {\n AnalogStylesheetRegistry,\n preprocessStylesheetResult,\n rewriteRelativeCssImports,\n} from '../stylesheet-registry.js';\nimport { normalizeStylesheetDependencies } from '../style-preprocessor.js';\nimport type { StylePreprocessor } from '../style-preprocessor.js';\nimport type { FileReplacement } from '../plugins/file-replacements.plugin.js';\nimport { debugStylesV } from './debug.js';\n\nexport enum DiagnosticModes {\n None = 0,\n Option = 1 << 0,\n Syntactic = 1 << 1,\n Semantic = 1 << 2,\n All = Option | Syntactic | Semantic,\n}\n\nexport function injectViteIgnoreForHmrMetadata(code: string): string {\n let patched = code.replace(\n /\\bimport\\(([a-zA-Z_$][\\w$]*\\.\\u0275\\u0275getReplaceMetadataURL)/g,\n 'import(/* @vite-ignore */ $1',\n );\n\n if (patched === code) {\n patched = patched.replace(\n /import\\((\\S+getReplaceMetadataURL)/g,\n 'import(/* @vite-ignore */ $1',\n );\n }\n\n return patched;\n}\n\nexport function isIgnoredHmrFile(file: string): boolean {\n return file.endsWith('.tsbuildinfo');\n}\n\n/**\n * Convert Analog/Angular CLI-style file replacements into the flat record\n * expected by `AngularHostOptions.fileReplacements`.\n *\n * Only browser replacements (`{ replace, with }`) are converted. SSR-only\n * replacements (`{ replace, ssr }`) are left for the Vite runtime plugin to\n * handle — they should not be baked into the Angular compilation host because\n * that would apply them to both browser and server builds.\n *\n * Relative paths are resolved against `workspaceRoot` so that the host\n * receives the same absolute paths it would get from the Angular CLI.\n */\nexport function toAngularCompilationFileReplacements(\n replacements: FileReplacement[],\n workspaceRoot: string,\n): Record<string, string> | undefined {\n const mappedReplacements = replacements.flatMap((replacement) => {\n if (!('with' in replacement)) {\n return [];\n }\n\n return [\n [\n isAbsolute(replacement.replace)\n ? replacement.replace\n : resolve(workspaceRoot, replacement.replace),\n isAbsolute(replacement.with)\n ? replacement.with\n : resolve(workspaceRoot, replacement.with),\n ] as const,\n ];\n });\n\n return mappedReplacements.length\n ? Object.fromEntries(mappedReplacements)\n : undefined;\n}\n\n/**\n * Map Angular's `templateUpdates` (keyed by `encodedFilePath@ClassName`)\n * back to absolute file paths with their associated HMR code and component\n * class name.\n *\n * Angular's private Compilation API emits template update keys in the form\n * `encodeURIComponent(relativePath + '@' + className)`. We decode and resolve\n * them so the caller can look up updates by the same normalized absolute path\n * used elsewhere in the plugin (`outputFiles`, `classNames`, etc.).\n */\nexport function mapTemplateUpdatesToFiles(\n templateUpdates: ReadonlyMap<string, string> | undefined,\n): Map<\n string,\n {\n className: string;\n code: string;\n }\n> {\n const updatesByFile = new Map<string, { className: string; code: string }>();\n\n templateUpdates?.forEach((code, encodedUpdateId) => {\n const [file, className = ''] =\n decodeURIComponent(encodedUpdateId).split('@');\n const resolvedFile = normalizePath(resolve(process.cwd(), file));\n\n updatesByFile.set(resolvedFile, {\n className,\n code,\n });\n });\n\n return updatesByFile;\n}\n\nexport function describeStylesheetContent(code: string): {\n length: number;\n digest: string;\n preview: string;\n} {\n return {\n length: code.length,\n digest: createHash('sha256').update(code).digest('hex').slice(0, 12),\n preview: code.replace(/\\s+/g, ' ').trim().slice(0, 160),\n };\n}\n\n/**\n * Refreshes any already-served stylesheet records that map back to a changed\n * source file.\n *\n * This is the critical bridge for externalized Angular component styles during\n * HMR. Angular's resource watcher can notice that `/src/...component.css`\n * changed before Angular recompilation has had a chance to repopulate the\n * stylesheet registry. If we emit a CSS update against the existing virtual\n * stylesheet id without first refreshing the registry content, the browser gets\n * a hot update containing stale CSS. By rewriting the existing served records\n * from disk up front, HMR always pushes the latest source content.\n */\nexport function refreshStylesheetRegistryForFile(\n file: string,\n stylesheetRegistry?: AnalogStylesheetRegistry,\n stylePreprocessor?: StylePreprocessor,\n): void {\n const normalizedFile = normalizePath(file.split('?')[0]);\n if (!stylesheetRegistry || !existsSync(normalizedFile)) {\n return;\n }\n\n const publicIds = stylesheetRegistry.getPublicIdsForSource(normalizedFile);\n if (publicIds.length === 0) {\n return;\n }\n\n const rawCss = readFileSync(normalizedFile, 'utf-8');\n const preprocessed = preprocessStylesheetResult(\n rawCss,\n normalizedFile,\n stylePreprocessor,\n );\n const servedCss = rewriteRelativeCssImports(\n preprocessed.code,\n normalizedFile,\n );\n\n for (const publicId of publicIds) {\n stylesheetRegistry.registerServedStylesheet(\n {\n publicId,\n sourcePath: normalizedFile,\n originalCode: rawCss,\n normalizedCode: servedCss,\n dependencies: normalizeStylesheetDependencies(\n preprocessed.dependencies,\n ),\n diagnostics: preprocessed.diagnostics,\n tags: preprocessed.tags,\n },\n [\n normalizedFile,\n normalizePath(normalizedFile),\n basename(normalizedFile),\n normalizedFile.replace(/^\\//, ''),\n ],\n );\n }\n\n debugStylesV('stylesheet registry refreshed from source file', {\n file: normalizedFile,\n publicIds,\n dependencies: preprocessed.dependencies,\n diagnostics: preprocessed.diagnostics,\n tags: preprocessed.tags,\n source: describeStylesheetContent(rawCss),\n served: describeStylesheetContent(servedCss),\n });\n}\n\n/**\n * Checks for vitest run from the command line\n * @returns boolean\n */\nexport function isTestWatchMode(args = process.argv): boolean {\n // vitest --run\n const hasRun = args.find((arg) => arg.includes('--run'));\n if (hasRun) {\n return false;\n }\n\n // vitest run\n if (args.includes('run')) {\n return false;\n }\n\n // vitest --no-run\n const hasNoRun = args.find((arg) => arg.includes('--no-run'));\n if (hasNoRun) {\n return true;\n }\n\n // check for --watch=false or --no-watch\n const hasWatch = args.find((arg) => arg.includes('watch'));\n if (hasWatch && ['false', 'no'].some((neg) => hasWatch.includes(neg))) {\n return false;\n }\n\n // check for --watch false\n const watchIndex = args.findIndex((arg) => arg.includes('watch'));\n const watchArg = args[watchIndex + 1];\n if (watchArg && watchArg === 'false') {\n return false;\n }\n\n return true;\n}\n\nexport function getBrowserModeCliOverride(\n args = process.argv.slice(2),\n): boolean | undefined {\n let enabled: boolean | undefined;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--') {\n break;\n }\n\n const [flag, inlineValue] = args[i].split('=', 2);\n if (flag === '--no-browser' || flag === '--no-browser.enabled') {\n enabled = false;\n } else if (flag === '--browser' || flag === '--browser.enabled') {\n const value = inlineValue ?? args[i + 1];\n if (value === 'false' || (flag === '--browser' && value === 'no')) {\n enabled = false;\n } else if (\n flag === '--browser.enabled' ||\n value === undefined ||\n value.startsWith('-') ||\n value === 'true' ||\n value === 'yes'\n ) {\n enabled = true;\n }\n }\n }\n\n return enabled;\n}\n"],"mappings":"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"}
@@ -32,7 +32,10 @@ else if (angularMajor >= 17 && angularMajor < 18) {
32
32
  sourceFileCache = SourceFileCache;
33
33
  cjt = createJitResourceTransformer;
34
34
  jt = JavaScriptTransformer;
35
- createAngularCompilation = createAngularCompilationFn;
35
+ createAngularCompilation = async (...args) => {
36
+ await initializeHash?.();
37
+ return createAngularCompilationFn(...args);
38
+ };
36
39
  if (usesTransformOptions) ({initializeHash} = require(join(dirname(require.resolve("@angular/build/package.json")), "src/utils/hash.js")));
37
40
  }
38
41
  var JavaScriptTransformer = class extends jt {
@@ -1 +1 @@
1
- {"version":3,"file":"devkit.js","names":[],"sources":["../../../../src/lib/utils/devkit.ts"],"sourcesContent":["import { VERSION } from '@angular/compiler-cli';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport type { JavaScriptTransformer as AngularJavaScriptTransformer } from '@angular/build/private';\nimport type { CompilerPluginOptions } from './compiler-plugin-options.js';\nimport type { TransformCacheStore } from './transform-cache.js';\nimport * as sfc from './source-file-cache.js';\n\nconst require = createRequire(import.meta.url);\n\nconst angularMajor = Number(VERSION.major);\nconst angularMinor = Number(VERSION.minor);\nconst angularPatch = Number(VERSION.patch);\nconst padVersion = (version: number) => String(version).padStart(2, '0');\nconst angularFullVersion = Number(\n `${angularMajor}${padVersion(angularMinor)}${padVersion(angularPatch)}`,\n);\nlet sourceFileCache: any;\nlet cjt: (...args: any[]) => any;\nlet jt: any;\nlet createAngularCompilation: (...args: any[]) => any;\nconst usesTransformOptions = angularFullVersion >= 220200;\nlet initializeHash: (() => Promise<void>) | undefined;\n\nif (angularMajor < 17) {\n throw new Error('AnalogJS is not compatible with Angular v16 and lower');\n} else if (angularMajor >= 17 && angularMajor < 18) {\n const cp = require('@angular-devkit/build-angular/src/tools/esbuild/angular/compiler-plugin.js');\n const {\n createJitResourceTransformer,\n } = require('@angular-devkit/build-angular/src/tools/esbuild/angular/jit-resource-transformer.js');\n const {\n JavaScriptTransformer,\n } = require('@angular-devkit/build-angular/src/tools/esbuild/javascript-transformer.js');\n\n /**\n * Workaround for compatibility with Angular 17.0+\n */\n if (typeof cp['SourceFileCache'] !== 'undefined') {\n sourceFileCache = cp.SourceFileCache;\n } else {\n sourceFileCache = sfc.SourceFileCache;\n }\n\n cjt = createJitResourceTransformer;\n jt = JavaScriptTransformer;\n} else {\n const {\n createJitResourceTransformer,\n JavaScriptTransformer,\n SourceFileCache,\n createAngularCompilation: createAngularCompilationFn,\n } = require('@angular/build/private');\n\n sourceFileCache = SourceFileCache;\n cjt = createJitResourceTransformer;\n jt = JavaScriptTransformer;\n createAngularCompilation = createAngularCompilationFn;\n\n if (usesTransformOptions) {\n ({ initializeHash } = require(\n join(\n dirname(require.resolve('@angular/build/package.json')),\n 'src/utils/hash.js',\n ),\n ));\n }\n}\n\n// Keep Angular's private transformer API differences at the compatibility boundary.\nclass JavaScriptTransformer extends jt {\n constructor(\n options: Partial<\n ConstructorParameters<typeof AngularJavaScriptTransformer>[0]\n >,\n maxThreads: number,\n cache?: TransformCacheStore,\n ) {\n if (usesTransformOptions) {\n super({ ...options, maxConcurrency: maxThreads }, cache);\n } else {\n super(options, maxThreads, cache);\n }\n }\n\n async transformFile(\n filename: string,\n skipLinker?: boolean,\n sideEffects?: boolean,\n instrumentForCoverage?: boolean,\n ): Promise<Uint8Array> {\n if (usesTransformOptions) {\n await initializeHash!();\n return super.transformFile(filename, {\n skipLinker,\n sideEffects:\n sideEffects === undefined ? undefined : async () => sideEffects,\n instrumentForCoverage,\n });\n }\n return super.transformFile(\n filename,\n skipLinker,\n sideEffects,\n instrumentForCoverage,\n );\n }\n\n async transformData(\n filename: string,\n data: string,\n skipLinker: boolean,\n sideEffects?: boolean,\n instrumentForCoverage?: boolean,\n ): Promise<Uint8Array> {\n if (usesTransformOptions) {\n await initializeHash!();\n return super.transformData(filename, data, {\n skipLinker,\n sideEffects:\n sideEffects === undefined ? undefined : async () => sideEffects,\n instrumentForCoverage,\n });\n }\n return super.transformData(\n filename,\n data,\n skipLinker,\n sideEffects,\n instrumentForCoverage,\n );\n }\n\n close(): Promise<void> {\n return super.close();\n }\n}\n\nexport {\n cjt as createJitResourceTransformer,\n JavaScriptTransformer,\n sourceFileCache as SourceFileCache,\n CompilerPluginOptions,\n angularMajor,\n angularMinor,\n angularPatch,\n createAngularCompilation,\n angularFullVersion,\n};\n"],"mappings":";;;;;AAQA,IAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAE9C,IAAM,eAAe,OAAO,QAAQ,MAAM;AAC1C,IAAM,eAAe,OAAO,QAAQ,MAAM;AAC1C,IAAM,eAAe,OAAO,QAAQ,MAAM;AAC1C,IAAM,cAAc,YAAoB,OAAO,QAAQ,CAAC,SAAS,GAAG,IAAI;AACxE,IAAM,qBAAqB,OACzB,GAAG,eAAe,WAAW,aAAa,GAAG,WAAW,aAAa,GACtE;AACD,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAM,uBAAuB,sBAAsB;AACnD,IAAI;AAEJ,IAAI,eAAe,GACjB,OAAM,IAAI,MAAM,wDAAwD;SAC/D,gBAAgB,MAAM,eAAe,IAAI;CAClD,MAAM,KAAK,QAAQ,6EAA6E;CAChG,MAAM,EACJ,iCACE,QAAQ,sFAAsF;CAClG,MAAM,EACJ,0BACE,QAAQ,4EAA4E;;;;AAKxF,KAAI,OAAO,GAAG,uBAAuB,YACnC,mBAAkB,GAAG;KAErB,mBAAkB;AAGpB,OAAM;AACN,MAAK;OACA;CACL,MAAM,EACJ,8BACA,uBACA,iBACA,0BAA0B,+BACxB,QAAQ,yBAAyB;AAErC,mBAAkB;AAClB,OAAM;AACN,MAAK;AACL,4BAA2B;AAE3B,KAAI,qBACF,EAAC,CAAE,kBAAmB,QACpB,KACE,QAAQ,QAAQ,QAAQ,8BAA8B,CAAC,EACvD,oBACD,CACF;;AAKL,IAAM,wBAAN,cAAoC,GAAG;CACrC,YACE,SAGA,YACA,OACA;AACA,MAAI,qBACF,OAAM;GAAE,GAAG;GAAS,gBAAgB;GAAY,EAAE,MAAM;MAExD,OAAM,SAAS,YAAY,MAAM;;CAIrC,MAAM,cACJ,UACA,YACA,aACA,uBACqB;AACrB,MAAI,sBAAsB;AACxB,SAAM,gBAAiB;AACvB,UAAO,MAAM,cAAc,UAAU;IACnC;IACA,aACE,gBAAgB,KAAA,IAAY,KAAA,IAAY,YAAY;IACtD;IACD,CAAC;;AAEJ,SAAO,MAAM,cACX,UACA,YACA,aACA,sBACD;;CAGH,MAAM,cACJ,UACA,MACA,YACA,aACA,uBACqB;AACrB,MAAI,sBAAsB;AACxB,SAAM,gBAAiB;AACvB,UAAO,MAAM,cAAc,UAAU,MAAM;IACzC;IACA,aACE,gBAAgB,KAAA,IAAY,KAAA,IAAY,YAAY;IACtD;IACD,CAAC;;AAEJ,SAAO,MAAM,cACX,UACA,MACA,YACA,aACA,sBACD;;CAGH,QAAuB;AACrB,SAAO,MAAM,OAAO"}
1
+ {"version":3,"file":"devkit.js","names":[],"sources":["../../../../src/lib/utils/devkit.ts"],"sourcesContent":["import { VERSION } from '@angular/compiler-cli';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport type { JavaScriptTransformer as AngularJavaScriptTransformer } from '@angular/build/private';\nimport type { CompilerPluginOptions } from './compiler-plugin-options.js';\nimport type { TransformCacheStore } from './transform-cache.js';\nimport * as sfc from './source-file-cache.js';\n\nconst require = createRequire(import.meta.url);\n\nconst angularMajor = Number(VERSION.major);\nconst angularMinor = Number(VERSION.minor);\nconst angularPatch = Number(VERSION.patch);\nconst padVersion = (version: number) => String(version).padStart(2, '0');\nconst angularFullVersion = Number(\n `${angularMajor}${padVersion(angularMinor)}${padVersion(angularPatch)}`,\n);\nlet sourceFileCache: any;\nlet cjt: (...args: any[]) => any;\nlet jt: any;\nlet createAngularCompilation: (...args: any[]) => any;\nconst usesTransformOptions = angularFullVersion >= 220200;\nlet initializeHash: (() => Promise<void>) | undefined;\n\nif (angularMajor < 17) {\n throw new Error('AnalogJS is not compatible with Angular v16 and lower');\n} else if (angularMajor >= 17 && angularMajor < 18) {\n const cp = require('@angular-devkit/build-angular/src/tools/esbuild/angular/compiler-plugin.js');\n const {\n createJitResourceTransformer,\n } = require('@angular-devkit/build-angular/src/tools/esbuild/angular/jit-resource-transformer.js');\n const {\n JavaScriptTransformer,\n } = require('@angular-devkit/build-angular/src/tools/esbuild/javascript-transformer.js');\n\n /**\n * Workaround for compatibility with Angular 17.0+\n */\n if (typeof cp['SourceFileCache'] !== 'undefined') {\n sourceFileCache = cp.SourceFileCache;\n } else {\n sourceFileCache = sfc.SourceFileCache;\n }\n\n cjt = createJitResourceTransformer;\n jt = JavaScriptTransformer;\n} else {\n const {\n createJitResourceTransformer,\n JavaScriptTransformer,\n SourceFileCache,\n createAngularCompilation: createAngularCompilationFn,\n } = require('@angular/build/private');\n\n sourceFileCache = SourceFileCache;\n cjt = createJitResourceTransformer;\n jt = JavaScriptTransformer;\n createAngularCompilation = async (...args: unknown[]) => {\n await initializeHash?.();\n return createAngularCompilationFn(...args);\n };\n\n if (usesTransformOptions) {\n ({ initializeHash } = require(\n join(\n dirname(require.resolve('@angular/build/package.json')),\n 'src/utils/hash.js',\n ),\n ));\n }\n}\n\n// Keep Angular's private transformer API differences at the compatibility boundary.\nclass JavaScriptTransformer extends jt {\n constructor(\n options: Partial<\n ConstructorParameters<typeof AngularJavaScriptTransformer>[0]\n >,\n maxThreads: number,\n cache?: TransformCacheStore,\n ) {\n if (usesTransformOptions) {\n super({ ...options, maxConcurrency: maxThreads }, cache);\n } else {\n super(options, maxThreads, cache);\n }\n }\n\n async transformFile(\n filename: string,\n skipLinker?: boolean,\n sideEffects?: boolean,\n instrumentForCoverage?: boolean,\n ): Promise<Uint8Array> {\n if (usesTransformOptions) {\n await initializeHash!();\n return super.transformFile(filename, {\n skipLinker,\n sideEffects:\n sideEffects === undefined ? undefined : async () => sideEffects,\n instrumentForCoverage,\n });\n }\n return super.transformFile(\n filename,\n skipLinker,\n sideEffects,\n instrumentForCoverage,\n );\n }\n\n async transformData(\n filename: string,\n data: string,\n skipLinker: boolean,\n sideEffects?: boolean,\n instrumentForCoverage?: boolean,\n ): Promise<Uint8Array> {\n if (usesTransformOptions) {\n await initializeHash!();\n return super.transformData(filename, data, {\n skipLinker,\n sideEffects:\n sideEffects === undefined ? undefined : async () => sideEffects,\n instrumentForCoverage,\n });\n }\n return super.transformData(\n filename,\n data,\n skipLinker,\n sideEffects,\n instrumentForCoverage,\n );\n }\n\n close(): Promise<void> {\n return super.close();\n }\n}\n\nexport {\n cjt as createJitResourceTransformer,\n JavaScriptTransformer,\n sourceFileCache as SourceFileCache,\n CompilerPluginOptions,\n angularMajor,\n angularMinor,\n angularPatch,\n createAngularCompilation,\n angularFullVersion,\n};\n"],"mappings":";;;;;AAQA,IAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAE9C,IAAM,eAAe,OAAO,QAAQ,MAAM;AAC1C,IAAM,eAAe,OAAO,QAAQ,MAAM;AAC1C,IAAM,eAAe,OAAO,QAAQ,MAAM;AAC1C,IAAM,cAAc,YAAoB,OAAO,QAAQ,CAAC,SAAS,GAAG,IAAI;AACxE,IAAM,qBAAqB,OACzB,GAAG,eAAe,WAAW,aAAa,GAAG,WAAW,aAAa,GACtE;AACD,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAM,uBAAuB,sBAAsB;AACnD,IAAI;AAEJ,IAAI,eAAe,GACjB,OAAM,IAAI,MAAM,wDAAwD;SAC/D,gBAAgB,MAAM,eAAe,IAAI;CAClD,MAAM,KAAK,QAAQ,6EAA6E;CAChG,MAAM,EACJ,iCACE,QAAQ,sFAAsF;CAClG,MAAM,EACJ,0BACE,QAAQ,4EAA4E;;;;AAKxF,KAAI,OAAO,GAAG,uBAAuB,YACnC,mBAAkB,GAAG;KAErB,mBAAkB;AAGpB,OAAM;AACN,MAAK;OACA;CACL,MAAM,EACJ,8BACA,uBACA,iBACA,0BAA0B,+BACxB,QAAQ,yBAAyB;AAErC,mBAAkB;AAClB,OAAM;AACN,MAAK;AACL,4BAA2B,OAAO,GAAG,SAAoB;AACvD,QAAM,kBAAkB;AACxB,SAAO,2BAA2B,GAAG,KAAK;;AAG5C,KAAI,qBACF,EAAC,CAAE,kBAAmB,QACpB,KACE,QAAQ,QAAQ,QAAQ,8BAA8B,CAAC,EACvD,oBACD,CACF;;AAKL,IAAM,wBAAN,cAAoC,GAAG;CACrC,YACE,SAGA,YACA,OACA;AACA,MAAI,qBACF,OAAM;GAAE,GAAG;GAAS,gBAAgB;GAAY,EAAE,MAAM;MAExD,OAAM,SAAS,YAAY,MAAM;;CAIrC,MAAM,cACJ,UACA,YACA,aACA,uBACqB;AACrB,MAAI,sBAAsB;AACxB,SAAM,gBAAiB;AACvB,UAAO,MAAM,cAAc,UAAU;IACnC;IACA,aACE,gBAAgB,KAAA,IAAY,KAAA,IAAY,YAAY;IACtD;IACD,CAAC;;AAEJ,SAAO,MAAM,cACX,UACA,YACA,aACA,sBACD;;CAGH,MAAM,cACJ,UACA,MACA,YACA,aACA,uBACqB;AACrB,MAAI,sBAAsB;AACxB,SAAM,gBAAiB;AACvB,UAAO,MAAM,cAAc,UAAU,MAAM;IACzC;IACA,aACE,gBAAgB,KAAA,IAAY,KAAA,IAAY,YAAY;IACtD;IACD,CAAC;;AAEJ,SAAO,MAAM,cACX,UACA,MACA,YACA,aACA,sBACD;;CAGH,QAAuB;AACrB,SAAO,MAAM,OAAO"}
@@ -11,6 +11,7 @@
11
11
  * and similar extensions matched by accident.
12
12
  */
13
13
  export declare const TS_EXT_REGEX: unknown;
14
+ export declare const EXCLUDED_TS_EXT_REGEX: unknown;
14
15
  /**
15
16
  * Resolves whether Angular should be compiled for production. An explicit
16
17
  * `development` mode wins over an ambient production `NODE_ENV` (e.g. set by
@@ -17,6 +17,7 @@ import * as vite from "vite";
17
17
  * and similar extensions matched by accident.
18
18
  */
19
19
  var TS_EXT_REGEX = /\.[cm]?ts(?![a-z])/;
20
+ var EXCLUDED_TS_EXT_REGEX = /\.d\.[cm]?ts$/;
20
21
  /**
21
22
  * Resolves whether Angular should be compiled for production. An explicit
22
23
  * `development` mode wins over an ambient production `NODE_ENV` (e.g. set by
@@ -80,6 +81,6 @@ function createDepOptimizerConfig(opts) {
80
81
  } };
81
82
  }
82
83
  //#endregion
83
- export { TS_EXT_REGEX, createDepOptimizerConfig, createTsConfigGetter, getTsConfigPath, isProdMode };
84
+ export { EXCLUDED_TS_EXT_REGEX, TS_EXT_REGEX, createDepOptimizerConfig, createTsConfigGetter, getTsConfigPath, isProdMode };
84
85
 
85
86
  //# sourceMappingURL=plugin-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-config.js","names":[],"sources":["../../../../src/lib/utils/plugin-config.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, isAbsolute, resolve } from 'node:path';\nimport * as vite from 'vite';\n\nimport {\n createCompilerPlugin,\n createRolldownCompilerPlugin,\n} from '../compiler-plugin.js';\nimport {\n createPersistentTransformCache,\n resolveTransformCacheDir,\n} from './transform-cache.js';\n\n/**\n * TypeScript file extension regex\n * Match .ts / .cts / .mts extensions with an optional ?query suffix.\n * Reject .tsx — and any other `.ts<letter>…` extension like .tsrx — via\n * a negative-lookahead on a following ASCII letter, so only genuine TS\n * files pass.\n *\n * Previous form `/\\.[cm]?(ts)[^x]?\\??/` was intended to exclude `.tsx`\n * specifically (`[^x]?` = not-an-x), but the `?` quantifier also allows\n * zero characters, and any non-`x` letter was admitted — so `.tsrx`\n * and similar extensions matched by accident.\n */\nexport const TS_EXT_REGEX = /\\.[cm]?ts(?![a-z])/;\n\n/**\n * Resolves whether Angular should be compiled for production. An explicit\n * `development` mode wins over an ambient production `NODE_ENV` (e.g. set by\n * `storybook build` at CLI entry), so a build can opt into Angular's\n * development compilation. See #2458 and #2462.\n */\nexport function isProdMode(mode: string | undefined): boolean {\n if (mode === 'development') {\n return false;\n }\n\n return mode === 'production' || process.env['NODE_ENV'] === 'production';\n}\n\nexport interface TsConfigResolutionContext {\n root: string;\n isProd: boolean;\n isLib: boolean;\n}\n\nexport function getTsConfigPath(\n root: string,\n tsconfig: string,\n isProd: boolean,\n isTest: boolean,\n isLib: boolean,\n workspaceRoot?: string,\n) {\n if (tsconfig && isAbsolute(tsconfig)) {\n if (!existsSync(tsconfig)) {\n console.error(\n `[@analogjs/vite-plugin-angular]: Unable to resolve tsconfig at ${tsconfig}. This causes compilation issues. Check the path or set the \"tsconfig\" property with an absolute path.`,\n );\n }\n\n return tsconfig;\n }\n\n let tsconfigFilePath = './tsconfig.app.json';\n\n if (isLib) {\n tsconfigFilePath = isProd\n ? './tsconfig.lib.prod.json'\n : './tsconfig.lib.json';\n }\n\n if (isTest) {\n tsconfigFilePath = './tsconfig.spec.json';\n }\n\n if (tsconfig) {\n tsconfigFilePath = tsconfig;\n }\n\n const resolvedPath = resolve(root, tsconfigFilePath);\n\n if (existsSync(resolvedPath)) {\n return resolvedPath;\n }\n\n // Callers such as Storybook's Angular builder document their `tsConfig` as\n // workspace-relative while setting the Vite root to the project directory,\n // so the path joins onto the project root twice. Fall back to the workspace\n // root before failing.\n const workspacePath = workspaceRoot\n ? resolve(workspaceRoot, tsconfigFilePath)\n : undefined;\n\n if (workspacePath && existsSync(workspacePath)) {\n return workspacePath;\n }\n\n const attemptedPaths =\n workspacePath && workspacePath !== resolvedPath\n ? `${resolvedPath} or ${workspacePath}`\n : resolvedPath;\n\n console.error(\n `[@analogjs/vite-plugin-angular]: Unable to resolve tsconfig at ${attemptedPaths}. This causes compilation issues. Check the path or set the \"tsconfig\" property with an absolute path.`,\n );\n\n return resolvedPath;\n}\n\nexport function createTsConfigGetter(\n tsconfigOrGetter?: string | (() => string),\n) {\n if (typeof tsconfigOrGetter === 'function') {\n return tsconfigOrGetter;\n }\n\n return () => tsconfigOrGetter || '';\n}\n\nexport interface DepOptimizerOptions {\n tsconfig: string;\n isProd: boolean;\n jit: boolean;\n watchMode: boolean;\n isTest: boolean;\n isAstroIntegration: boolean;\n}\n\nexport function createDepOptimizerConfig(opts: DepOptimizerOptions) {\n const defineOptions = {\n ngJitMode: 'false',\n ngI18nClosureMode: 'false',\n ...(opts.watchMode ? {} : { ngDevMode: 'false' }),\n };\n\n // Persist linked dependency output across dep-optimizer runs. The\n // transformer's own key covers file bytes + options, and the directory\n // is namespaced by Angular version, so entries never go stale.\n const transformCacheDir = resolveTransformCacheDir(dirname(opts.tsconfig));\n const transformCache = transformCacheDir\n ? createPersistentTransformCache(transformCacheDir)\n : undefined;\n\n const rolldownOptions: vite.DepOptimizationOptions['rolldownOptions'] = {\n plugins: [\n createRolldownCompilerPlugin(\n {\n tsconfig: opts.tsconfig,\n sourcemap: !opts.isProd,\n advancedOptimizations: opts.isProd,\n jit: opts.jit,\n incremental: opts.watchMode,\n },\n opts.isTest,\n !opts.isAstroIntegration,\n transformCache,\n ),\n ],\n };\n\n const esbuildOptions: vite.DepOptimizationOptions['esbuildOptions'] = {\n plugins: [\n createCompilerPlugin(\n {\n tsconfig: opts.tsconfig,\n sourcemap: !opts.isProd,\n advancedOptimizations: opts.isProd,\n jit: opts.jit,\n incremental: opts.watchMode,\n },\n opts.isTest,\n !opts.isAstroIntegration,\n transformCache,\n ),\n ],\n define: defineOptions,\n };\n\n // No top-level `resolve` block: the `style` package-export condition\n // is now scoped to `.css`-extension requests via\n // `cssExtensionStyleResolverPlugin`, so this dep optimizer config no\n // longer needs to leak it into Vite's global `resolve.conditions`.\n return {\n optimizeDeps: {\n include: ['rxjs/operators', 'rxjs'],\n exclude: ['@angular/platform-server'],\n ...(vite.rolldownVersion ? { rolldownOptions } : { esbuildOptions }),\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyBA,IAAa,eAAe;;;;;;;AAQ5B,SAAgB,WAAW,MAAmC;AAC5D,KAAI,SAAS,cACX,QAAO;AAGT,QAAO,SAAS,gBAAA,QAAA,IAAA,aAA4C;;AAS9D,SAAgB,gBACd,MACA,UACA,QACA,QACA,OACA,eACA;AACA,KAAI,YAAY,WAAW,SAAS,EAAE;AACpC,MAAI,CAAC,WAAW,SAAS,CACvB,SAAQ,MACN,kEAAkE,SAAS,wGAC5E;AAGH,SAAO;;CAGT,IAAI,mBAAmB;AAEvB,KAAI,MACF,oBAAmB,SACf,6BACA;AAGN,KAAI,OACF,oBAAmB;AAGrB,KAAI,SACF,oBAAmB;CAGrB,MAAM,eAAe,QAAQ,MAAM,iBAAiB;AAEpD,KAAI,WAAW,aAAa,CAC1B,QAAO;CAOT,MAAM,gBAAgB,gBAClB,QAAQ,eAAe,iBAAiB,GACxC,KAAA;AAEJ,KAAI,iBAAiB,WAAW,cAAc,CAC5C,QAAO;CAGT,MAAM,iBACJ,iBAAiB,kBAAkB,eAC/B,GAAG,aAAa,MAAM,kBACtB;AAEN,SAAQ,MACN,kEAAkE,eAAe,wGAClF;AAED,QAAO;;AAGT,SAAgB,qBACd,kBACA;AACA,KAAI,OAAO,qBAAqB,WAC9B,QAAO;AAGT,cAAa,oBAAoB;;AAYnC,SAAgB,yBAAyB,MAA2B;CAClE,MAAM,gBAAgB;EACpB,WAAW;EACX,mBAAmB;EACnB,GAAI,KAAK,YAAY,EAAE,GAAG,EAAE,WAAW,SAAS;EACjD;CAKD,MAAM,oBAAoB,yBAAyB,QAAQ,KAAK,SAAS,CAAC;CAC1E,MAAM,iBAAiB,oBACnB,+BAA+B,kBAAkB,GACjD,KAAA;CAEJ,MAAM,kBAAkE,EACtE,SAAS,CACP,6BACE;EACE,UAAU,KAAK;EACf,WAAW,CAAC,KAAK;EACjB,uBAAuB,KAAK;EAC5B,KAAK,KAAK;EACV,aAAa,KAAK;EACnB,EACD,KAAK,QACL,CAAC,KAAK,oBACN,eACD,CACF,EACF;CAED,MAAM,iBAAgE;EACpE,SAAS,CACP,qBACE;GACE,UAAU,KAAK;GACf,WAAW,CAAC,KAAK;GACjB,uBAAuB,KAAK;GAC5B,KAAK,KAAK;GACV,aAAa,KAAK;GACnB,EACD,KAAK,QACL,CAAC,KAAK,oBACN,eACD,CACF;EACD,QAAQ;EACT;AAMD,QAAO,EACL,cAAc;EACZ,SAAS,CAAC,kBAAkB,OAAO;EACnC,SAAS,CAAC,2BAA2B;EACrC,GAAI,KAAK,kBAAkB,EAAE,iBAAiB,GAAG,EAAE,gBAAgB;EACpE,EACF"}
1
+ {"version":3,"file":"plugin-config.js","names":[],"sources":["../../../../src/lib/utils/plugin-config.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, isAbsolute, resolve } from 'node:path';\nimport * as vite from 'vite';\n\nimport {\n createCompilerPlugin,\n createRolldownCompilerPlugin,\n} from '../compiler-plugin.js';\nimport {\n createPersistentTransformCache,\n resolveTransformCacheDir,\n} from './transform-cache.js';\n\n/**\n * TypeScript file extension regex\n * Match .ts / .cts / .mts extensions with an optional ?query suffix.\n * Reject .tsx — and any other `.ts<letter>…` extension like .tsrx — via\n * a negative-lookahead on a following ASCII letter, so only genuine TS\n * files pass.\n *\n * Previous form `/\\.[cm]?(ts)[^x]?\\??/` was intended to exclude `.tsx`\n * specifically (`[^x]?` = not-an-x), but the `?` quantifier also allows\n * zero characters, and any non-`x` letter was admitted — so `.tsrx`\n * and similar extensions matched by accident.\n */\nexport const TS_EXT_REGEX = /\\.[cm]?ts(?![a-z])/;\n\n// Spec files stay included — a newly added spec must join the program's\n// root names in Vitest watch mode.\nexport const EXCLUDED_TS_EXT_REGEX = /\\.d\\.[cm]?ts$/;\n\n/**\n * Resolves whether Angular should be compiled for production. An explicit\n * `development` mode wins over an ambient production `NODE_ENV` (e.g. set by\n * `storybook build` at CLI entry), so a build can opt into Angular's\n * development compilation. See #2458 and #2462.\n */\nexport function isProdMode(mode: string | undefined): boolean {\n if (mode === 'development') {\n return false;\n }\n\n return mode === 'production' || process.env['NODE_ENV'] === 'production';\n}\n\nexport interface TsConfigResolutionContext {\n root: string;\n isProd: boolean;\n isLib: boolean;\n}\n\nexport function getTsConfigPath(\n root: string,\n tsconfig: string,\n isProd: boolean,\n isTest: boolean,\n isLib: boolean,\n workspaceRoot?: string,\n) {\n if (tsconfig && isAbsolute(tsconfig)) {\n if (!existsSync(tsconfig)) {\n console.error(\n `[@analogjs/vite-plugin-angular]: Unable to resolve tsconfig at ${tsconfig}. This causes compilation issues. Check the path or set the \"tsconfig\" property with an absolute path.`,\n );\n }\n\n return tsconfig;\n }\n\n let tsconfigFilePath = './tsconfig.app.json';\n\n if (isLib) {\n tsconfigFilePath = isProd\n ? './tsconfig.lib.prod.json'\n : './tsconfig.lib.json';\n }\n\n if (isTest) {\n tsconfigFilePath = './tsconfig.spec.json';\n }\n\n if (tsconfig) {\n tsconfigFilePath = tsconfig;\n }\n\n const resolvedPath = resolve(root, tsconfigFilePath);\n\n if (existsSync(resolvedPath)) {\n return resolvedPath;\n }\n\n // Callers such as Storybook's Angular builder document their `tsConfig` as\n // workspace-relative while setting the Vite root to the project directory,\n // so the path joins onto the project root twice. Fall back to the workspace\n // root before failing.\n const workspacePath = workspaceRoot\n ? resolve(workspaceRoot, tsconfigFilePath)\n : undefined;\n\n if (workspacePath && existsSync(workspacePath)) {\n return workspacePath;\n }\n\n const attemptedPaths =\n workspacePath && workspacePath !== resolvedPath\n ? `${resolvedPath} or ${workspacePath}`\n : resolvedPath;\n\n console.error(\n `[@analogjs/vite-plugin-angular]: Unable to resolve tsconfig at ${attemptedPaths}. This causes compilation issues. Check the path or set the \"tsconfig\" property with an absolute path.`,\n );\n\n return resolvedPath;\n}\n\nexport function createTsConfigGetter(\n tsconfigOrGetter?: string | (() => string),\n) {\n if (typeof tsconfigOrGetter === 'function') {\n return tsconfigOrGetter;\n }\n\n return () => tsconfigOrGetter || '';\n}\n\nexport interface DepOptimizerOptions {\n tsconfig: string;\n isProd: boolean;\n jit: boolean;\n watchMode: boolean;\n isTest: boolean;\n isAstroIntegration: boolean;\n}\n\nexport function createDepOptimizerConfig(opts: DepOptimizerOptions) {\n const defineOptions = {\n ngJitMode: 'false',\n ngI18nClosureMode: 'false',\n ...(opts.watchMode ? {} : { ngDevMode: 'false' }),\n };\n\n // Persist linked dependency output across dep-optimizer runs. The\n // transformer's own key covers file bytes + options, and the directory\n // is namespaced by Angular version, so entries never go stale.\n const transformCacheDir = resolveTransformCacheDir(dirname(opts.tsconfig));\n const transformCache = transformCacheDir\n ? createPersistentTransformCache(transformCacheDir)\n : undefined;\n\n const rolldownOptions: vite.DepOptimizationOptions['rolldownOptions'] = {\n plugins: [\n createRolldownCompilerPlugin(\n {\n tsconfig: opts.tsconfig,\n sourcemap: !opts.isProd,\n advancedOptimizations: opts.isProd,\n jit: opts.jit,\n incremental: opts.watchMode,\n },\n opts.isTest,\n !opts.isAstroIntegration,\n transformCache,\n ),\n ],\n };\n\n const esbuildOptions: vite.DepOptimizationOptions['esbuildOptions'] = {\n plugins: [\n createCompilerPlugin(\n {\n tsconfig: opts.tsconfig,\n sourcemap: !opts.isProd,\n advancedOptimizations: opts.isProd,\n jit: opts.jit,\n incremental: opts.watchMode,\n },\n opts.isTest,\n !opts.isAstroIntegration,\n transformCache,\n ),\n ],\n define: defineOptions,\n };\n\n // No top-level `resolve` block: the `style` package-export condition\n // is now scoped to `.css`-extension requests via\n // `cssExtensionStyleResolverPlugin`, so this dep optimizer config no\n // longer needs to leak it into Vite's global `resolve.conditions`.\n return {\n optimizeDeps: {\n include: ['rxjs/operators', 'rxjs'],\n exclude: ['@angular/platform-server'],\n ...(vite.rolldownVersion ? { rolldownOptions } : { esbuildOptions }),\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyBA,IAAa,eAAe;AAI5B,IAAa,wBAAwB;;;;;;;AAQrC,SAAgB,WAAW,MAAmC;AAC5D,KAAI,SAAS,cACX,QAAO;AAGT,QAAO,SAAS,gBAAA,QAAA,IAAA,aAA4C;;AAS9D,SAAgB,gBACd,MACA,UACA,QACA,QACA,OACA,eACA;AACA,KAAI,YAAY,WAAW,SAAS,EAAE;AACpC,MAAI,CAAC,WAAW,SAAS,CACvB,SAAQ,MACN,kEAAkE,SAAS,wGAC5E;AAGH,SAAO;;CAGT,IAAI,mBAAmB;AAEvB,KAAI,MACF,oBAAmB,SACf,6BACA;AAGN,KAAI,OACF,oBAAmB;AAGrB,KAAI,SACF,oBAAmB;CAGrB,MAAM,eAAe,QAAQ,MAAM,iBAAiB;AAEpD,KAAI,WAAW,aAAa,CAC1B,QAAO;CAOT,MAAM,gBAAgB,gBAClB,QAAQ,eAAe,iBAAiB,GACxC,KAAA;AAEJ,KAAI,iBAAiB,WAAW,cAAc,CAC5C,QAAO;CAGT,MAAM,iBACJ,iBAAiB,kBAAkB,eAC/B,GAAG,aAAa,MAAM,kBACtB;AAEN,SAAQ,MACN,kEAAkE,eAAe,wGAClF;AAED,QAAO;;AAGT,SAAgB,qBACd,kBACA;AACA,KAAI,OAAO,qBAAqB,WAC9B,QAAO;AAGT,cAAa,oBAAoB;;AAYnC,SAAgB,yBAAyB,MAA2B;CAClE,MAAM,gBAAgB;EACpB,WAAW;EACX,mBAAmB;EACnB,GAAI,KAAK,YAAY,EAAE,GAAG,EAAE,WAAW,SAAS;EACjD;CAKD,MAAM,oBAAoB,yBAAyB,QAAQ,KAAK,SAAS,CAAC;CAC1E,MAAM,iBAAiB,oBACnB,+BAA+B,kBAAkB,GACjD,KAAA;CAEJ,MAAM,kBAAkE,EACtE,SAAS,CACP,6BACE;EACE,UAAU,KAAK;EACf,WAAW,CAAC,KAAK;EACjB,uBAAuB,KAAK;EAC5B,KAAK,KAAK;EACV,aAAa,KAAK;EACnB,EACD,KAAK,QACL,CAAC,KAAK,oBACN,eACD,CACF,EACF;CAED,MAAM,iBAAgE;EACpE,SAAS,CACP,qBACE;GACE,UAAU,KAAK;GACf,WAAW,CAAC,KAAK;GACjB,uBAAuB,KAAK;GAC5B,KAAK,KAAK;GACV,aAAa,KAAK;GACnB,EACD,KAAK,QACL,CAAC,KAAK,oBACN,eACD,CACF;EACD,QAAQ;EACT;AAMD,QAAO,EACL,cAAc;EACZ,SAAS,CAAC,kBAAkB,OAAO;EACnC,SAAS,CAAC,2BAA2B;EACrC,GAAI,KAAK,kBAAkB,EAAE,iBAAiB,GAAG,EAAE,gBAAgB;EACpE,EACF"}