@electron-ipc-bridge/vite-plugin 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/dist/constants.d.ts +5 -0
  4. package/dist/generate-ipc.d.ts +9 -0
  5. package/dist/generator/build-namespaces.d.ts +2 -0
  6. package/dist/generator/build-type-definitions.d.ts +2 -0
  7. package/dist/generator/generate-global-types.d.ts +1 -0
  8. package/dist/generator/generate-runtime-types.d.ts +2 -0
  9. package/dist/generator/generate-types.d.ts +2 -0
  10. package/dist/generator/get-return-type.d.ts +1 -0
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +1158 -0
  13. package/dist/index.js.map +7 -0
  14. package/dist/normalize-path.d.ts +1 -0
  15. package/dist/parser/ast-utils.d.ts +3 -0
  16. package/dist/parser/collect-dependencies.d.ts +2 -0
  17. package/dist/parser/collect-external-type-references.d.ts +2 -0
  18. package/dist/parser/constants.d.ts +1 -0
  19. package/dist/parser/extract-metadata.d.ts +3 -0
  20. package/dist/parser/extract-type.d.ts +4 -0
  21. package/dist/parser/find-controllers.d.ts +9 -0
  22. package/dist/parser/find-nest-root-module.d.ts +6 -0
  23. package/dist/parser/get-decorator.d.ts +2 -0
  24. package/dist/parser/is-truncated-type-string.d.ts +2 -0
  25. package/dist/parser/parse-controller.d.ts +3 -0
  26. package/dist/parser/parse-method.d.ts +3 -0
  27. package/dist/parser/process-create-ipc-app-call.d.ts +4 -0
  28. package/dist/parser/resolve-controller.d.ts +3 -0
  29. package/dist/parser/resolve-controllers-from-array.d.ts +3 -0
  30. package/dist/parser/resolve-controllers-from-module-class.d.ts +3 -0
  31. package/dist/parser/resolve-controllers-from-module.d.ts +3 -0
  32. package/dist/parser/resolve-controllers-from-nest-root.d.ts +6 -0
  33. package/dist/parser/resolve-return-type.d.ts +3 -0
  34. package/dist/parser/types.d.ts +28 -0
  35. package/dist/plugin-state.d.ts +17 -0
  36. package/dist/plugin.d.ts +21 -0
  37. package/dist/preload/resolve-api-root.d.ts +4 -0
  38. package/dist/resolve-type-paths.d.ts +12 -0
  39. package/dist/strategies/nest.d.ts +7 -0
  40. package/dist/strategies/types.d.ts +12 -0
  41. package/dist/types.d.ts +24 -0
  42. package/dist/utils/dependency-collector.d.ts +6 -0
  43. package/package.json +43 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/plugin.ts", "../package.json", "../src/constants.ts", "../src/generate-ipc.ts", "../../shared/dist/constants.js", "../../shared/dist/utils/to-snake-case.js", "../../shared/dist/utils/to-camel-case.js", "../../shared/dist/utils/derive-namespace.js", "../src/generator/generate-global-types.ts", "../src/generator/get-return-type.ts", "../src/generator/build-namespaces.ts", "../src/generator/build-type-definitions.ts", "../src/generator/generate-runtime-types.ts", "../src/normalize-path.ts", "../src/parser/find-controllers.ts", "../src/strategies/nest.ts", "../src/parser/resolve-controllers-from-nest-root.ts", "../src/parser/resolve-controllers-from-module-class.ts", "../src/parser/resolve-controller.ts", "../src/parser/collect-dependencies.ts", "../src/parser/extract-metadata.ts", "../src/parser/get-decorator.ts", "../src/parser/parse-controller.ts", "../src/parser/parse-method.ts", "../src/parser/collect-external-type-references.ts", "../src/parser/extract-type.ts", "../src/parser/constants.ts", "../src/parser/resolve-return-type.ts", "../src/parser/is-truncated-type-string.ts", "../src/parser/process-create-ipc-app-call.ts", "../src/parser/ast-utils.ts", "../src/parser/resolve-controllers-from-array.ts", "../src/parser/resolve-controllers-from-module.ts", "../src/preload/resolve-api-root.ts", "../src/resolve-type-paths.ts", "../src/plugin-state.ts"],
4
+ "sourcesContent": ["import path from \"path\";\nimport { createLogger, type Logger, Plugin } from \"vite\";\n\nimport pkg from \"../package.json\" with { type: \"json\" };\n\nimport { DEFAULT_MAIN_ENTRY, DEFAULT_PRELOAD_ENTRY } from \"./constants.js\";\nimport { generateIpc } from \"./generate-ipc.js\";\nimport { normalizePath } from \"./normalize-path.js\";\nimport { PluginState } from \"./plugin-state.js\";\nimport type { PluginOptions } from \"./types.js\";\n\nexport { type PluginOptions, type PluginTypesOptions } from \"./types.js\";\n\n/**\n * Creates a Vite plugin that generates TypeScript type definitions\n * for your IPC controllers, enabling type-safe `window` usage in the renderer.\n *\n * @param options - Plugin configuration\n * @returns Vite plugin instance\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { electronIpcBridge } from \"@electron-ipc-bridge/vite-plugin\";\n *\n * export default defineConfig({\n * plugins: [electronIpcBridge(options)],\n * });\n * ```\n */\nexport function electronIpcBridge({\n main = DEFAULT_MAIN_ENTRY,\n preload = DEFAULT_PRELOAD_ENTRY,\n resolutionStrategy,\n types = {},\n}: PluginOptions = {}): Plugin {\n let root = process.cwd();\n let logger: Logger;\n\n const state = new PluginState();\n\n const generate = () => {\n generateIpc(root, logger, state, { main, preload, resolutionStrategy, types });\n };\n\n return {\n buildStart() {\n if (state.claimInitialGeneration()) {\n generate();\n }\n },\n configResolved(config) {\n root = config.root;\n logger = createLogger(config.logLevel, {\n allowClearScreen: config.clearScreen,\n customLogger: config.customLogger,\n prefix: `[${pkg.name}]`,\n });\n },\n configureServer(server) {\n const preloadPath = path.resolve(root, preload);\n server.watcher.add(preloadPath);\n server.watcher.on(\"change\", (file) => {\n if (normalizePath(file) === normalizePath(preloadPath)) {\n state.scheduleGenerate(generate);\n }\n });\n },\n name: \"electron-ipc-bridge\",\n transform(_code, id) {\n if (id.includes(\"node_modules\") || id.endsWith(\".d.ts\")) return null;\n\n const absId = normalizePath(path.resolve(id));\n const mainEntryPath = normalizePath(path.resolve(root, main));\n const preloadEntryPath = normalizePath(path.resolve(root, preload));\n\n if (state.shouldRegenerate(absId, mainEntryPath, preloadEntryPath)) {\n state.scheduleGenerate(generate);\n }\n return null;\n },\n };\n}\n", "{\n \"name\": \"@electron-ipc-bridge/vite-plugin\",\n \"version\": \"0.0.4\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/metacurb/electron-ipc-bridge.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/metacurb/electron-ipc-bridge/issues\"\n },\n \"homepage\": \"https://metacurb.github.io/electron-ipc-bridge/\",\n \"description\": \"A Vite plugin for Electron-IPC-Bridge\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"node scripts/build.mjs\",\n \"test\": \"pnpm exec jest --config jest.config.cjs\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0\"\n },\n \"devDependencies\": {\n \"@electron-ipc-bridge/shared\": \"workspace:*\",\n \"@types/node\": \"^25.2.3\",\n \"esbuild\": \"^0.27.3\",\n \"typescript\": \"^5.9.3\",\n \"vite\": \"^7.3.1\"\n }\n}\n", "export const DEFAULT_GLOBAL_TYPES_FILENAME = \"ipc.d.ts\";\nexport const DEFAULT_MAIN_ENTRY = \"src/main/index.ts\";\nexport const DEFAULT_PRELOAD_ENTRY = \"src/preload/index.ts\";\nexport const DEFAULT_RENDERER_RUNTIME_DIR = \"src/renderer/src\";\nexport const DEFAULT_RUNTIME_TYPES_FILENAME = \"ipc.types.ts\";\n", "import crypto from \"crypto\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { Logger } from \"vite\";\n\nimport { generateGlobalTypes } from \"./generator/generate-global-types.js\";\nimport { generateRuntimeTypes } from \"./generator/generate-runtime-types.js\";\nimport { normalizePath } from \"./normalize-path.js\";\nimport { findControllers } from \"./parser/find-controllers.js\";\nimport { PluginState } from \"./plugin-state.js\";\nimport { resolveApiRootFromPreload } from \"./preload/resolve-api-root.js\";\nimport { resolveTypePaths } from \"./resolve-type-paths.js\";\nimport type { PluginTypesOptions, ResolutionStrategy } from \"./types.js\";\n\nexport function generateIpc(\n root: string,\n logger: Logger,\n state: PluginState,\n options: {\n main: string;\n preload: string;\n types: PluginTypesOptions;\n resolutionStrategy?: ResolutionStrategy;\n },\n): void {\n try {\n const { main, preload, resolutionStrategy, types } = options;\n const preloadPath = path.resolve(root, preload);\n const { dependencies: preloadDependencies, namespace: resolvedApiRoot } = resolveApiRootFromPreload(preloadPath);\n const entryPath = path.resolve(root, main);\n if (!fs.existsSync(entryPath)) {\n logger.warn(`Main entry not found at: ${entryPath}`);\n return;\n }\n\n logger.info(`Generating IPC types from ${entryPath}...`);\n const { controllers, processedFiles, program } = findControllers(\n entryPath,\n undefined,\n state.getProgram(),\n resolutionStrategy,\n );\n state.setProgram(program);\n\n if (controllers.length === 0) {\n logger.warn(`No createIpcApp() call found in ${entryPath}; generated types will be empty.`);\n }\n\n state.setControllerFiles(new Set([...processedFiles, ...preloadDependencies].map(normalizePath)));\n\n const { globalPath, runtimePath } = resolveTypePaths({\n hasRendererRuntimeDir: (absPath) => fs.existsSync(absPath),\n preloadPath,\n root,\n types,\n });\n\n if (!runtimePath && !globalPath) {\n logger.warn(`Both runtime and global type outputs are disabled; nothing to generate.`);\n return;\n }\n\n let runtimeTypesContent: string | null = null;\n let globalTypesContent: string | null = null;\n\n if (runtimePath) {\n runtimeTypesContent = generateRuntimeTypes(controllers);\n }\n\n if (globalPath) {\n const ipcApiImportPath = (() => {\n if (!runtimePath) {\n throw new Error(\"Global type generation requires a runtime types output path.\");\n }\n const rel = path\n .relative(path.dirname(globalPath), runtimePath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.tsx?$/, \".ts\")\n .replace(/(\\.d)?\\.ts$/, \"\");\n return rel.startsWith(\".\") ? rel : `./${rel}`;\n })();\n globalTypesContent = generateGlobalTypes(resolvedApiRoot, ipcApiImportPath);\n }\n\n const combinedHash = crypto\n .createHash(\"md5\")\n .update(runtimeTypesContent ?? \"\")\n .update(globalTypesContent ?? \"\")\n .digest(\"hex\");\n\n if (!state.updateHash(combinedHash)) return;\n\n if (runtimePath && runtimeTypesContent != null) {\n fs.mkdirSync(path.dirname(runtimePath), { recursive: true });\n fs.writeFileSync(runtimePath, runtimeTypesContent);\n logger.info(`Runtime types generated at ${path.relative(root, runtimePath)}`);\n }\n\n if (globalPath && globalTypesContent != null) {\n fs.mkdirSync(path.dirname(globalPath), { recursive: true });\n fs.writeFileSync(globalPath, globalTypesContent);\n logger.info(`Global types generated at ${path.relative(root, globalPath)}`);\n }\n } catch (err) {\n logger.error(`Type generation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n", "export const IPC_CONTRACT_CHANNEL = \"ipc_controller_contract\";\nexport const IPC_DEFAULT_API_ROOT = \"ipc\";\nexport const IPC_DECORATOR_ON = \"IpcOn\";\nexport const IPC_DECORATOR_ONCE = \"IpcOnce\";\nexport const IPC_DECORATOR_HANDLE = \"IpcHandle\";\nexport const IPC_DECORATOR_HANDLE_ONCE = \"IpcHandleOnce\";\nexport const IPC_METHOD_DECORATOR_NAMES = [\n IPC_DECORATOR_HANDLE,\n IPC_DECORATOR_ON,\n IPC_DECORATOR_HANDLE_ONCE,\n IPC_DECORATOR_ONCE,\n];\nexport const IPC_PARAM_INJECTION_DECORATOR_NAMES = [\n \"Channel\",\n \"CorrelationId\",\n \"Origin\",\n \"ProcessId\",\n \"RawEvent\",\n \"Sender\",\n \"Window\",\n];\n", "export const toSnakeCase = (str) => str\n .trim()\n .replace(/[\\s-]+/g, \"_\")\n .replace(/(?<=[A-Z])(?=[A-Z][a-z])/g, \"_\")\n .replace(/([a-z\\d])([A-Z])/g, \"$1_$2\")\n .toLocaleLowerCase();\n", "import { toSnakeCase } from \"./to-snake-case.js\";\nexport const toCamelCase = (str) => toSnakeCase(str)\n .replace(/_([a-z0-9])/g, (_, c) => c.toLocaleUpperCase())\n .replace(/_/g, \"\")\n .replace(/^./, (s) => s.toLocaleLowerCase());\n", "import { toCamelCase } from \"./to-camel-case.js\";\nexport const deriveNamespace = (name) => toCamelCase(name.replace(/Controller$/, \"\"));\n", "import { IPC_DEFAULT_API_ROOT } from \"@electron-ipc-bridge/shared\";\n\nexport const generateGlobalTypes = (namespace: string = IPC_DEFAULT_API_ROOT, ipcApiImportPath: string): string => {\n const isValidIdentifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(namespace);\n const windowProperty = isValidIdentifier ? `${namespace}: IpcApi;` : `[${JSON.stringify(namespace)}]: IpcApi;`;\n\n return `// Auto-generated by @electron-ipc-bridge/vite-plugin\n// Do not edit manually\n\nimport type { IpcApi } from \"${ipcApiImportPath}\";\n\ndeclare global {\n interface Window {\n ${windowProperty}\n }\n}\n\nexport {};\n`;\n};\n", "import { IPC_DECORATOR_ON, IPC_DECORATOR_ONCE } from \"@electron-ipc-bridge/shared\";\n\nexport const getReturnType = (decorator: string, originalReturnType: string): string => {\n if (decorator === IPC_DECORATOR_ON || decorator === IPC_DECORATOR_ONCE) {\n return \"void\";\n }\n\n if (originalReturnType.startsWith(\"Promise<\")) {\n return originalReturnType;\n }\n\n return `Promise<${originalReturnType}>`;\n};\n", "import type { ControllerMetadata } from \"../parser/types.js\";\n\nimport { getReturnType } from \"./get-return-type.js\";\n\nexport const buildNamespaces = (controllers: ControllerMetadata[]): string[] => {\n return controllers.map((controller) => {\n const methods = controller.methods.map((method) => {\n const params = method.params.map((p) => `${p.name}${p.optional ? \"?\" : \"\"}: ${p.type}`).join(\", \");\n const returnType = getReturnType(method.decoratorName, method.returnType);\n return `${method.name}(${params}): ${returnType};`;\n });\n\n return ` ${controller.namespace}: {\\n ${methods.join(\"\\n \")}\\n };`;\n });\n};\n", "import type { ControllerMetadata } from \"../parser/types.js\";\n\nexport const buildTypeDefinitions = (controllers: ControllerMetadata[]): string => {\n const referencedTypes = new Map<string, string>();\n\n const collectTypes = (types: (typeof controllers)[0][\"referencedTypes\"]) => {\n types.forEach((t) => {\n if (t.definition && !referencedTypes.has(t.name)) {\n referencedTypes.set(t.name, t.definition);\n collectTypes(t.referencedTypes);\n }\n });\n };\n\n controllers.forEach((c) => collectTypes(c.referencedTypes));\n\n return Array.from(referencedTypes.entries())\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([, def]) => `export ${def}`)\n .join(\"\\n\\n\");\n};\n", "import type { ControllerMetadata } from \"../parser/types.js\";\n\nimport { buildNamespaces } from \"./build-namespaces.js\";\nimport { buildTypeDefinitions } from \"./build-type-definitions.js\";\n\nexport const generateRuntimeTypes = (controllers: ControllerMetadata[]): string => {\n const referenceTypes = Array.from(new Set(controllers.flatMap((c) => c.requiredReferenceTypes ?? []))).sort();\n const referenceDirectives = referenceTypes.map((refType) => `/// <reference types=\"${refType}\" />`).join(\"\\n\");\n const typeDefinitions = buildTypeDefinitions(controllers);\n const namespaces = buildNamespaces(controllers);\n\n const sections = [\"// Auto-generated by @electron-ipc-bridge/vite-plugin\", \"// Do not edit manually\", \"\"];\n if (referenceDirectives) {\n sections.push(referenceDirectives, \"\");\n }\n if (typeDefinitions) {\n sections.push(typeDefinitions, \"\");\n }\n\n return `${sections.join(\"\\n\")}\nexport interface IpcApi {\n${namespaces.join(\"\\n\")}\n}\n`;\n};\n", "export const normalizePath = (p: string): string => p.replace(/\\\\/g, \"/\");\n", "import path from \"path\";\nimport {\n CallExpression,\n CompilerOptions,\n createProgram,\n findConfigFile,\n forEachChild,\n isCallExpression,\n isIdentifier,\n parseJsonConfigFileContent,\n Program,\n readConfigFile,\n sys,\n TypeChecker,\n} from \"typescript\";\n\nimport { nestResolutionStrategy } from \"../strategies/nest.js\";\nimport type { DependencyResolutionStrategy } from \"../strategies/types.js\";\nimport type { ResolutionStrategy } from \"../types.js\";\n\nimport { processCreateIpcAppCall } from \"./process-create-ipc-app-call.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\n/** Maps a user-facing strategy name (e.g. `\"nest\"`) to its concrete implementation function. */\nfunction resolveStrategy(option?: ResolutionStrategy): DependencyResolutionStrategy | undefined {\n if (option === \"nest\") return nestResolutionStrategy;\n return undefined;\n}\n\nexport interface FindControllersResult {\n controllers: ControllerMetadata[];\n processedFiles: Set<string>;\n program: Program;\n}\n\nconst isCreateIpcAppCall = (node: CallExpression, typeChecker: TypeChecker): boolean => {\n if (!isIdentifier(node.expression)) return false;\n const sym = typeChecker.getSymbolAtLocation(node.expression);\n if (!sym) return false;\n let target = sym;\n try {\n const aliased = typeChecker.getAliasedSymbol(sym);\n if (aliased) target = aliased;\n } catch {\n // Not an alias; use original symbol (e.g. local createIpcApp)\n }\n return target.name === \"createIpcApp\";\n};\n\nexport const findControllers = (\n entryFile: string,\n tsConfigPath?: string,\n oldProgram?: Program,\n resolutionStrategy?: ResolutionStrategy,\n): FindControllersResult => {\n const strategy = resolveStrategy(resolutionStrategy);\n const searchConfig = tsConfigPath || \"tsconfig.node.json\";\n let configFile = findConfigFile(path.dirname(entryFile), sys.fileExists, searchConfig);\n\n if (!configFile && !tsConfigPath) {\n configFile = findConfigFile(path.dirname(entryFile), sys.fileExists, \"tsconfig.json\");\n }\n\n let compilerOptions: CompilerOptions = {};\n if (configFile) {\n const { config } = readConfigFile(configFile, sys.readFile);\n const { options } = parseJsonConfigFileContent(config, sys, path.dirname(configFile));\n compilerOptions = options;\n }\n\n const program = createProgram([entryFile], compilerOptions, undefined, oldProgram);\n const typeChecker = program.getTypeChecker();\n const sourceFile = program.getSourceFile(entryFile);\n\n if (!sourceFile) {\n return { controllers: [], processedFiles: new Set(), program };\n }\n\n const controllers: ControllerMetadata[] = [];\n const processedFiles = new Set<string>();\n const fileCache = new Map<string, ControllerMetadata[]>();\n\n processedFiles.add(path.resolve(entryFile));\n\n forEachChild(sourceFile, function visit(node) {\n if (isCallExpression(node) && isCreateIpcAppCall(node, typeChecker)) {\n processCreateIpcAppCall(node, typeChecker, processedFiles, controllers, fileCache, strategy);\n }\n forEachChild(node, visit);\n });\n\n return { controllers, processedFiles, program };\n};\n", "import {\n ClassDeclaration,\n forEachChild,\n isCallExpression,\n isClassDeclaration,\n isIdentifier,\n isPropertyAccessExpression,\n SourceFile,\n TypeChecker,\n} from \"typescript\";\n\nimport { resolveControllersFromNestRoot } from \"../parser/resolve-controllers-from-nest-root.js\";\n\nimport type { DependencyResolutionStrategy, ResolutionContext } from \"./types.js\";\n\n/**\n * Scans a source file for `NestFactory.createApplicationContext(ModuleClass)` and\n * returns the class declaration of `ModuleClass` if found.\n */\nconst findNestRootModule = (sourceFile: SourceFile, typeChecker: TypeChecker): ClassDeclaration | undefined => {\n let found: ClassDeclaration | undefined;\n\n const visit = (node: import(\"typescript\").Node): void => {\n if (found) return;\n if (!isCallExpression(node)) {\n forEachChild(node, visit);\n return;\n }\n const expr = node.expression;\n if (!isPropertyAccessExpression(expr) || expr.name.text !== \"createApplicationContext\") {\n forEachChild(node, visit);\n return;\n }\n const firstArg = node.arguments[0];\n if (!firstArg || !isIdentifier(firstArg)) {\n forEachChild(node, visit);\n return;\n }\n const symbol = typeChecker.getSymbolAtLocation(firstArg);\n if (!symbol) {\n forEachChild(node, visit);\n return;\n }\n let targetSymbol = symbol;\n try {\n const aliased = typeChecker.getAliasedSymbol(symbol);\n if (aliased) targetSymbol = aliased;\n } catch {\n // not an alias\n }\n const decl = targetSymbol.declarations?.[0];\n if (decl && isClassDeclaration(decl)) {\n found = decl;\n return;\n }\n forEachChild(node, visit);\n };\n\n forEachChild(sourceFile, visit);\n return found;\n};\n\n/**\n * NestJS resolution strategy: locates the root module via\n * `NestFactory.createApplicationContext(ModuleClass)` and recursively walks\n * `@Module({ imports: [...] })` to discover all IPC controllers.\n */\nexport const nestResolutionStrategy = (context: ResolutionContext): ReturnType<DependencyResolutionStrategy> => {\n const { fileCache, processedFiles, sourceFile, typeChecker } = context;\n const rootModule = findNestRootModule(sourceFile, typeChecker);\n if (!rootModule) return [];\n\n const controllers: ReturnType<DependencyResolutionStrategy> = [];\n const visitedModules = new Set<string>();\n resolveControllersFromNestRoot(rootModule, typeChecker, processedFiles, controllers, fileCache, visitedModules);\n return controllers;\n};\n", "import path from \"path\";\nimport {\n ClassDeclaration,\n Expression,\n getDecorators,\n isArrayLiteralExpression,\n isArrowFunction,\n isBlock,\n isCallExpression,\n isClassDeclaration,\n isIdentifier,\n isObjectLiteralExpression,\n isPropertyAssignment,\n isReturnStatement,\n TypeChecker,\n} from \"typescript\";\n\nimport { resolveControllersFromModuleClass } from \"./resolve-controllers-from-module-class.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\nconst normalizePathSafe = (p: string) => path.normalize(p).replace(/\\\\/g, \"/\");\n\nfunction resolveImportElementToClass(element: Expression, typeChecker: TypeChecker): ClassDeclaration | undefined {\n if (isIdentifier(element)) {\n const symbol = typeChecker.getSymbolAtLocation(element);\n if (!symbol) return undefined;\n let target = symbol;\n try {\n const aliased = typeChecker.getAliasedSymbol(symbol);\n if (aliased) target = aliased;\n } catch {\n // not an alias\n }\n const decl = target.declarations?.[0];\n return decl && isClassDeclaration(decl) ? decl : undefined;\n }\n if (isCallExpression(element)) {\n const firstArg = element.arguments[0];\n if (!firstArg) return undefined;\n if (isArrowFunction(firstArg)) {\n const body = firstArg.body;\n if (isIdentifier(body)) return resolveImportElementToClass(body, typeChecker);\n if (isBlock(body)) {\n const ret = body.statements.find((s) => isReturnStatement(s));\n if (ret && isReturnStatement(ret) && ret.expression)\n return resolveImportElementToClass(ret.expression, typeChecker);\n }\n }\n }\n return undefined;\n}\n\n/**\n * Resolves all IPC controllers from a Nest root module and its imported modules recursively.\n */\nexport const resolveControllersFromNestRoot = (\n targetDecl: ClassDeclaration,\n typeChecker: TypeChecker,\n processedFiles: Set<string>,\n controllers: ControllerMetadata[],\n fileCache: Map<string, ControllerMetadata[]>,\n visitedModules: Set<string>,\n): void => {\n const sourceFile = targetDecl.getSourceFile();\n const filePath = normalizePathSafe(sourceFile.fileName);\n if (visitedModules.has(filePath)) return;\n visitedModules.add(filePath);\n\n resolveControllersFromModuleClass(targetDecl, typeChecker, processedFiles, controllers, fileCache);\n\n const decorators = getDecorators(targetDecl);\n if (!decorators) return;\n\n for (const decorator of decorators) {\n if (!isCallExpression(decorator.expression)) continue;\n const moduleArgs = decorator.expression.arguments;\n const moduleOptions = moduleArgs[0];\n if (!moduleOptions || !isObjectLiteralExpression(moduleOptions)) continue;\n\n const importsProp = moduleOptions.properties.find(\n (p): p is import(\"typescript\").PropertyAssignment =>\n isPropertyAssignment(p) && isIdentifier(p.name) && p.name.text === \"imports\",\n );\n if (!importsProp || !isArrayLiteralExpression(importsProp.initializer)) continue;\n\n for (const element of importsProp.initializer.elements) {\n const importClass = resolveImportElementToClass(element, typeChecker);\n if (importClass) {\n resolveControllersFromNestRoot(\n importClass,\n typeChecker,\n processedFiles,\n controllers,\n fileCache,\n visitedModules,\n );\n }\n }\n break;\n }\n};\n", "import {\n ClassDeclaration,\n getDecorators,\n isArrayLiteralExpression,\n isCallExpression,\n isIdentifier,\n isObjectLiteralExpression,\n isPropertyAssignment,\n TypeChecker,\n} from \"typescript\";\n\nimport { resolveController } from \"./resolve-controller.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\nexport const resolveControllersFromModuleClass = (\n targetDecl: ClassDeclaration,\n typeChecker: TypeChecker,\n processedFiles: Set<string>,\n controllers: ControllerMetadata[],\n fileCache: Map<string, ControllerMetadata[]>,\n): void => {\n const decorators = getDecorators(targetDecl);\n if (!decorators) return;\n\n for (const decorator of decorators) {\n if (!isCallExpression(decorator.expression)) continue;\n const moduleArgs = decorator.expression.arguments;\n const moduleOptions = moduleArgs[0];\n if (!moduleOptions || !isObjectLiteralExpression(moduleOptions)) continue;\n\n const properties = moduleOptions.properties;\n for (const prop of properties) {\n if (!isPropertyAssignment(prop) || !isIdentifier(prop.name)) continue;\n if (prop.name.text === \"providers\" || prop.name.text === \"controllers\") {\n if (!isArrayLiteralExpression(prop.initializer)) continue;\n const providerElements = prop.initializer.elements;\n providerElements.forEach((element) => {\n resolveController(element, typeChecker, processedFiles, controllers, fileCache);\n });\n }\n }\n }\n};\n", "import { Expression, isClassDeclaration, TypeChecker } from \"typescript\";\n\nimport { collectDependencies } from \"./collect-dependencies.js\";\nimport { extractControllerMetadata } from \"./extract-metadata.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\nexport const resolveController = (\n node: Expression,\n typeChecker: TypeChecker,\n processedFiles: Set<string>,\n controllers: ControllerMetadata[],\n fileCache: Map<string, ControllerMetadata[]>,\n): void => {\n const symbol = typeChecker.getSymbolAtLocation(node);\n if (!symbol) return;\n\n let targetSymbol = symbol;\n try {\n const aliasedSymbol = typeChecker.getAliasedSymbol(symbol);\n targetSymbol = aliasedSymbol || symbol;\n } catch {\n // Not an alias\n }\n\n if (!targetSymbol.declarations || targetSymbol.declarations.length === 0) return;\n\n const targetDecl = targetSymbol.declarations[0];\n if (!isClassDeclaration(targetDecl)) return;\n\n const sourceFile = targetDecl.getSourceFile();\n const fileName = sourceFile.fileName;\n const className = targetDecl.name?.text;\n if (!className) return;\n\n let fileControllers = fileCache.get(fileName);\n if (fileControllers === undefined) {\n fileControllers = extractControllerMetadata(sourceFile, typeChecker);\n fileCache.set(fileName, fileControllers);\n processedFiles.add(fileName);\n }\n\n const match = fileControllers.find((c) => c.className === className);\n if (match) {\n controllers.push(match);\n collectDependencies(match.referencedTypes, processedFiles);\n }\n};\n", "import { ControllerMetadata, TypeDefinition } from \"./types.js\";\n\nexport const collectDependencies = (\n referencedTypes: ControllerMetadata[\"referencedTypes\"],\n processedFiles: Set<string>,\n) => {\n const visited = new Set<TypeDefinition>();\n\n const visit = (types: typeof referencedTypes) => {\n for (const type of types) {\n if (visited.has(type)) {\n continue;\n }\n visited.add(type);\n\n if (type.sourceFile) {\n processedFiles.add(type.sourceFile);\n }\n visit(type.referencedTypes);\n }\n };\n visit(referencedTypes);\n};\n", "import { forEachChild, isClassDeclaration, SourceFile, TypeChecker } from \"typescript\";\n\nimport { getDecorator } from \"./get-decorator.js\";\nimport { parseController } from \"./parse-controller.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\nexport const extractControllerMetadata = (sourceFile: SourceFile, typeChecker: TypeChecker): ControllerMetadata[] => {\n const controllers: ControllerMetadata[] = [];\n\n forEachChild(sourceFile, (node) => {\n if (isClassDeclaration(node)) {\n const decorator = getDecorator(node, \"IpcController\");\n if (decorator) {\n const controller = parseController(node, decorator, sourceFile, typeChecker);\n if (controller) {\n controllers.push(controller);\n }\n }\n }\n });\n\n return controllers;\n};\n", "import { canHaveDecorators, Decorator, getDecorators, isCallExpression, isIdentifier, Node } from \"typescript\";\n\nexport const getDecorator = (node: Node, name: string): Decorator | undefined => {\n if (!canHaveDecorators(node)) return undefined;\n\n const decorators = getDecorators(node);\n if (!decorators) return undefined;\n\n return decorators.find(\n (m) =>\n isCallExpression(m.expression) && isIdentifier(m.expression.expression) && m.expression.expression.text === name,\n );\n};\n", "import { deriveNamespace } from \"@electron-ipc-bridge/shared\";\nimport {\n ClassDeclaration,\n Decorator,\n isCallExpression,\n isIdentifier,\n isMethodDeclaration,\n isStringLiteral,\n SourceFile,\n TypeChecker,\n} from \"typescript\";\n\nimport { parseMethod } from \"./parse-method.js\";\nimport { ControllerMetadata, MethodMetadata } from \"./types.js\";\n\nexport const parseController = (\n node: ClassDeclaration,\n decorator: Decorator,\n sourceFile: SourceFile,\n typeChecker: TypeChecker,\n): ControllerMetadata => {\n const className = node.name!.text;\n let namespace = deriveNamespace(className);\n\n if (isCallExpression(decorator.expression)) {\n const args = decorator.expression.arguments;\n if (args.length > 0 && isStringLiteral(args[0])) {\n namespace = args[0].text;\n }\n }\n\n const methods: MethodMetadata[] = [];\n\n node.members.forEach((member) => {\n if (isMethodDeclaration(member) && member.name && isIdentifier(member.name)) {\n const methodMeta = parseMethod(member, typeChecker);\n if (methodMeta) {\n methods.push(methodMeta);\n }\n }\n });\n\n const referencedTypes = methods.flatMap((m) => m.referencedTypes);\n const requiredReferenceTypes = Array.from(new Set(methods.flatMap((m) => m.requiredReferenceTypes ?? []))).sort();\n\n return {\n className,\n filePath: sourceFile.fileName,\n methods,\n namespace,\n referencedTypes,\n requiredReferenceTypes,\n };\n};\n", "import {\n IPC_DECORATOR_ON,\n IPC_DECORATOR_ONCE,\n IPC_METHOD_DECORATOR_NAMES,\n IPC_PARAM_INJECTION_DECORATOR_NAMES,\n} from \"@electron-ipc-bridge/shared\";\nimport type { Decorator } from \"typescript\";\nimport { Identifier, isCallExpression, isStringLiteral, MethodDeclaration, TypeChecker } from \"typescript\";\n\nimport { collectExternalTypeReferencesFromType } from \"./collect-external-type-references.js\";\nimport { collectTypeDefinitions, collectTypeDefinitionsFromType } from \"./extract-type.js\";\nimport { getDecorator } from \"./get-decorator.js\";\nimport { resolveReturnType } from \"./resolve-return-type.js\";\nimport { MethodMetadata, ParamMetadata, TypeDefinition } from \"./types.js\";\n\nexport const parseMethod = (node: MethodDeclaration, typeChecker: TypeChecker): MethodMetadata | null => {\n let found: (typeof IPC_METHOD_DECORATOR_NAMES)[number] | null = null;\n let decorator: Decorator | null = null;\n for (const d of IPC_METHOD_DECORATOR_NAMES) {\n const dec = getDecorator(node, d);\n if (dec) {\n found = d;\n decorator = dec;\n break;\n }\n }\n if (!found || !decorator) return null;\n\n let name = (node.name as Identifier).text;\n\n if (isCallExpression(decorator.expression)) {\n const args = decorator.expression.arguments;\n if (args.length > 0 && isStringLiteral(args[0])) {\n name = args[0].text;\n }\n }\n\n const signature = typeChecker.getSignatureFromDeclaration(node);\n const returnType = resolveReturnType(node, signature ?? undefined, typeChecker);\n\n const referencedTypes: TypeDefinition[] = [];\n const requiredReferenceTypes = new Set<string>();\n const seen = new Set<string>();\n\n const paramInfos = node.parameters.map((param) => {\n const hasInjection = IPC_PARAM_INJECTION_DECORATOR_NAMES.some((d) => getDecorator(param, d));\n return { hasInjection, param };\n });\n\n const params: ParamMetadata[] = [];\n for (const { hasInjection, param } of paramInfos) {\n const type = typeChecker.getTypeAtLocation(param);\n const typeString = typeChecker.typeToString(type);\n const extracted = !hasInjection && param.type ? collectTypeDefinitions(param.type, typeChecker, seen) : [];\n if (!hasInjection) {\n collectExternalTypeReferencesFromType(type, typeChecker, requiredReferenceTypes);\n }\n referencedTypes.push(...extracted);\n params.push({\n name: param.name.getText(),\n optional: !!param.questionToken || !!param.initializer,\n type: typeString,\n });\n }\n\n const filteredParams = params.filter((_, index) => !paramInfos[index].hasInjection);\n\n if (node.type) {\n const returnTypeRefs = collectTypeDefinitions(node.type, typeChecker, seen);\n referencedTypes.push(...returnTypeRefs);\n } else if (signature) {\n const returnTypeRefs = collectTypeDefinitionsFromType(signature.getReturnType(), typeChecker, seen);\n referencedTypes.push(...returnTypeRefs);\n }\n\n if (signature && found !== IPC_DECORATOR_ON && found !== IPC_DECORATOR_ONCE) {\n collectExternalTypeReferencesFromType(signature.getReturnType(), typeChecker, requiredReferenceTypes);\n }\n\n return {\n decoratorName: found,\n name,\n params: filteredParams,\n referencedTypes,\n requiredReferenceTypes: Array.from(requiredReferenceTypes).sort(),\n returnType,\n };\n};\n", "import {\n isEnumDeclaration,\n isInterfaceDeclaration,\n isTypeAliasDeclaration,\n Symbol,\n Type,\n TypeChecker,\n} from \"typescript\";\n\nconst NODE_TYPES_PATH_RE = /[\\\\/]@types[\\\\/]node[\\\\/]/i;\n\nconst pickDeclaration = (symbol: Symbol | undefined) =>\n symbol\n ?.getDeclarations()\n ?.find((d) => isTypeAliasDeclaration(d) || isInterfaceDeclaration(d) || isEnumDeclaration(d));\n\nconst resolveDeclarationFromSymbol = (symbol: Symbol | undefined, typeChecker: TypeChecker) => {\n let decl = pickDeclaration(symbol);\n if (!decl && symbol) {\n try {\n const aliased = typeChecker.getAliasedSymbol(symbol);\n const aliasedDecl = pickDeclaration(aliased);\n if (aliasedDecl) {\n decl = aliasedDecl;\n }\n } catch {\n // Not an alias; fall back to original symbol\n }\n }\n return decl;\n};\n\nconst addReferenceTypeIfExternal = (symbol: Symbol | undefined, typeChecker: TypeChecker, out: Set<string>): void => {\n const decl = resolveDeclarationFromSymbol(symbol, typeChecker);\n if (!decl) return;\n\n const sourceFile = decl.getSourceFile();\n if (NODE_TYPES_PATH_RE.test(sourceFile.fileName)) {\n out.add(\"node\");\n }\n};\n\nconst walkTypeForExternalRefs = (type: Type, typeChecker: TypeChecker, seen: Set<Type>, out: Set<string>): void => {\n if (seen.has(type)) return;\n seen.add(type);\n\n addReferenceTypeIfExternal(type.getSymbol(), typeChecker, out);\n\n const typeWithAlias = type as Type & { aliasSymbol?: Symbol };\n addReferenceTypeIfExternal(typeWithAlias.aliasSymbol, typeChecker, out);\n\n const typeWithNested = type as Type & {\n aliasTypeArguments?: readonly Type[];\n typeArguments?: readonly Type[];\n types?: readonly Type[];\n };\n\n typeWithNested.aliasTypeArguments?.forEach((arg) => walkTypeForExternalRefs(arg, typeChecker, seen, out));\n typeWithNested.typeArguments?.forEach((arg) => walkTypeForExternalRefs(arg, typeChecker, seen, out));\n typeWithNested.types?.forEach((nested) => walkTypeForExternalRefs(nested, typeChecker, seen, out));\n};\n\nexport const collectExternalTypeReferencesFromType = (\n type: Type,\n typeChecker: TypeChecker,\n out = new Set<string>(),\n): Set<string> => {\n walkTypeForExternalRefs(type, typeChecker, new Set<Type>(), out);\n return out;\n};\n", "import {\n createPrinter,\n EmitHint,\n forEachChild,\n isEnumDeclaration,\n isInterfaceDeclaration,\n isTypeAliasDeclaration,\n isTypeReferenceNode,\n Node,\n Symbol,\n Type,\n TypeChecker,\n} from \"typescript\";\n\nimport { BUILTIN_TYPE_NAMES } from \"./constants.js\";\nimport { TypeDefinition } from \"./types.js\";\n\nconst printer = createPrinter({ removeComments: true });\n\nexport const collectTypeDefinitions = (\n node: Node,\n typeChecker: TypeChecker,\n seen = new Set<string>(),\n): TypeDefinition[] => {\n const result: TypeDefinition[] = [];\n walkForTypeRefs(node, typeChecker, seen, result);\n return result;\n};\n\nexport const collectTypeDefinitionsFromType = (\n type: Type,\n typeChecker: TypeChecker,\n seen = new Set<string>(),\n): TypeDefinition[] => {\n const result: TypeDefinition[] = [];\n walkTypeForTypeRefs(type, typeChecker, seen, result);\n return result;\n};\n\nconst pickDeclaration = (symbol: Symbol | undefined) =>\n symbol\n ?.getDeclarations()\n ?.find((d) => isTypeAliasDeclaration(d) || isInterfaceDeclaration(d) || isEnumDeclaration(d));\n\nconst resolveDeclarationFromSymbol = (symbol: Symbol | undefined, typeChecker: TypeChecker) => {\n let decl = pickDeclaration(symbol);\n if (!decl && symbol) {\n try {\n const aliased = typeChecker.getAliasedSymbol(symbol);\n const aliasedDecl = pickDeclaration(aliased);\n if (aliasedDecl) {\n decl = aliasedDecl;\n }\n } catch {\n // Not an alias; fall back to original symbol\n }\n }\n return decl;\n};\n\nconst addDefinitionFromDeclaration = (\n decl: ReturnType<typeof pickDeclaration>,\n typeChecker: TypeChecker,\n seen: Set<string>,\n out: TypeDefinition[],\n): void => {\n if (!decl || !(isTypeAliasDeclaration(decl) || isInterfaceDeclaration(decl) || isEnumDeclaration(decl))) {\n return;\n }\n const name = decl.name.text;\n if (BUILTIN_TYPE_NAMES.has(name) || seen.has(name)) {\n return;\n }\n seen.add(name);\n\n const sourceFile = decl.getSourceFile();\n if (sourceFile.fileName.includes(\"node_modules\")) {\n return;\n }\n\n const referencedTypes: TypeDefinition[] = [];\n walkForTypeRefs(decl, typeChecker, seen, referencedTypes);\n\n const definition = printer\n .printNode(EmitHint.Unspecified, decl, sourceFile)\n .replace(/^\\s*export\\s+/, \"\")\n .replace(/^\\s*declare\\s+/, \"\")\n .trim();\n\n if (definition) {\n out.push({ definition, name, referencedTypes, sourceFile: sourceFile.fileName });\n }\n};\n\nconst walkForTypeRefs = (node: Node, typeChecker: TypeChecker, seen: Set<string>, out: TypeDefinition[]): void => {\n if (isTypeReferenceNode(node)) {\n const sym = typeChecker.getSymbolAtLocation(node.typeName);\n addDefinitionFromDeclaration(resolveDeclarationFromSymbol(sym, typeChecker), typeChecker, seen, out);\n\n if (node.typeArguments) {\n node.typeArguments.forEach((arg) => walkForTypeRefs(arg, typeChecker, seen, out));\n }\n return;\n }\n\n forEachChild(node, (child) => walkForTypeRefs(child, typeChecker, seen, out));\n};\n\nconst walkTypeForTypeRefs = (type: Type, typeChecker: TypeChecker, seen: Set<string>, out: TypeDefinition[]): void => {\n addDefinitionFromDeclaration(resolveDeclarationFromSymbol(type.getSymbol(), typeChecker), typeChecker, seen, out);\n\n const typeWithAlias = type as Type & { aliasSymbol?: Symbol };\n addDefinitionFromDeclaration(\n resolveDeclarationFromSymbol(typeWithAlias.aliasSymbol, typeChecker),\n typeChecker,\n seen,\n out,\n );\n\n const typeWithNested = type as Type & {\n aliasTypeArguments?: readonly Type[];\n typeArguments?: readonly Type[];\n types?: readonly Type[];\n };\n\n typeWithNested.aliasTypeArguments?.forEach((arg) => walkTypeForTypeRefs(arg, typeChecker, seen, out));\n typeWithNested.typeArguments?.forEach((arg) => walkTypeForTypeRefs(arg, typeChecker, seen, out));\n typeWithNested.types?.forEach((nested) => walkTypeForTypeRefs(nested, typeChecker, seen, out));\n};\n", "export const BUILTIN_TYPE_NAMES = new Set([\n \"Promise\",\n \"Array\",\n \"Map\",\n \"Set\",\n \"WeakMap\",\n \"WeakSet\",\n \"Date\",\n \"RegExp\",\n \"Function\",\n \"Symbol\",\n \"Error\",\n \"Record\",\n \"Partial\",\n \"Required\",\n \"Readonly\",\n \"Pick\",\n \"Omit\",\n \"Exclude\",\n \"Extract\",\n \"NonNullable\",\n \"ReturnType\",\n \"Parameters\",\n \"InstanceType\",\n \"ConstructorParameters\",\n \"__type\",\n \"undefined\",\n]);\n", "import type { Signature } from \"typescript\";\nimport { createPrinter, EmitHint, MethodDeclaration, TypeChecker, TypeFormatFlags } from \"typescript\";\n\nimport { isTruncatedTypeString } from \"./is-truncated-type-string.js\";\n\nconst printer = createPrinter();\n\nexport const resolveReturnType = (\n node: MethodDeclaration,\n signature: Signature | undefined,\n typeChecker: TypeChecker,\n): string => {\n if (node.type) {\n return printer.printNode(EmitHint.Unspecified, node.type, node.getSourceFile()).trim();\n }\n const inferred =\n signature != null\n ? typeChecker.typeToString(\n signature.getReturnType(),\n undefined,\n TypeFormatFlags.NoTruncation | TypeFormatFlags.UseFullyQualifiedType,\n )\n : \"unknown\";\n\n if (isTruncatedTypeString(inferred)) return \"unknown\";\n\n // Strip import(\"...\") wrappers only for local file paths (starting with ./, ../, /, or Drive letter)\n // This keeps external package imports (like import(\"zod\")) intact, while simplifying local types to their names\n // (since we generate definitions for them in the same file).\n return inferred.replace(/import\\(\"(?:\\.|\\/|[a-zA-Z]:).*?\"\\)\\./g, \"\");\n};\n", "/** True if the type string was truncated by TypeScript (e.g. \"... 27 more ...\"). */\nexport const isTruncatedTypeString = (s: string): boolean => /\\.\\.\\.\\s+\\d+\\s+more\\s+\\.\\.\\./.test(s);\n", "import {\n CallExpression,\n isArrayLiteralExpression,\n isCallExpression,\n isClassDeclaration,\n isIdentifier,\n isObjectLiteralExpression,\n isPropertyAssignment,\n PropertyAssignment,\n TypeChecker,\n} from \"typescript\";\n\nimport { DependencyResolutionStrategy } from \"../strategies/types.js\";\n\nimport { resolveExpression } from \"./ast-utils.js\";\nimport { resolveControllersFromArray } from \"./resolve-controllers-from-array.js\";\nimport { resolveControllersFromModule } from \"./resolve-controllers-from-module.js\";\nimport { resolveControllersFromModuleClass } from \"./resolve-controllers-from-module-class.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\nexport const processCreateIpcAppCall = (\n node: CallExpression,\n typeChecker: TypeChecker,\n processedFiles: Set<string>,\n controllers: ControllerMetadata[],\n fileCache: Map<string, ControllerMetadata[]>,\n resolutionStrategy?: DependencyResolutionStrategy,\n): void => {\n const args = node.arguments;\n if (args.length === 0) return;\n\n const optionsObj = resolveExpression(args[0], typeChecker);\n if (!isObjectLiteralExpression(optionsObj)) return;\n\n const controllersProp = optionsObj.properties.find(\n (p): p is PropertyAssignment => isPropertyAssignment(p) && isIdentifier(p.name) && p.name.text === \"controllers\",\n );\n\n if (!controllersProp) return;\n\n const initializer = resolveExpression(controllersProp.initializer, typeChecker);\n\n if (isArrayLiteralExpression(initializer)) {\n resolveControllersFromArray(initializer, typeChecker, processedFiles, controllers, fileCache);\n return;\n }\n\n if (isCallExpression(initializer)) {\n resolveControllersFromModule(initializer, typeChecker, processedFiles, controllers, fileCache);\n\n for (const arg of initializer.arguments) {\n const resolvedArg = resolveExpression(arg, typeChecker);\n\n if (isCallExpression(resolvedArg)) {\n for (const factoryArg of resolvedArg.arguments) {\n const resolvedFactoryArg = resolveExpression(factoryArg, typeChecker);\n\n if (!isIdentifier(resolvedFactoryArg)) continue;\n const factorySymbol = typeChecker.getSymbolAtLocation(resolvedFactoryArg);\n if (!factorySymbol) continue;\n\n let targetSymbol = factorySymbol;\n try {\n const aliased = typeChecker.getAliasedSymbol(factorySymbol);\n targetSymbol = aliased || factorySymbol;\n } catch {\n // Not an alias\n }\n\n const targetDecl = targetSymbol.declarations?.[0];\n if (targetDecl && isClassDeclaration(targetDecl)) {\n resolveControllersFromModuleClass(targetDecl, typeChecker, processedFiles, controllers, fileCache);\n }\n }\n }\n }\n\n if (controllers.length === 0 && resolutionStrategy) {\n const context = {\n fileCache,\n processedFiles,\n sourceFile: node.getSourceFile(),\n typeChecker,\n };\n const resolved = resolutionStrategy(context);\n controllers.push(...resolved);\n }\n }\n};\n", "import {\n Expression,\n isAsExpression,\n isAwaitExpression,\n isIdentifier,\n isNonNullExpression,\n isParenthesizedExpression,\n isSatisfiesExpression,\n isTypeAssertionExpression,\n isVariableDeclaration,\n TypeChecker,\n} from \"typescript\";\n\nexport const unwrapExpression = (expr: Expression): Expression => {\n let current = expr;\n while (true) {\n if (isAwaitExpression(current)) {\n current = current.expression;\n continue;\n }\n if (isParenthesizedExpression(current)) {\n current = current.expression;\n continue;\n }\n if (isAsExpression(current)) {\n current = current.expression;\n continue;\n }\n if (isTypeAssertionExpression(current)) {\n current = current.expression;\n continue;\n }\n if (isNonNullExpression(current)) {\n current = current.expression;\n continue;\n }\n if (isSatisfiesExpression(current)) {\n current = current.expression;\n continue;\n }\n return current;\n }\n};\n\nexport const resolveExpression = (expr: Expression, typeChecker: TypeChecker): Expression => {\n let current = unwrapExpression(expr);\n const visited = new Set<Expression>();\n\n while (isIdentifier(current)) {\n if (visited.has(current)) break;\n visited.add(current);\n\n const symbol = typeChecker.getSymbolAtLocation(current);\n if (!symbol) break;\n\n let targetSymbol = symbol;\n try {\n const aliasedSymbol = typeChecker.getAliasedSymbol(symbol);\n targetSymbol = aliasedSymbol || symbol;\n } catch {\n // Not an alias\n }\n\n const decl = targetSymbol.declarations?.[0];\n if (decl && isVariableDeclaration(decl) && decl.initializer) {\n current = unwrapExpression(decl.initializer);\n } else {\n break;\n }\n }\n\n return current;\n};\n", "import { ArrayLiteralExpression, TypeChecker } from \"typescript\";\n\nimport { resolveController } from \"./resolve-controller.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\nexport const resolveControllersFromArray = (\n initializer: ArrayLiteralExpression,\n typeChecker: TypeChecker,\n processedFiles: Set<string>,\n controllers: ControllerMetadata[],\n fileCache: Map<string, ControllerMetadata[]>,\n): void => {\n initializer.elements.forEach((element) => {\n resolveController(element, typeChecker, processedFiles, controllers, fileCache);\n });\n};\n", "import { CallExpression, isClassDeclaration, isIdentifier, TypeChecker } from \"typescript\";\n\nimport { resolveControllersFromModuleClass } from \"./resolve-controllers-from-module-class.js\";\nimport { ControllerMetadata } from \"./types.js\";\n\nexport const resolveControllersFromModule = (\n callExpr: CallExpression,\n typeChecker: TypeChecker,\n processedFiles: Set<string>,\n controllers: ControllerMetadata[],\n fileCache: Map<string, ControllerMetadata[]>,\n): void => {\n const moduleArg = callExpr.arguments[0];\n if (moduleArg && isIdentifier(moduleArg)) {\n const moduleSymbol = typeChecker.getSymbolAtLocation(moduleArg);\n if (!moduleSymbol) return;\n\n let targetSymbol = moduleSymbol;\n try {\n const aliasedSymbol = typeChecker.getAliasedSymbol(moduleSymbol);\n targetSymbol = aliasedSymbol || moduleSymbol;\n } catch {\n // Not an alias\n }\n\n const targetDecl = targetSymbol.declarations?.[0];\n if (!targetDecl || !isClassDeclaration(targetDecl)) return;\n\n resolveControllersFromModuleClass(targetDecl, typeChecker, processedFiles, controllers, fileCache);\n }\n};\n", "import { IPC_DEFAULT_API_ROOT } from \"@electron-ipc-bridge/shared\";\nimport fs from \"fs\";\nimport {\n createSourceFile,\n forEachChild,\n isCallExpression,\n isIdentifier,\n isObjectLiteralExpression,\n isPropertyAssignment,\n isStringLiteral,\n ScriptTarget,\n} from \"typescript\";\n\nexport const resolveApiRootFromPreload = (preloadPath: string): { namespace: string; dependencies: Set<string> } => {\n const dependencies = new Set<string>();\n dependencies.add(preloadPath);\n let namespace: string = IPC_DEFAULT_API_ROOT;\n\n if (!fs.existsSync(preloadPath)) {\n return { dependencies, namespace };\n }\n\n const content = fs.readFileSync(preloadPath, \"utf-8\");\n const sourceFile = createSourceFile(preloadPath, content, ScriptTarget.Latest, true);\n\n const visit = (node: import(\"typescript\").Node) => {\n if (isCallExpression(node) && isIdentifier(node.expression) && node.expression.text === \"setupPreload\") {\n const args = node.arguments;\n if (args.length > 0) {\n const first = args[0];\n if (isStringLiteral(first)) {\n namespace = first.text;\n } else if (isObjectLiteralExpression(first)) {\n const namespaceProp = first.properties.find(\n (p) => isPropertyAssignment(p) && isIdentifier(p.name) && p.name.text === \"namespace\",\n );\n if (namespaceProp && isPropertyAssignment(namespaceProp) && isStringLiteral(namespaceProp.initializer)) {\n namespace = namespaceProp.initializer.text;\n }\n }\n }\n }\n forEachChild(node, visit);\n };\n\n forEachChild(sourceFile, visit);\n\n return { dependencies, namespace };\n};\n", "import path from \"path\";\n\nimport {\n DEFAULT_GLOBAL_TYPES_FILENAME,\n DEFAULT_RENDERER_RUNTIME_DIR,\n DEFAULT_RUNTIME_TYPES_FILENAME,\n} from \"./constants.js\";\nimport type { PluginTypesOptions } from \"./plugin.js\";\n\nexport interface ResolveTypePathsOptions {\n hasRendererRuntimeDir: (absPath: string) => boolean;\n preloadPath: string;\n root: string;\n types: PluginTypesOptions;\n}\n\nexport interface ResolvedTypePaths {\n globalPath: string | null;\n runtimePath: string | null;\n}\n\nexport const resolveTypePaths = ({\n hasRendererRuntimeDir,\n preloadPath,\n root,\n types,\n}: ResolveTypePathsOptions): ResolvedTypePaths => {\n const runtimePath =\n types.runtime === false\n ? null\n : types.runtime\n ? path.resolve(root, types.runtime)\n : (() => {\n const rendererSrc = path.resolve(root, DEFAULT_RENDERER_RUNTIME_DIR);\n if (hasRendererRuntimeDir(rendererSrc)) {\n return path.join(rendererSrc, DEFAULT_RUNTIME_TYPES_FILENAME);\n }\n return path.resolve(root, path.join(\"src\", DEFAULT_RUNTIME_TYPES_FILENAME));\n })();\n\n const globalPath =\n types.global === false\n ? null\n : types.global\n ? path.resolve(root, types.global)\n : path.join(path.dirname(preloadPath), DEFAULT_GLOBAL_TYPES_FILENAME);\n\n return { globalPath, runtimePath };\n};\n", "import type { Program } from \"typescript\";\n\nexport class PluginState {\n private controllerFiles: Set<string> | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private hasGeneratedOnce = false;\n private lastHash: string | null = null;\n private program: Program | null = null;\n\n constructor(private readonly debounceMs = 100) {}\n\n claimInitialGeneration(): boolean {\n if (!this.hasGeneratedOnce) {\n this.hasGeneratedOnce = true;\n return true;\n }\n return false;\n }\n\n getProgram(): Program | undefined {\n return this.program ?? undefined;\n }\n\n scheduleGenerate(callback: () => void): void {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n callback();\n this.debounceTimer = null;\n }, this.debounceMs);\n }\n\n setControllerFiles(files: Set<string>): void {\n this.controllerFiles = files;\n }\n\n setProgram(program: Program): void {\n this.program = program;\n }\n\n shouldRegenerate(absId: string, mainEntryPath: string, preloadEntryPath?: string): boolean {\n const isMainEntry = absId === mainEntryPath;\n const isPreloadEntry = preloadEntryPath ? absId === preloadEntryPath : false;\n const isControllerFile = this.controllerFiles?.has(absId);\n return isMainEntry || isPreloadEntry || !!isControllerFile;\n }\n\n updateHash(hash: string): boolean {\n if (hash === this.lastHash) {\n return false;\n }\n this.lastHash = hash;\n return true;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "fs", "path", "path", "forEachChild", "isCallExpression", "isIdentifier", "forEachChild", "isCallExpression", "isClassDeclaration", "isIdentifier", "getDecorators", "isArrayLiteralExpression", "isCallExpression", "isClassDeclaration", "isIdentifier", "isObjectLiteralExpression", "isPropertyAssignment", "getDecorators", "isCallExpression", "isIdentifier", "isClassDeclaration", "forEachChild", "isCallExpression", "isIdentifier", "isStringLiteral", "isCallExpression", "isEnumDeclaration", "isInterfaceDeclaration", "isTypeAliasDeclaration", "pickDeclaration", "isTypeAliasDeclaration", "isInterfaceDeclaration", "isEnumDeclaration", "resolveDeclarationFromSymbol", "createPrinter", "EmitHint", "printer", "createPrinter", "EmitHint", "isCallExpression", "isCallExpression", "isStringLiteral", "isIdentifier", "forEachChild", "isClassDeclaration", "getDecorators", "isCallExpression", "isIdentifier", "isIdentifier", "isClassDeclaration", "isCallExpression", "getDecorators", "isObjectLiteralExpression", "isPropertyAssignment", "isArrayLiteralExpression", "isCallExpression", "forEachChild", "isIdentifier", "isClassDeclaration", "isArrayLiteralExpression", "isCallExpression", "isClassDeclaration", "isIdentifier", "isObjectLiteralExpression", "isPropertyAssignment", "isIdentifier", "isClassDeclaration", "isIdentifier", "isIdentifier", "isClassDeclaration", "isObjectLiteralExpression", "isPropertyAssignment", "isIdentifier", "isArrayLiteralExpression", "isCallExpression", "isClassDeclaration", "isIdentifier", "path", "forEachChild", "isCallExpression", "forEachChild", "isCallExpression", "isIdentifier", "isObjectLiteralExpression", "isPropertyAssignment", "isStringLiteral", "path", "path", "path", "fs", "path"]
7
+ }
@@ -0,0 +1 @@
1
+ export declare const normalizePath: (p: string) => string;
@@ -0,0 +1,3 @@
1
+ import { Expression, TypeChecker } from "typescript";
2
+ export declare const unwrapExpression: (expr: Expression) => Expression;
3
+ export declare const resolveExpression: (expr: Expression, typeChecker: TypeChecker) => Expression;
@@ -0,0 +1,2 @@
1
+ import { ControllerMetadata } from "./types.js";
2
+ export declare const collectDependencies: (referencedTypes: ControllerMetadata["referencedTypes"], processedFiles: Set<string>) => void;
@@ -0,0 +1,2 @@
1
+ import { Type, TypeChecker } from "typescript";
2
+ export declare const collectExternalTypeReferencesFromType: (type: Type, typeChecker: TypeChecker, out?: Set<string>) => Set<string>;
@@ -0,0 +1 @@
1
+ export declare const BUILTIN_TYPE_NAMES: Set<string>;
@@ -0,0 +1,3 @@
1
+ import { SourceFile, TypeChecker } from "typescript";
2
+ import { ControllerMetadata } from "./types.js";
3
+ export declare const extractControllerMetadata: (sourceFile: SourceFile, typeChecker: TypeChecker) => ControllerMetadata[];
@@ -0,0 +1,4 @@
1
+ import { Node, Type, TypeChecker } from "typescript";
2
+ import { TypeDefinition } from "./types.js";
3
+ export declare const collectTypeDefinitions: (node: Node, typeChecker: TypeChecker, seen?: Set<string>) => TypeDefinition[];
4
+ export declare const collectTypeDefinitionsFromType: (type: Type, typeChecker: TypeChecker, seen?: Set<string>) => TypeDefinition[];
@@ -0,0 +1,9 @@
1
+ import { Program } from "typescript";
2
+ import type { ResolutionStrategy } from "../types.js";
3
+ import { ControllerMetadata } from "./types.js";
4
+ export interface FindControllersResult {
5
+ controllers: ControllerMetadata[];
6
+ processedFiles: Set<string>;
7
+ program: Program;
8
+ }
9
+ export declare const findControllers: (entryFile: string, tsConfigPath?: string, oldProgram?: Program, resolutionStrategy?: ResolutionStrategy) => FindControllersResult;
@@ -0,0 +1,6 @@
1
+ import { ClassDeclaration, SourceFile, TypeChecker } from "typescript";
2
+ /**
3
+ * Finds the NestJS root module class in a source file by looking for
4
+ * NestFactory.createApplicationContext(ModuleClass).
5
+ */
6
+ export declare const findNestRootModule: (sourceFile: SourceFile, typeChecker: TypeChecker) => ClassDeclaration | undefined;
@@ -0,0 +1,2 @@
1
+ import { Decorator, Node } from "typescript";
2
+ export declare const getDecorator: (node: Node, name: string) => Decorator | undefined;
@@ -0,0 +1,2 @@
1
+ /** True if the type string was truncated by TypeScript (e.g. "... 27 more ..."). */
2
+ export declare const isTruncatedTypeString: (s: string) => boolean;
@@ -0,0 +1,3 @@
1
+ import { ClassDeclaration, Decorator, SourceFile, TypeChecker } from "typescript";
2
+ import { ControllerMetadata } from "./types.js";
3
+ export declare const parseController: (node: ClassDeclaration, decorator: Decorator, sourceFile: SourceFile, typeChecker: TypeChecker) => ControllerMetadata;
@@ -0,0 +1,3 @@
1
+ import { MethodDeclaration, TypeChecker } from "typescript";
2
+ import { MethodMetadata } from "./types.js";
3
+ export declare const parseMethod: (node: MethodDeclaration, typeChecker: TypeChecker) => MethodMetadata | null;
@@ -0,0 +1,4 @@
1
+ import { CallExpression, TypeChecker } from "typescript";
2
+ import { DependencyResolutionStrategy } from "../strategies/types.js";
3
+ import { ControllerMetadata } from "./types.js";
4
+ export declare const processCreateIpcAppCall: (node: CallExpression, typeChecker: TypeChecker, processedFiles: Set<string>, controllers: ControllerMetadata[], fileCache: Map<string, ControllerMetadata[]>, resolutionStrategy?: DependencyResolutionStrategy) => void;
@@ -0,0 +1,3 @@
1
+ import { Expression, TypeChecker } from "typescript";
2
+ import { ControllerMetadata } from "./types.js";
3
+ export declare const resolveController: (node: Expression, typeChecker: TypeChecker, processedFiles: Set<string>, controllers: ControllerMetadata[], fileCache: Map<string, ControllerMetadata[]>) => void;
@@ -0,0 +1,3 @@
1
+ import { ArrayLiteralExpression, TypeChecker } from "typescript";
2
+ import { ControllerMetadata } from "./types.js";
3
+ export declare const resolveControllersFromArray: (initializer: ArrayLiteralExpression, typeChecker: TypeChecker, processedFiles: Set<string>, controllers: ControllerMetadata[], fileCache: Map<string, ControllerMetadata[]>) => void;
@@ -0,0 +1,3 @@
1
+ import { ClassDeclaration, TypeChecker } from "typescript";
2
+ import { ControllerMetadata } from "./types.js";
3
+ export declare const resolveControllersFromModuleClass: (targetDecl: ClassDeclaration, typeChecker: TypeChecker, processedFiles: Set<string>, controllers: ControllerMetadata[], fileCache: Map<string, ControllerMetadata[]>) => void;
@@ -0,0 +1,3 @@
1
+ import { CallExpression, TypeChecker } from "typescript";
2
+ import { ControllerMetadata } from "./types.js";
3
+ export declare const resolveControllersFromModule: (callExpr: CallExpression, typeChecker: TypeChecker, processedFiles: Set<string>, controllers: ControllerMetadata[], fileCache: Map<string, ControllerMetadata[]>) => void;
@@ -0,0 +1,6 @@
1
+ import { ClassDeclaration, TypeChecker } from "typescript";
2
+ import { ControllerMetadata } from "./types.js";
3
+ /**
4
+ * Resolves all IPC controllers from a Nest root module and its imported modules recursively.
5
+ */
6
+ export declare const resolveControllersFromNestRoot: (targetDecl: ClassDeclaration, typeChecker: TypeChecker, processedFiles: Set<string>, controllers: ControllerMetadata[], fileCache: Map<string, ControllerMetadata[]>, visitedModules: Set<string>) => void;
@@ -0,0 +1,3 @@
1
+ import type { Signature } from "typescript";
2
+ import { MethodDeclaration, TypeChecker } from "typescript";
3
+ export declare const resolveReturnType: (node: MethodDeclaration, signature: Signature | undefined, typeChecker: TypeChecker) => string;
@@ -0,0 +1,28 @@
1
+ import type { IpcDecoratorName } from "@electron-ipc-bridge/shared";
2
+ export interface ControllerMetadata {
3
+ className: string;
4
+ filePath: string;
5
+ methods: MethodMetadata[];
6
+ namespace: string;
7
+ referencedTypes: TypeDefinition[];
8
+ requiredReferenceTypes?: string[];
9
+ }
10
+ export interface TypeDefinition {
11
+ definition: string;
12
+ name: string;
13
+ referencedTypes: TypeDefinition[];
14
+ sourceFile: string;
15
+ }
16
+ export interface MethodMetadata {
17
+ decoratorName: IpcDecoratorName;
18
+ name: string;
19
+ params: ParamMetadata[];
20
+ referencedTypes: TypeDefinition[];
21
+ requiredReferenceTypes?: string[];
22
+ returnType: string;
23
+ }
24
+ export interface ParamMetadata {
25
+ name: string;
26
+ optional: boolean;
27
+ type: string;
28
+ }
@@ -0,0 +1,17 @@
1
+ import type { Program } from "typescript";
2
+ export declare class PluginState {
3
+ private readonly debounceMs;
4
+ private controllerFiles;
5
+ private debounceTimer;
6
+ private hasGeneratedOnce;
7
+ private lastHash;
8
+ private program;
9
+ constructor(debounceMs?: number);
10
+ claimInitialGeneration(): boolean;
11
+ getProgram(): Program | undefined;
12
+ scheduleGenerate(callback: () => void): void;
13
+ setControllerFiles(files: Set<string>): void;
14
+ setProgram(program: Program): void;
15
+ shouldRegenerate(absId: string, mainEntryPath: string, preloadEntryPath?: string): boolean;
16
+ updateHash(hash: string): boolean;
17
+ }
@@ -0,0 +1,21 @@
1
+ import { Plugin } from "vite";
2
+ import type { PluginOptions } from "./types.js";
3
+ export { type PluginOptions, type PluginTypesOptions } from "./types.js";
4
+ /**
5
+ * Creates a Vite plugin that generates TypeScript type definitions
6
+ * for your IPC controllers, enabling type-safe `window` usage in the renderer.
7
+ *
8
+ * @param options - Plugin configuration
9
+ * @returns Vite plugin instance
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // vite.config.ts
14
+ * import { electronIpcBridge } from "@electron-ipc-bridge/vite-plugin";
15
+ *
16
+ * export default defineConfig({
17
+ * plugins: [electronIpcBridge(options)],
18
+ * });
19
+ * ```
20
+ */
21
+ export declare function electronIpcBridge({ main, preload, resolutionStrategy, types, }?: PluginOptions): Plugin;
@@ -0,0 +1,4 @@
1
+ export declare const resolveApiRootFromPreload: (preloadPath: string) => {
2
+ namespace: string;
3
+ dependencies: Set<string>;
4
+ };
@@ -0,0 +1,12 @@
1
+ import type { PluginTypesOptions } from "./plugin.js";
2
+ export interface ResolveTypePathsOptions {
3
+ hasRendererRuntimeDir: (absPath: string) => boolean;
4
+ preloadPath: string;
5
+ root: string;
6
+ types: PluginTypesOptions;
7
+ }
8
+ export interface ResolvedTypePaths {
9
+ globalPath: string | null;
10
+ runtimePath: string | null;
11
+ }
12
+ export declare const resolveTypePaths: ({ hasRendererRuntimeDir, preloadPath, root, types, }: ResolveTypePathsOptions) => ResolvedTypePaths;
@@ -0,0 +1,7 @@
1
+ import type { DependencyResolutionStrategy, ResolutionContext } from "./types.js";
2
+ /**
3
+ * NestJS resolution strategy: locates the root module via
4
+ * `NestFactory.createApplicationContext(ModuleClass)` and recursively walks
5
+ * `@Module({ imports: [...] })` to discover all IPC controllers.
6
+ */
7
+ export declare const nestResolutionStrategy: (context: ResolutionContext) => ReturnType<DependencyResolutionStrategy>;
@@ -0,0 +1,12 @@
1
+ import type { SourceFile, TypeChecker } from "typescript";
2
+ import type { ControllerMetadata } from "../parser/types.js";
3
+ /** Context passed to a resolution strategy when fallback resolution is triggered. */
4
+ export interface ResolutionContext {
5
+ fileCache: Map<string, ControllerMetadata[]>;
6
+ processedFiles: Set<string>;
7
+ /** The main entry source file where `createIpcApp(...)` was found. */
8
+ sourceFile: SourceFile;
9
+ typeChecker: TypeChecker;
10
+ }
11
+ /** A function that discovers controllers when the primary static analysis paths find nothing. */
12
+ export type DependencyResolutionStrategy = (context: ResolutionContext) => ControllerMetadata[];
@@ -0,0 +1,24 @@
1
+ export interface PluginTypesOptions {
2
+ /** Output path for generated global Window augmentation d.ts. @default auto-detected */
3
+ global?: string | false;
4
+ /** Output path for generated runtime types module. @default auto-detected */
5
+ runtime?: string | false;
6
+ }
7
+ /** Built-in resolution strategy names. Use when `controllers` is a call and the primary path finds nothing. */
8
+ export type ResolutionStrategy = "nest";
9
+ /**
10
+ * Options for the electron-ipc-bridge Vite plugin.
11
+ */
12
+ export interface PluginOptions {
13
+ /** Path to your main process entry file. @default "src/main/index.ts" */
14
+ main?: string;
15
+ /** Path to your preload entry file. @default "src/preload/index.ts" */
16
+ preload?: string;
17
+ /**
18
+ * Optional resolution strategy when `controllers` is a call (e.g. getIpcControllers(app))
19
+ * and the primary path finds no controllers. Set to `"nest"` for NestJS apps.
20
+ */
21
+ resolutionStrategy?: ResolutionStrategy;
22
+ /** Output configuration for generated types. */
23
+ types?: PluginTypesOptions;
24
+ }
@@ -0,0 +1,6 @@
1
+ export declare class DependencyCollector {
2
+ private dependencies;
3
+ add(filePath: string): void;
4
+ getDependencies(): Set<string>;
5
+ merge(other: Set<string> | DependencyCollector): void;
6
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@electron-ipc-bridge/vite-plugin",
3
+ "version": "0.0.4",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/metacurb/electron-ipc-bridge.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/metacurb/electron-ipc-bridge/issues"
13
+ },
14
+ "homepage": "https://metacurb.github.io/electron-ipc-bridge/",
15
+ "description": "A Vite plugin for Electron-IPC-Bridge",
16
+ "type": "module",
17
+ "main": "dist/index.js",
18
+ "types": "dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "peerDependencies": {
29
+ "typescript": "^5.0.0",
30
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^25.2.3",
34
+ "esbuild": "^0.27.3",
35
+ "typescript": "^5.9.3",
36
+ "vite": "^7.3.1",
37
+ "@electron-ipc-bridge/shared": "0.0.4"
38
+ },
39
+ "scripts": {
40
+ "build": "node scripts/build.mjs",
41
+ "test": "pnpm exec jest --config jest.config.cjs"
42
+ }
43
+ }