angular-rust-plugins 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +118 -0
  2. package/binding/angular-binding.darwin-arm64.node +0 -0
  3. package/binding/index.d.ts +13 -0
  4. package/binding/index.js +316 -0
  5. package/binding/package.json +1 -0
  6. package/compiler/index.cjs +135 -0
  7. package/compiler/index.cjs.map +1 -0
  8. package/compiler/index.d.cts +12 -0
  9. package/compiler/index.d.ts +12 -0
  10. package/compiler/index.js +107 -0
  11. package/compiler/index.js.map +1 -0
  12. package/compiler/vite.cjs +135 -0
  13. package/compiler/vite.cjs.map +1 -0
  14. package/compiler/vite.d.cts +41 -0
  15. package/compiler/vite.d.ts +41 -0
  16. package/compiler/vite.js +109 -0
  17. package/compiler/vite.js.map +1 -0
  18. package/index.cjs +479 -0
  19. package/index.cjs.map +1 -0
  20. package/index.d.cts +8 -0
  21. package/index.d.ts +8 -0
  22. package/index.js +438 -0
  23. package/index.js.map +1 -0
  24. package/linker/esbuild.cjs +125 -0
  25. package/linker/esbuild.cjs.map +1 -0
  26. package/linker/esbuild.d.cts +39 -0
  27. package/linker/esbuild.d.ts +39 -0
  28. package/linker/esbuild.js +99 -0
  29. package/linker/esbuild.js.map +1 -0
  30. package/linker/index.cjs +372 -0
  31. package/linker/index.cjs.map +1 -0
  32. package/linker/index.d.cts +6 -0
  33. package/linker/index.d.ts +6 -0
  34. package/linker/index.js +333 -0
  35. package/linker/index.js.map +1 -0
  36. package/linker/rolldown.cjs +135 -0
  37. package/linker/rolldown.cjs.map +1 -0
  38. package/linker/rolldown.d.cts +36 -0
  39. package/linker/rolldown.d.ts +36 -0
  40. package/linker/rolldown.js +109 -0
  41. package/linker/rolldown.js.map +1 -0
  42. package/linker/vite.cjs +184 -0
  43. package/linker/vite.cjs.map +1 -0
  44. package/linker/vite.d.cts +58 -0
  45. package/linker/vite.d.ts +58 -0
  46. package/linker/vite.js +155 -0
  47. package/linker/vite.js.map +1 -0
  48. package/package.json +77 -0
  49. package/types-BTaYbdhr.d.cts +45 -0
  50. package/types-BTaYbdhr.d.ts +45 -0
package/index.js ADDED
@@ -0,0 +1,438 @@
1
+ // src/linker/esbuild.ts
2
+ import { promises as fs } from "fs";
3
+ import { createRequire } from "module";
4
+ import { dirname, join } from "path";
5
+ import { fileURLToPath } from "url";
6
+
7
+ // src/linker/types.ts
8
+ function needsLinking(code) {
9
+ return code.includes("\u0275\u0275ngDeclare");
10
+ }
11
+ function isAngularPackage(id) {
12
+ return id.includes("@angular") || id.includes("/@angular/");
13
+ }
14
+ function isJsFile(id) {
15
+ const cleanId = id.split("?")[0];
16
+ return cleanId.endsWith(".mjs") || cleanId.endsWith(".js");
17
+ }
18
+ function cleanModuleId(id) {
19
+ return id.split("?")[0];
20
+ }
21
+ var ANGULAR_PACKAGES = [
22
+ "@angular/core",
23
+ "@angular/common",
24
+ "@angular/platform-browser",
25
+ "@angular/platform-browser-dynamic",
26
+ "@angular/router",
27
+ "@angular/forms",
28
+ "@angular/animations",
29
+ "@angular/cdk",
30
+ "@angular/material"
31
+ ];
32
+ var NON_ANGULAR_PACKAGES = ["zone.js", "rxjs", "rxjs/operators"];
33
+
34
+ // src/linker/esbuild.ts
35
+ var compilerInstance = null;
36
+ function getCompiler(options) {
37
+ if (compilerInstance) {
38
+ return compilerInstance;
39
+ }
40
+ try {
41
+ let binding;
42
+ if (options?.bindingPath) {
43
+ const require2 = createRequire(import.meta.url);
44
+ binding = require2(options.bindingPath);
45
+ } else {
46
+ const currentFileUrl = import.meta.url;
47
+ const currentFilePath = fileURLToPath(currentFileUrl);
48
+ const currentDir = dirname(currentFilePath);
49
+ const require2 = createRequire(currentFileUrl);
50
+ const possiblePaths = [
51
+ join(currentDir, "..", "binding"),
52
+ // dist/linker/../binding
53
+ join(currentDir, "binding"),
54
+ // same directory
55
+ join(currentDir, "..", "..", "binding")
56
+ // deeper nesting
57
+ ];
58
+ let loadedBinding = null;
59
+ let lastError = null;
60
+ for (const bindingPath of possiblePaths) {
61
+ try {
62
+ loadedBinding = require2(bindingPath);
63
+ break;
64
+ } catch (e) {
65
+ lastError = e;
66
+ }
67
+ }
68
+ if (!loadedBinding) {
69
+ throw lastError || new Error("Could not find binding in any expected location");
70
+ }
71
+ binding = loadedBinding;
72
+ }
73
+ compilerInstance = new binding.Compiler();
74
+ return compilerInstance;
75
+ } catch (e) {
76
+ throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);
77
+ }
78
+ }
79
+ function angularLinkerEsbuildPlugin(options) {
80
+ return {
81
+ name: "angular-linker-esbuild",
82
+ setup(build) {
83
+ const compiler = getCompiler(options);
84
+ const debug = options?.debug ?? false;
85
+ build.onLoad({ filter: /@angular\/.*\.(mjs|js)$/ }, async (args) => {
86
+ if (debug) {
87
+ console.log(`[Angular Linker] Processing: ${args.path}`);
88
+ }
89
+ const code = await fs.readFile(args.path, "utf8");
90
+ if (!needsLinking(code)) {
91
+ return { contents: code, loader: "js" };
92
+ }
93
+ try {
94
+ const result = compiler.linkFile(args.path, code);
95
+ if (result.startsWith("/* Linker Error")) {
96
+ if (debug) {
97
+ console.error(`[Angular Linker Error] ${args.path}:
98
+ ${result}`);
99
+ }
100
+ return { contents: code, loader: "js" };
101
+ }
102
+ if (debug) {
103
+ console.log(`[Angular Linker] Successfully linked: ${args.path}`);
104
+ }
105
+ return { contents: result, loader: "js" };
106
+ } catch (e) {
107
+ if (debug) {
108
+ console.error(`[Angular Linker Failed] ${args.path}:`, e);
109
+ }
110
+ return { contents: code, loader: "js" };
111
+ }
112
+ });
113
+ }
114
+ };
115
+ }
116
+
117
+ // src/linker/rolldown.ts
118
+ import { createRequire as createRequire2 } from "module";
119
+ import { dirname as dirname2, join as join2 } from "path";
120
+ import { fileURLToPath as fileURLToPath2 } from "url";
121
+ var compilerInstance2 = null;
122
+ function getCompiler2(options) {
123
+ if (compilerInstance2) {
124
+ return compilerInstance2;
125
+ }
126
+ try {
127
+ let binding;
128
+ if (options?.bindingPath) {
129
+ const require2 = createRequire2(import.meta.url);
130
+ binding = require2(options.bindingPath);
131
+ } else {
132
+ const currentFileUrl = import.meta.url;
133
+ const currentFilePath = fileURLToPath2(currentFileUrl);
134
+ const currentDir = dirname2(currentFilePath);
135
+ const require2 = createRequire2(currentFileUrl);
136
+ const possiblePaths = [
137
+ join2(currentDir, "..", "binding"),
138
+ // dist/linker/../binding
139
+ join2(currentDir, "binding"),
140
+ // same directory
141
+ join2(currentDir, "..", "..", "binding")
142
+ // deeper nesting
143
+ ];
144
+ let loadedBinding = null;
145
+ let lastError = null;
146
+ for (const bindingPath of possiblePaths) {
147
+ try {
148
+ loadedBinding = require2(bindingPath);
149
+ break;
150
+ } catch (e) {
151
+ lastError = e;
152
+ }
153
+ }
154
+ if (!loadedBinding) {
155
+ throw lastError || new Error("Could not find binding in any expected location");
156
+ }
157
+ binding = loadedBinding;
158
+ }
159
+ compilerInstance2 = new binding.Compiler();
160
+ return compilerInstance2;
161
+ } catch (e) {
162
+ throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);
163
+ }
164
+ }
165
+ function angularLinkerRolldownPlugin(options) {
166
+ const debug = options?.debug ?? false;
167
+ let compiler;
168
+ return {
169
+ name: "angular-linker-rolldown",
170
+ async transform(code, id) {
171
+ if (!compiler) {
172
+ compiler = getCompiler2(options);
173
+ }
174
+ const isInNodeModules = id.includes("node_modules");
175
+ const cleanId = cleanModuleId(id);
176
+ if (!isAngularPackage(id) || !isInNodeModules || !isJsFile(id)) {
177
+ return null;
178
+ }
179
+ if (!needsLinking(code)) {
180
+ return null;
181
+ }
182
+ if (debug) {
183
+ console.log(`[Angular Linker] Linking: ${cleanId}`);
184
+ }
185
+ try {
186
+ const result = compiler.linkFile(cleanId, code);
187
+ if (result.startsWith("/* Linker Error")) {
188
+ console.error(`[Angular Linker Error] ${id}:
189
+ ${result}`);
190
+ return null;
191
+ }
192
+ if (debug) {
193
+ console.log(`[Angular Linker] Successfully linked: ${cleanId}`);
194
+ }
195
+ return { code: result, map: null };
196
+ } catch (e) {
197
+ console.error(`[Angular Linker Failed] ${id}:`, e);
198
+ return null;
199
+ }
200
+ }
201
+ };
202
+ }
203
+
204
+ // src/linker/vite.ts
205
+ import { createRequire as createRequire3 } from "module";
206
+ import { dirname as dirname3, join as join3 } from "path";
207
+ import { fileURLToPath as fileURLToPath3 } from "url";
208
+ var compilerInstance3 = null;
209
+ function getCompiler3(options) {
210
+ if (compilerInstance3) {
211
+ return compilerInstance3;
212
+ }
213
+ try {
214
+ let binding;
215
+ if (options?.bindingPath) {
216
+ const require2 = createRequire3(import.meta.url);
217
+ binding = require2(options.bindingPath);
218
+ } else {
219
+ const currentFileUrl = import.meta.url;
220
+ const currentFilePath = fileURLToPath3(currentFileUrl);
221
+ const currentDir = dirname3(currentFilePath);
222
+ const require2 = createRequire3(currentFileUrl);
223
+ const possiblePaths = [
224
+ join3(currentDir, "..", "binding"),
225
+ // dist/linker/../binding
226
+ join3(currentDir, "binding"),
227
+ // same directory
228
+ join3(currentDir, "..", "..", "binding")
229
+ // deeper nesting
230
+ ];
231
+ let loadedBinding = null;
232
+ let lastError = null;
233
+ for (const bindingPath of possiblePaths) {
234
+ try {
235
+ loadedBinding = require2(bindingPath);
236
+ break;
237
+ } catch (e) {
238
+ lastError = e;
239
+ }
240
+ }
241
+ if (!loadedBinding) {
242
+ throw lastError || new Error("Could not find binding in any expected location");
243
+ }
244
+ binding = loadedBinding;
245
+ }
246
+ compilerInstance3 = new binding.Compiler();
247
+ return compilerInstance3;
248
+ } catch (e) {
249
+ throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);
250
+ }
251
+ }
252
+ function angularLinkerVitePlugin(options) {
253
+ const debug = options?.debug ?? false;
254
+ let compiler;
255
+ return {
256
+ name: "angular-linker-vite",
257
+ enforce: "pre",
258
+ config(config) {
259
+ const excludePackages = [
260
+ ...ANGULAR_PACKAGES,
261
+ ...options?.excludePackages ?? []
262
+ ];
263
+ const includePackages = [
264
+ ...NON_ANGULAR_PACKAGES,
265
+ ...options?.includePackages ?? []
266
+ ];
267
+ return {
268
+ optimizeDeps: {
269
+ exclude: excludePackages,
270
+ include: includePackages
271
+ }
272
+ };
273
+ },
274
+ transform(code, id) {
275
+ if (!compiler) {
276
+ compiler = getCompiler3(options);
277
+ }
278
+ if (!id.includes("node_modules")) {
279
+ return null;
280
+ }
281
+ if (!isAngularPackage(id)) {
282
+ return null;
283
+ }
284
+ if (!isJsFile(id)) {
285
+ return null;
286
+ }
287
+ if (!needsLinking(code)) {
288
+ return null;
289
+ }
290
+ const cleanId = cleanModuleId(id);
291
+ if (debug) {
292
+ console.log(`[Angular Linker] Linking: ${cleanId}`);
293
+ }
294
+ try {
295
+ const result = compiler.linkFile(cleanId, code);
296
+ if (result.startsWith("/* Linker Error")) {
297
+ console.error(`[Angular Linker Error] ${id}:
298
+ ${result}`);
299
+ return null;
300
+ }
301
+ if (debug) {
302
+ console.log(`[Angular Linker] Successfully linked: ${cleanId}`);
303
+ }
304
+ return { code: result, map: null };
305
+ } catch (e) {
306
+ console.error(`[Angular Linker Failed] ${id}:`, e);
307
+ return null;
308
+ }
309
+ }
310
+ };
311
+ }
312
+ function getAngularViteConfig() {
313
+ return {
314
+ plugins: [angularLinkerVitePlugin()],
315
+ optimizeDeps: {
316
+ exclude: ANGULAR_PACKAGES,
317
+ include: NON_ANGULAR_PACKAGES
318
+ }
319
+ };
320
+ }
321
+
322
+ // src/compiler/vite.ts
323
+ import { createRequire as createRequire4 } from "module";
324
+ import { dirname as dirname4, join as join4 } from "path";
325
+ import { fileURLToPath as fileURLToPath4 } from "url";
326
+ var compilerInstance4 = null;
327
+ function getCompiler4(options) {
328
+ if (compilerInstance4) {
329
+ return compilerInstance4;
330
+ }
331
+ try {
332
+ let binding;
333
+ if (options?.bindingPath) {
334
+ const require2 = createRequire4(import.meta.url);
335
+ binding = require2(options.bindingPath);
336
+ } else {
337
+ const currentFileUrl = import.meta.url;
338
+ const currentFilePath = fileURLToPath4(currentFileUrl);
339
+ const currentDir = dirname4(currentFilePath);
340
+ const require2 = createRequire4(currentFileUrl);
341
+ const possiblePaths = [
342
+ join4(currentDir, "..", "binding"),
343
+ // dist/compiler/../binding
344
+ join4(currentDir, "..", "..", "binding"),
345
+ // in case of deeper nesting
346
+ join4(currentDir, "binding")
347
+ // same directory
348
+ ];
349
+ let loadedBinding = null;
350
+ let lastError = null;
351
+ for (const bindingPath of possiblePaths) {
352
+ try {
353
+ loadedBinding = require2(bindingPath);
354
+ break;
355
+ } catch (e) {
356
+ lastError = e;
357
+ }
358
+ }
359
+ if (!loadedBinding) {
360
+ throw lastError || new Error("Could not find binding in any expected location");
361
+ }
362
+ binding = loadedBinding;
363
+ }
364
+ compilerInstance4 = new binding.Compiler();
365
+ return compilerInstance4;
366
+ } catch (e) {
367
+ throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);
368
+ }
369
+ }
370
+ function angularCompilerVitePlugin(options) {
371
+ const debug = options?.debug ?? false;
372
+ let compiler;
373
+ return {
374
+ name: "angular-rust-compiler",
375
+ enforce: "pre",
376
+ transform(code, id) {
377
+ if (!compiler) {
378
+ compiler = getCompiler4(options);
379
+ }
380
+ if (id.includes("node_modules")) {
381
+ return null;
382
+ }
383
+ if (!id.endsWith(".ts") || id.endsWith(".d.ts")) {
384
+ return null;
385
+ }
386
+ if (debug) {
387
+ console.log(`[Angular Compiler] Compiling: ${id}`);
388
+ }
389
+ try {
390
+ const result = compiler.compile(id, code);
391
+ if (result.startsWith("/* Error")) {
392
+ console.error(`[Angular Compiler Error] ${id}:
393
+ ${result}`);
394
+ throw new Error(`Rust Compilation Failed for ${id}`);
395
+ }
396
+ if (debug) {
397
+ console.log(`[Angular Compiler] Successfully compiled: ${id}`);
398
+ }
399
+ return { code: result, map: null };
400
+ } catch (e) {
401
+ console.error(`[Angular Compiler Failed] ${id}:`, e);
402
+ throw e;
403
+ }
404
+ },
405
+ handleHotUpdate({ file, server }) {
406
+ if (file.endsWith(".html")) {
407
+ const tsFile = file.replace(/\.html$/, ".ts");
408
+ if (debug) {
409
+ console.log(`[HMR] HTML changed: ${file}`);
410
+ console.log(`[HMR] Invalidating TS: ${tsFile}`);
411
+ }
412
+ const mod = server.moduleGraph.getModuleById(tsFile);
413
+ if (mod) {
414
+ server.moduleGraph.invalidateModule(mod);
415
+ server.ws.send({ type: "full-reload", path: "*" });
416
+ return [];
417
+ } else {
418
+ server.ws.send({ type: "full-reload", path: "*" });
419
+ return [];
420
+ }
421
+ }
422
+ }
423
+ };
424
+ }
425
+ export {
426
+ ANGULAR_PACKAGES,
427
+ NON_ANGULAR_PACKAGES,
428
+ angularCompilerVitePlugin,
429
+ angularLinkerEsbuildPlugin,
430
+ angularLinkerRolldownPlugin,
431
+ angularLinkerVitePlugin,
432
+ cleanModuleId,
433
+ getAngularViteConfig,
434
+ isAngularPackage,
435
+ isJsFile,
436
+ needsLinking
437
+ };
438
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/linker/esbuild.ts","../src/linker/types.ts","../src/linker/rolldown.ts","../src/linker/vite.ts","../src/compiler/vite.ts"],"sourcesContent":["/**\n * Angular Linker Plugin for esbuild\n *\n * Use this plugin with Vite's optimizeDeps.esbuildOptions or standalone esbuild.\n *\n * @example\n * ```js\n * import { angularLinkerEsbuildPlugin } from 'vite-plugin-angular-rust/esbuild';\n *\n * // With esbuild\n * import esbuild from 'esbuild';\n *\n * esbuild.build({\n * plugins: [angularLinkerEsbuildPlugin()],\n * // ...\n * });\n *\n * // With Vite\n * import { defineConfig } from 'vite';\n *\n * export default defineConfig({\n * optimizeDeps: {\n * esbuildOptions: {\n * plugins: [angularLinkerEsbuildPlugin()],\n * },\n * },\n * });\n * ```\n */\n\nimport type { Plugin } from \"esbuild\";\nimport { promises as fs } from \"fs\";\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { CompilerBinding, LinkerOptions } from \"./types\";\nimport { needsLinking } from \"./types\";\n\nlet compilerInstance: CompilerBinding | null = null;\n\nfunction getCompiler(options?: LinkerOptions): CompilerBinding {\n if (compilerInstance) {\n return compilerInstance;\n }\n\n try {\n let binding: { Compiler: new () => CompilerBinding };\n\n if (options?.bindingPath) {\n const require = createRequire(import.meta.url);\n binding = require(options.bindingPath);\n } else {\n // Load from bundled binding directory\n const currentFileUrl = import.meta.url;\n const currentFilePath = fileURLToPath(currentFileUrl);\n const currentDir = dirname(currentFilePath);\n const require = createRequire(currentFileUrl);\n\n // Try multiple possible binding locations\n const possiblePaths = [\n join(currentDir, \"..\", \"binding\"), // dist/linker/../binding\n join(currentDir, \"binding\"), // same directory\n join(currentDir, \"..\", \"..\", \"binding\"), // deeper nesting\n ];\n\n let loadedBinding: { Compiler: new () => CompilerBinding } | null = null;\n let lastError: unknown = null;\n\n for (const bindingPath of possiblePaths) {\n try {\n loadedBinding = require(bindingPath);\n break;\n } catch (e) {\n lastError = e;\n }\n }\n\n if (!loadedBinding) {\n throw (\n lastError ||\n new Error(\"Could not find binding in any expected location\")\n );\n }\n\n binding = loadedBinding;\n }\n\n compilerInstance = new binding.Compiler();\n return compilerInstance;\n } catch (e) {\n throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);\n }\n}\n\n/**\n * Creates an esbuild plugin for Angular linker\n */\nexport function angularLinkerEsbuildPlugin(options?: LinkerOptions): Plugin {\n return {\n name: \"angular-linker-esbuild\",\n setup(build) {\n const compiler = getCompiler(options);\n const debug = options?.debug ?? false;\n\n // Handle all .mjs and .js files in @angular packages\n build.onLoad({ filter: /@angular\\/.*\\.(mjs|js)$/ }, async (args) => {\n if (debug) {\n console.log(`[Angular Linker] Processing: ${args.path}`);\n }\n\n const code = await fs.readFile(args.path, \"utf8\");\n\n // Check if file contains partial declarations\n if (!needsLinking(code)) {\n return { contents: code, loader: \"js\" };\n }\n\n try {\n const result = compiler.linkFile(args.path, code);\n\n if (result.startsWith(\"/* Linker Error\")) {\n if (debug) {\n console.error(`[Angular Linker Error] ${args.path}:\\n${result}`);\n }\n return { contents: code, loader: \"js\" };\n }\n\n if (debug) {\n console.log(`[Angular Linker] Successfully linked: ${args.path}`);\n }\n\n return { contents: result, loader: \"js\" };\n } catch (e) {\n if (debug) {\n console.error(`[Angular Linker Failed] ${args.path}:`, e);\n }\n return { contents: code, loader: \"js\" };\n }\n });\n },\n };\n}\n\nexport default angularLinkerEsbuildPlugin;\n","/**\n * Angular Linker Plugin Types\n */\n\nexport interface LinkerOptions {\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Custom path to the Angular Rust binding package\n * If not specified, will try to resolve @anthropic/angular-rust-binding\n */\n bindingPath?: string;\n}\n\nexport interface LinkerResult {\n code: string;\n map: null | undefined;\n}\n\nexport interface CompilerBinding {\n linkFile(filePath: string, code: string): string;\n compile?(filePath: string, code: string): string;\n}\n\n/**\n * Check if file contains Angular partial declarations that need linking\n */\nexport function needsLinking(code: string): boolean {\n return code.includes(\"ɵɵngDeclare\");\n}\n\n/**\n * Check if file is an Angular package file\n */\nexport function isAngularPackage(id: string): boolean {\n return id.includes(\"@angular\") || id.includes(\"/@angular/\");\n}\n\n/**\n * Check if file is a JavaScript/MJS file\n */\nexport function isJsFile(id: string): boolean {\n const cleanId = id.split(\"?\")[0];\n return cleanId.endsWith(\".mjs\") || cleanId.endsWith(\".js\");\n}\n\n/**\n * Clean module ID by removing query strings\n */\nexport function cleanModuleId(id: string): string {\n return id.split(\"?\")[0];\n}\n\n/**\n * Default Angular packages to exclude from pre-bundling\n */\nexport const ANGULAR_PACKAGES = [\n \"@angular/core\",\n \"@angular/common\",\n \"@angular/platform-browser\",\n \"@angular/platform-browser-dynamic\",\n \"@angular/router\",\n \"@angular/forms\",\n \"@angular/animations\",\n \"@angular/cdk\",\n \"@angular/material\",\n];\n\n/**\n * Packages that don't need linking and should be included in pre-bundling\n */\nexport const NON_ANGULAR_PACKAGES = [\"zone.js\", \"rxjs\", \"rxjs/operators\"];\n","/**\n * Angular Linker Plugin for Rolldown\n *\n * Use this plugin with rolldown-vite or standalone Rolldown.\n *\n * @example\n * ```js\n * import { angularLinkerRolldownPlugin } from 'vite-plugin-angular-rust/rolldown';\n * import { defineConfig } from 'vite';\n *\n * export default defineConfig({\n * plugins: [angularLinkerRolldownPlugin()],\n * optimizeDeps: {\n * exclude: [\n * '@angular/core',\n * '@angular/common',\n * '@angular/platform-browser',\n * '@angular/router',\n * ],\n * },\n * });\n * ```\n */\n\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { CompilerBinding, LinkerOptions, LinkerResult } from \"./types\";\nimport {\n needsLinking,\n isAngularPackage,\n isJsFile,\n cleanModuleId,\n} from \"./types\";\n\nlet compilerInstance: CompilerBinding | null = null;\n\nfunction getCompiler(options?: LinkerOptions): CompilerBinding {\n if (compilerInstance) {\n return compilerInstance;\n }\n\n try {\n let binding: { Compiler: new () => CompilerBinding };\n\n if (options?.bindingPath) {\n const require = createRequire(import.meta.url);\n binding = require(options.bindingPath);\n } else {\n // Load from bundled binding directory\n const currentFileUrl = import.meta.url;\n const currentFilePath = fileURLToPath(currentFileUrl);\n const currentDir = dirname(currentFilePath);\n const require = createRequire(currentFileUrl);\n\n // Try multiple possible binding locations\n const possiblePaths = [\n join(currentDir, \"..\", \"binding\"), // dist/linker/../binding\n join(currentDir, \"binding\"), // same directory\n join(currentDir, \"..\", \"..\", \"binding\"), // deeper nesting\n ];\n\n let loadedBinding: { Compiler: new () => CompilerBinding } | null = null;\n let lastError: unknown = null;\n\n for (const bindingPath of possiblePaths) {\n try {\n loadedBinding = require(bindingPath);\n break;\n } catch (e) {\n lastError = e;\n }\n }\n\n if (!loadedBinding) {\n throw (\n lastError ||\n new Error(\"Could not find binding in any expected location\")\n );\n }\n\n binding = loadedBinding;\n }\n\n compilerInstance = new binding.Compiler();\n return compilerInstance;\n } catch (e) {\n throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);\n }\n}\n\nexport interface RolldownPlugin {\n name: string;\n transform(\n code: string,\n id: string\n ): Promise<LinkerResult | null> | LinkerResult | null;\n}\n\n/**\n * Creates a Rolldown-compatible plugin for Angular linker\n */\nexport function angularLinkerRolldownPlugin(\n options?: LinkerOptions\n): RolldownPlugin {\n const debug = options?.debug ?? false;\n let compiler: CompilerBinding;\n\n return {\n name: \"angular-linker-rolldown\",\n async transform(code: string, id: string): Promise<LinkerResult | null> {\n // Lazy initialize compiler\n if (!compiler) {\n compiler = getCompiler(options);\n }\n\n // Only process @angular packages with .mjs or .js extensions\n const isInNodeModules = id.includes(\"node_modules\");\n const cleanId = cleanModuleId(id);\n\n if (!isAngularPackage(id) || !isInNodeModules || !isJsFile(id)) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!needsLinking(code)) {\n return null;\n }\n\n if (debug) {\n console.log(`[Angular Linker] Linking: ${cleanId}`);\n }\n\n try {\n const result = compiler.linkFile(cleanId, code);\n\n if (result.startsWith(\"/* Linker Error\")) {\n console.error(`[Angular Linker Error] ${id}:\\n${result}`);\n return null;\n }\n\n if (debug) {\n console.log(`[Angular Linker] Successfully linked: ${cleanId}`);\n }\n\n return { code: result, map: null };\n } catch (e) {\n console.error(`[Angular Linker Failed] ${id}:`, e);\n return null;\n }\n },\n };\n}\n\nexport default angularLinkerRolldownPlugin;\n","/**\n * Angular Linker Plugin for Vite\n *\n * This plugin handles Angular linking for both Vite's dev server (with rolldown/esbuild)\n * and production builds.\n *\n * @example\n * ```js\n * import { angularLinkerVitePlugin } from 'vite-plugin-angular-rust/vite';\n * import { defineConfig } from 'vite';\n *\n * export default defineConfig({\n * plugins: [angularLinkerVitePlugin()],\n * optimizeDeps: {\n * exclude: [\n * '@angular/core',\n * '@angular/common',\n * '@angular/platform-browser',\n * '@angular/router',\n * '@angular/forms',\n * ],\n * include: ['zone.js', 'rxjs', 'rxjs/operators'],\n * },\n * });\n * ```\n */\n\nimport type { Plugin } from \"vite\";\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { CompilerBinding, LinkerOptions } from \"./types\";\nimport {\n needsLinking,\n isAngularPackage,\n isJsFile,\n cleanModuleId,\n ANGULAR_PACKAGES,\n NON_ANGULAR_PACKAGES,\n} from \"./types\";\n\nlet compilerInstance: CompilerBinding | null = null;\n\nfunction getCompiler(options?: LinkerOptions): CompilerBinding {\n if (compilerInstance) {\n return compilerInstance;\n }\n\n try {\n let binding: { Compiler: new () => CompilerBinding };\n\n if (options?.bindingPath) {\n const require = createRequire(import.meta.url);\n binding = require(options.bindingPath);\n } else {\n // Load from bundled binding directory\n const currentFileUrl = import.meta.url;\n const currentFilePath = fileURLToPath(currentFileUrl);\n const currentDir = dirname(currentFilePath);\n const require = createRequire(currentFileUrl);\n\n // Try multiple possible binding locations\n const possiblePaths = [\n join(currentDir, \"..\", \"binding\"), // dist/linker/../binding\n join(currentDir, \"binding\"), // same directory\n join(currentDir, \"..\", \"..\", \"binding\"), // deeper nesting\n ];\n\n let loadedBinding: { Compiler: new () => CompilerBinding } | null = null;\n let lastError: unknown = null;\n\n for (const bindingPath of possiblePaths) {\n try {\n loadedBinding = require(bindingPath);\n break;\n } catch (e) {\n lastError = e;\n }\n }\n\n if (!loadedBinding) {\n throw (\n lastError ||\n new Error(\"Could not find binding in any expected location\")\n );\n }\n\n binding = loadedBinding;\n }\n\n compilerInstance = new binding.Compiler();\n return compilerInstance;\n } catch (e) {\n throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);\n }\n}\n\nexport interface ViteLinkerPluginOptions extends LinkerOptions {\n /**\n * Additional packages to exclude from pre-bundling\n */\n excludePackages?: string[];\n\n /**\n * Additional packages to include in pre-bundling (non-Angular packages)\n */\n includePackages?: string[];\n}\n\n/**\n * Creates a Vite plugin for Angular linker\n * Works with both rolldown-vite and standard Vite (esbuild)\n */\nexport function angularLinkerVitePlugin(\n options?: ViteLinkerPluginOptions\n): Plugin {\n const debug = options?.debug ?? false;\n let compiler: CompilerBinding;\n\n return {\n name: \"angular-linker-vite\",\n enforce: \"pre\",\n\n config(config) {\n // Merge optimizeDeps configuration\n const excludePackages = [\n ...ANGULAR_PACKAGES,\n ...(options?.excludePackages ?? []),\n ];\n const includePackages = [\n ...NON_ANGULAR_PACKAGES,\n ...(options?.includePackages ?? []),\n ];\n\n return {\n optimizeDeps: {\n exclude: excludePackages,\n include: includePackages,\n },\n };\n },\n\n transform(code: string, id: string) {\n // Lazy initialize compiler\n if (!compiler) {\n compiler = getCompiler(options);\n }\n\n // Only process node_modules\n if (!id.includes(\"node_modules\")) {\n return null;\n }\n\n // Only process Angular packages\n if (!isAngularPackage(id)) {\n return null;\n }\n\n // Only process JS files\n if (!isJsFile(id)) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!needsLinking(code)) {\n return null;\n }\n\n const cleanId = cleanModuleId(id);\n\n if (debug) {\n console.log(`[Angular Linker] Linking: ${cleanId}`);\n }\n\n try {\n const result = compiler.linkFile(cleanId, code);\n\n if (result.startsWith(\"/* Linker Error\")) {\n console.error(`[Angular Linker Error] ${id}:\\n${result}`);\n return null;\n }\n\n if (debug) {\n console.log(`[Angular Linker] Successfully linked: ${cleanId}`);\n }\n\n return { code: result, map: null };\n } catch (e) {\n console.error(`[Angular Linker Failed] ${id}:`, e);\n return null;\n }\n },\n };\n}\n\n/**\n * Get recommended Vite config for Angular with Rust linker\n */\nexport function getAngularViteConfig() {\n return {\n plugins: [angularLinkerVitePlugin()],\n optimizeDeps: {\n exclude: ANGULAR_PACKAGES,\n include: NON_ANGULAR_PACKAGES,\n },\n };\n}\n\nexport { ANGULAR_PACKAGES, NON_ANGULAR_PACKAGES };\nexport default angularLinkerVitePlugin;\n","/**\n * Angular Compiler Plugin for Vite\n *\n * This plugin compiles Angular TypeScript files using the Rust-based Angular compiler.\n * Use with the linker plugin for a complete Angular build solution.\n *\n * @example\n * ```js\n * import { angularCompilerVitePlugin } from 'angular-rust-plugins/compiler/vite';\n * import { angularLinkerVitePlugin } from 'angular-rust-plugins/linker/vite';\n * import { defineConfig } from 'vite';\n *\n * export default defineConfig({\n * plugins: [\n * angularLinkerVitePlugin(),\n * angularCompilerVitePlugin(),\n * ],\n * });\n * ```\n */\n\nimport type { Plugin, HmrContext } from \"vite\";\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { CompilerBinding } from \"./types\";\n\nlet compilerInstance: CompilerBinding | null = null;\n\nexport interface CompilerOptions {\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Custom path to the Angular Rust binding package\n */\n bindingPath?: string;\n}\n\nfunction getCompiler(options?: CompilerOptions): CompilerBinding {\n if (compilerInstance) {\n return compilerInstance;\n }\n\n try {\n let binding: { Compiler: new () => CompilerBinding };\n\n if (options?.bindingPath) {\n const require = createRequire(import.meta.url);\n binding = require(options.bindingPath);\n } else {\n // Load from bundled binding directory\n // Use import.meta.url to get the actual location of this file\n const currentFileUrl = import.meta.url;\n const currentFilePath = fileURLToPath(currentFileUrl);\n const currentDir = dirname(currentFilePath);\n const require = createRequire(currentFileUrl);\n\n // Try multiple possible binding locations\n const possiblePaths = [\n join(currentDir, \"..\", \"binding\"), // dist/compiler/../binding\n join(currentDir, \"..\", \"..\", \"binding\"), // in case of deeper nesting\n join(currentDir, \"binding\"), // same directory\n ];\n\n let loadedBinding: { Compiler: new () => CompilerBinding } | null = null;\n let lastError: unknown = null;\n\n for (const bindingPath of possiblePaths) {\n try {\n loadedBinding = require(bindingPath);\n break;\n } catch (e) {\n lastError = e;\n }\n }\n\n if (!loadedBinding) {\n throw (\n lastError ||\n new Error(\"Could not find binding in any expected location\")\n );\n }\n\n binding = loadedBinding;\n }\n\n compilerInstance = new binding.Compiler();\n return compilerInstance;\n } catch (e) {\n throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);\n }\n}\n\n/**\n * Creates a Vite plugin for Angular Rust compiler\n * Compiles .ts files (except .d.ts) using the Rust compiler\n */\nexport function angularCompilerVitePlugin(options?: CompilerOptions): Plugin {\n const debug = options?.debug ?? false;\n let compiler: CompilerBinding;\n\n return {\n name: \"angular-rust-compiler\",\n enforce: \"pre\",\n\n transform(code: string, id: string) {\n // Lazy initialize compiler\n if (!compiler) {\n compiler = getCompiler(options);\n }\n\n // Skip node_modules - those are handled by linker, not compiler\n if (id.includes(\"node_modules\")) {\n return null;\n }\n\n // Only process TypeScript files, skip declaration files\n if (!id.endsWith(\".ts\") || id.endsWith(\".d.ts\")) {\n return null;\n }\n\n if (debug) {\n console.log(`[Angular Compiler] Compiling: ${id}`);\n }\n\n try {\n const result = compiler.compile(id, code);\n\n if (result.startsWith(\"/* Error\")) {\n console.error(`[Angular Compiler Error] ${id}:\\n${result}`);\n throw new Error(`Rust Compilation Failed for ${id}`);\n }\n\n if (debug) {\n console.log(`[Angular Compiler] Successfully compiled: ${id}`);\n }\n\n return { code: result, map: null };\n } catch (e) {\n console.error(`[Angular Compiler Failed] ${id}:`, e);\n throw e;\n }\n },\n\n handleHotUpdate({ file, server }: HmrContext) {\n // When HTML template changes, invalidate the corresponding TS file\n if (file.endsWith(\".html\")) {\n const tsFile = file.replace(/\\.html$/, \".ts\");\n\n if (debug) {\n console.log(`[HMR] HTML changed: ${file}`);\n console.log(`[HMR] Invalidating TS: ${tsFile}`);\n }\n\n const mod = server.moduleGraph.getModuleById(tsFile);\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n server.ws.send({ type: \"full-reload\", path: \"*\" });\n return [];\n } else {\n server.ws.send({ type: \"full-reload\", path: \"*\" });\n return [];\n }\n }\n },\n };\n}\n\nexport default angularCompilerVitePlugin;\n"],"mappings":"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","names":["require","createRequire","dirname","join","fileURLToPath","compilerInstance","getCompiler","require","createRequire","fileURLToPath","dirname","join","createRequire","dirname","join","fileURLToPath","compilerInstance","getCompiler","require","createRequire","fileURLToPath","dirname","join","createRequire","dirname","join","fileURLToPath","compilerInstance","getCompiler","require"]}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/linker/esbuild.ts
21
+ var esbuild_exports = {};
22
+ __export(esbuild_exports, {
23
+ angularLinkerEsbuildPlugin: () => angularLinkerEsbuildPlugin,
24
+ default: () => esbuild_default
25
+ });
26
+ module.exports = __toCommonJS(esbuild_exports);
27
+ var import_fs = require("fs");
28
+ var import_module = require("module");
29
+ var import_path = require("path");
30
+ var import_url = require("url");
31
+
32
+ // src/linker/types.ts
33
+ function needsLinking(code) {
34
+ return code.includes("\u0275\u0275ngDeclare");
35
+ }
36
+
37
+ // src/linker/esbuild.ts
38
+ var import_meta = {};
39
+ var compilerInstance = null;
40
+ function getCompiler(options) {
41
+ if (compilerInstance) {
42
+ return compilerInstance;
43
+ }
44
+ try {
45
+ let binding;
46
+ if (options?.bindingPath) {
47
+ const require2 = (0, import_module.createRequire)(import_meta.url);
48
+ binding = require2(options.bindingPath);
49
+ } else {
50
+ const currentFileUrl = import_meta.url;
51
+ const currentFilePath = (0, import_url.fileURLToPath)(currentFileUrl);
52
+ const currentDir = (0, import_path.dirname)(currentFilePath);
53
+ const require2 = (0, import_module.createRequire)(currentFileUrl);
54
+ const possiblePaths = [
55
+ (0, import_path.join)(currentDir, "..", "binding"),
56
+ // dist/linker/../binding
57
+ (0, import_path.join)(currentDir, "binding"),
58
+ // same directory
59
+ (0, import_path.join)(currentDir, "..", "..", "binding")
60
+ // deeper nesting
61
+ ];
62
+ let loadedBinding = null;
63
+ let lastError = null;
64
+ for (const bindingPath of possiblePaths) {
65
+ try {
66
+ loadedBinding = require2(bindingPath);
67
+ break;
68
+ } catch (e) {
69
+ lastError = e;
70
+ }
71
+ }
72
+ if (!loadedBinding) {
73
+ throw lastError || new Error("Could not find binding in any expected location");
74
+ }
75
+ binding = loadedBinding;
76
+ }
77
+ compilerInstance = new binding.Compiler();
78
+ return compilerInstance;
79
+ } catch (e) {
80
+ throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);
81
+ }
82
+ }
83
+ function angularLinkerEsbuildPlugin(options) {
84
+ return {
85
+ name: "angular-linker-esbuild",
86
+ setup(build) {
87
+ const compiler = getCompiler(options);
88
+ const debug = options?.debug ?? false;
89
+ build.onLoad({ filter: /@angular\/.*\.(mjs|js)$/ }, async (args) => {
90
+ if (debug) {
91
+ console.log(`[Angular Linker] Processing: ${args.path}`);
92
+ }
93
+ const code = await import_fs.promises.readFile(args.path, "utf8");
94
+ if (!needsLinking(code)) {
95
+ return { contents: code, loader: "js" };
96
+ }
97
+ try {
98
+ const result = compiler.linkFile(args.path, code);
99
+ if (result.startsWith("/* Linker Error")) {
100
+ if (debug) {
101
+ console.error(`[Angular Linker Error] ${args.path}:
102
+ ${result}`);
103
+ }
104
+ return { contents: code, loader: "js" };
105
+ }
106
+ if (debug) {
107
+ console.log(`[Angular Linker] Successfully linked: ${args.path}`);
108
+ }
109
+ return { contents: result, loader: "js" };
110
+ } catch (e) {
111
+ if (debug) {
112
+ console.error(`[Angular Linker Failed] ${args.path}:`, e);
113
+ }
114
+ return { contents: code, loader: "js" };
115
+ }
116
+ });
117
+ }
118
+ };
119
+ }
120
+ var esbuild_default = angularLinkerEsbuildPlugin;
121
+ // Annotate the CommonJS export names for ESM import in node:
122
+ 0 && (module.exports = {
123
+ angularLinkerEsbuildPlugin
124
+ });
125
+ //# sourceMappingURL=esbuild.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/linker/esbuild.ts","../../src/linker/types.ts"],"sourcesContent":["/**\n * Angular Linker Plugin for esbuild\n *\n * Use this plugin with Vite's optimizeDeps.esbuildOptions or standalone esbuild.\n *\n * @example\n * ```js\n * import { angularLinkerEsbuildPlugin } from 'vite-plugin-angular-rust/esbuild';\n *\n * // With esbuild\n * import esbuild from 'esbuild';\n *\n * esbuild.build({\n * plugins: [angularLinkerEsbuildPlugin()],\n * // ...\n * });\n *\n * // With Vite\n * import { defineConfig } from 'vite';\n *\n * export default defineConfig({\n * optimizeDeps: {\n * esbuildOptions: {\n * plugins: [angularLinkerEsbuildPlugin()],\n * },\n * },\n * });\n * ```\n */\n\nimport type { Plugin } from \"esbuild\";\nimport { promises as fs } from \"fs\";\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { CompilerBinding, LinkerOptions } from \"./types\";\nimport { needsLinking } from \"./types\";\n\nlet compilerInstance: CompilerBinding | null = null;\n\nfunction getCompiler(options?: LinkerOptions): CompilerBinding {\n if (compilerInstance) {\n return compilerInstance;\n }\n\n try {\n let binding: { Compiler: new () => CompilerBinding };\n\n if (options?.bindingPath) {\n const require = createRequire(import.meta.url);\n binding = require(options.bindingPath);\n } else {\n // Load from bundled binding directory\n const currentFileUrl = import.meta.url;\n const currentFilePath = fileURLToPath(currentFileUrl);\n const currentDir = dirname(currentFilePath);\n const require = createRequire(currentFileUrl);\n\n // Try multiple possible binding locations\n const possiblePaths = [\n join(currentDir, \"..\", \"binding\"), // dist/linker/../binding\n join(currentDir, \"binding\"), // same directory\n join(currentDir, \"..\", \"..\", \"binding\"), // deeper nesting\n ];\n\n let loadedBinding: { Compiler: new () => CompilerBinding } | null = null;\n let lastError: unknown = null;\n\n for (const bindingPath of possiblePaths) {\n try {\n loadedBinding = require(bindingPath);\n break;\n } catch (e) {\n lastError = e;\n }\n }\n\n if (!loadedBinding) {\n throw (\n lastError ||\n new Error(\"Could not find binding in any expected location\")\n );\n }\n\n binding = loadedBinding;\n }\n\n compilerInstance = new binding.Compiler();\n return compilerInstance;\n } catch (e) {\n throw new Error(`Failed to load Angular Rust binding. Error: ${e}`);\n }\n}\n\n/**\n * Creates an esbuild plugin for Angular linker\n */\nexport function angularLinkerEsbuildPlugin(options?: LinkerOptions): Plugin {\n return {\n name: \"angular-linker-esbuild\",\n setup(build) {\n const compiler = getCompiler(options);\n const debug = options?.debug ?? false;\n\n // Handle all .mjs and .js files in @angular packages\n build.onLoad({ filter: /@angular\\/.*\\.(mjs|js)$/ }, async (args) => {\n if (debug) {\n console.log(`[Angular Linker] Processing: ${args.path}`);\n }\n\n const code = await fs.readFile(args.path, \"utf8\");\n\n // Check if file contains partial declarations\n if (!needsLinking(code)) {\n return { contents: code, loader: \"js\" };\n }\n\n try {\n const result = compiler.linkFile(args.path, code);\n\n if (result.startsWith(\"/* Linker Error\")) {\n if (debug) {\n console.error(`[Angular Linker Error] ${args.path}:\\n${result}`);\n }\n return { contents: code, loader: \"js\" };\n }\n\n if (debug) {\n console.log(`[Angular Linker] Successfully linked: ${args.path}`);\n }\n\n return { contents: result, loader: \"js\" };\n } catch (e) {\n if (debug) {\n console.error(`[Angular Linker Failed] ${args.path}:`, e);\n }\n return { contents: code, loader: \"js\" };\n }\n });\n },\n };\n}\n\nexport default angularLinkerEsbuildPlugin;\n","/**\n * Angular Linker Plugin Types\n */\n\nexport interface LinkerOptions {\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Custom path to the Angular Rust binding package\n * If not specified, will try to resolve @anthropic/angular-rust-binding\n */\n bindingPath?: string;\n}\n\nexport interface LinkerResult {\n code: string;\n map: null | undefined;\n}\n\nexport interface CompilerBinding {\n linkFile(filePath: string, code: string): string;\n compile?(filePath: string, code: string): string;\n}\n\n/**\n * Check if file contains Angular partial declarations that need linking\n */\nexport function needsLinking(code: string): boolean {\n return code.includes(\"ɵɵngDeclare\");\n}\n\n/**\n * Check if file is an Angular package file\n */\nexport function isAngularPackage(id: string): boolean {\n return id.includes(\"@angular\") || id.includes(\"/@angular/\");\n}\n\n/**\n * Check if file is a JavaScript/MJS file\n */\nexport function isJsFile(id: string): boolean {\n const cleanId = id.split(\"?\")[0];\n return cleanId.endsWith(\".mjs\") || cleanId.endsWith(\".js\");\n}\n\n/**\n * Clean module ID by removing query strings\n */\nexport function cleanModuleId(id: string): string {\n return id.split(\"?\")[0];\n}\n\n/**\n * Default Angular packages to exclude from pre-bundling\n */\nexport const ANGULAR_PACKAGES = [\n \"@angular/core\",\n \"@angular/common\",\n \"@angular/platform-browser\",\n \"@angular/platform-browser-dynamic\",\n \"@angular/router\",\n \"@angular/forms\",\n \"@angular/animations\",\n \"@angular/cdk\",\n \"@angular/material\",\n];\n\n/**\n * Packages that don't need linking and should be included in pre-bundling\n */\nexport const NON_ANGULAR_PACKAGES = [\"zone.js\", \"rxjs\", \"rxjs/operators\"];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BA,gBAA+B;AAC/B,oBAA8B;AAC9B,kBAA8B;AAC9B,iBAA8B;;;ACHvB,SAAS,aAAa,MAAuB;AAClD,SAAO,KAAK,SAAS,uBAAa;AACpC;;;ADjCA;AAsCA,IAAI,mBAA2C;AAE/C,SAAS,YAAY,SAA0C;AAC7D,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,QAAI;AAEJ,QAAI,SAAS,aAAa;AACxB,YAAMA,eAAU,6BAAc,YAAY,GAAG;AAC7C,gBAAUA,SAAQ,QAAQ,WAAW;AAAA,IACvC,OAAO;AAEL,YAAM,iBAAiB,YAAY;AACnC,YAAM,sBAAkB,0BAAc,cAAc;AACpD,YAAM,iBAAa,qBAAQ,eAAe;AAC1C,YAAMA,eAAU,6BAAc,cAAc;AAG5C,YAAM,gBAAgB;AAAA,YACpB,kBAAK,YAAY,MAAM,SAAS;AAAA;AAAA,YAChC,kBAAK,YAAY,SAAS;AAAA;AAAA,YAC1B,kBAAK,YAAY,MAAM,MAAM,SAAS;AAAA;AAAA,MACxC;AAEA,UAAI,gBAAgE;AACpE,UAAI,YAAqB;AAEzB,iBAAW,eAAe,eAAe;AACvC,YAAI;AACF,0BAAgBA,SAAQ,WAAW;AACnC;AAAA,QACF,SAAS,GAAG;AACV,sBAAY;AAAA,QACd;AAAA,MACF;AAEA,UAAI,CAAC,eAAe;AAClB,cACE,aACA,IAAI,MAAM,iDAAiD;AAAA,MAE/D;AAEA,gBAAU;AAAA,IACZ;AAEA,uBAAmB,IAAI,QAAQ,SAAS;AACxC,WAAO;AAAA,EACT,SAAS,GAAG;AACV,UAAM,IAAI,MAAM,+CAA+C,CAAC,EAAE;AAAA,EACpE;AACF;AAKO,SAAS,2BAA2B,SAAiC;AAC1E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,WAAW,YAAY,OAAO;AACpC,YAAM,QAAQ,SAAS,SAAS;AAGhC,YAAM,OAAO,EAAE,QAAQ,0BAA0B,GAAG,OAAO,SAAS;AAClE,YAAI,OAAO;AACT,kBAAQ,IAAI,gCAAgC,KAAK,IAAI,EAAE;AAAA,QACzD;AAEA,cAAM,OAAO,MAAM,UAAAC,SAAG,SAAS,KAAK,MAAM,MAAM;AAGhD,YAAI,CAAC,aAAa,IAAI,GAAG;AACvB,iBAAO,EAAE,UAAU,MAAM,QAAQ,KAAK;AAAA,QACxC;AAEA,YAAI;AACF,gBAAM,SAAS,SAAS,SAAS,KAAK,MAAM,IAAI;AAEhD,cAAI,OAAO,WAAW,iBAAiB,GAAG;AACxC,gBAAI,OAAO;AACT,sBAAQ,MAAM,0BAA0B,KAAK,IAAI;AAAA,EAAM,MAAM,EAAE;AAAA,YACjE;AACA,mBAAO,EAAE,UAAU,MAAM,QAAQ,KAAK;AAAA,UACxC;AAEA,cAAI,OAAO;AACT,oBAAQ,IAAI,yCAAyC,KAAK,IAAI,EAAE;AAAA,UAClE;AAEA,iBAAO,EAAE,UAAU,QAAQ,QAAQ,KAAK;AAAA,QAC1C,SAAS,GAAG;AACV,cAAI,OAAO;AACT,oBAAQ,MAAM,2BAA2B,KAAK,IAAI,KAAK,CAAC;AAAA,UAC1D;AACA,iBAAO,EAAE,UAAU,MAAM,QAAQ,KAAK;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAO,kBAAQ;","names":["require","fs"]}