@mionjs/devtools 0.8.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/build/eslint/cjs/index.cjs +41 -0
  3. package/build/eslint/cjs/index.cjs.map +1 -0
  4. package/build/eslint/cjs/package.json +1 -0
  5. package/build/eslint/cjs/src/eslint/index.cjs +13 -0
  6. package/build/eslint/cjs/src/eslint/index.cjs.map +1 -0
  7. package/build/eslint/cjs/src/eslint/index.d.ts +3 -0
  8. package/build/eslint/cjs/src/eslint/rules/enforce-type-imports.cjs +121 -0
  9. package/build/eslint/cjs/src/eslint/rules/enforce-type-imports.cjs.map +1 -0
  10. package/build/eslint/cjs/src/eslint/rules/enforce-type-imports.d.ts +7 -0
  11. package/build/eslint/cjs/src/eslint/rules/formatTypeNames.cjs +71 -0
  12. package/build/eslint/cjs/src/eslint/rules/formatTypeNames.cjs.map +1 -0
  13. package/build/eslint/cjs/src/eslint/rules/formatTypeNames.d.ts +3 -0
  14. package/build/eslint/cjs/src/eslint/rules/no-mixed-union-properties.cjs +220 -0
  15. package/build/eslint/cjs/src/eslint/rules/no-mixed-union-properties.cjs.map +1 -0
  16. package/build/eslint/cjs/src/eslint/rules/no-mixed-union-properties.d.ts +3 -0
  17. package/build/eslint/cjs/src/eslint/rules/no-type-imports.cjs +251 -0
  18. package/build/eslint/cjs/src/eslint/rules/no-type-imports.cjs.map +1 -0
  19. package/build/eslint/cjs/src/eslint/rules/no-type-imports.d.ts +3 -0
  20. package/build/eslint/cjs/src/eslint/rules/no-typeof-runtype.cjs +72 -0
  21. package/build/eslint/cjs/src/eslint/rules/no-typeof-runtype.cjs.map +1 -0
  22. package/build/eslint/cjs/src/eslint/rules/no-typeof-runtype.d.ts +3 -0
  23. package/build/eslint/cjs/src/eslint/rules/no-unreachable-union-types.cjs +220 -0
  24. package/build/eslint/cjs/src/eslint/rules/no-unreachable-union-types.cjs.map +1 -0
  25. package/build/eslint/cjs/src/eslint/rules/no-unreachable-union-types.d.ts +3 -0
  26. package/build/eslint/cjs/src/eslint/rules/no-vite-client.cjs +71 -0
  27. package/build/eslint/cjs/src/eslint/rules/no-vite-client.cjs.map +1 -0
  28. package/build/eslint/cjs/src/eslint/rules/no-vite-client.d.ts +4 -0
  29. package/build/eslint/cjs/src/eslint/rules/pure-functions.cjs +346 -0
  30. package/build/eslint/cjs/src/eslint/rules/pure-functions.cjs.map +1 -0
  31. package/build/eslint/cjs/src/eslint/rules/pure-functions.d.ts +4 -0
  32. package/build/eslint/cjs/src/eslint/rules/strong-typed-routes.cjs +328 -0
  33. package/build/eslint/cjs/src/eslint/rules/strong-typed-routes.cjs.map +1 -0
  34. package/build/eslint/cjs/src/eslint/rules/strong-typed-routes.d.ts +4 -0
  35. package/build/eslint/cjs/src/eslint/rules/type-formats-imports.cjs +52 -0
  36. package/build/eslint/cjs/src/eslint/rules/type-formats-imports.cjs.map +1 -0
  37. package/build/eslint/cjs/src/eslint/rules/type-formats-imports.d.ts +3 -0
  38. package/build/eslint/cjs/src/pureFns/purityRules.cjs +67 -0
  39. package/build/eslint/cjs/src/pureFns/purityRules.cjs.map +1 -0
  40. package/build/eslint/cjs/src/pureFns/purityRules.d.ts +4 -0
  41. package/build/eslint/esm/index.js +42 -0
  42. package/build/eslint/esm/index.js.map +1 -0
  43. package/build/eslint/esm/src/eslint/index.d.ts +3 -0
  44. package/build/eslint/esm/src/eslint/index.js +14 -0
  45. package/build/eslint/esm/src/eslint/index.js.map +1 -0
  46. package/build/eslint/esm/src/eslint/rules/enforce-type-imports.d.ts +7 -0
  47. package/build/eslint/esm/src/eslint/rules/enforce-type-imports.js +122 -0
  48. package/build/eslint/esm/src/eslint/rules/enforce-type-imports.js.map +1 -0
  49. package/build/eslint/esm/src/eslint/rules/formatTypeNames.d.ts +3 -0
  50. package/build/eslint/esm/src/eslint/rules/formatTypeNames.js +71 -0
  51. package/build/eslint/esm/src/eslint/rules/formatTypeNames.js.map +1 -0
  52. package/build/eslint/esm/src/eslint/rules/no-mixed-union-properties.d.ts +3 -0
  53. package/build/eslint/esm/src/eslint/rules/no-mixed-union-properties.js +221 -0
  54. package/build/eslint/esm/src/eslint/rules/no-mixed-union-properties.js.map +1 -0
  55. package/build/eslint/esm/src/eslint/rules/no-type-imports.d.ts +3 -0
  56. package/build/eslint/esm/src/eslint/rules/no-type-imports.js +252 -0
  57. package/build/eslint/esm/src/eslint/rules/no-type-imports.js.map +1 -0
  58. package/build/eslint/esm/src/eslint/rules/no-typeof-runtype.d.ts +3 -0
  59. package/build/eslint/esm/src/eslint/rules/no-typeof-runtype.js +73 -0
  60. package/build/eslint/esm/src/eslint/rules/no-typeof-runtype.js.map +1 -0
  61. package/build/eslint/esm/src/eslint/rules/no-unreachable-union-types.d.ts +3 -0
  62. package/build/eslint/esm/src/eslint/rules/no-unreachable-union-types.js +221 -0
  63. package/build/eslint/esm/src/eslint/rules/no-unreachable-union-types.js.map +1 -0
  64. package/build/eslint/esm/src/eslint/rules/no-vite-client.d.ts +4 -0
  65. package/build/eslint/esm/src/eslint/rules/no-vite-client.js +72 -0
  66. package/build/eslint/esm/src/eslint/rules/no-vite-client.js.map +1 -0
  67. package/build/eslint/esm/src/eslint/rules/pure-functions.d.ts +4 -0
  68. package/build/eslint/esm/src/eslint/rules/pure-functions.js +347 -0
  69. package/build/eslint/esm/src/eslint/rules/pure-functions.js.map +1 -0
  70. package/build/eslint/esm/src/eslint/rules/strong-typed-routes.d.ts +4 -0
  71. package/build/eslint/esm/src/eslint/rules/strong-typed-routes.js +329 -0
  72. package/build/eslint/esm/src/eslint/rules/strong-typed-routes.js.map +1 -0
  73. package/build/eslint/esm/src/eslint/rules/type-formats-imports.d.ts +3 -0
  74. package/build/eslint/esm/src/eslint/rules/type-formats-imports.js +53 -0
  75. package/build/eslint/esm/src/eslint/rules/type-formats-imports.js.map +1 -0
  76. package/build/eslint/esm/src/pureFns/purityRules.d.ts +4 -0
  77. package/build/eslint/esm/src/pureFns/purityRules.js +67 -0
  78. package/build/eslint/esm/src/pureFns/purityRules.js.map +1 -0
  79. package/build/vite-plugin/cjs/index.cjs +14 -0
  80. package/build/vite-plugin/cjs/index.cjs.map +1 -0
  81. package/build/vite-plugin/cjs/package.json +1 -0
  82. package/build/vite-plugin/cjs/src/pureFns/purityRules.cjs +65 -0
  83. package/build/vite-plugin/cjs/src/pureFns/purityRules.cjs.map +1 -0
  84. package/build/vite-plugin/cjs/src/pureFns/purityRules.d.ts +4 -0
  85. package/build/vite-plugin/cjs/src/vite-plugin/aotCacheGenerator.cjs +235 -0
  86. package/build/vite-plugin/cjs/src/vite-plugin/aotCacheGenerator.cjs.map +1 -0
  87. package/build/vite-plugin/cjs/src/vite-plugin/aotCacheGenerator.d.ts +23 -0
  88. package/build/vite-plugin/cjs/src/vite-plugin/aotDiskCache.cjs +134 -0
  89. package/build/vite-plugin/cjs/src/vite-plugin/aotDiskCache.cjs.map +1 -0
  90. package/build/vite-plugin/cjs/src/vite-plugin/aotDiskCache.d.ts +6 -0
  91. package/build/vite-plugin/cjs/src/vite-plugin/cjsPackageJsonPlugin.cjs +15 -0
  92. package/build/vite-plugin/cjs/src/vite-plugin/cjsPackageJsonPlugin.cjs.map +1 -0
  93. package/build/vite-plugin/cjs/src/vite-plugin/cjsPackageJsonPlugin.d.ts +2 -0
  94. package/build/vite-plugin/cjs/src/vite-plugin/constants.cjs +25 -0
  95. package/build/vite-plugin/cjs/src/vite-plugin/constants.cjs.map +1 -0
  96. package/build/vite-plugin/cjs/src/vite-plugin/constants.d.ts +10 -0
  97. package/build/vite-plugin/cjs/src/vite-plugin/extractPureFn.cjs +628 -0
  98. package/build/vite-plugin/cjs/src/vite-plugin/extractPureFn.cjs.map +1 -0
  99. package/build/vite-plugin/cjs/src/vite-plugin/extractPureFn.d.ts +13 -0
  100. package/build/vite-plugin/cjs/src/vite-plugin/index.cjs +14 -0
  101. package/build/vite-plugin/cjs/src/vite-plugin/index.cjs.map +1 -0
  102. package/build/vite-plugin/cjs/src/vite-plugin/index.d.ts +5 -0
  103. package/build/vite-plugin/cjs/src/vite-plugin/mionVitePlugin.cjs +404 -0
  104. package/build/vite-plugin/cjs/src/vite-plugin/mionVitePlugin.cjs.map +1 -0
  105. package/build/vite-plugin/cjs/src/vite-plugin/mionVitePlugin.d.ts +36 -0
  106. package/build/vite-plugin/cjs/src/vite-plugin/resolveModule.cjs +55 -0
  107. package/build/vite-plugin/cjs/src/vite-plugin/resolveModule.cjs.map +1 -0
  108. package/build/vite-plugin/cjs/src/vite-plugin/resolveModule.d.ts +1 -0
  109. package/build/vite-plugin/cjs/src/vite-plugin/transformers.cjs +165 -0
  110. package/build/vite-plugin/cjs/src/vite-plugin/transformers.cjs.map +1 -0
  111. package/build/vite-plugin/cjs/src/vite-plugin/transformers.d.ts +10 -0
  112. package/build/vite-plugin/cjs/src/vite-plugin/types.cjs +2 -0
  113. package/build/vite-plugin/cjs/src/vite-plugin/types.cjs.map +1 -0
  114. package/build/vite-plugin/cjs/src/vite-plugin/types.d.ts +57 -0
  115. package/build/vite-plugin/cjs/src/vite-plugin/virtual-modules.d.cjs +2 -0
  116. package/build/vite-plugin/cjs/src/vite-plugin/virtual-modules.d.cjs.map +1 -0
  117. package/build/vite-plugin/cjs/src/vite-plugin/virtualModule.cjs +68 -0
  118. package/build/vite-plugin/cjs/src/vite-plugin/virtualModule.cjs.map +1 -0
  119. package/build/vite-plugin/cjs/src/vite-plugin/virtualModule.d.ts +2 -0
  120. package/build/vite-plugin/esm/index.js +14 -0
  121. package/build/vite-plugin/esm/index.js.map +1 -0
  122. package/build/vite-plugin/esm/src/pureFns/purityRules.d.ts +4 -0
  123. package/build/vite-plugin/esm/src/pureFns/purityRules.js +65 -0
  124. package/build/vite-plugin/esm/src/pureFns/purityRules.js.map +1 -0
  125. package/build/vite-plugin/esm/src/vite-plugin/aotCacheGenerator.d.ts +23 -0
  126. package/build/vite-plugin/esm/src/vite-plugin/aotCacheGenerator.js +235 -0
  127. package/build/vite-plugin/esm/src/vite-plugin/aotCacheGenerator.js.map +1 -0
  128. package/build/vite-plugin/esm/src/vite-plugin/aotDiskCache.d.ts +6 -0
  129. package/build/vite-plugin/esm/src/vite-plugin/aotDiskCache.js +133 -0
  130. package/build/vite-plugin/esm/src/vite-plugin/aotDiskCache.js.map +1 -0
  131. package/build/vite-plugin/esm/src/vite-plugin/cjsPackageJsonPlugin.d.ts +2 -0
  132. package/build/vite-plugin/esm/src/vite-plugin/cjsPackageJsonPlugin.js +15 -0
  133. package/build/vite-plugin/esm/src/vite-plugin/cjsPackageJsonPlugin.js.map +1 -0
  134. package/build/vite-plugin/esm/src/vite-plugin/constants.d.ts +10 -0
  135. package/build/vite-plugin/esm/src/vite-plugin/constants.js +25 -0
  136. package/build/vite-plugin/esm/src/vite-plugin/constants.js.map +1 -0
  137. package/build/vite-plugin/esm/src/vite-plugin/extractPureFn.d.ts +13 -0
  138. package/build/vite-plugin/esm/src/vite-plugin/extractPureFn.js +611 -0
  139. package/build/vite-plugin/esm/src/vite-plugin/extractPureFn.js.map +1 -0
  140. package/build/vite-plugin/esm/src/vite-plugin/index.d.ts +5 -0
  141. package/build/vite-plugin/esm/src/vite-plugin/index.js +14 -0
  142. package/build/vite-plugin/esm/src/vite-plugin/index.js.map +1 -0
  143. package/build/vite-plugin/esm/src/vite-plugin/mionVitePlugin.d.ts +36 -0
  144. package/build/vite-plugin/esm/src/vite-plugin/mionVitePlugin.js +387 -0
  145. package/build/vite-plugin/esm/src/vite-plugin/mionVitePlugin.js.map +1 -0
  146. package/build/vite-plugin/esm/src/vite-plugin/resolveModule.d.ts +1 -0
  147. package/build/vite-plugin/esm/src/vite-plugin/resolveModule.js +33 -0
  148. package/build/vite-plugin/esm/src/vite-plugin/resolveModule.js.map +1 -0
  149. package/build/vite-plugin/esm/src/vite-plugin/transformers.d.ts +10 -0
  150. package/build/vite-plugin/esm/src/vite-plugin/transformers.js +148 -0
  151. package/build/vite-plugin/esm/src/vite-plugin/transformers.js.map +1 -0
  152. package/build/vite-plugin/esm/src/vite-plugin/types.d.ts +57 -0
  153. package/build/vite-plugin/esm/src/vite-plugin/types.js +2 -0
  154. package/build/vite-plugin/esm/src/vite-plugin/types.js.map +1 -0
  155. package/build/vite-plugin/esm/src/vite-plugin/virtual-modules.d.js +2 -0
  156. package/build/vite-plugin/esm/src/vite-plugin/virtual-modules.d.js.map +1 -0
  157. package/build/vite-plugin/esm/src/vite-plugin/virtualModule.d.ts +2 -0
  158. package/build/vite-plugin/esm/src/vite-plugin/virtualModule.js +68 -0
  159. package/build/vite-plugin/esm/src/vite-plugin/virtualModule.js.map +1 -0
  160. package/package.json +94 -0
  161. package/src/vite-plugin/virtual-modules.d.ts +48 -0
@@ -0,0 +1,65 @@
1
+ const ALLOWED_GLOBALS = /* @__PURE__ */ new Set([
2
+ // Value types
3
+ "undefined",
4
+ "null",
5
+ "NaN",
6
+ "Infinity",
7
+ "true",
8
+ "false",
9
+ // Built-in constructors/objects
10
+ "Object",
11
+ "Array",
12
+ "String",
13
+ "Number",
14
+ "Boolean",
15
+ "Math",
16
+ "JSON",
17
+ "Date",
18
+ "RegExp",
19
+ "Map",
20
+ "Set",
21
+ "WeakMap",
22
+ "WeakSet",
23
+ "Symbol",
24
+ "BigInt",
25
+ "Promise",
26
+ "Error",
27
+ "TypeError",
28
+ "RangeError",
29
+ "parseInt",
30
+ "parseFloat",
31
+ "isNaN",
32
+ "isFinite",
33
+ "encodeURIComponent",
34
+ "decodeURIComponent",
35
+ "encodeURI",
36
+ "decodeURI",
37
+ // Common safe globals
38
+ "console",
39
+ "globalThis",
40
+ "Bun"
41
+ ]);
42
+ const FORBIDDEN_IDENTIFIERS = /* @__PURE__ */ new Set([
43
+ "eval",
44
+ "Function",
45
+ "fetch",
46
+ "setTimeout",
47
+ "setInterval",
48
+ "clearTimeout",
49
+ "clearInterval",
50
+ "process",
51
+ "window",
52
+ "document",
53
+ "global",
54
+ "require",
55
+ "XMLHttpRequest",
56
+ "WebSocket",
57
+ "localStorage",
58
+ "sessionStorage",
59
+ "indexedDB"
60
+ ]);
61
+ export {
62
+ ALLOWED_GLOBALS,
63
+ FORBIDDEN_IDENTIFIERS
64
+ };
65
+ //# sourceMappingURL=purityRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purityRules.js","sources":["../../../../../src/pureFns/purityRules.ts"],"sourcesContent":["/* ########\n * 2026 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\n/** Globals and built-ins that are allowed inside pure functions */\nexport const ALLOWED_GLOBALS = new Set([\n // Value types\n 'undefined',\n 'null',\n 'NaN',\n 'Infinity',\n 'true',\n 'false',\n // Built-in constructors/objects\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Math',\n 'JSON',\n 'Date',\n 'RegExp',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Symbol',\n 'BigInt',\n 'Promise',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'encodeURIComponent',\n 'decodeURIComponent',\n 'encodeURI',\n 'decodeURI',\n // Common safe globals\n 'console',\n 'globalThis',\n 'Bun',\n]);\n\n/** Forbidden identifiers that indicate impure operations in pure functions */\nexport const FORBIDDEN_IDENTIFIERS = new Set([\n 'eval',\n 'Function',\n 'fetch',\n 'setTimeout',\n 'setInterval',\n 'clearTimeout',\n 'clearInterval',\n 'process',\n 'window',\n 'document',\n 'global',\n 'require',\n 'XMLHttpRequest',\n 'WebSocket',\n 'localStorage',\n 'sessionStorage',\n 'indexedDB',\n]);\n\n/** The target function names that purity validation applies to */\nexport const PURE_FN_CALL_NAMES = ['pureServerFn', 'registerPureFnFactory', 'mapFrom'] as const;\n\n/** The packages that export the target pure function APIs */\nexport const PURE_FN_SOURCE_PACKAGES = ['@mionjs/core', '@mionjs/client'] as const;\n"],"names":[],"mappings":"AAQO,MAAM,sCAAsB,IAAI;AAAA;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AAGM,MAAM,4CAA4B,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;"}
@@ -0,0 +1,23 @@
1
+ import { ChildProcess } from 'child_process';
2
+ import { MionServerConfig } from './types.ts';
3
+ export interface AOTCacheData {
4
+ jitFnsCode: string;
5
+ pureFnsCode: string;
6
+ routerCacheCode: string;
7
+ }
8
+ export interface AOTCacheResult {
9
+ data: AOTCacheData;
10
+ childProcess?: ChildProcess;
11
+ }
12
+ export declare function generateAOTCaches(serverConfig: MionServerConfig, startScriptOverride?: string): Promise<AOTCacheResult>;
13
+ export type ModuleLoader = (url: string) => Promise<Record<string, any>>;
14
+ export declare function loadSSRRouterAndGenerateAOTCaches(loadModule: ModuleLoader, startServerScript: string): Promise<AOTCacheData>;
15
+ export declare function killPersistentChild(child: ChildProcess | null): Promise<void>;
16
+ export declare function logAOTCaches(data: AOTCacheData): void;
17
+ export declare function generateJitFnsModule(jitFnsCode: string): string;
18
+ export declare function generatePureFnsModule(pureFnsCode: string): string;
19
+ export declare function generateRouterCacheModule(routerCacheCode: string): string;
20
+ export declare function generateCombinedCachesModule(): string;
21
+ export declare function generateNoopModule(comment: string): string;
22
+ export declare function waitForServer(port: number, timeoutMs?: number): Promise<void>;
23
+ export declare function generateNoopCombinedModule(): string;
@@ -0,0 +1,235 @@
1
+ import { fork } from "child_process";
2
+ import { resolve, dirname } from "path";
3
+ import { resolveModule } from "./resolveModule.js";
4
+ const DEFAULT_TIMEOUT = 3e4;
5
+ async function generateAOTCaches(serverConfig, startScriptOverride) {
6
+ const persist = serverConfig.mode === "IPC";
7
+ const startScript = resolve(startScriptOverride ?? serverConfig.startServerScript);
8
+ const scriptDir = dirname(startScript);
9
+ const viteConfigArgs = serverConfig.serverViteConfig ? ["--config", resolve(serverConfig.serverViteConfig)] : [];
10
+ let viteNodePath;
11
+ try {
12
+ viteNodePath = await resolveModule("vite-node/cli", scriptDir);
13
+ } catch (err) {
14
+ throw new Error(
15
+ `Failed to resolve vite-node. Make sure vite-node is installed.
16
+ You can install it with: npm install -D vite-node
17
+ Original error: ${err instanceof Error ? err.message : String(err)}`
18
+ );
19
+ }
20
+ return new Promise((resolvePromise, reject) => {
21
+ let child;
22
+ let resolved = false;
23
+ let stderr = "";
24
+ try {
25
+ child = fork(viteNodePath, [...viteConfigArgs, startScript], {
26
+ env: { ...process.env, MION_COMPILE: persist ? "serve" : "onlyAOT" },
27
+ stdio: ["pipe", "pipe", "pipe", "ipc"],
28
+ cwd: scriptDir
29
+ });
30
+ } catch (err) {
31
+ reject(
32
+ new Error(
33
+ `Failed to spawn vite-node. Make sure vite-node is installed.
34
+ You can install it with: npm install -D vite-node
35
+ Original error: ${err instanceof Error ? err.message : String(err)}`
36
+ )
37
+ );
38
+ return;
39
+ }
40
+ const cleanup = () => {
41
+ clearTimeout(timeoutId);
42
+ if (child.connected) child.disconnect();
43
+ if (!persist) child.kill();
44
+ };
45
+ child.on("message", (msg) => {
46
+ const message = msg;
47
+ if (message?.type === "mion-aot-caches") {
48
+ resolved = true;
49
+ cleanup();
50
+ resolvePromise({
51
+ data: {
52
+ jitFnsCode: message.jitFnsCode,
53
+ pureFnsCode: message.pureFnsCode,
54
+ routerCacheCode: message.routerCacheCode
55
+ },
56
+ childProcess: persist ? child : void 0
57
+ });
58
+ }
59
+ });
60
+ child.stderr?.on("data", (data) => {
61
+ const msg = data.toString().trim();
62
+ if (!resolved) stderr += msg + "\n";
63
+ if (persist && msg) console.error(`[mion-server] ${msg}`);
64
+ });
65
+ child.stdout?.on("data", (data) => {
66
+ const msg = data.toString().trim();
67
+ if (persist && msg) {
68
+ console.log(`[mion-server] ${msg}`);
69
+ } else if (process.env.DEBUG_AOT && msg) {
70
+ console.log("[mion-aot] stdout:", msg);
71
+ }
72
+ });
73
+ child.on("error", (err) => {
74
+ if (!resolved) {
75
+ cleanup();
76
+ reject(new Error(`vite-node failed to start: ${err.message}`));
77
+ }
78
+ });
79
+ child.on("exit", (code) => {
80
+ if (!resolved) {
81
+ cleanup();
82
+ reject(
83
+ new Error(
84
+ `vite-node exited with code ${code} before emitting AOT caches.
85
+ Make sure the startServerScript calls initMionRouter() and the router is fully initialized.
86
+ ` + (stderr ? `stderr: ${stderr}` : "")
87
+ )
88
+ );
89
+ }
90
+ });
91
+ const timeoutId = setTimeout(() => {
92
+ if (!resolved) {
93
+ cleanup();
94
+ if (persist) child.kill();
95
+ reject(
96
+ new Error(
97
+ `AOT cache generation timed out (${DEFAULT_TIMEOUT / 1e3}s). Make sure the server start script completes initialization.`
98
+ )
99
+ );
100
+ }
101
+ }, DEFAULT_TIMEOUT);
102
+ });
103
+ }
104
+ async function loadSSRRouterAndGenerateAOTCaches(loadModule, startServerScript) {
105
+ const prevCompile = process.env.MION_COMPILE;
106
+ process.env.MION_COMPILE = "viteSSR";
107
+ try {
108
+ const mod = await loadModule(startServerScript);
109
+ const promises = Object.values(mod).filter((v) => v instanceof Promise);
110
+ if (promises.length > 0) await Promise.all(promises);
111
+ const aotModule = await loadModule("@mionjs/router/aot");
112
+ const caches = await aotModule.getSerializedCaches();
113
+ return caches;
114
+ } finally {
115
+ if (prevCompile === void 0) delete process.env.MION_COMPILE;
116
+ else process.env.MION_COMPILE = prevCompile;
117
+ }
118
+ }
119
+ async function killPersistentChild(child) {
120
+ if (!child || child.killed) return;
121
+ const pid = child.pid;
122
+ if (pid) {
123
+ try {
124
+ process.kill(-pid, "SIGTERM");
125
+ } catch {
126
+ child.kill("SIGTERM");
127
+ }
128
+ } else {
129
+ child.kill("SIGTERM");
130
+ }
131
+ await new Promise((resolve2) => {
132
+ const timeout = setTimeout(() => {
133
+ if (child && !child.killed) {
134
+ if (pid) {
135
+ try {
136
+ process.kill(-pid, "SIGKILL");
137
+ } catch {
138
+ child.kill("SIGKILL");
139
+ }
140
+ } else {
141
+ child.kill("SIGKILL");
142
+ }
143
+ }
144
+ resolve2();
145
+ }, 5e3);
146
+ child.on("exit", () => {
147
+ clearTimeout(timeout);
148
+ resolve2();
149
+ });
150
+ });
151
+ }
152
+ function formatBytes(bytes) {
153
+ if (bytes < 1024) return `${bytes} B`;
154
+ const kb = bytes / 1024;
155
+ if (kb < 1024) return `${kb.toFixed(1)} KB`;
156
+ const mb = kb / 1024;
157
+ return `${mb.toFixed(1)} MB`;
158
+ }
159
+ function logAOTCaches(data) {
160
+ const jitSize = formatBytes(Buffer.byteLength(data.jitFnsCode, "utf-8"));
161
+ const pureSize = formatBytes(Buffer.byteLength(data.pureFnsCode, "utf-8"));
162
+ const routerSize = formatBytes(Buffer.byteLength(data.routerCacheCode, "utf-8"));
163
+ console.log(`[mion] jitFns: ${jitSize}, pureFns: ${pureSize}, routerCache: ${routerSize}`);
164
+ if (process.env.DEBUG_AOT) {
165
+ console.log("[mion] AOT jitFns cache:\n", data.jitFnsCode);
166
+ console.log("[mion] AOT pureFns cache:\n", data.pureFnsCode);
167
+ console.log("[mion] AOT routerCache:\n", data.routerCacheCode);
168
+ }
169
+ }
170
+ function generateJitFnsModule(jitFnsCode) {
171
+ return `/* Auto-generated AOT JIT functions cache - do not edit */
172
+ export const jitFnsCache = ${jitFnsCode};
173
+ `;
174
+ }
175
+ function generatePureFnsModule(pureFnsCode) {
176
+ return `/* Auto-generated AOT pure functions cache - do not edit */
177
+ export const pureFnsCache = ${pureFnsCode};
178
+ `;
179
+ }
180
+ function generateRouterCacheModule(routerCacheCode) {
181
+ return `/* Auto-generated AOT router cache - do not edit */
182
+ export const routerCache = ${routerCacheCode};
183
+ `;
184
+ }
185
+ function generateCombinedCachesModule() {
186
+ return `/* Auto-generated combined AOT caches - do not edit */
187
+ import { addAOTCaches, addRoutesToCache } from '@mionjs/core';
188
+ import { pureFnsCache } from 'virtual:mion-aot/pure-fns';
189
+ import { jitFnsCache } from 'virtual:mion-aot/jit-fns';
190
+ import { routerCache } from 'virtual:mion-aot/router-cache';
191
+
192
+ addAOTCaches(jitFnsCache, pureFnsCache);
193
+ addRoutesToCache(routerCache);
194
+
195
+ export { jitFnsCache, pureFnsCache, routerCache };
196
+ `;
197
+ }
198
+ function generateNoopModule(comment) {
199
+ return `/* ${comment} */
200
+ `;
201
+ }
202
+ async function waitForServer(port, timeoutMs = 3e4) {
203
+ const startTime = Date.now();
204
+ const checkInterval = 100;
205
+ while (Date.now() - startTime < timeoutMs) {
206
+ try {
207
+ const response = await fetch(`http://localhost:${port}/`);
208
+ if (response.ok || response.status === 404) return;
209
+ } catch {
210
+ }
211
+ await new Promise((r) => setTimeout(r, checkInterval));
212
+ }
213
+ throw new Error(`[mion] Server failed to become ready on port ${port} within ${timeoutMs}ms`);
214
+ }
215
+ function generateNoopCombinedModule() {
216
+ return `/* No-op: AOT caches not generated */
217
+ export const jitFnsCache = {};
218
+ export const pureFnsCache = {};
219
+ export const routerCache = {};
220
+ `;
221
+ }
222
+ export {
223
+ generateAOTCaches,
224
+ generateCombinedCachesModule,
225
+ generateJitFnsModule,
226
+ generateNoopCombinedModule,
227
+ generateNoopModule,
228
+ generatePureFnsModule,
229
+ generateRouterCacheModule,
230
+ killPersistentChild,
231
+ loadSSRRouterAndGenerateAOTCaches,
232
+ logAOTCaches,
233
+ waitForServer
234
+ };
235
+ //# sourceMappingURL=aotCacheGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aotCacheGenerator.js","sources":["../../../../../src/vite-plugin/aotCacheGenerator.ts"],"sourcesContent":["/* ########\n * 2026 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {fork, ChildProcess} from 'child_process';\nimport {resolve, dirname} from 'path';\nimport {MionServerConfig} from './types.ts';\nimport {resolveModule} from './resolveModule.ts';\n\n/** AOT cache data returned from the generator */\nexport interface AOTCacheData {\n jitFnsCode: string;\n pureFnsCode: string;\n routerCacheCode: string;\n}\n\n/** AOT cache result including optional persistent child process */\nexport interface AOTCacheResult {\n data: AOTCacheData;\n /** The child process, only present when server mode is 'IPC' (persist) */\n childProcess?: ChildProcess;\n}\n\n/** IPC message type from the router's aotEmitter */\ninterface AOTCacheMessage {\n type: 'mion-aot-caches';\n jitFnsCode: string;\n pureFnsCode: string;\n routerCacheCode: string;\n}\n\n/** Default timeout for AOT cache generation (30 seconds) */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Generates AOT caches by spawning vite-node to run the server's start script.\n *\n * vite-node is used instead of plain node/ts-node because:\n * 1. The server needs deepkit type compiler transformations\n * 2. The server's vite.config.ts has aliases and plugins that must be applied\n * 3. vite-node provides the same environment as the actual server build\n *\n * The router's emitAOTCaches() (called automatically from initMionRouter)\n * detects MION_COMPILE and sends the serialized caches via IPC.\n */\nexport async function generateAOTCaches(serverConfig: MionServerConfig, startScriptOverride?: string): Promise<AOTCacheResult> {\n const persist = serverConfig.mode === 'IPC';\n const startScript = resolve(startScriptOverride ?? serverConfig.startServerScript);\n const scriptDir = dirname(startScript);\n\n // Determine the vite config to use\n // If serverViteConfig is provided, use it; otherwise let vite-node auto-discover\n const viteConfigArgs = serverConfig.serverViteConfig ? ['--config', resolve(serverConfig.serverViteConfig)] : [];\n\n // Resolve vite-node path in both CJS and ESM environments\n let viteNodePath: string;\n try {\n viteNodePath = await resolveModule('vite-node/cli', scriptDir);\n } catch (err) {\n throw new Error(\n `Failed to resolve vite-node. Make sure vite-node is installed.\\n` +\n `You can install it with: npm install -D vite-node\\n` +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n return new Promise((resolvePromise, reject) => {\n let child: ChildProcess;\n let resolved = false;\n let stderr = '';\n\n try {\n // Spawn vite-node as a child process with IPC channel\n // 'serve' mode tells platform adapters to proceed with server.listen()\n child = fork(viteNodePath, [...viteConfigArgs, startScript], {\n env: {...process.env, MION_COMPILE: persist ? 'serve' : 'onlyAOT'},\n stdio: ['pipe', 'pipe', 'pipe', 'ipc'],\n cwd: scriptDir,\n });\n } catch (err) {\n // If vite-node is not found, provide a helpful error message\n reject(\n new Error(\n `Failed to spawn vite-node. Make sure vite-node is installed.\\n` +\n `You can install it with: npm install -D vite-node\\n` +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n )\n );\n return;\n }\n\n /** Cleanup child process: disconnect IPC, clear timeout, and optionally kill */\n const cleanup = () => {\n clearTimeout(timeoutId);\n if (child.connected) child.disconnect();\n if (!persist) child.kill();\n };\n\n child.on('message', (msg: unknown) => {\n const message = msg as AOTCacheMessage;\n if (message?.type === 'mion-aot-caches') {\n resolved = true;\n cleanup();\n resolvePromise({\n data: {\n jitFnsCode: message.jitFnsCode,\n pureFnsCode: message.pureFnsCode,\n routerCacheCode: message.routerCacheCode,\n },\n childProcess: persist ? child : undefined,\n });\n }\n });\n\n // Capture stderr for error reporting (and pipe through in persist mode)\n child.stderr?.on('data', (data: Buffer) => {\n const msg = data.toString().trim();\n if (!resolved) stderr += msg + '\\n';\n if (persist && msg) console.error(`[mion-server] ${msg}`);\n });\n\n // Pipe stdout through (always in persist mode, only with DEBUG_AOT otherwise)\n child.stdout?.on('data', (data: Buffer) => {\n const msg = data.toString().trim();\n if (persist && msg) {\n console.log(`[mion-server] ${msg}`);\n } else if (process.env.DEBUG_AOT && msg) {\n console.log('[mion-aot] stdout:', msg);\n }\n });\n\n child.on('error', (err) => {\n if (!resolved) {\n cleanup();\n reject(new Error(`vite-node failed to start: ${err.message}`));\n }\n });\n\n child.on('exit', (code) => {\n if (!resolved) {\n cleanup();\n reject(\n new Error(\n `vite-node exited with code ${code} before emitting AOT caches.\\n` +\n `Make sure the startServerScript calls initMionRouter() and the router ` +\n `is fully initialized.\\n` +\n (stderr ? `stderr: ${stderr}` : '')\n )\n );\n }\n });\n\n // Timeout safety\n const timeoutId = setTimeout(() => {\n if (!resolved) {\n cleanup();\n if (persist) child.kill();\n reject(\n new Error(\n `AOT cache generation timed out (${DEFAULT_TIMEOUT / 1000}s). ` +\n `Make sure the server start script completes initialization.`\n )\n );\n }\n }, DEFAULT_TIMEOUT);\n });\n}\n\n/** Loads a module by URL — abstracts over ssrLoadModule and Environment Runner */\nexport type ModuleLoader = (url: string) => Promise<Record<string, any>>;\n\n/**\n * Loads the startServerScript with MION_COMPILE=SSR so platform adapters skip server.listen().\n * Generates AOT caches via SSR using a module loader (for same-Vite-process scenarios like Nuxt).\n * After loading, retrieves the caches directly from the router's global state via getSerializedCaches(). */\nexport async function loadSSRRouterAndGenerateAOTCaches(\n loadModule: ModuleLoader,\n startServerScript: string\n): Promise<AOTCacheData> {\n const prevCompile = process.env.MION_COMPILE;\n process.env.MION_COMPILE = 'viteSSR';\n\n try {\n // Load the start server script — triggers initMionRouter(), populates caches,\n // skips process.send (SSR mode) and skips server.listen() (platform adapters)\n const mod = await loadModule(startServerScript);\n // Await any Promise-valued exports (e.g. initMionRouter() without top-level await)\n const promises = Object.values(mod).filter((v): v is Promise<any> => v instanceof Promise);\n if (promises.length > 0) await Promise.all(promises);\n\n // Get caches directly from the router's global state\n const aotModule = await loadModule('@mionjs/router/aot');\n const caches: AOTCacheData = await aotModule.getSerializedCaches();\n return caches;\n } finally {\n if (prevCompile === undefined) delete process.env.MION_COMPILE;\n else process.env.MION_COMPILE = prevCompile;\n }\n}\n\n// ============ Persistent child management ============\n\n/** Kills a persistent child process gracefully (SIGTERM then SIGKILL after 5s) */\nexport async function killPersistentChild(child: ChildProcess | null): Promise<void> {\n if (!child || child.killed) return;\n const pid = child.pid;\n\n if (pid) {\n try {\n process.kill(-pid, 'SIGTERM');\n } catch {\n child.kill('SIGTERM');\n }\n } else {\n child.kill('SIGTERM');\n }\n\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n if (child && !child.killed) {\n if (pid) {\n try {\n process.kill(-pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n } else {\n child.kill('SIGKILL');\n }\n }\n resolve();\n }, 5000);\n\n child!.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n}\n\n// ============ Logging ============\n\n/** Formats byte size to human-readable string */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n const mb = kb / 1024;\n return `${mb.toFixed(1)} MB`;\n}\n\n/** Logs AOT cache sizes and optionally full contents in verbose mode (DEBUG_AOT) */\nexport function logAOTCaches(data: AOTCacheData): void {\n const jitSize = formatBytes(Buffer.byteLength(data.jitFnsCode, 'utf-8'));\n const pureSize = formatBytes(Buffer.byteLength(data.pureFnsCode, 'utf-8'));\n const routerSize = formatBytes(Buffer.byteLength(data.routerCacheCode, 'utf-8'));\n console.log(`[mion] jitFns: ${jitSize}, pureFns: ${pureSize}, routerCache: ${routerSize}`);\n\n if (process.env.DEBUG_AOT) {\n console.log('[mion] AOT jitFns cache:\\n', data.jitFnsCode);\n console.log('[mion] AOT pureFns cache:\\n', data.pureFnsCode);\n console.log('[mion] AOT routerCache:\\n', data.routerCacheCode);\n }\n}\n\n// ============ Module Generators ============\n\n/** Generates the virtual module code for JIT functions cache (exports only). */\nexport function generateJitFnsModule(jitFnsCode: string): string {\n return `/* Auto-generated AOT JIT functions cache - do not edit */\nexport const jitFnsCache = ${jitFnsCode};\n`;\n}\n\n/** Generates the virtual module code for pure functions cache (exports only). */\nexport function generatePureFnsModule(pureFnsCode: string): string {\n return `/* Auto-generated AOT pure functions cache - do not edit */\nexport const pureFnsCache = ${pureFnsCode};\n`;\n}\n\n/** Generates the virtual module code for router methods cache (exports only). */\nexport function generateRouterCacheModule(routerCacheCode: string): string {\n return `/* Auto-generated AOT router cache - do not edit */\nexport const routerCache = ${routerCacheCode};\n`;\n}\n\n/** Generates the combined virtual module that imports all 3 caches, registers them, and re-exports. */\nexport function generateCombinedCachesModule(): string {\n return `/* Auto-generated combined AOT caches - do not edit */\nimport { addAOTCaches, addRoutesToCache } from '@mionjs/core';\nimport { pureFnsCache } from 'virtual:mion-aot/pure-fns';\nimport { jitFnsCache } from 'virtual:mion-aot/jit-fns';\nimport { routerCache } from 'virtual:mion-aot/router-cache';\n\naddAOTCaches(jitFnsCache, pureFnsCache);\naddRoutesToCache(routerCache);\n\nexport { jitFnsCache, pureFnsCache, routerCache };\n`;\n}\n\n/** Generates a no-op module for when AOT caches are disabled. */\nexport function generateNoopModule(comment: string): string {\n return `/* ${comment} */\\n`;\n}\n\n/** Poll an HTTP port until the server responds (2xx or 404). */\nexport async function waitForServer(port: number, timeoutMs = 30000): Promise<void> {\n const startTime = Date.now();\n const checkInterval = 100;\n while (Date.now() - startTime < timeoutMs) {\n try {\n const response = await fetch(`http://localhost:${port}/`);\n if (response.ok || response.status === 404) return;\n } catch {\n // Server not ready yet\n }\n await new Promise((r) => setTimeout(r, checkInterval));\n }\n throw new Error(`[mion] Server failed to become ready on port ${port} within ${timeoutMs}ms`);\n}\n\n/** Generates a no-op combined module that exports empty caches. */\nexport function generateNoopCombinedModule(): string {\n return `/* No-op: AOT caches not generated */\nexport const jitFnsCache = {};\nexport const pureFnsCache = {};\nexport const routerCache = {};\n`;\n}\n"],"names":["resolve"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { AOTCacheOptions, MionServerConfig } from './types.ts';
2
+ import { AOTCacheData, AOTCacheResult } from './aotCacheGenerator.ts';
3
+ export declare function computeSourceHash(serverConfig: MionServerConfig, aotOptions?: AOTCacheOptions): string;
4
+ export declare function resolveCacheDir(options: AOTCacheOptions, viteCacheDir?: string): string;
5
+ export declare function getOrGenerateAOTCaches(serverConfig: MionServerConfig, aotOptions: AOTCacheOptions | undefined, cacheDir: string): Promise<AOTCacheResult>;
6
+ export declare function updateDiskCache(serverConfig: MionServerConfig, aotOptions: AOTCacheOptions | undefined, data: AOTCacheData, cacheDir: string): void;
@@ -0,0 +1,133 @@
1
+ import { createHash } from "crypto";
2
+ import { readdirSync, statSync, readFileSync, mkdirSync, writeFileSync } from "fs";
3
+ import { dirname, resolve, join, relative } from "path";
4
+ import { generateAOTCaches } from "./aotCacheGenerator.js";
5
+ const AOT_DISK_CACHE_VERSION = "2";
6
+ const CACHE_FILENAME = "mion-aot-cache.json";
7
+ const SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", ".dist", "dist", ".git", ".vite", "build", "coverage", ".coverage"]);
8
+ const SOURCE_EXTENSIONS = /\.(ts|tsx)$/;
9
+ const TEST_FILE_PATTERN = /\.(spec|test)\.(ts|tsx)$/;
10
+ let devtoolsVersion = null;
11
+ function getDevtoolsVersion() {
12
+ if (devtoolsVersion) return devtoolsVersion;
13
+ try {
14
+ const pkgPath = resolve(dirname(new URL(import.meta.url).pathname), "../../package.json");
15
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
16
+ devtoolsVersion = pkg.version || "0.0.0";
17
+ } catch {
18
+ devtoolsVersion = "0.0.0";
19
+ }
20
+ return devtoolsVersion;
21
+ }
22
+ function collectFileStats(dir, baseDir) {
23
+ const entries = [];
24
+ let files;
25
+ try {
26
+ files = readdirSync(dir);
27
+ } catch {
28
+ return entries;
29
+ }
30
+ for (const file of files) {
31
+ const fullPath = join(dir, file);
32
+ let stat;
33
+ try {
34
+ stat = statSync(fullPath);
35
+ } catch {
36
+ continue;
37
+ }
38
+ if (stat.isDirectory()) {
39
+ if (SKIP_DIRS.has(file)) continue;
40
+ entries.push(...collectFileStats(fullPath, baseDir));
41
+ } else if (SOURCE_EXTENSIONS.test(file) && !TEST_FILE_PATTERN.test(file)) {
42
+ const relativePath = relative(baseDir, fullPath);
43
+ entries.push(`${relativePath}:${stat.mtimeMs}:${stat.size}`);
44
+ }
45
+ }
46
+ return entries;
47
+ }
48
+ function computeSourceHash(serverConfig, aotOptions) {
49
+ const serverDir = dirname(resolve(serverConfig.startServerScript));
50
+ const fileStats = collectFileStats(serverDir, serverDir);
51
+ fileStats.sort();
52
+ const hashInput = [
53
+ ...fileStats,
54
+ `cacheVersion:${AOT_DISK_CACHE_VERSION}`,
55
+ `devtoolsVersion:${getDevtoolsVersion()}`,
56
+ `excludedFns:${JSON.stringify((aotOptions?.excludedFns || []).slice().sort())}`,
57
+ `excludedPureFns:${JSON.stringify((aotOptions?.excludedPureFns || []).slice().sort())}`
58
+ ].join("\n");
59
+ return createHash("sha256").update(hashInput).digest("hex");
60
+ }
61
+ function readDiskCache(cacheDir) {
62
+ const cachePath = join(cacheDir, CACHE_FILENAME);
63
+ try {
64
+ const raw = readFileSync(cachePath, "utf-8");
65
+ const parsed = JSON.parse(raw);
66
+ if (typeof parsed.cacheVersion === "string" && typeof parsed.hash === "string" && typeof parsed.jitFnsCode === "string" && typeof parsed.pureFnsCode === "string" && typeof parsed.routerCacheCode === "string") {
67
+ return parsed;
68
+ }
69
+ return null;
70
+ } catch {
71
+ return null;
72
+ }
73
+ }
74
+ function writeDiskCache(cacheDir, hash, data) {
75
+ const cachePath = join(cacheDir, CACHE_FILENAME);
76
+ try {
77
+ mkdirSync(cacheDir, { recursive: true });
78
+ const cacheFile = {
79
+ cacheVersion: AOT_DISK_CACHE_VERSION,
80
+ hash,
81
+ jitFnsCode: data.jitFnsCode,
82
+ pureFnsCode: data.pureFnsCode,
83
+ routerCacheCode: data.routerCacheCode
84
+ };
85
+ writeFileSync(cachePath, JSON.stringify(cacheFile), "utf-8");
86
+ } catch (err) {
87
+ console.warn(`[mion] Warning: Could not write AOT disk cache: ${err instanceof Error ? err.message : String(err)}`);
88
+ }
89
+ }
90
+ function resolveCacheDir(options, viteCacheDir) {
91
+ if (options.cache === false) return "";
92
+ if (typeof options.cache === "string") return resolve(options.cache);
93
+ return viteCacheDir || resolve(process.cwd(), "node_modules/.vite");
94
+ }
95
+ async function getOrGenerateAOTCaches(serverConfig, aotOptions, cacheDir) {
96
+ const forceRegenerate = process.env.MION_AOT_FORCE === "true";
97
+ const isIPCMode = serverConfig.mode === "IPC";
98
+ const cachingEnabled = cacheDir !== "" && !forceRegenerate && !isIPCMode;
99
+ let hash = "";
100
+ if (cachingEnabled) {
101
+ hash = computeSourceHash(serverConfig, aotOptions);
102
+ const cached = readDiskCache(cacheDir);
103
+ if (cached && cached.cacheVersion === AOT_DISK_CACHE_VERSION && cached.hash === hash) {
104
+ console.log("[mion] AOT caches loaded from disk cache (source unchanged)");
105
+ return {
106
+ data: {
107
+ jitFnsCode: cached.jitFnsCode,
108
+ pureFnsCode: cached.pureFnsCode,
109
+ routerCacheCode: cached.routerCacheCode
110
+ }
111
+ };
112
+ }
113
+ }
114
+ const result = await generateAOTCaches(serverConfig);
115
+ if (cachingEnabled) {
116
+ if (!hash) hash = computeSourceHash(serverConfig, aotOptions);
117
+ writeDiskCache(cacheDir, hash, result.data);
118
+ console.log("[mion] AOT caches saved to disk cache");
119
+ }
120
+ return result;
121
+ }
122
+ function updateDiskCache(serverConfig, aotOptions, data, cacheDir) {
123
+ if (!cacheDir || aotOptions?.cache === false) return;
124
+ const hash = computeSourceHash(serverConfig, aotOptions);
125
+ writeDiskCache(cacheDir, hash, data);
126
+ }
127
+ export {
128
+ computeSourceHash,
129
+ getOrGenerateAOTCaches,
130
+ resolveCacheDir,
131
+ updateDiskCache
132
+ };
133
+ //# sourceMappingURL=aotDiskCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aotDiskCache.js","sources":["../../../../../src/vite-plugin/aotDiskCache.ts"],"sourcesContent":["/* ########\n * 2026 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {createHash} from 'crypto';\nimport {readFileSync, writeFileSync, mkdirSync, readdirSync, statSync} from 'fs';\nimport {join, resolve, dirname, relative} from 'path';\nimport {AOTCacheOptions, MionServerConfig} from './types.ts';\nimport {generateAOTCaches, AOTCacheData, AOTCacheResult} from './aotCacheGenerator.ts';\n\n/** Schema for the on-disk cache file */\ninterface AOTDiskCacheFile {\n cacheVersion: string;\n hash: string;\n jitFnsCode: string;\n pureFnsCode: string;\n routerCacheCode: string;\n}\n\n/** Bump when mion internals change in a way that invalidates cached output */\nconst AOT_DISK_CACHE_VERSION = '2';\n\n/** Cache file name */\nconst CACHE_FILENAME = 'mion-aot-cache.json';\n\n/** Directories to skip when walking the server source tree */\nconst SKIP_DIRS = new Set(['node_modules', '.dist', 'dist', '.git', '.vite', 'build', 'coverage', '.coverage']);\n\n/** File extensions to include in hash computation */\nconst SOURCE_EXTENSIONS = /\\.(ts|tsx)$/;\n\n/** Test file patterns to exclude from hash computation */\nconst TEST_FILE_PATTERN = /\\.(spec|test)\\.(ts|tsx)$/;\n\n/** Read the devtools package version (cached after first call) */\nlet devtoolsVersion: string | null = null;\nfunction getDevtoolsVersion(): string {\n if (devtoolsVersion) return devtoolsVersion;\n try {\n const pkgPath = resolve(dirname(new URL(import.meta.url).pathname), '../../package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n devtoolsVersion = pkg.version || '0.0.0';\n } catch {\n devtoolsVersion = '0.0.0';\n }\n return devtoolsVersion as string;\n}\n\n/** Recursively collect file stats (relativePath:mtimeMs:size) for source files */\nfunction collectFileStats(dir: string, baseDir: string): string[] {\n const entries: string[] = [];\n let files: string[];\n try {\n files = readdirSync(dir);\n } catch {\n return entries;\n }\n for (const file of files) {\n const fullPath = join(dir, file);\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n continue;\n }\n if (stat.isDirectory()) {\n if (SKIP_DIRS.has(file)) continue;\n entries.push(...collectFileStats(fullPath, baseDir));\n } else if (SOURCE_EXTENSIONS.test(file) && !TEST_FILE_PATTERN.test(file)) {\n const relativePath = relative(baseDir, fullPath);\n entries.push(`${relativePath}:${stat.mtimeMs}:${stat.size}`);\n }\n }\n return entries;\n}\n\n/** Compute a SHA-256 hash of the server source directory + options */\nexport function computeSourceHash(serverConfig: MionServerConfig, aotOptions?: AOTCacheOptions): string {\n const serverDir = dirname(resolve(serverConfig.startServerScript));\n const fileStats = collectFileStats(serverDir, serverDir);\n fileStats.sort();\n\n const hashInput = [\n ...fileStats,\n `cacheVersion:${AOT_DISK_CACHE_VERSION}`,\n `devtoolsVersion:${getDevtoolsVersion()}`,\n `excludedFns:${JSON.stringify((aotOptions?.excludedFns || []).slice().sort())}`,\n `excludedPureFns:${JSON.stringify((aotOptions?.excludedPureFns || []).slice().sort())}`,\n ].join('\\n');\n\n return createHash('sha256').update(hashInput).digest('hex');\n}\n\n/** Read and validate the disk cache file. Returns null on any error. */\nfunction readDiskCache(cacheDir: string): AOTDiskCacheFile | null {\n const cachePath = join(cacheDir, CACHE_FILENAME);\n try {\n const raw = readFileSync(cachePath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (\n typeof parsed.cacheVersion === 'string' &&\n typeof parsed.hash === 'string' &&\n typeof parsed.jitFnsCode === 'string' &&\n typeof parsed.pureFnsCode === 'string' &&\n typeof parsed.routerCacheCode === 'string'\n ) {\n return parsed as AOTDiskCacheFile;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/** Write cache data to disk. Best-effort — logs warning on failure. */\nfunction writeDiskCache(cacheDir: string, hash: string, data: AOTCacheData): void {\n const cachePath = join(cacheDir, CACHE_FILENAME);\n try {\n mkdirSync(cacheDir, {recursive: true});\n const cacheFile: AOTDiskCacheFile = {\n cacheVersion: AOT_DISK_CACHE_VERSION,\n hash,\n jitFnsCode: data.jitFnsCode,\n pureFnsCode: data.pureFnsCode,\n routerCacheCode: data.routerCacheCode,\n };\n writeFileSync(cachePath, JSON.stringify(cacheFile), 'utf-8');\n } catch (err) {\n console.warn(`[mion] Warning: Could not write AOT disk cache: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n/** Resolve the cache directory from options and Vite's cacheDir */\nexport function resolveCacheDir(options: AOTCacheOptions, viteCacheDir?: string): string {\n if (options.cache === false) return '';\n if (typeof options.cache === 'string') return resolve(options.cache);\n return viteCacheDir || resolve(process.cwd(), 'node_modules/.vite');\n}\n\n/** Load AOT caches from disk if valid, otherwise generate fresh and save to disk. */\nexport async function getOrGenerateAOTCaches(\n serverConfig: MionServerConfig,\n aotOptions: AOTCacheOptions | undefined,\n cacheDir: string\n): Promise<AOTCacheResult> {\n const forceRegenerate = process.env.MION_AOT_FORCE === 'true';\n // IPC mode always needs a live child process (the server), so skip disk caching entirely\n const isIPCMode = serverConfig.mode === 'IPC';\n const cachingEnabled = cacheDir !== '' && !forceRegenerate && !isIPCMode;\n\n let hash = '';\n if (cachingEnabled) {\n hash = computeSourceHash(serverConfig, aotOptions);\n const cached = readDiskCache(cacheDir);\n if (cached && cached.cacheVersion === AOT_DISK_CACHE_VERSION && cached.hash === hash) {\n console.log('[mion] AOT caches loaded from disk cache (source unchanged)');\n return {\n data: {\n jitFnsCode: cached.jitFnsCode,\n pureFnsCode: cached.pureFnsCode,\n routerCacheCode: cached.routerCacheCode,\n },\n };\n }\n }\n\n // Cache miss or caching disabled — generate fresh\n const result = await generateAOTCaches(serverConfig);\n\n if (cachingEnabled) {\n if (!hash) hash = computeSourceHash(serverConfig, aotOptions);\n writeDiskCache(cacheDir, hash, result.data);\n console.log('[mion] AOT caches saved to disk cache');\n }\n\n return result;\n}\n\n/** Update the disk cache after HMR regeneration */\nexport function updateDiskCache(\n serverConfig: MionServerConfig,\n aotOptions: AOTCacheOptions | undefined,\n data: AOTCacheData,\n cacheDir: string\n): void {\n if (!cacheDir || aotOptions?.cache === false) return;\n const hash = computeSourceHash(serverConfig, aotOptions);\n writeDiskCache(cacheDir, hash, data);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Plugin } from 'vite';
2
+ export declare function cjsPackageJsonPlugin(...cjsDirs: string[]): Plugin;
@@ -0,0 +1,15 @@
1
+ import { writeFileSync } from "fs";
2
+ function cjsPackageJsonPlugin(...cjsDirs) {
3
+ return {
4
+ name: "cjs-package-json",
5
+ closeBundle() {
6
+ for (const dir of cjsDirs) {
7
+ writeFileSync(`${dir}/package.json`, '{"type":"commonjs"}\n');
8
+ }
9
+ }
10
+ };
11
+ }
12
+ export {
13
+ cjsPackageJsonPlugin
14
+ };
15
+ //# sourceMappingURL=cjsPackageJsonPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cjsPackageJsonPlugin.js","sources":["../../../../../src/vite-plugin/cjsPackageJsonPlugin.ts"],"sourcesContent":["/* ########\n * 2026 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport type {Plugin} from 'vite';\nimport {writeFileSync} from 'fs';\n\n/** Writes {\"type\": \"commonjs\"} package.json in CJS output dirs so Node.js doesn't treat .cjs files ambiguously */\nexport function cjsPackageJsonPlugin(...cjsDirs: string[]): Plugin {\n return {\n name: 'cjs-package-json',\n closeBundle() {\n for (const dir of cjsDirs) {\n writeFileSync(`${dir}/package.json`, '{\"type\":\"commonjs\"}\\n');\n }\n },\n };\n}\n"],"names":[],"mappings":";AAWO,SAAS,wBAAwB,SAA2B;AAC/D,SAAO;AAAA,IACH,MAAM;AAAA,IACN,cAAc;AACV,iBAAW,OAAO,SAAS;AACvB,sBAAc,GAAG,GAAG,iBAAiB,uBAAuB;AAAA,MAChE;AAAA,IACJ;AAAA,EAAA;AAER;"}
@@ -0,0 +1,10 @@
1
+ export declare const BODY_HASH_LENGTH = 14;
2
+ export declare const VIRTUAL_SERVER_PURE_FNS = "virtual:mion-server-pure-fns";
3
+ export declare const VIRTUAL_AOT_JIT_FNS = "virtual:mion-aot/jit-fns";
4
+ export declare const VIRTUAL_AOT_PURE_FNS = "virtual:mion-aot/pure-fns";
5
+ export declare const VIRTUAL_AOT_ROUTER_CACHE = "virtual:mion-aot/router-cache";
6
+ export declare const VIRTUAL_AOT_CACHES = "virtual:mion-aot/caches";
7
+ export declare const PURE_SERVER_FN_NAMESPACE = "pureServerFn";
8
+ export declare function resolveVirtualId(id: string): string;
9
+ export declare const REFLECTION_MODULES: string[];
10
+ export declare const VIRTUAL_STUB_PREFIX = "virtual:mion-stub/";
@@ -0,0 +1,25 @@
1
+ const BODY_HASH_LENGTH = 14;
2
+ const VIRTUAL_SERVER_PURE_FNS = "virtual:mion-server-pure-fns";
3
+ const VIRTUAL_AOT_JIT_FNS = "virtual:mion-aot/jit-fns";
4
+ const VIRTUAL_AOT_PURE_FNS = "virtual:mion-aot/pure-fns";
5
+ const VIRTUAL_AOT_ROUTER_CACHE = "virtual:mion-aot/router-cache";
6
+ const VIRTUAL_AOT_CACHES = "virtual:mion-aot/caches";
7
+ const PURE_SERVER_FN_NAMESPACE = "pureServerFn";
8
+ function resolveVirtualId(id) {
9
+ return "\0" + id + ".ts";
10
+ }
11
+ const REFLECTION_MODULES = ["@mionjs/run-types", "@deepkit/type", "@deepkit/core"];
12
+ const VIRTUAL_STUB_PREFIX = "virtual:mion-stub/";
13
+ export {
14
+ BODY_HASH_LENGTH,
15
+ PURE_SERVER_FN_NAMESPACE,
16
+ REFLECTION_MODULES,
17
+ VIRTUAL_AOT_CACHES,
18
+ VIRTUAL_AOT_JIT_FNS,
19
+ VIRTUAL_AOT_PURE_FNS,
20
+ VIRTUAL_AOT_ROUTER_CACHE,
21
+ VIRTUAL_SERVER_PURE_FNS,
22
+ VIRTUAL_STUB_PREFIX,
23
+ resolveVirtualId
24
+ };
25
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../../../src/vite-plugin/constants.ts"],"sourcesContent":["/* ########\n * 2026 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nexport const BODY_HASH_LENGTH = 14;\n\n/** Virtual module ID for the pure functions registry (client-extracted pure functions) */\nexport const VIRTUAL_SERVER_PURE_FNS = 'virtual:mion-server-pure-fns';\n\n// ============ AOT Virtual Modules ============\n\n/** Virtual module ID for JIT functions + pure functions cache (from running the router) */\nexport const VIRTUAL_AOT_JIT_FNS = 'virtual:mion-aot/jit-fns';\n\n/** Virtual module ID for pure functions cache (standalone, from client AST extraction) */\nexport const VIRTUAL_AOT_PURE_FNS = 'virtual:mion-aot/pure-fns';\n\n/** Virtual module ID for router methods cache */\nexport const VIRTUAL_AOT_ROUTER_CACHE = 'virtual:mion-aot/router-cache';\n\n/** Virtual module ID for combined AOT caches (re-exports all 3 cache modules) */\nexport const VIRTUAL_AOT_CACHES = 'virtual:mion-aot/caches';\n\n/** The namespace used for all pureServerFn functions */\nexport const PURE_SERVER_FN_NAMESPACE = 'pureServerFn';\n\n/** Resolves a virtual module ID to its internal Vite ID (\\0 prefix + .ts extension) */\nexport function resolveVirtualId(id: string): string {\n return '\\0' + id + '.ts';\n}\n\n// ============ Reflection Stubs (for excludeReflection) ============\n\n/** Modules stubbed out when excludeReflection is enabled (not needed at runtime in AOT mode) */\nexport const REFLECTION_MODULES = ['@mionjs/run-types', '@deepkit/type', '@deepkit/core'];\n\n/** Prefix for virtual stub module IDs */\nexport const VIRTUAL_STUB_PREFIX = 'virtual:mion-stub/';\n\n// Purity validation constants (ALLOWED_GLOBALS, FORBIDDEN_IDENTIFIERS, FACTORY_FORBIDDEN_IDENTIFIERS)\n// are in ../pureFns/purityRules.ts, shared with the eslint plugin.\n"],"names":[],"mappings":"AAOO,MAAM,mBAAmB;AAGzB,MAAM,0BAA0B;AAKhC,MAAM,sBAAsB;AAG5B,MAAM,uBAAuB;AAG7B,MAAM,2BAA2B;AAGjC,MAAM,qBAAqB;AAG3B,MAAM,2BAA2B;AAGjC,SAAS,iBAAiB,IAAoB;AACjD,SAAO,OAAO,KAAK;AACvB;AAKO,MAAM,qBAAqB,CAAC,qBAAqB,iBAAiB,eAAe;AAGjF,MAAM,sBAAsB;"}
@@ -0,0 +1,13 @@
1
+ import { ExtractedPureFn, ServerPureFunctionsOptions } from './types.ts';
2
+ export declare function extractVueScriptContent(source: string): {
3
+ content: string;
4
+ lang: string;
5
+ } | null;
6
+ export declare function scanClientSource(options: ServerPureFunctionsOptions): ExtractedPureFn[];
7
+ export declare function extractPureFnsFromSource(source: string, filePath: string, fnName?: string, noViteClient?: boolean): ExtractedPureFn[];
8
+ export declare function stripTypes(code: string, filePath?: string): string;
9
+ export declare class PurityError extends Error {
10
+ readonly filePath: string;
11
+ readonly position: number;
12
+ constructor(message: string, filePath: string, position: number);
13
+ }