@swissjs/swite 0.3.0 → 0.3.2

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 (187) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/adapters/proxy/SwiteProxyError.d.ts.map +1 -0
  3. package/dist/{proxy → adapters/proxy}/proxyToPython.d.ts +1 -1
  4. package/dist/adapters/proxy/proxyToPython.d.ts.map +1 -0
  5. package/dist/build-engine/builder.d.ts.map +1 -0
  6. package/dist/{builder.js → build-engine/builder.js} +8 -14
  7. package/dist/cli.js +5 -5
  8. package/dist/config/config-loader.d.ts.map +1 -0
  9. package/dist/{config.d.ts → config/config.d.ts} +11 -0
  10. package/dist/config/config.d.ts.map +1 -0
  11. package/dist/config/env.d.ts +25 -0
  12. package/dist/config/env.d.ts.map +1 -0
  13. package/dist/config/env.js +84 -0
  14. package/dist/{handlers → dev-engine/handlers}/base-handler.d.ts +5 -1
  15. package/dist/dev-engine/handlers/base-handler.d.ts.map +1 -0
  16. package/dist/dev-engine/handlers/base-handler.js +58 -0
  17. package/dist/dev-engine/handlers/js-handler.d.ts.map +1 -0
  18. package/dist/{handlers → dev-engine/handlers}/js-handler.js +1 -1
  19. package/dist/dev-engine/handlers/mjs-handler.d.ts.map +1 -0
  20. package/dist/{handlers → dev-engine/handlers}/mjs-handler.js +1 -1
  21. package/dist/dev-engine/handlers/node-module-handler.d.ts.map +1 -0
  22. package/dist/{handlers → dev-engine/handlers}/node-module-handler.js +33 -44
  23. package/dist/{handlers → dev-engine/handlers}/ts-handler.d.ts +0 -4
  24. package/dist/dev-engine/handlers/ts-handler.d.ts.map +1 -0
  25. package/dist/{handlers → dev-engine/handlers}/ts-handler.js +5 -28
  26. package/dist/{handlers → dev-engine/handlers}/ui-handler.d.ts +0 -4
  27. package/dist/dev-engine/handlers/ui-handler.d.ts.map +1 -0
  28. package/dist/dev-engine/handlers/ui-handler.js +84 -0
  29. package/dist/{handlers → dev-engine/handlers}/uix-handler.d.ts +0 -4
  30. package/dist/dev-engine/handlers/uix-handler.d.ts.map +1 -0
  31. package/dist/dev-engine/handlers/uix-handler.js +70 -0
  32. package/dist/dev-engine/hmr/hmr-client-template.d.ts +10 -0
  33. package/dist/dev-engine/hmr/hmr-client-template.d.ts.map +1 -0
  34. package/dist/dev-engine/hmr/hmr-client-template.js +122 -0
  35. package/dist/dev-engine/hmr/hmr.d.ts.map +1 -0
  36. package/dist/{hmr.js → dev-engine/hmr/hmr.js} +2 -134
  37. package/dist/{middleware → dev-engine/middleware}/hmr-routes.d.ts +2 -2
  38. package/dist/dev-engine/middleware/hmr-routes.d.ts.map +1 -0
  39. package/dist/{middleware → dev-engine/middleware}/hmr-routes.js +1 -1
  40. package/dist/dev-engine/middleware/middleware-setup.d.ts +35 -0
  41. package/dist/dev-engine/middleware/middleware-setup.d.ts.map +1 -0
  42. package/dist/dev-engine/middleware/middleware-setup.js +327 -0
  43. package/dist/dev-engine/middleware/static-files.d.ts.map +1 -0
  44. package/dist/{middleware → dev-engine/middleware}/static-files.js +2 -2
  45. package/dist/{dev → dev-engine}/pythonDevManager.d.ts +1 -1
  46. package/dist/dev-engine/pythonDevManager.d.ts.map +1 -0
  47. package/dist/{dev → dev-engine}/pythonDevManager.js +1 -1
  48. package/dist/{router → dev-engine/router}/file-router.d.ts +4 -4
  49. package/dist/dev-engine/router/file-router.d.ts.map +1 -0
  50. package/dist/{router → dev-engine/router}/file-router.js +4 -4
  51. package/dist/dev-engine/server.d.ts.map +1 -0
  52. package/dist/{server.js → dev-engine/server.js} +10 -6
  53. package/dist/index.d.ts +13 -13
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +9 -9
  56. package/dist/internal/cache/compilation-cache.d.ts.map +1 -0
  57. package/dist/{cache → internal/cache}/compilation-cache.js +3 -2
  58. package/dist/internal/generate-import-map-cli.d.ts.map +1 -0
  59. package/dist/{utils → internal}/generate-import-map-cli.js +1 -1
  60. package/dist/internal/generate-import-map.d.ts.map +1 -0
  61. package/dist/{utils → internal}/generate-import-map.js +3 -3
  62. package/dist/{utils → kernel}/package-finder.d.ts +7 -5
  63. package/dist/kernel/package-finder.d.ts.map +1 -0
  64. package/dist/kernel/package-finder.js +154 -0
  65. package/dist/kernel/package-registry.d.ts.map +1 -0
  66. package/dist/kernel/workspace.d.ts.map +1 -0
  67. package/dist/{resolver → resolution}/bare-import-resolver.d.ts +1 -1
  68. package/dist/resolution/bare-import-resolver.d.ts.map +1 -0
  69. package/dist/{resolver → resolution}/bare-import-resolver.js +25 -53
  70. package/dist/resolution/cdn/cdn-fallback.d.ts.map +1 -0
  71. package/dist/{utils → resolution/path}/file-path-resolver.d.ts +2 -1
  72. package/dist/resolution/path/file-path-resolver.d.ts.map +1 -0
  73. package/dist/{utils → resolution/path}/file-path-resolver.js +46 -28
  74. package/dist/resolution/path/path-fixup.d.ts +13 -0
  75. package/dist/resolution/path/path-fixup.d.ts.map +1 -0
  76. package/dist/resolution/path/path-fixup.js +20 -0
  77. package/dist/{resolver.d.ts → resolution/resolver.d.ts} +1 -1
  78. package/dist/resolution/resolver.d.ts.map +1 -0
  79. package/dist/{resolver.js → resolution/resolver.js} +8 -37
  80. package/dist/{import-rewriter.d.ts → resolution/rewriting/import-rewriter.d.ts} +1 -1
  81. package/dist/resolution/rewriting/import-rewriter.d.ts.map +1 -0
  82. package/dist/resolution/rewriting/import-rewriter.js +199 -0
  83. package/dist/{resolver → resolution}/symlink-registry.d.ts +1 -1
  84. package/dist/resolution/symlink-registry.d.ts.map +1 -0
  85. package/dist/{resolver → resolution}/symlink-registry.js +1 -1
  86. package/dist/resolution/url-resolver.d.ts.map +1 -0
  87. package/dist/{resolver → resolution}/url-resolver.js +38 -109
  88. package/dist/resolution/workspace-package-resolver.d.ts.map +1 -0
  89. package/dist/resolution/workspace-package-resolver.js +77 -0
  90. package/docs/architecture/build-pipeline.md +97 -0
  91. package/docs/architecture/dev-server.md +87 -0
  92. package/docs/architecture/hmr.md +78 -0
  93. package/docs/architecture/import-rewriting.md +101 -0
  94. package/docs/architecture/index.md +16 -0
  95. package/docs/architecture/python-integration.md +93 -0
  96. package/docs/architecture/resolution.md +92 -0
  97. package/docs/cli/build.md +78 -0
  98. package/docs/cli/dev.md +90 -0
  99. package/docs/cli/index.md +15 -0
  100. package/docs/cli/start.md +45 -0
  101. package/docs/development/contributing.md +74 -0
  102. package/docs/development/index.md +12 -0
  103. package/docs/development/internals.md +101 -0
  104. package/docs/guide/configuration.md +89 -0
  105. package/docs/guide/index.md +13 -0
  106. package/docs/guide/project-structure.md +75 -0
  107. package/docs/guide/quickstart.md +113 -0
  108. package/docs/index.md +16 -0
  109. package/package.json +5 -5
  110. package/src/cli.ts +1 -1
  111. package/src/config/config.ts +11 -0
  112. package/src/dev-engine/handlers/base-handler.ts +4 -2
  113. package/src/dev-engine/handlers/node-module-handler.ts +51 -78
  114. package/src/dev-engine/middleware/middleware-setup.ts +1 -0
  115. package/src/dev-engine/server.ts +38 -33
  116. package/src/kernel/package-finder.ts +59 -43
  117. package/src/resolution/bare-import-resolver.ts +14 -4
  118. package/src/resolution/path/file-path-resolver.ts +44 -10
  119. package/src/resolution/url-resolver.ts +1 -1
  120. package/dist/builder.d.ts.map +0 -1
  121. package/dist/cache/compilation-cache.d.ts.map +0 -1
  122. package/dist/config-loader.d.ts.map +0 -1
  123. package/dist/config.d.ts.map +0 -1
  124. package/dist/dev/pythonDevManager.d.ts.map +0 -1
  125. package/dist/env.d.ts +0 -19
  126. package/dist/env.d.ts.map +0 -1
  127. package/dist/env.js +0 -112
  128. package/dist/handlers/base-handler.d.ts.map +0 -1
  129. package/dist/handlers/base-handler.js +0 -38
  130. package/dist/handlers/js-handler.d.ts.map +0 -1
  131. package/dist/handlers/mjs-handler.d.ts.map +0 -1
  132. package/dist/handlers/node-module-handler.d.ts.map +0 -1
  133. package/dist/handlers/ts-handler.d.ts.map +0 -1
  134. package/dist/handlers/ui-handler.d.ts.map +0 -1
  135. package/dist/handlers/ui-handler.js +0 -182
  136. package/dist/handlers/uix-handler.d.ts.map +0 -1
  137. package/dist/handlers/uix-handler.js +0 -135
  138. package/dist/hmr.d.ts.map +0 -1
  139. package/dist/import-rewriter.d.ts.map +0 -1
  140. package/dist/import-rewriter.js +0 -351
  141. package/dist/middleware/hmr-routes.d.ts.map +0 -1
  142. package/dist/middleware/middleware-setup.d.ts +0 -23
  143. package/dist/middleware/middleware-setup.d.ts.map +0 -1
  144. package/dist/middleware/middleware-setup.js +0 -596
  145. package/dist/middleware/static-files.d.ts.map +0 -1
  146. package/dist/proxy/SwiteProxyError.d.ts.map +0 -1
  147. package/dist/proxy/proxyToPython.d.ts.map +0 -1
  148. package/dist/resolver/bare-import-resolver.d.ts.map +0 -1
  149. package/dist/resolver/symlink-registry.d.ts.map +0 -1
  150. package/dist/resolver/url-resolver.d.ts.map +0 -1
  151. package/dist/resolver/workspace-package-resolver.d.ts.map +0 -1
  152. package/dist/resolver/workspace-package-resolver.js +0 -185
  153. package/dist/resolver.d.ts.map +0 -1
  154. package/dist/router/file-router.d.ts.map +0 -1
  155. package/dist/server.d.ts.map +0 -1
  156. package/dist/utils/cdn-fallback.d.ts.map +0 -1
  157. package/dist/utils/file-path-resolver.d.ts.map +0 -1
  158. package/dist/utils/generate-import-map-cli.d.ts.map +0 -1
  159. package/dist/utils/generate-import-map.d.ts.map +0 -1
  160. package/dist/utils/package-finder.d.ts.map +0 -1
  161. package/dist/utils/package-finder.js +0 -161
  162. package/dist/utils/package-registry.d.ts.map +0 -1
  163. package/dist/utils/workspace.d.ts.map +0 -1
  164. /package/dist/{proxy → adapters/proxy}/SwiteProxyError.d.ts +0 -0
  165. /package/dist/{proxy → adapters/proxy}/SwiteProxyError.js +0 -0
  166. /package/dist/{proxy → adapters/proxy}/proxyToPython.js +0 -0
  167. /package/dist/{builder.d.ts → build-engine/builder.d.ts} +0 -0
  168. /package/dist/{config-loader.d.ts → config/config-loader.d.ts} +0 -0
  169. /package/dist/{config-loader.js → config/config-loader.js} +0 -0
  170. /package/dist/{config.js → config/config.js} +0 -0
  171. /package/dist/{handlers → dev-engine/handlers}/js-handler.d.ts +0 -0
  172. /package/dist/{handlers → dev-engine/handlers}/mjs-handler.d.ts +0 -0
  173. /package/dist/{handlers → dev-engine/handlers}/node-module-handler.d.ts +0 -0
  174. /package/dist/{hmr.d.ts → dev-engine/hmr/hmr.d.ts} +0 -0
  175. /package/dist/{middleware → dev-engine/middleware}/static-files.d.ts +0 -0
  176. /package/dist/{server.d.ts → dev-engine/server.d.ts} +0 -0
  177. /package/dist/{cache → internal/cache}/compilation-cache.d.ts +0 -0
  178. /package/dist/{utils → internal}/generate-import-map-cli.d.ts +0 -0
  179. /package/dist/{utils → internal}/generate-import-map.d.ts +0 -0
  180. /package/dist/{utils → kernel}/package-registry.d.ts +0 -0
  181. /package/dist/{utils → kernel}/package-registry.js +0 -0
  182. /package/dist/{utils → kernel}/workspace.d.ts +0 -0
  183. /package/dist/{utils → kernel}/workspace.js +0 -0
  184. /package/dist/{utils → resolution/cdn}/cdn-fallback.d.ts +0 -0
  185. /package/dist/{utils → resolution/cdn}/cdn-fallback.js +0 -0
  186. /package/dist/{resolver → resolution}/url-resolver.d.ts +0 -0
  187. /package/dist/{resolver → resolution}/workspace-package-resolver.d.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Generalize resolution system and add internalScopes support
8
+
9
+ - Add `findSiblingRepository(startPath, repoName)` — replaces hardcoded swiss-lib discovery with a generic sibling repo finder. `findSwissLibMonorepo` preserved as a backward-compat wrapper.
10
+ - Add `findPackage` with local-first dev precedence — in development, resolves `@scoped/*` packages from local sibling source trees before falling back to `node_modules`.
11
+ - `internalScopes` from `swiss.config.ts` now flows through to all handlers at startup — prevents internal-scoped packages from being routed to jsDelivr CDN.
12
+ - `NodeModuleHandler` rewritten to use `findPackage` — replaces verbose walk-up/swiss-lib fallback chain with unified local-first resolver. Adds dist→src redirect for local sibling packages.
13
+ - CDN blacklist: packages matching `internalScopes` are blocked from jsDelivr fallback with a clear error log.
14
+ - Fix `cli.ts` builder import path (`./build-engine/builder.js`).
15
+ - Fix `url-resolver.ts` dynamic import path for `file-path-resolver`.
16
+ - Update peer deps: `@swissjs/core` → `0.1.8`, `@swissjs/compiler` → `0.1.5`.
17
+
3
18
  ## 0.2.31
4
19
 
5
20
  ### Patch Changes
@@ -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"}
@@ -20,6 +20,17 @@ export interface ServerConfig {
20
20
  export interface SwiteUserConfig {
21
21
  server?: ServerConfig;
22
22
  services?: ServicesConfig;
23
+ /**
24
+ * Package scopes that should be treated as "internal" or "private".
25
+ * These scopes prioritize local/monorepo resolution and are forbidden from CDN redirects.
26
+ * e.g. ["@kibologic", "@alpine"]
27
+ */
28
+ internalScopes?: string[];
29
+ /**
30
+ * Manual override for sibling repository lookup.
31
+ * Swite will search these directories for local package source code.
32
+ */
33
+ siblingRepositories?: string[];
23
34
  }
24
35
  /**
25
36
  * Define swite configuration with full TypeScript validation.
@@ -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;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;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,12 @@
1
1
  import type { Response } from "express";
2
- import { ModuleResolver } from "../resolver.js";
2
+ import { ModuleResolver } from "../../resolution/resolver.js";
3
+ import type { SwiteUserConfig } from "../../config/config.js";
3
4
  export interface HandlerContext {
4
5
  resolver: ModuleResolver;
5
6
  root: string;
6
7
  workspaceRoot: string | null;
8
+ env?: Record<string, string>;
9
+ userConfig?: SwiteUserConfig;
7
10
  }
8
11
  /**
9
12
  * Set cache-busting headers for development
@@ -17,5 +20,6 @@ export declare class BaseHandler {
17
20
  constructor(context: HandlerContext);
18
21
  protected resolveFilePath(url: string): Promise<string>;
19
22
  protected fileExists(filePath: string): Promise<boolean>;
23
+ protected getDependencies(compiled: string): Promise<string[]>;
20
24
  }
21
25
  //# 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;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;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"}
@@ -0,0 +1,58 @@
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 { ModuleResolver } from "../../resolution/resolver.js";
8
+ import { resolveFilePath } from "../../resolution/path/file-path-resolver.js";
9
+ /**
10
+ * Set cache-busting headers for development
11
+ */
12
+ export function setDevHeaders(res) {
13
+ // Prevent all caching during development
14
+ res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
15
+ res.setHeader("Pragma", "no-cache");
16
+ res.setHeader("Expires", "0");
17
+ res.setHeader("Surrogate-Control", "no-store");
18
+ }
19
+ /**
20
+ * Base handler utilities
21
+ */
22
+ export class BaseHandler {
23
+ constructor(context) {
24
+ this.context = context;
25
+ }
26
+ async resolveFilePath(url) {
27
+ return resolveFilePath(url, this.context.root, this.context.workspaceRoot, this.context.userConfig);
28
+ }
29
+ async fileExists(filePath) {
30
+ try {
31
+ await fs.access(filePath);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
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
+ }
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;AAQrE,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;IAgPvD;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CAmCjC"}
@@ -6,13 +6,14 @@
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 { findPackage } from "../../kernel/package-finder.js";
16
+ import { shouldUseCdnFallback } from "../../resolution/cdn/cdn-fallback.js";
16
17
  export class NodeModuleHandler extends BaseHandler {
17
18
  constructor(context) {
18
19
  super(context);
@@ -64,52 +65,33 @@ export class NodeModuleHandler extends BaseHandler {
64
65
  current = parent;
65
66
  }
66
67
  }
68
+ // CONSOLIDATED DISCOVERY: Use the Generalized Package Finder
69
+ // This follows our "Local-First" priority: Siblings > Local node_modules > Workspace node_modules
67
70
  if (!filePath) {
68
- // Try workspace root node_modules
69
- if (workspaceRoot) {
70
- const workspaceNodeModulesPath = path.join(workspaceRoot, urlPath);
71
- console.log(chalk.blue(`[node_modules] Trying workspace path: ${workspaceNodeModulesPath}`));
72
- try {
73
- // Try to resolve symlinks first (realpath works even if path is a symlink)
74
- const resolvedPath = await fs.realpath(workspaceNodeModulesPath);
75
- console.log(chalk.blue(`[node_modules] Resolved to: ${resolvedPath}`));
76
- // Verify the resolved path exists
77
- await fs.access(resolvedPath);
78
- filePath = resolvedPath;
79
- console.log(chalk.green(`[node_modules] ✓ Found in workspace: ${urlPath}`));
80
- }
81
- catch (err2) {
82
- console.log(chalk.yellow(`[node_modules] Workspace path failed: ${err2 instanceof Error ? err2.message : String(err2)}`));
83
- // Try swiss-lib monorepo node_modules (dynamically found)
84
- const { findSwissLibMonorepo } = await import("../utils/package-finder.js");
85
- const swissLib = await findSwissLibMonorepo(this.context.root);
86
- if (swissLib) {
87
- const swissNodeModulesPath = path.join(swissLib, urlPath);
88
- console.log(chalk.blue(`[node_modules] Trying swiss-lib path: ${swissNodeModulesPath}`));
89
- try {
90
- // Try to resolve symlinks first (realpath works even if path is a symlink)
91
- const resolvedPath = await fs.realpath(swissNodeModulesPath);
92
- console.log(chalk.blue(`[node_modules] Resolved to: ${resolvedPath}`));
93
- // Verify the resolved path exists
94
- await fs.access(resolvedPath);
95
- filePath = resolvedPath;
96
- console.log(chalk.green(`[node_modules] ✓ Found in swiss-lib monorepo: ${urlPath}`));
97
- }
98
- catch (err3) {
99
- console.log(chalk.yellow(`[node_modules] swiss-lib path failed: ${err3 instanceof Error ? err3.message : String(err3)}`));
100
- // File not found in any location, will trigger case-insensitive search below
101
- filePath = path.join(this.context.root, urlPath);
71
+ const urlParts = urlPath.split("/");
72
+ const packageName = urlParts[1].startsWith("@") ? `${urlParts[1]}/${urlParts[2]}` : urlParts[1];
73
+ const remainingPath = urlParts[1].startsWith("@") ? urlParts.slice(3).join("/") : urlParts.slice(2).join("/");
74
+ const location = await findPackage(packageName, this.context.root, workspaceRoot);
75
+ if (location) {
76
+ filePath = path.join(location.path, remainingPath);
77
+ console.log(chalk.green(`[node_modules] Found ${packageName} via ${location.type}: ${filePath}`));
78
+ // Re-use dist -> src fallback for local siblings
79
+ if (location.type !== 'node_modules' && filePath.includes("/dist/")) {
80
+ const srcPath = filePath.replace("/dist/", "/src/").replace(/\.[mc]?js$/, ".ts");
81
+ try {
82
+ await fs.access(srcPath);
83
+ console.log(chalk.yellow(`[node_modules] Intercept: Serving local source instead of dist: ${srcPath}`));
84
+ filePath = srcPath;
85
+ if (srcPath.endsWith(".ts")) {
86
+ return await this.tsHandler.handle(url.replace(/\.[mc]?js$/, ".ts"), res);
102
87
  }
103
88
  }
104
- else {
105
- // File not found in any location, will trigger case-insensitive search below
106
- filePath = path.join(this.context.root, urlPath);
107
- }
89
+ catch { /* Fallback to original filePath */ }
108
90
  }
109
91
  }
110
- else {
111
- filePath = path.join(this.context.root, urlPath);
112
- }
92
+ }
93
+ if (!filePath) {
94
+ filePath = path.join(this.context.root, urlPath);
113
95
  }
114
96
  console.log(chalk.gray(`[node_modules] Resolving: ${url} -> ${filePath}`));
115
97
  // File path is already resolved from above, no need to resolve again
@@ -259,6 +241,13 @@ export class NodeModuleHandler extends BaseHandler {
259
241
  }
260
242
  if (!pkgName || pkgName === "." || pkgName === "..")
261
243
  return null;
244
+ // Never redirect internal/private scoped packages to public CDNs
245
+ const internalScopes = this.context.userConfig?.internalScopes || [];
246
+ const isInternal = internalScopes.some(scope => pkgName === scope || pkgName.startsWith(scope + "/"));
247
+ if (isInternal) {
248
+ console.log(chalk.red(`[node_modules] CDN Blocked: Internal scope package ${pkgName} cannot be served from jsDelivr.`));
249
+ return null;
250
+ }
262
251
  if (!shouldUseCdnFallback(pkgName))
263
252
  return null;
264
253
  // jsDelivr +esm serves ESM build; works for reflect-metadata and most npm packages
@@ -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"}