angular-rust-plugins 0.5.0 → 0.7.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.
package/index.js.map CHANGED
@@ -1 +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"]}
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 'angular-rust-plugins/linker/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 { cleanModuleId } 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 // Logic from vite.config.mjs\n const isAngularPackage = id.includes('@angular') || id.includes('/@angular/');\n const isNodeModules = id.includes('node_modules');\n const cleanId = cleanModuleId(id);\n const isJsFile = cleanId.endsWith('.mjs') || cleanId.endsWith('.js');\n\n if (!isAngularPackage || !isNodeModules || !isJsFile) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!code.includes('ɵɵngDeclare')) {\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(`[Rolldown 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(`[Rolldown 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 'angular-rust-plugins/linker/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 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 // Logic from vite.config.mjs\n const isAngularPackage = id.includes('@angular') || id.includes('/@angular/');\n const isNodeModules = id.includes('node_modules');\n const cleanId = cleanModuleId(id);\n const isJsFile = cleanId.endsWith('.mjs') || cleanId.endsWith('.js');\n\n if (!isAngularPackage || !isNodeModules || !isJsFile) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!code.includes('ɵɵngDeclare')) {\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\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 { Compiler } from \"../binding\";\n\nlet compilerInstance: Compiler | 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\n// ============ Diagnostic Formatting ============\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst BOLD = '\\x1b[1m';\nconst RESET = '\\x1b[0m';\n\nfunction formatDiagnostic(diag: any, sourceCode: string): string {\n const level = 'WARNING';\n const codeStr = `NG${diag.code}`;\n const file = diag.file || 'unknown';\n\n let line = 1;\n let col = 0;\n let lineStartPos = 0;\n\n if (diag.start !== undefined && diag.start !== null) {\n for (let i = 0; i < diag.start && i < sourceCode.length; i++) {\n if (sourceCode[i] === '\\n') {\n line++;\n col = 0;\n lineStartPos = i + 1;\n } else {\n col++;\n }\n }\n }\n\n let output = `\\n${BOLD}${YELLOW}▲ [${level}] ${RED}${codeStr}${RESET}${BOLD}: ${diag.message}${RESET} ${YELLOW}[plugin rust-ngc-plugin]${RESET}\\n`;\n\n const lineStr = line.toString();\n const colStr = (col + 1).toString();\n output += `\\n ${CYAN}${file}:${lineStr}:${colStr}:${RESET}\\n`;\n\n let lineEndPos = sourceCode.indexOf('\\n', lineStartPos);\n if (lineEndPos === -1) lineEndPos = sourceCode.length;\n const lineContent = sourceCode.substring(lineStartPos, lineEndPos);\n\n output += ` ${BOLD}${lineStr} │ ${RESET}${lineContent}\\n`;\n\n const gutterWidth = lineStr.length + 3;\n const gutterEmpty = ' '.repeat(gutterWidth);\n const length = diag.length || 1;\n const underline = '~'.repeat(length);\n\n output += ` ${gutterEmpty}${' '.repeat(col)}${RED}${underline}${RESET}`;\n\n return output;\n}\n\nfunction getCompiler(options?: CompilerOptions): Compiler {\n if (compilerInstance) {\n return compilerInstance;\n }\n\n try {\n let binding: { Compiler: new () => Compiler };\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 () => Compiler } | 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: Compiler;\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 but check for Angular packages that need linking\n if (id.includes('node_modules')) {\n if (id.includes('@angular') && code.includes('ɵɵngDeclare')) {\n const cleanId = id.split('?')[0];\n if (cleanId.endsWith('.mjs') || cleanId.endsWith('.js')) {\n try {\n const result = compiler.linkFile(id, code);\n if (result.startsWith('/* Linker Error')) {\n if (debug) console.error(`[Linker Error] ${id}: ${result}`);\n return null;\n }\n return { code: result, map: null };\n } catch (e) {\n if (debug) console.error(`Linker failed for ${id}:`, e);\n return null;\n }\n }\n }\n return null;\n }\n\n // Only process TypeScript files, skip declaration files\n const cleanId = id.split('?')[0];\n if (!cleanId.endsWith('.ts') || cleanId.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 // Handle structured result\n const { code: compiledCode, diagnostics } = result;\n\n if (compiledCode.startsWith('/* Error')) {\n console.error(`[Angular Compiler Error] ${id}:\\n${compiledCode}`);\n throw new Error(`Rust Compilation Failed for ${id}`);\n }\n\n if (diagnostics && diagnostics.length > 0) {\n diagnostics.forEach((diag: any) => {\n console.warn(formatDiagnostic(diag, code));\n });\n }\n\n if (debug) {\n console.log(`[Angular Compiler] Successfully compiled: ${id}`);\n }\n\n return { code: compiledCode, 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","isAngularPackage","isJsFile","createRequire","dirname","join","fileURLToPath","compilerInstance","getCompiler","require","createRequire","fileURLToPath","dirname","join","isAngularPackage","isJsFile","createRequire","dirname","join","fileURLToPath","compilerInstance","getCompiler","require","cleanId"]}
package/linker/index.cjs CHANGED
@@ -208,12 +208,14 @@ function angularLinkerRolldownPlugin(options) {
208
208
  if (!compiler) {
209
209
  compiler = getCompiler2(options);
210
210
  }
211
- const isInNodeModules = id.includes("node_modules");
211
+ const isAngularPackage2 = id.includes("@angular") || id.includes("/@angular/");
212
+ const isNodeModules = id.includes("node_modules");
212
213
  const cleanId = cleanModuleId(id);
213
- if (!isAngularPackage(id) || !isInNodeModules || !isJsFile(id)) {
214
+ const isJsFile2 = cleanId.endsWith(".mjs") || cleanId.endsWith(".js");
215
+ if (!isAngularPackage2 || !isNodeModules || !isJsFile2) {
214
216
  return null;
215
217
  }
216
- if (!needsLinking(code)) {
218
+ if (!code.includes("\u0275\u0275ngDeclare")) {
217
219
  return null;
218
220
  }
219
221
  if (debug) {
@@ -222,7 +224,7 @@ function angularLinkerRolldownPlugin(options) {
222
224
  try {
223
225
  const result = compiler.linkFile(cleanId, code);
224
226
  if (result.startsWith("/* Linker Error")) {
225
- console.error(`[Angular Linker Error] ${id}:
227
+ console.error(`[Rolldown Linker Error] ${id}:
226
228
  ${result}`);
227
229
  return null;
228
230
  }
@@ -231,7 +233,7 @@ ${result}`);
231
233
  }
232
234
  return { code: result, map: null };
233
235
  } catch (e) {
234
- console.error(`[Angular Linker Failed] ${id}:`, e);
236
+ console.error(`[Rolldown Linker Failed] ${id}:`, e);
235
237
  return null;
236
238
  }
237
239
  }
@@ -313,19 +315,16 @@ function angularLinkerVitePlugin(options) {
313
315
  if (!compiler) {
314
316
  compiler = getCompiler3(options);
315
317
  }
316
- if (!id.includes("node_modules")) {
317
- return null;
318
- }
319
- if (!isAngularPackage(id)) {
320
- return null;
321
- }
322
- if (!isJsFile(id)) {
318
+ const isAngularPackage2 = id.includes("@angular") || id.includes("/@angular/");
319
+ const isNodeModules = id.includes("node_modules");
320
+ const cleanId = cleanModuleId(id);
321
+ const isJsFile2 = cleanId.endsWith(".mjs") || cleanId.endsWith(".js");
322
+ if (!isAngularPackage2 || !isNodeModules || !isJsFile2) {
323
323
  return null;
324
324
  }
325
- if (!needsLinking(code)) {
325
+ if (!code.includes("\u0275\u0275ngDeclare")) {
326
326
  return null;
327
327
  }
328
- const cleanId = cleanModuleId(id);
329
328
  if (debug) {
330
329
  console.log(`[Angular Linker] Linking: ${cleanId}`);
331
330
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/linker/index.ts","../../src/linker/esbuild.ts","../../src/linker/types.ts","../../src/linker/rolldown.ts","../../src/linker/vite.ts"],"sourcesContent":["/**\n * Angular Linker Plugins - Index\n *\n * Re-exports all linker plugins for different bundlers.\n */\n\nexport { angularLinkerEsbuildPlugin } from \"./esbuild\";\nexport { angularLinkerRolldownPlugin } from \"./rolldown\";\nexport {\n angularLinkerVitePlugin,\n getAngularViteConfig,\n ANGULAR_PACKAGES,\n NON_ANGULAR_PACKAGES,\n} from \"./vite\";\nexport type { ViteLinkerPluginOptions } from \"./vite\";\nexport type { LinkerOptions, LinkerResult } from \"./types\";\nexport {\n needsLinking,\n isAngularPackage,\n isJsFile,\n cleanModuleId,\n} from \"./types\";\n","/**\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"],"mappings":"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","names":["require","fs","import_module","import_path","import_url","import_meta","compilerInstance","getCompiler","require","import_module","import_path","import_url","import_meta","compilerInstance","getCompiler","require"]}
1
+ {"version":3,"sources":["../../src/linker/index.ts","../../src/linker/esbuild.ts","../../src/linker/types.ts","../../src/linker/rolldown.ts","../../src/linker/vite.ts"],"sourcesContent":["/**\n * Angular Linker Plugins - Index\n *\n * Re-exports all linker plugins for different bundlers.\n */\n\nexport { angularLinkerEsbuildPlugin } from \"./esbuild\";\nexport { angularLinkerRolldownPlugin } from \"./rolldown\";\nexport {\n angularLinkerVitePlugin,\n getAngularViteConfig,\n ANGULAR_PACKAGES,\n NON_ANGULAR_PACKAGES,\n} from \"./vite\";\nexport type { ViteLinkerPluginOptions } from \"./vite\";\nexport type { LinkerOptions, LinkerResult } from \"./types\";\nexport {\n needsLinking,\n isAngularPackage,\n isJsFile,\n cleanModuleId,\n} from \"./types\";\n","/**\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 'angular-rust-plugins/linker/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 { cleanModuleId } 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 // Logic from vite.config.mjs\n const isAngularPackage = id.includes('@angular') || id.includes('/@angular/');\n const isNodeModules = id.includes('node_modules');\n const cleanId = cleanModuleId(id);\n const isJsFile = cleanId.endsWith('.mjs') || cleanId.endsWith('.js');\n\n if (!isAngularPackage || !isNodeModules || !isJsFile) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!code.includes('ɵɵngDeclare')) {\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(`[Rolldown 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(`[Rolldown 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 'angular-rust-plugins/linker/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 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 // Logic from vite.config.mjs\n const isAngularPackage = id.includes('@angular') || id.includes('/@angular/');\n const isNodeModules = id.includes('node_modules');\n const cleanId = cleanModuleId(id);\n const isJsFile = cleanId.endsWith('.mjs') || cleanId.endsWith('.js');\n\n if (!isAngularPackage || !isNodeModules || !isJsFile) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!code.includes('ɵɵngDeclare')) {\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\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"],"mappings":"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","names":["require","fs","import_module","import_path","import_url","import_meta","compilerInstance","getCompiler","require","isAngularPackage","isJsFile","import_module","import_path","import_url","import_meta","compilerInstance","getCompiler","require","isAngularPackage","isJsFile"]}
package/linker/index.js CHANGED
@@ -171,12 +171,14 @@ function angularLinkerRolldownPlugin(options) {
171
171
  if (!compiler) {
172
172
  compiler = getCompiler2(options);
173
173
  }
174
- const isInNodeModules = id.includes("node_modules");
174
+ const isAngularPackage2 = id.includes("@angular") || id.includes("/@angular/");
175
+ const isNodeModules = id.includes("node_modules");
175
176
  const cleanId = cleanModuleId(id);
176
- if (!isAngularPackage(id) || !isInNodeModules || !isJsFile(id)) {
177
+ const isJsFile2 = cleanId.endsWith(".mjs") || cleanId.endsWith(".js");
178
+ if (!isAngularPackage2 || !isNodeModules || !isJsFile2) {
177
179
  return null;
178
180
  }
179
- if (!needsLinking(code)) {
181
+ if (!code.includes("\u0275\u0275ngDeclare")) {
180
182
  return null;
181
183
  }
182
184
  if (debug) {
@@ -185,7 +187,7 @@ function angularLinkerRolldownPlugin(options) {
185
187
  try {
186
188
  const result = compiler.linkFile(cleanId, code);
187
189
  if (result.startsWith("/* Linker Error")) {
188
- console.error(`[Angular Linker Error] ${id}:
190
+ console.error(`[Rolldown Linker Error] ${id}:
189
191
  ${result}`);
190
192
  return null;
191
193
  }
@@ -194,7 +196,7 @@ ${result}`);
194
196
  }
195
197
  return { code: result, map: null };
196
198
  } catch (e) {
197
- console.error(`[Angular Linker Failed] ${id}:`, e);
199
+ console.error(`[Rolldown Linker Failed] ${id}:`, e);
198
200
  return null;
199
201
  }
200
202
  }
@@ -275,19 +277,16 @@ function angularLinkerVitePlugin(options) {
275
277
  if (!compiler) {
276
278
  compiler = getCompiler3(options);
277
279
  }
278
- if (!id.includes("node_modules")) {
279
- return null;
280
- }
281
- if (!isAngularPackage(id)) {
282
- return null;
283
- }
284
- if (!isJsFile(id)) {
280
+ const isAngularPackage2 = id.includes("@angular") || id.includes("/@angular/");
281
+ const isNodeModules = id.includes("node_modules");
282
+ const cleanId = cleanModuleId(id);
283
+ const isJsFile2 = cleanId.endsWith(".mjs") || cleanId.endsWith(".js");
284
+ if (!isAngularPackage2 || !isNodeModules || !isJsFile2) {
285
285
  return null;
286
286
  }
287
- if (!needsLinking(code)) {
287
+ if (!code.includes("\u0275\u0275ngDeclare")) {
288
288
  return null;
289
289
  }
290
- const cleanId = cleanModuleId(id);
291
290
  if (debug) {
292
291
  console.log(`[Angular Linker] Linking: ${cleanId}`);
293
292
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/linker/esbuild.ts","../../src/linker/types.ts","../../src/linker/rolldown.ts","../../src/linker/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"],"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"]}
1
+ {"version":3,"sources":["../../src/linker/esbuild.ts","../../src/linker/types.ts","../../src/linker/rolldown.ts","../../src/linker/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 'angular-rust-plugins/linker/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 { cleanModuleId } 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 // Logic from vite.config.mjs\n const isAngularPackage = id.includes('@angular') || id.includes('/@angular/');\n const isNodeModules = id.includes('node_modules');\n const cleanId = cleanModuleId(id);\n const isJsFile = cleanId.endsWith('.mjs') || cleanId.endsWith('.js');\n\n if (!isAngularPackage || !isNodeModules || !isJsFile) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!code.includes('ɵɵngDeclare')) {\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(`[Rolldown 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(`[Rolldown 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 'angular-rust-plugins/linker/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 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 // Logic from vite.config.mjs\n const isAngularPackage = id.includes('@angular') || id.includes('/@angular/');\n const isNodeModules = id.includes('node_modules');\n const cleanId = cleanModuleId(id);\n const isJsFile = cleanId.endsWith('.mjs') || cleanId.endsWith('.js');\n\n if (!isAngularPackage || !isNodeModules || !isJsFile) {\n return null;\n }\n\n // Check if file contains partial declarations\n if (!code.includes('ɵɵngDeclare')) {\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\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"],"mappings":"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","names":["require","createRequire","dirname","join","fileURLToPath","compilerInstance","getCompiler","require","createRequire","fileURLToPath","dirname","join","isAngularPackage","isJsFile","createRequire","dirname","join","fileURLToPath","compilerInstance","getCompiler","require","createRequire","fileURLToPath","dirname","join","isAngularPackage","isJsFile"]}
@@ -29,16 +29,6 @@ var import_path = require("path");
29
29
  var import_url = require("url");
30
30
 
31
31
  // src/linker/types.ts
32
- function needsLinking(code) {
33
- return code.includes("\u0275\u0275ngDeclare");
34
- }
35
- function isAngularPackage(id) {
36
- return id.includes("@angular") || id.includes("/@angular/");
37
- }
38
- function isJsFile(id) {
39
- const cleanId = id.split("?")[0];
40
- return cleanId.endsWith(".mjs") || cleanId.endsWith(".js");
41
- }
42
32
  function cleanModuleId(id) {
43
33
  return id.split("?")[0];
44
34
  }
@@ -98,12 +88,14 @@ function angularLinkerRolldownPlugin(options) {
98
88
  if (!compiler) {
99
89
  compiler = getCompiler(options);
100
90
  }
101
- const isInNodeModules = id.includes("node_modules");
91
+ const isAngularPackage = id.includes("@angular") || id.includes("/@angular/");
92
+ const isNodeModules = id.includes("node_modules");
102
93
  const cleanId = cleanModuleId(id);
103
- if (!isAngularPackage(id) || !isInNodeModules || !isJsFile(id)) {
94
+ const isJsFile = cleanId.endsWith(".mjs") || cleanId.endsWith(".js");
95
+ if (!isAngularPackage || !isNodeModules || !isJsFile) {
104
96
  return null;
105
97
  }
106
- if (!needsLinking(code)) {
98
+ if (!code.includes("\u0275\u0275ngDeclare")) {
107
99
  return null;
108
100
  }
109
101
  if (debug) {
@@ -112,7 +104,7 @@ function angularLinkerRolldownPlugin(options) {
112
104
  try {
113
105
  const result = compiler.linkFile(cleanId, code);
114
106
  if (result.startsWith("/* Linker Error")) {
115
- console.error(`[Angular Linker Error] ${id}:
107
+ console.error(`[Rolldown Linker Error] ${id}:
116
108
  ${result}`);
117
109
  return null;
118
110
  }
@@ -121,7 +113,7 @@ ${result}`);
121
113
  }
122
114
  return { code: result, map: null };
123
115
  } catch (e) {
124
- console.error(`[Angular Linker Failed] ${id}:`, e);
116
+ console.error(`[Rolldown Linker Failed] ${id}:`, e);
125
117
  return null;
126
118
  }
127
119
  }