@swissjs/swite 0.3.0 → 0.3.1

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 (157) hide show
  1. package/dist/adapters/proxy/SwiteProxyError.d.ts.map +1 -0
  2. package/dist/{proxy → adapters/proxy}/proxyToPython.d.ts +1 -1
  3. package/dist/adapters/proxy/proxyToPython.d.ts.map +1 -0
  4. package/dist/build-engine/builder.d.ts.map +1 -0
  5. package/dist/{builder.js → build-engine/builder.js} +8 -14
  6. package/dist/cli.js +5 -5
  7. package/dist/config/config-loader.d.ts.map +1 -0
  8. package/dist/config/config.d.ts.map +1 -0
  9. package/dist/config/env.d.ts +25 -0
  10. package/dist/config/env.d.ts.map +1 -0
  11. package/dist/config/env.js +84 -0
  12. package/dist/{handlers → dev-engine/handlers}/base-handler.d.ts +3 -1
  13. package/dist/dev-engine/handlers/base-handler.d.ts.map +1 -0
  14. package/dist/{handlers → dev-engine/handlers}/base-handler.js +22 -2
  15. package/dist/dev-engine/handlers/js-handler.d.ts.map +1 -0
  16. package/dist/{handlers → dev-engine/handlers}/js-handler.js +1 -1
  17. package/dist/dev-engine/handlers/mjs-handler.d.ts.map +1 -0
  18. package/dist/{handlers → dev-engine/handlers}/mjs-handler.js +1 -1
  19. package/dist/dev-engine/handlers/node-module-handler.d.ts.map +1 -0
  20. package/dist/{handlers → dev-engine/handlers}/node-module-handler.js +4 -4
  21. package/dist/{handlers → dev-engine/handlers}/ts-handler.d.ts +0 -4
  22. package/dist/dev-engine/handlers/ts-handler.d.ts.map +1 -0
  23. package/dist/{handlers → dev-engine/handlers}/ts-handler.js +5 -28
  24. package/dist/{handlers → dev-engine/handlers}/ui-handler.d.ts +0 -4
  25. package/dist/dev-engine/handlers/ui-handler.d.ts.map +1 -0
  26. package/dist/dev-engine/handlers/ui-handler.js +84 -0
  27. package/dist/{handlers → dev-engine/handlers}/uix-handler.d.ts +0 -4
  28. package/dist/dev-engine/handlers/uix-handler.d.ts.map +1 -0
  29. package/dist/dev-engine/handlers/uix-handler.js +70 -0
  30. package/dist/dev-engine/hmr/hmr-client-template.d.ts +10 -0
  31. package/dist/dev-engine/hmr/hmr-client-template.d.ts.map +1 -0
  32. package/dist/dev-engine/hmr/hmr-client-template.js +122 -0
  33. package/dist/dev-engine/hmr/hmr.d.ts.map +1 -0
  34. package/dist/{hmr.js → dev-engine/hmr/hmr.js} +2 -134
  35. package/dist/{middleware → dev-engine/middleware}/hmr-routes.d.ts +2 -2
  36. package/dist/dev-engine/middleware/hmr-routes.d.ts.map +1 -0
  37. package/dist/{middleware → dev-engine/middleware}/hmr-routes.js +1 -1
  38. package/dist/dev-engine/middleware/middleware-setup.d.ts +34 -0
  39. package/dist/dev-engine/middleware/middleware-setup.d.ts.map +1 -0
  40. package/dist/dev-engine/middleware/middleware-setup.js +327 -0
  41. package/dist/dev-engine/middleware/static-files.d.ts.map +1 -0
  42. package/dist/{middleware → dev-engine/middleware}/static-files.js +2 -2
  43. package/dist/{dev → dev-engine}/pythonDevManager.d.ts +1 -1
  44. package/dist/dev-engine/pythonDevManager.d.ts.map +1 -0
  45. package/dist/{dev → dev-engine}/pythonDevManager.js +1 -1
  46. package/dist/{router → dev-engine/router}/file-router.d.ts +4 -4
  47. package/dist/dev-engine/router/file-router.d.ts.map +1 -0
  48. package/dist/{router → dev-engine/router}/file-router.js +4 -4
  49. package/dist/dev-engine/server.d.ts.map +1 -0
  50. package/dist/{server.js → dev-engine/server.js} +6 -6
  51. package/dist/index.d.ts +13 -13
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +9 -9
  54. package/dist/internal/cache/compilation-cache.d.ts.map +1 -0
  55. package/dist/{cache → internal/cache}/compilation-cache.js +3 -2
  56. package/dist/internal/generate-import-map-cli.d.ts.map +1 -0
  57. package/dist/{utils → internal}/generate-import-map-cli.js +1 -1
  58. package/dist/internal/generate-import-map.d.ts.map +1 -0
  59. package/dist/{utils → internal}/generate-import-map.js +3 -3
  60. package/dist/{utils → kernel}/package-finder.d.ts +3 -1
  61. package/dist/kernel/package-finder.d.ts.map +1 -0
  62. package/dist/{utils → kernel}/package-finder.js +29 -52
  63. package/dist/kernel/package-registry.d.ts.map +1 -0
  64. package/dist/kernel/workspace.d.ts.map +1 -0
  65. package/dist/{resolver → resolution}/bare-import-resolver.d.ts +1 -1
  66. package/dist/resolution/bare-import-resolver.d.ts.map +1 -0
  67. package/dist/{resolver → resolution}/bare-import-resolver.js +12 -49
  68. package/dist/resolution/cdn/cdn-fallback.d.ts.map +1 -0
  69. package/dist/resolution/path/file-path-resolver.d.ts.map +1 -0
  70. package/dist/{utils → resolution/path}/file-path-resolver.js +11 -20
  71. package/dist/resolution/path/path-fixup.d.ts +13 -0
  72. package/dist/resolution/path/path-fixup.d.ts.map +1 -0
  73. package/dist/resolution/path/path-fixup.js +20 -0
  74. package/dist/{resolver.d.ts → resolution/resolver.d.ts} +1 -1
  75. package/dist/resolution/resolver.d.ts.map +1 -0
  76. package/dist/{resolver.js → resolution/resolver.js} +8 -37
  77. package/dist/{import-rewriter.d.ts → resolution/rewriting/import-rewriter.d.ts} +1 -1
  78. package/dist/resolution/rewriting/import-rewriter.d.ts.map +1 -0
  79. package/dist/resolution/rewriting/import-rewriter.js +199 -0
  80. package/dist/{resolver → resolution}/symlink-registry.d.ts +1 -1
  81. package/dist/resolution/symlink-registry.d.ts.map +1 -0
  82. package/dist/{resolver → resolution}/symlink-registry.js +1 -1
  83. package/dist/resolution/url-resolver.d.ts.map +1 -0
  84. package/dist/{resolver → resolution}/url-resolver.js +38 -109
  85. package/dist/resolution/workspace-package-resolver.d.ts.map +1 -0
  86. package/dist/resolution/workspace-package-resolver.js +77 -0
  87. package/package.json +24 -15
  88. package/src/cli.ts +1 -1
  89. package/src/resolution/url-resolver.ts +1 -1
  90. package/dist/builder.d.ts.map +0 -1
  91. package/dist/cache/compilation-cache.d.ts.map +0 -1
  92. package/dist/config-loader.d.ts.map +0 -1
  93. package/dist/config.d.ts.map +0 -1
  94. package/dist/dev/pythonDevManager.d.ts.map +0 -1
  95. package/dist/env.d.ts +0 -19
  96. package/dist/env.d.ts.map +0 -1
  97. package/dist/env.js +0 -112
  98. package/dist/handlers/base-handler.d.ts.map +0 -1
  99. package/dist/handlers/js-handler.d.ts.map +0 -1
  100. package/dist/handlers/mjs-handler.d.ts.map +0 -1
  101. package/dist/handlers/node-module-handler.d.ts.map +0 -1
  102. package/dist/handlers/ts-handler.d.ts.map +0 -1
  103. package/dist/handlers/ui-handler.d.ts.map +0 -1
  104. package/dist/handlers/ui-handler.js +0 -182
  105. package/dist/handlers/uix-handler.d.ts.map +0 -1
  106. package/dist/handlers/uix-handler.js +0 -135
  107. package/dist/hmr.d.ts.map +0 -1
  108. package/dist/import-rewriter.d.ts.map +0 -1
  109. package/dist/import-rewriter.js +0 -351
  110. package/dist/middleware/hmr-routes.d.ts.map +0 -1
  111. package/dist/middleware/middleware-setup.d.ts +0 -23
  112. package/dist/middleware/middleware-setup.d.ts.map +0 -1
  113. package/dist/middleware/middleware-setup.js +0 -596
  114. package/dist/middleware/static-files.d.ts.map +0 -1
  115. package/dist/proxy/SwiteProxyError.d.ts.map +0 -1
  116. package/dist/proxy/proxyToPython.d.ts.map +0 -1
  117. package/dist/resolver/bare-import-resolver.d.ts.map +0 -1
  118. package/dist/resolver/symlink-registry.d.ts.map +0 -1
  119. package/dist/resolver/url-resolver.d.ts.map +0 -1
  120. package/dist/resolver/workspace-package-resolver.d.ts.map +0 -1
  121. package/dist/resolver/workspace-package-resolver.js +0 -185
  122. package/dist/resolver.d.ts.map +0 -1
  123. package/dist/router/file-router.d.ts.map +0 -1
  124. package/dist/server.d.ts.map +0 -1
  125. package/dist/utils/cdn-fallback.d.ts.map +0 -1
  126. package/dist/utils/file-path-resolver.d.ts.map +0 -1
  127. package/dist/utils/generate-import-map-cli.d.ts.map +0 -1
  128. package/dist/utils/generate-import-map.d.ts.map +0 -1
  129. package/dist/utils/package-finder.d.ts.map +0 -1
  130. package/dist/utils/package-registry.d.ts.map +0 -1
  131. package/dist/utils/workspace.d.ts.map +0 -1
  132. /package/dist/{proxy → adapters/proxy}/SwiteProxyError.d.ts +0 -0
  133. /package/dist/{proxy → adapters/proxy}/SwiteProxyError.js +0 -0
  134. /package/dist/{proxy → adapters/proxy}/proxyToPython.js +0 -0
  135. /package/dist/{builder.d.ts → build-engine/builder.d.ts} +0 -0
  136. /package/dist/{config-loader.d.ts → config/config-loader.d.ts} +0 -0
  137. /package/dist/{config-loader.js → config/config-loader.js} +0 -0
  138. /package/dist/{config.d.ts → config/config.d.ts} +0 -0
  139. /package/dist/{config.js → config/config.js} +0 -0
  140. /package/dist/{handlers → dev-engine/handlers}/js-handler.d.ts +0 -0
  141. /package/dist/{handlers → dev-engine/handlers}/mjs-handler.d.ts +0 -0
  142. /package/dist/{handlers → dev-engine/handlers}/node-module-handler.d.ts +0 -0
  143. /package/dist/{hmr.d.ts → dev-engine/hmr/hmr.d.ts} +0 -0
  144. /package/dist/{middleware → dev-engine/middleware}/static-files.d.ts +0 -0
  145. /package/dist/{server.d.ts → dev-engine/server.d.ts} +0 -0
  146. /package/dist/{cache → internal/cache}/compilation-cache.d.ts +0 -0
  147. /package/dist/{utils → internal}/generate-import-map-cli.d.ts +0 -0
  148. /package/dist/{utils → internal}/generate-import-map.d.ts +0 -0
  149. /package/dist/{utils → kernel}/package-registry.d.ts +0 -0
  150. /package/dist/{utils → kernel}/package-registry.js +0 -0
  151. /package/dist/{utils → kernel}/workspace.d.ts +0 -0
  152. /package/dist/{utils → kernel}/workspace.js +0 -0
  153. /package/dist/{utils → resolution/cdn}/cdn-fallback.d.ts +0 -0
  154. /package/dist/{utils → resolution/cdn}/cdn-fallback.js +0 -0
  155. /package/dist/{utils → resolution/path}/file-path-resolver.d.ts +0 -0
  156. /package/dist/{resolver → resolution}/url-resolver.d.ts +0 -0
  157. /package/dist/{resolver → resolution}/workspace-package-resolver.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwiteProxyError.d.ts","sourceRoot":"","sources":["../../../src/adapters/proxy/SwiteProxyError.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;gBAEnB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;CAOpE"}
@@ -1,4 +1,4 @@
1
- import type { PythonServiceConfig } from "../config.js";
1
+ import type { PythonServiceConfig } from "../../config/config.js";
2
2
  /**
3
3
  * Called by swite start on startup.
4
4
  * Disables localhost fallback — PYTHON_SERVICE_URL is the only valid base URL.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxyToPython.d.ts","sourceRoot":"","sources":["../../../src/adapters/proxy/proxyToPython.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAMlE;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAEjE;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAiDxE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/build-engine/builder.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,EAAE,WAAW;IAezB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBd,cAAc;YAMd,iBAAiB;YA+BjB,gBAAgB;YAsEhB,6BAA6B;YA+J7B,MAAM;YAmdN,gBAAgB;YAchB,cAAc;YAuBd,SAAS;YAuBT,OAAO;IAgBrB,OAAO,CAAC,WAAW;YAQL,iBAAiB;YAyBjB,UAAU;YASV,aAAa;CAiC5B;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D"}
@@ -4,11 +4,11 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  import { build as esbuild } from "esbuild";
7
- import { UiCompiler } from "@kibologic/compiler";
7
+ import { UiCompiler } from "@swissjs/compiler";
8
8
  import { promises as fs } from "node:fs";
9
9
  import path from "node:path";
10
10
  import chalk from "chalk";
11
- import { ModuleResolver } from "./resolver.js";
11
+ import { ModuleResolver } from "../resolution/resolver.js";
12
12
  export class SwiteBuilder {
13
13
  constructor(config) {
14
14
  this.compiler = new UiCompiler();
@@ -28,18 +28,12 @@ export class SwiteBuilder {
28
28
  async build() {
29
29
  const startTime = Date.now();
30
30
  console.log(chalk.cyan("\n⚡ SWITE - Production Build\n"));
31
+ const tempDir = path.join(this.config.root, ".swite-build");
31
32
  try {
32
- // Step 1: Clean output directory
33
33
  await this.cleanOutputDir();
34
- // Step 2: Compile Swiss files to temp directory
35
- const tempDir = path.join(this.config.root, ".swite-build");
36
34
  await this.compileSwissFiles(tempDir);
37
- // Step 3: Bundle with esbuild
38
35
  await this.bundle(tempDir);
39
- // Step 4: Copy public assets
40
36
  await this.copyPublicAssets();
41
- // Step 5: Clean up temp directory
42
- await fs.rm(tempDir, { recursive: true, force: true });
43
37
  const duration = Date.now() - startTime;
44
38
  console.log(chalk.green(`\n✅ Build completed in ${duration}ms\n`));
45
39
  }
@@ -47,6 +41,9 @@ export class SwiteBuilder {
47
41
  console.error(chalk.red("\n❌ Build failed:"), error);
48
42
  throw error;
49
43
  }
44
+ finally {
45
+ await fs.rm(tempDir, { recursive: true, force: true });
46
+ }
50
47
  }
51
48
  async cleanOutputDir() {
52
49
  console.log(chalk.blue("🧹 Cleaning output directory..."));
@@ -284,12 +281,9 @@ export class SwiteBuilder {
284
281
  // Configure esbuild to resolve workspace packages from temp directory
285
282
  const absWorkingDir = workspaceRoot || this.config.root;
286
283
  // const aliases = workspaceRoot ? await this.createAliases(workspaceRoot, tempDir) : {}; // Unused
287
- // Mark Node.js built-ins and build-time-only deps as external
284
+ // Mark Node.js built-ins as external; user-facing framework packages are
285
+ // resolved at runtime — do not hardcode package scopes here
288
286
  const nodeBuiltins = [
289
- "@kibologic/swite",
290
- "@kibologic/core",
291
- "@kibologic/*",
292
- "@kibologic/*",
293
287
  "fs",
294
288
  "path",
295
289
  "os",
package/dist/cli.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { resolve } from "node:path";
3
3
  import chalk from "chalk";
4
- import { SwiteServer } from "./server.js";
5
- import { loadUserConfig } from "./config-loader.js";
6
- import { startPythonDevService, stopPythonDevService, } from "./dev/pythonDevManager.js";
7
- import { setProductionMode } from "./proxy/proxyToPython.js";
4
+ import { SwiteServer } from "./dev-engine/server.js";
5
+ import { loadUserConfig } from "./config/config-loader.js";
6
+ import { startPythonDevService, stopPythonDevService, } from "./dev-engine/pythonDevManager.js";
7
+ import { setProductionMode } from "./adapters/proxy/proxyToPython.js";
8
8
  const [, , command, ...args] = process.argv;
9
9
  const root = resolve(process.cwd());
10
10
  async function dev() {
@@ -49,7 +49,7 @@ async function start() {
49
49
  await server.start();
50
50
  }
51
51
  async function build() {
52
- const { SwiteBuilder } = await import("./builder.js");
52
+ const { SwiteBuilder } = await import("./build-engine/builder.js");
53
53
  const config = await loadUserConfig(root);
54
54
  const builder = new SwiteBuilder({
55
55
  root,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgC3E"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,SAAS,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAErE"}
@@ -0,0 +1,25 @@
1
+ export interface EnvConfig {
2
+ mode?: "development" | "production";
3
+ prefix?: string;
4
+ }
5
+ /**
6
+ * Load environment variables from .env files.
7
+ * Supports .env, .env.local, .env.[mode], .env.[mode].local
8
+ */
9
+ export declare function loadEnv(root: string, mode?: string, prefix?: string): Record<string, string>;
10
+ /**
11
+ * Replace all import.meta.env references in compiled code with their literal values.
12
+ *
13
+ * This is the only correct approach for ES modules — import.meta is sealed and
14
+ * import.meta.env cannot be assigned at runtime. All substitution must happen at
15
+ * transform time (here, after esbuild strips TypeScript).
16
+ *
17
+ * Handles:
18
+ * - import.meta.env.KEY → JSON.stringify(env[KEY]) or "undefined"
19
+ * - import.meta.env.DEV → true/false literal
20
+ * - import.meta.env.PROD → true/false literal
21
+ * - import.meta.env.MODE → "development"/"production" literal
22
+ * - bare import.meta.env → serialized object literal (for spread, typeof, etc.)
23
+ */
24
+ export declare function inlineEnvReferences(code: string, env: Record<string, string>, mode?: string): string;
25
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAsB,EAC5B,MAAM,GAAE,MAAiB,GACxB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,IAAI,GAAE,MAAsB,GAC3B,MAAM,CAsBR"}
@@ -0,0 +1,84 @@
1
+ /*
2
+ * Environment Variable Support for SWITE
3
+ * Provides import.meta.env replacement for SWITE
4
+ */
5
+ import { readFileSync, existsSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ /**
8
+ * Load environment variables from .env files.
9
+ * Supports .env, .env.local, .env.[mode], .env.[mode].local
10
+ */
11
+ export function loadEnv(root, mode = "development", prefix = "SWITE_") {
12
+ const env = {};
13
+ const envFiles = [`.env.${mode}.local`, `.env.${mode}`, `.env.local`, `.env`];
14
+ for (const file of envFiles) {
15
+ const envPath = join(root, file);
16
+ if (!existsSync(envPath))
17
+ continue;
18
+ const content = readFileSync(envPath, "utf-8");
19
+ for (const line of content.split("\n")) {
20
+ const trimmed = line.trim();
21
+ if (!trimmed || trimmed.startsWith("#"))
22
+ continue;
23
+ const match = trimmed.match(/^([^=]+)=(.*)$/);
24
+ if (!match)
25
+ continue;
26
+ const key = match[1].trim();
27
+ const value = match[2].replace(/^["']|["']$/g, "");
28
+ if (key.startsWith(prefix) || key.startsWith("PUBLIC_")) {
29
+ env[key] = value;
30
+ }
31
+ }
32
+ }
33
+ return env;
34
+ }
35
+ /**
36
+ * Replace all import.meta.env references in compiled code with their literal values.
37
+ *
38
+ * This is the only correct approach for ES modules — import.meta is sealed and
39
+ * import.meta.env cannot be assigned at runtime. All substitution must happen at
40
+ * transform time (here, after esbuild strips TypeScript).
41
+ *
42
+ * Handles:
43
+ * - import.meta.env.KEY → JSON.stringify(env[KEY]) or "undefined"
44
+ * - import.meta.env.DEV → true/false literal
45
+ * - import.meta.env.PROD → true/false literal
46
+ * - import.meta.env.MODE → "development"/"production" literal
47
+ * - bare import.meta.env → serialized object literal (for spread, typeof, etc.)
48
+ */
49
+ export function inlineEnvReferences(code, env, mode = "development") {
50
+ if (!code.includes("import.meta.env"))
51
+ return code;
52
+ const isDev = mode !== "production";
53
+ // Named key access first (most specific)
54
+ code = code.replace(/\bimport\.meta\.env\.([A-Z_][A-Z0-9_]*)\b/g, (_, key) => {
55
+ if (key === "DEV")
56
+ return String(isDev);
57
+ if (key === "PROD")
58
+ return String(!isDev);
59
+ if (key === "MODE")
60
+ return JSON.stringify(mode);
61
+ if (key === "SSR")
62
+ return "false";
63
+ if (key in env)
64
+ return JSON.stringify(env[key]);
65
+ return "undefined";
66
+ });
67
+ // Bare import.meta.env (spread/typeof patterns)
68
+ if (code.includes("import.meta.env")) {
69
+ const envLiteral = buildEnvLiteral(env, mode);
70
+ code = code.replace(/\bimport\.meta\.env\b/g, envLiteral);
71
+ }
72
+ return code;
73
+ }
74
+ function buildEnvLiteral(env, mode) {
75
+ const isDev = mode !== "production";
76
+ const entries = [
77
+ `MODE:${JSON.stringify(mode)}`,
78
+ `DEV:${isDev}`,
79
+ `PROD:${!isDev}`,
80
+ `SSR:false`,
81
+ ...Object.entries(env).map(([k, v]) => `${JSON.stringify(k)}:${JSON.stringify(v)}`),
82
+ ];
83
+ return `({${entries.join(",")}})`;
84
+ }
@@ -1,9 +1,10 @@
1
1
  import type { Response } from "express";
2
- import { ModuleResolver } from "../resolver.js";
2
+ import { ModuleResolver } from "../../resolution/resolver.js";
3
3
  export interface HandlerContext {
4
4
  resolver: ModuleResolver;
5
5
  root: string;
6
6
  workspaceRoot: string | null;
7
+ env: Record<string, string>;
7
8
  }
8
9
  /**
9
10
  * Set cache-busting headers for development
@@ -17,5 +18,6 @@ export declare class BaseHandler {
17
18
  constructor(context: HandlerContext);
18
19
  protected resolveFilePath(url: string): Promise<string>;
19
20
  protected fileExists(filePath: string): Promise<boolean>;
21
+ protected getDependencies(compiled: string): Promise<string[]>;
20
22
  }
21
23
  //# sourceMappingURL=base-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/base-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAMjD;AAED;;GAEG;AACH,qBAAa,WAAW;IACV,SAAS,CAAC,OAAO,EAAE,cAAc;gBAAvB,OAAO,EAAE,cAAc;cAE7B,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAI7C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAS9C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAmBrE"}
@@ -4,8 +4,8 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  import { promises as fs } from "node:fs";
7
- import { ModuleResolver } from "../resolver.js";
8
- import { resolveFilePath } from "../utils/file-path-resolver.js";
7
+ import { ModuleResolver } from "../../resolution/resolver.js";
8
+ import { resolveFilePath } from "../../resolution/path/file-path-resolver.js";
9
9
  /**
10
10
  * Set cache-busting headers for development
11
11
  */
@@ -35,4 +35,24 @@ export class BaseHandler {
35
35
  return false;
36
36
  }
37
37
  }
38
+ async getDependencies(compiled) {
39
+ const deps = [];
40
+ const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
41
+ let match;
42
+ while ((match = importPattern.exec(compiled)) !== null) {
43
+ const specifier = match[1];
44
+ if (specifier.startsWith("/") || specifier.startsWith("@")) {
45
+ try {
46
+ const resolved = await this.context.resolver.resolve(specifier, "");
47
+ if (resolved && !resolved.startsWith("http")) {
48
+ deps.push(resolved);
49
+ }
50
+ }
51
+ catch {
52
+ // ignore resolution errors during dependency tracking
53
+ }
54
+ }
55
+ }
56
+ return deps;
57
+ }
38
58
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/js-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAK3B,qBAAa,SAAU,SAAQ,WAAW;IACxC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,cAAc;IAO7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAsGxD"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { promises as fs } from "node:fs";
7
7
  import chalk from "chalk";
8
- import { rewriteImports } from "../import-rewriter.js";
8
+ import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
9
9
  import { BaseHandler, setDevHeaders, } from "./base-handler.js";
10
10
  import { UIHandler } from "./ui-handler.js";
11
11
  import { UIXHandler } from "./uix-handler.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mjs-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/mjs-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAG3B,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,cAAc;IAK7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuCxD"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { promises as fs } from "node:fs";
7
7
  import chalk from "chalk";
8
- import { rewriteImports } from "../import-rewriter.js";
8
+ import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
9
9
  import { BaseHandler, setDevHeaders, } from "./base-handler.js";
10
10
  import { JSHandler } from "./js-handler.js";
11
11
  export class MJSHandler extends BaseHandler {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-module-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/node-module-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOrE,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,cAAc;IAO7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAqRvD;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CA0BjC"}
@@ -6,13 +6,13 @@
6
6
  import { promises as fs } from "node:fs";
7
7
  import * as path from "node:path";
8
8
  import chalk from "chalk";
9
- import { rewriteImports } from "../import-rewriter.js";
9
+ import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
10
10
  import { BaseHandler } from "./base-handler.js";
11
11
  import { UIHandler } from "./ui-handler.js";
12
12
  import { UIXHandler } from "./uix-handler.js";
13
13
  import { TSHandler } from "./ts-handler.js";
14
- import { findWorkspaceRoot } from "../utils/workspace.js";
15
- import { shouldUseCdnFallback } from "../utils/cdn-fallback.js";
14
+ import { findWorkspaceRoot } from "../../kernel/workspace.js";
15
+ import { shouldUseCdnFallback } from "../../resolution/cdn/cdn-fallback.js";
16
16
  export class NodeModuleHandler extends BaseHandler {
17
17
  constructor(context) {
18
18
  super(context);
@@ -81,7 +81,7 @@ export class NodeModuleHandler extends BaseHandler {
81
81
  catch (err2) {
82
82
  console.log(chalk.yellow(`[node_modules] Workspace path failed: ${err2 instanceof Error ? err2.message : String(err2)}`));
83
83
  // Try swiss-lib monorepo node_modules (dynamically found)
84
- const { findSwissLibMonorepo } = await import("../utils/package-finder.js");
84
+ const { findSwissLibMonorepo } = await import("../../kernel/package-finder.js");
85
85
  const swissLib = await findSwissLibMonorepo(this.context.root);
86
86
  if (swissLib) {
87
87
  const swissNodeModulesPath = path.join(swissLib, urlPath);
@@ -2,10 +2,6 @@ import type { Response } from "express";
2
2
  import { BaseHandler, type HandlerContext } from "./base-handler.js";
3
3
  export declare class TSHandler extends BaseHandler {
4
4
  constructor(context: HandlerContext);
5
- /**
6
- * Extract dependencies from compiled code (import paths)
7
- */
8
- private getDependencies;
9
5
  handle(url: string, res: Response): Promise<void>;
10
6
  }
11
7
  //# sourceMappingURL=ts-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/ts-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,SAAU,SAAQ,WAAW;gBAC5B,OAAO,EAAE,cAAc;IAI7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuHxD"}
@@ -5,37 +5,14 @@
5
5
  */
6
6
  import { promises as fs } from "node:fs";
7
7
  import chalk from "chalk";
8
- import { rewriteImports } from "../import-rewriter.js";
9
- import { compilationCache } from "../cache/compilation-cache.js";
8
+ import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
9
+ import { inlineEnvReferences } from "../../config/env.js";
10
+ import { compilationCache } from "../../internal/cache/compilation-cache.js";
10
11
  import { BaseHandler, setDevHeaders, } from "./base-handler.js";
11
12
  export class TSHandler extends BaseHandler {
12
13
  constructor(context) {
13
14
  super(context);
14
15
  }
15
- /**
16
- * Extract dependencies from compiled code (import paths)
17
- */
18
- async getDependencies(compiled) {
19
- const deps = [];
20
- const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
21
- let match;
22
- while ((match = importPattern.exec(compiled)) !== null) {
23
- const specifier = match[1];
24
- // Only track absolute paths and workspace paths (not relative)
25
- if (specifier.startsWith("/") || specifier.startsWith("@")) {
26
- try {
27
- const resolved = await this.context.resolver.resolve(specifier, "");
28
- if (resolved && !resolved.startsWith("http")) {
29
- deps.push(resolved);
30
- }
31
- }
32
- catch {
33
- // Ignore resolution errors
34
- }
35
- }
36
- }
37
- return deps;
38
- }
39
16
  async handle(url, res) {
40
17
  const filePath = await this.resolveFilePath(url);
41
18
  console.log(chalk.gray(`[.ts] ${url}`));
@@ -101,8 +78,8 @@ export class TSHandler extends BaseHandler {
101
78
  target: "esnext",
102
79
  sourcefile: filePath,
103
80
  });
104
- const rewritten = await rewriteImports(result.code, filePath, this.context.resolver);
105
- // Store in cache (use result.code as "compiled" for dependency tracking)
81
+ const inlined = inlineEnvReferences(result.code, this.context.env);
82
+ const rewritten = await rewriteImports(inlined, filePath, this.context.resolver);
106
83
  await compilationCache.set(filePath, result.code, rewritten, (compiled) => this.getDependencies(compiled));
107
84
  // Debug: Check for bare imports after rewriting
108
85
  const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
@@ -3,10 +3,6 @@ import { BaseHandler, type HandlerContext } from "./base-handler.js";
3
3
  export declare class UIHandler extends BaseHandler {
4
4
  private compiler;
5
5
  constructor(context: HandlerContext);
6
- /**
7
- * Extract dependencies from compiled code (import paths)
8
- */
9
- private getDependencies;
10
6
  handle(url: string, res: Response): Promise<void>;
11
7
  }
12
8
  //# sourceMappingURL=ui-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/ui-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,SAAU,SAAQ,WAAW;IACxC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAI7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAkExD"}
@@ -0,0 +1,84 @@
1
+ /*
2
+ * Copyright (c) 2024 Themba Mzumara
3
+ * SWITE - SWISS Development Server
4
+ * Licensed under the MIT License.
5
+ */
6
+ import { promises as fs } from "node:fs";
7
+ import { UiCompiler } from "@swissjs/compiler";
8
+ import chalk from "chalk";
9
+ import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
10
+ import { inlineEnvReferences } from "../../config/env.js";
11
+ import { compilationCache } from "../../internal/cache/compilation-cache.js";
12
+ import { fixSwissLibPaths } from "../../resolution/path/path-fixup.js";
13
+ import { BaseHandler, setDevHeaders, } from "./base-handler.js";
14
+ export class UIHandler extends BaseHandler {
15
+ constructor(context) {
16
+ super(context);
17
+ this.compiler = new UiCompiler();
18
+ }
19
+ async handle(url, res) {
20
+ const filePath = await this.resolveFilePath(url);
21
+ console.log(chalk.blue(`[.ui] ${url} → ${filePath}`));
22
+ try {
23
+ await fs.access(filePath);
24
+ }
25
+ catch {
26
+ console.error(chalk.red(`[.ui] File not found: ${filePath}`));
27
+ throw new Error(`File not found: ${url} (resolved to: ${filePath})`);
28
+ }
29
+ // Cache hit
30
+ const cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
31
+ if (cached) {
32
+ const fixed = fixSwissLibPaths(cached);
33
+ setDevHeaders(res);
34
+ res.setHeader("Content-Type", "application/javascript; charset=utf-8");
35
+ res.setHeader("Content-Length", Buffer.byteLength(fixed, "utf-8"));
36
+ res.end(fixed, "utf-8");
37
+ return;
38
+ }
39
+ // Cache miss — compile
40
+ const source = await fs.readFile(filePath, "utf-8");
41
+ let compiled = await this.compiler.compileAsync(source, filePath);
42
+ const esbuild = await import("esbuild");
43
+ const tsResult = await esbuild.transform(compiled, {
44
+ loader: "ts",
45
+ format: "esm",
46
+ target: "esnext",
47
+ sourcefile: filePath,
48
+ });
49
+ compiled = tsResult.code;
50
+ // Fix compiler-emitted wrong paths before import rewriting
51
+ compiled = fixSwissLibPaths(compiled);
52
+ // Inline import.meta.env references before import rewriting
53
+ compiled = inlineEnvReferences(compiled, this.context.env);
54
+ // Strip CSS static-asset imports — they are not ES modules
55
+ compiled = stripCssImports(compiled, url);
56
+ const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
57
+ if (bareImportPattern.test(compiled)) {
58
+ console.warn(`[.ui] Compiled output contains bare imports: ${url}`);
59
+ }
60
+ const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
61
+ const finalCode = fixSwissLibPaths(rewritten);
62
+ await compilationCache.set(filePath, compiled, finalCode, (c) => this.getDependencies(c));
63
+ if (bareImportPattern.test(finalCode)) {
64
+ console.error(`[.ui] Bare imports still present after rewriting: ${url}`);
65
+ for (const m of Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g)).slice(0, 3)) {
66
+ console.error(`[.ui] Unresolved import: ${m[1]}`);
67
+ }
68
+ }
69
+ setDevHeaders(res);
70
+ res.setHeader("Content-Type", "application/javascript; charset=utf-8");
71
+ res.setHeader("Content-Length", Buffer.byteLength(finalCode, "utf-8"));
72
+ res.end(finalCode, "utf-8");
73
+ }
74
+ }
75
+ function stripCssImports(code, url) {
76
+ // Single well-ordered pass: static imports first, then dynamic imports
77
+ const before = code;
78
+ code = code.replace(/^[^\S\r\n]*import\s[^'"]*['"][^'"]*\.css['"]\s*;?[^\S\r\n]*$/gm, "");
79
+ code = code.replace(/\bimport\s*\(\s*['"][^'"]*\.css['"]\s*\)/g, "undefined");
80
+ if (before !== code) {
81
+ console.log(chalk.blue(`[.ui] Stripped CSS imports from ${url}`));
82
+ }
83
+ return code;
84
+ }
@@ -3,10 +3,6 @@ import { BaseHandler, type HandlerContext } from "./base-handler.js";
3
3
  export declare class UIXHandler extends BaseHandler {
4
4
  private compiler;
5
5
  constructor(context: HandlerContext);
6
- /**
7
- * Extract dependencies from compiled code (import paths)
8
- */
9
- private getDependencies;
10
6
  handle(url: string, res: Response): Promise<void>;
11
7
  }
12
8
  //# sourceMappingURL=uix-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uix-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/uix-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAI7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA8DxD"}
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Copyright (c) 2024 Themba Mzumara
3
+ * SWITE - SWISS Development Server
4
+ * Licensed under the MIT License.
5
+ */
6
+ import { promises as fs } from "node:fs";
7
+ import { UiCompiler } from "@swissjs/compiler";
8
+ import chalk from "chalk";
9
+ import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
10
+ import { inlineEnvReferences } from "../../config/env.js";
11
+ import { compilationCache } from "../../internal/cache/compilation-cache.js";
12
+ import { fixSwissLibPaths } from "../../resolution/path/path-fixup.js";
13
+ import { BaseHandler, setDevHeaders, } from "./base-handler.js";
14
+ export class UIXHandler extends BaseHandler {
15
+ constructor(context) {
16
+ super(context);
17
+ this.compiler = new UiCompiler();
18
+ }
19
+ async handle(url, res) {
20
+ const filePath = await this.resolveFilePath(url);
21
+ console.log(chalk.blue(`[.uix] ${url}`));
22
+ // Cache hit
23
+ const cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
24
+ if (cached) {
25
+ const fixed = fixSwissLibPaths(cached);
26
+ setDevHeaders(res);
27
+ res.setHeader("Content-Type", "application/javascript; charset=utf-8");
28
+ res.send(fixed);
29
+ return;
30
+ }
31
+ // Cache miss — compile
32
+ const source = await fs.readFile(filePath, "utf-8");
33
+ let compiled = await this.compiler.compileAsync(source, filePath);
34
+ const esbuild = await import("esbuild");
35
+ const tsResult = await esbuild.transform(compiled, {
36
+ loader: "ts",
37
+ format: "esm",
38
+ target: "esnext",
39
+ sourcefile: filePath,
40
+ });
41
+ compiled = tsResult.code;
42
+ // Fix compiler-emitted wrong paths before import rewriting
43
+ compiled = fixSwissLibPaths(compiled);
44
+ // Inline import.meta.env references before import rewriting
45
+ compiled = inlineEnvReferences(compiled, this.context.env);
46
+ // Strip CSS static-asset imports — they are not ES modules
47
+ const beforeCss = compiled;
48
+ compiled = compiled.replace(/^[^\S\r\n]*import\s[^'"]*['"][^'"]*\.css['"]\s*;?[^\S\r\n]*$/gm, "");
49
+ compiled = compiled.replace(/\bimport\s*\(\s*['"][^'"]*\.css['"]\s*\)/g, "undefined");
50
+ if (beforeCss !== compiled) {
51
+ console.log(chalk.blue(`[.uix] Stripped CSS imports from ${url}`));
52
+ }
53
+ const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
54
+ if (bareImportPattern.test(compiled)) {
55
+ console.warn(`[.uix] Compiled output contains bare imports: ${url}`);
56
+ }
57
+ const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
58
+ const finalCode = fixSwissLibPaths(rewritten);
59
+ await compilationCache.set(filePath, compiled, finalCode, (c) => this.getDependencies(c));
60
+ if (bareImportPattern.test(finalCode)) {
61
+ console.error(`[.uix] Bare imports still present after rewriting: ${url}`);
62
+ for (const m of Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g)).slice(0, 3)) {
63
+ console.error(`[.uix] Unresolved import: ${m[1]}`);
64
+ }
65
+ }
66
+ setDevHeaders(res);
67
+ res.setHeader("Content-Type", "application/javascript; charset=utf-8");
68
+ res.send(finalCode);
69
+ }
70
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Build the HMR client script served to the browser at /__swite_hmr_client.
3
+ *
4
+ * The client is plain JavaScript (no TS syntax) because it is injected into
5
+ * browser pages as-is. Keeping it in a separate module rather than embedded
6
+ * inside hmr.ts makes it editable with syntax highlighting and avoids
7
+ * template-literal escaping issues.
8
+ */
9
+ export declare function buildHmrClientScript(port: number): string;
10
+ //# sourceMappingURL=hmr-client-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmr-client-template.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/hmr/hmr-client-template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiHzD"}