@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/dist/env.js DELETED
@@ -1,112 +0,0 @@
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") {
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
- const content = readFileSync(envPath, "utf-8");
18
- for (const line of content.split("\n")) {
19
- const trimmed = line.trim();
20
- if (trimmed && !trimmed.startsWith("#")) {
21
- const match = trimmed.match(/^([^=]+)=(.*)$/);
22
- if (match) {
23
- const [, key, value] = match;
24
- // Remove quotes if present
25
- const cleanValue = value.replace(/^["']|["']$/g, "");
26
- env[key.trim()] = cleanValue;
27
- }
28
- }
29
- }
30
- }
31
- }
32
- return env;
33
- }
34
- /**
35
- * Generate import.meta.env replacement code
36
- * Injects environment variables as a module that can be imported
37
- */
38
- export function generateEnvModule(env, prefix = "SWITE_") {
39
- // Filter env vars by prefix and expose them
40
- const switeEnv = {};
41
- const publicEnv = {};
42
- for (const [key, value] of Object.entries(env)) {
43
- if (key.startsWith(prefix)) {
44
- // Remove prefix for SWITE_ prefixed vars
45
- const cleanKey = key.slice(prefix.length);
46
- switeEnv[cleanKey] = value;
47
- publicEnv[key] = value;
48
- }
49
- else if (key.startsWith("PUBLIC_")) {
50
- // PUBLIC_ vars are always exposed
51
- publicEnv[key] = value;
52
- }
53
- }
54
- // Build env object with all variables
55
- const allEnvEntries = [
56
- ...Object.entries(switeEnv).map(([key, value]) => [key, value]),
57
- ...Object.entries(publicEnv).map(([key, value]) => [key, value]),
58
- ["MODE", process.env.NODE_ENV || "development"],
59
- ["DEV", process.env.NODE_ENV !== "production"],
60
- ["PROD", process.env.NODE_ENV === "production"],
61
- ];
62
- return `
63
- // SWITE Environment Variables
64
- // Generated at runtime - do not edit manually
65
- export const env = {
66
- ${allEnvEntries
67
- .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
68
- .join(",\n ")},
69
- };
70
-
71
- // For import.meta.env compatibility
72
- if (typeof globalThis !== 'undefined') {
73
- globalThis.__swite_env__ = env;
74
- }
75
- `;
76
- }
77
- /**
78
- * Inject import.meta.env polyfill into code
79
- */
80
- export function injectEnvPolyfill(code) {
81
- // Check if import.meta.env is used
82
- if (!code.includes("import.meta.env") && !code.includes("__swite_env__")) {
83
- return code;
84
- }
85
- // Inject polyfill at the top - load env module first
86
- const polyfill = `
87
- // SWITE import.meta.env polyfill
88
- import { env as switeEnv } from '/__swite_env';
89
- if (typeof globalThis !== 'undefined') {
90
- globalThis.__swite_env__ = switeEnv;
91
- }
92
- if (typeof import !== 'undefined' && import.meta) {
93
- import.meta.env = switeEnv;
94
- } else if (typeof globalThis !== 'undefined') {
95
- // Fallback for environments without import.meta
96
- if (!globalThis.import) {
97
- globalThis.import = { meta: {} };
98
- }
99
- if (!globalThis.import.meta) {
100
- globalThis.import.meta = {};
101
- }
102
- globalThis.import.meta.env = switeEnv;
103
- }
104
- `;
105
- // Find the first import statement or start of file
106
- const firstImport = code.match(/^import\s+/m);
107
- if (firstImport) {
108
- const insertIndex = firstImport.index;
109
- return (code.slice(0, insertIndex) + polyfill + "\n" + code.slice(insertIndex));
110
- }
111
- return polyfill + "\n" + code;
112
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/base-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,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;CAQ/D"}
@@ -1,38 +0,0 @@
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 "../resolver.js";
8
- import { resolveFilePath } from "../utils/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);
28
- }
29
- async fileExists(filePath) {
30
- try {
31
- await fs.access(filePath);
32
- return true;
33
- }
34
- catch {
35
- return false;
36
- }
37
- }
38
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"js-handler.d.ts","sourceRoot":"","sources":["../../src/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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mjs-handler.d.ts","sourceRoot":"","sources":["../../src/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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-module-handler.d.ts","sourceRoot":"","sources":["../../src/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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/ts-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,SAAU,SAAQ,WAAW;gBAC5B,OAAO,EAAE,cAAc;IAInC;;OAEG;YACW,eAAe;IAwBvB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuHxD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/ui-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;IACxC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAInC;;OAEG;YACW,eAAe;IAyBvB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAwLxD"}
@@ -1,182 +0,0 @@
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 "@kibologic/compiler";
8
- import chalk from "chalk";
9
- import { rewriteImports } from "../import-rewriter.js";
10
- import { compilationCache } from "../cache/compilation-cache.js";
11
- import { BaseHandler, setDevHeaders, } from "./base-handler.js";
12
- export class UIHandler extends BaseHandler {
13
- constructor(context) {
14
- super(context);
15
- this.compiler = new UiCompiler();
16
- }
17
- /**
18
- * Extract dependencies from compiled code (import paths)
19
- */
20
- async getDependencies(compiled) {
21
- const deps = [];
22
- const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
23
- let match;
24
- while ((match = importPattern.exec(compiled)) !== null) {
25
- const specifier = match[1];
26
- // Only track absolute paths and workspace paths (not relative)
27
- if (specifier.startsWith("/") || specifier.startsWith("@")) {
28
- try {
29
- // Try to resolve to actual file path
30
- const resolved = await this.context.resolver.resolve(specifier, "");
31
- if (resolved && !resolved.startsWith("http")) {
32
- deps.push(resolved);
33
- }
34
- }
35
- catch {
36
- // Ignore resolution errors for dependency tracking
37
- }
38
- }
39
- }
40
- return deps;
41
- }
42
- async handle(url, res) {
43
- const filePath = await this.resolveFilePath(url);
44
- console.log(chalk.blue(`[.ui] ${url} → ${filePath}`));
45
- // Check if file exists
46
- try {
47
- await fs.access(filePath);
48
- }
49
- catch (error) {
50
- console.error(chalk.red(`[.ui] File not found: ${filePath}`));
51
- throw new Error(`File not found: ${url} (resolved to: ${filePath})`);
52
- }
53
- // Check cache first
54
- let cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
55
- if (cached) {
56
- console.log(chalk.yellow(`[.ui] Cache hit for ${url}`));
57
- console.log(chalk.yellow(`[.ui] Cached content starts with: ${cached.substring(0, 50).replace(/\n/g, "\\n")}`));
58
- // CRITICAL: Strip /swiss-lib/ paths from cached code too
59
- // Old cache entries may have /swiss-lib/ paths from before the fix
60
- if (cached.includes("/swiss-lib/")) {
61
- console.log(chalk.yellow(`[.ui] Fixing /swiss-lib/ paths in cached code for ${url}`));
62
- cached = cached.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
63
- cached = cached.replace(/\/swiss-lib\//g, "/swiss-packages/");
64
- // Also fix in import statements and URLs (preserve quote type)
65
- cached = cached.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
66
- }
67
- setDevHeaders(res);
68
- res.setHeader("Content-Type", "application/javascript; charset=utf-8");
69
- res.setHeader("Content-Length", Buffer.byteLength(cached, "utf-8"));
70
- res.end(cached, "utf-8");
71
- return;
72
- }
73
- // Cache miss - compile
74
- const source = await fs.readFile(filePath, "utf-8");
75
- console.log(chalk.yellow(`[.ui] Compiling file: ${filePath}`));
76
- console.log(chalk.yellow(`[.ui] Source starts with: ${source.substring(0, 50).replace(/\n/g, "\\n")}`));
77
- let compiled = await this.compiler.compileAsync(source, filePath);
78
- // Transform TypeScript output to plain JavaScript via esbuild
79
- const esbuild = await import("esbuild");
80
- const tsResult = await esbuild.transform(compiled, {
81
- loader: "ts",
82
- format: "esm",
83
- target: "esnext",
84
- sourcefile: filePath,
85
- });
86
- compiled = tsResult.code;
87
- console.log(chalk.yellow(`[.ui] Compiled result starts with: ${compiled.substring(0, 50).replace(/\n/g, "\\n")}`));
88
- // CRITICAL: Strip /swiss-lib/ paths from compiled output BEFORE import rewriting
89
- // The compiler may output /swiss-lib/ paths directly in the code
90
- if (compiled.includes("/swiss-lib/")) {
91
- const beforeSwissLibFix = compiled;
92
- // Fix all variations of /swiss-lib/ paths
93
- compiled = compiled.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
94
- compiled = compiled.replace(/\/swiss-lib\//g, "/swiss-packages/");
95
- // Also fix in import statements and URLs (preserve quote type)
96
- compiled = compiled.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
97
- if (beforeSwissLibFix !== compiled) {
98
- console.log(chalk.yellow(`[.ui] Fixed /swiss-lib/ paths in compiled output for ${url}`));
99
- }
100
- }
101
- // Strip CSS imports - they should be handled as static assets, not modules
102
- // Use aggressive regex that matches all CSS import patterns
103
- const beforeCssStrip = compiled;
104
- // Pattern 1: Match standalone import statements for CSS (with or without semicolon, on their own line)
105
- compiled = compiled.replace(/^\s*import\s+.*?\.css\s*['"];?\s*$/gm, '');
106
- // Pattern 2: Match CSS imports anywhere in the code (more aggressive) - including without quotes
107
- compiled = compiled.replace(/\bimport\s+.*?\.css\s*['"];?/g, '');
108
- compiled = compiled.replace(/\bimport\s+['"].*?\.css['"];?/g, '');
109
- // Pattern 3: Match dynamic imports for CSS
110
- compiled = compiled.replace(/import\s*\(\s*['"].*?\.css['"]\s*\)/g, '');
111
- // Pattern 4: Match CSS imports with different quote styles and whitespace
112
- compiled = compiled.replace(/import\s+['"](.*?\.css)['"];?/g, '');
113
- if (beforeCssStrip !== compiled) {
114
- console.log(chalk.blue(`[.ui] Stripped CSS imports from ${url}`));
115
- }
116
- // Debug: Check for bare imports (only match actual bare imports, not paths)
117
- // Pattern matches: import ... from "@package/name" or import("@package/name")
118
- // But NOT: import ... from "/path/to/@package/name" (already a path)
119
- const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
120
- if (bareImportPattern.test(compiled)) {
121
- console.log(chalk.yellow(`[.ui] WARNING: Compiled code contains bare imports: ${url}`));
122
- }
123
- const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
124
- // FINAL SAFETY: Strip any remaining /swiss-lib/ paths after import rewriting
125
- // This catches any paths that might have slipped through
126
- let finalCode = rewritten;
127
- if (finalCode.includes("/swiss-lib/")) {
128
- const beforeFinal = finalCode;
129
- const count = (beforeFinal.match(/\/swiss-lib\//g) || []).length;
130
- console.log(chalk.red(`[.ui] 🚨 FINAL PASS TRIGGERED: Found ${count} /swiss-lib/ paths in ${url}`));
131
- // Multiple passes to catch all variations
132
- finalCode = finalCode.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
133
- finalCode = finalCode.replace(/\/swiss-lib\//g, "/swiss-packages/");
134
- finalCode = finalCode.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
135
- if (beforeFinal !== finalCode) {
136
- const afterCount = (finalCode.match(/\/swiss-lib\//g) || []).length;
137
- console.log(chalk.green(`[.ui] ✅ FINAL PASS: Fixed ${count} /swiss-lib/ paths (${afterCount} remaining) in ${url}`));
138
- if (afterCount > 0) {
139
- console.log(chalk.red(`[.ui] ❌ STILL HAS /swiss-lib/: ${finalCode.substring(0, 500)}`));
140
- }
141
- }
142
- else {
143
- console.log(chalk.red(`[.ui] ❌ FINAL PASS FAILED: No changes made!`));
144
- console.log(chalk.yellow(`[.ui] Sample: ${beforeFinal.substring(0, 200)}`));
145
- }
146
- }
147
- // Store in cache
148
- await compilationCache.set(filePath, compiled, finalCode, (compiled) => this.getDependencies(compiled));
149
- // Debug: Verify no bare imports remain after rewriting
150
- if (bareImportPattern.test(finalCode)) {
151
- console.log(chalk.red(`[.ui] ERROR: Bare imports still present after rewriting: ${url}`));
152
- const matches = Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g));
153
- for (const match of matches.slice(0, 3)) {
154
- console.log(chalk.red(`[.ui] Unresolved import: ${match[1]}`));
155
- }
156
- }
157
- // Set headers BEFORE sending response
158
- setDevHeaders(res);
159
- // Explicitly set Content-Type to ensure it's not overridden
160
- res.setHeader("Content-Type", "application/javascript; charset=utf-8");
161
- // Log the Content-Type being sent
162
- console.log(chalk.green(`[.ui] Sending response with Content-Type: ${res.getHeader("Content-Type")}`));
163
- console.log(chalk.green(`[.ui] Response body length: ${rewritten.length} chars`));
164
- console.log(chalk.green(`[.ui] Response body preview: ${rewritten.substring(0, 100)}...`));
165
- // Send response - use res.end() to ensure headers are final
166
- // Double-check Content-Type one more time
167
- const finalContentType = res.getHeader("Content-Type");
168
- if (finalContentType !== "application/javascript; charset=utf-8") {
169
- console.error(chalk.red(`[.ui] ⚠️ Content-Type is wrong before send! Expected: application/javascript, Got: ${finalContentType}`));
170
- res.setHeader("Content-Type", "application/javascript; charset=utf-8");
171
- }
172
- console.log(chalk.green(`[.ui] Final Content-Type: ${res.getHeader("Content-Type")}`));
173
- console.log(chalk.green(`[.ui] Sending ${finalCode.length} bytes of JavaScript`));
174
- // Use res.end() instead of res.send() to have more control
175
- res.setHeader("Content-Length", Buffer.byteLength(finalCode, "utf-8"));
176
- res.end(finalCode, "utf-8");
177
- // Ensure headersSent is set (should be set by res.end(), but verify)
178
- if (!res.headersSent) {
179
- console.error(chalk.red(`[.ui] ⚠️ res.end() called but headersSent is still false!`));
180
- }
181
- }
182
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"uix-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/uix-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,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAInC;;OAEG;YACW,eAAe;IAwBvB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuIxD"}
@@ -1,135 +0,0 @@
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 "@kibologic/compiler";
8
- import chalk from "chalk";
9
- import { rewriteImports } from "../import-rewriter.js";
10
- import { compilationCache } from "../cache/compilation-cache.js";
11
- import { BaseHandler, setDevHeaders, } from "./base-handler.js";
12
- export class UIXHandler extends BaseHandler {
13
- constructor(context) {
14
- super(context);
15
- this.compiler = new UiCompiler();
16
- }
17
- /**
18
- * Extract dependencies from compiled code (import paths)
19
- */
20
- async getDependencies(compiled) {
21
- const deps = [];
22
- const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
23
- let match;
24
- while ((match = importPattern.exec(compiled)) !== null) {
25
- const specifier = match[1];
26
- // Only track absolute paths and workspace paths (not relative)
27
- if (specifier.startsWith("/") || specifier.startsWith("@")) {
28
- try {
29
- const resolved = await this.context.resolver.resolve(specifier, "");
30
- if (resolved && !resolved.startsWith("http")) {
31
- deps.push(resolved);
32
- }
33
- }
34
- catch {
35
- // Ignore resolution errors
36
- }
37
- }
38
- }
39
- return deps;
40
- }
41
- async handle(url, res) {
42
- const filePath = await this.resolveFilePath(url);
43
- console.log(chalk.blue(`[.uix] ${url}`));
44
- // Check cache first
45
- let cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
46
- if (cached) {
47
- // CRITICAL: Strip /swiss-lib/ paths from cached code too
48
- // Old cache entries may have /swiss-lib/ paths from before the fix
49
- if (cached.includes("/swiss-lib/")) {
50
- console.log(chalk.yellow(`[.uix] Fixing /swiss-lib/ paths in cached code for ${url}`));
51
- cached = cached.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
52
- cached = cached.replace(/\/swiss-lib\//g, "/swiss-packages/");
53
- // Also fix in import statements and URLs (preserve quote type)
54
- cached = cached.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
55
- }
56
- setDevHeaders(res);
57
- res.setHeader("Content-Type", "application/javascript; charset=utf-8");
58
- res.send(cached);
59
- return;
60
- }
61
- // Cache miss - compile
62
- const source = await fs.readFile(filePath, "utf-8");
63
- let compiled = await this.compiler.compileAsync(source, filePath);
64
- // Transform TypeScript output to plain JavaScript via esbuild
65
- const esbuild = await import("esbuild");
66
- const tsResult = await esbuild.transform(compiled, {
67
- loader: "ts",
68
- format: "esm",
69
- target: "esnext",
70
- sourcefile: filePath,
71
- });
72
- compiled = tsResult.code;
73
- // CRITICAL: Strip /swiss-lib/ paths from compiled output BEFORE import rewriting
74
- // The compiler may output /swiss-lib/ paths directly in the code
75
- if (compiled.includes("/swiss-lib/")) {
76
- const beforeSwissLibFix = compiled;
77
- // Fix all variations of /swiss-lib/ paths
78
- compiled = compiled.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
79
- compiled = compiled.replace(/\/swiss-lib\//g, "/swiss-packages/");
80
- // Also fix in import statements and URLs (preserve quote type)
81
- compiled = compiled.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
82
- if (beforeSwissLibFix !== compiled) {
83
- console.log(chalk.yellow(`[.uix] Fixed /swiss-lib/ paths in compiled output for ${url}`));
84
- }
85
- }
86
- // Strip CSS imports - they should be handled as static assets, not modules
87
- // Use aggressive regex that matches all CSS import patterns
88
- const beforeCssStrip = compiled;
89
- // Pattern 1: Match standalone import statements for CSS (with or without semicolon, on their own line)
90
- compiled = compiled.replace(/^\s*import\s+.*?\.css\s*['"];?\s*$/gm, '');
91
- // Pattern 2: Match CSS imports anywhere in the code (more aggressive) - including without quotes
92
- compiled = compiled.replace(/\bimport\s+.*?\.css\s*['"];?/g, '');
93
- compiled = compiled.replace(/\bimport\s+['"].*?\.css['"];?/g, '');
94
- // Pattern 3: Match dynamic imports for CSS
95
- compiled = compiled.replace(/import\s*\(\s*['"].*?\.css['"]\s*\)/g, '');
96
- // Pattern 4: Match CSS imports with different quote styles and whitespace
97
- compiled = compiled.replace(/import\s+['"](.*?\.css)['"];?/g, '');
98
- if (beforeCssStrip !== compiled) {
99
- console.log(chalk.blue(`[.uix] Stripped CSS imports from ${url}`));
100
- }
101
- // Debug: Check for bare imports (only match actual bare imports, not paths)
102
- // Pattern matches: import ... from "@package/name" or import("@package/name")
103
- // But NOT: import ... from "/path/to/@package/name" (already a path)
104
- const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
105
- if (bareImportPattern.test(compiled)) {
106
- console.log(chalk.yellow(`[.uix] WARNING: Compiled code contains bare imports: ${url}`));
107
- }
108
- const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
109
- // FINAL SAFETY: Strip any remaining /swiss-lib/ paths after import rewriting
110
- // This catches any paths that might have slipped through
111
- let finalCode = rewritten;
112
- if (finalCode.includes("/swiss-lib/")) {
113
- const beforeFinal = finalCode;
114
- finalCode = finalCode.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
115
- finalCode = finalCode.replace(/\/swiss-lib\//g, "/swiss-packages/");
116
- finalCode = finalCode.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
117
- if (beforeFinal !== finalCode) {
118
- console.log(chalk.red(`[.uix] ⚠️ FINAL PASS: Fixed ${beforeFinal.split('/swiss-lib/').length - 1} remaining /swiss-lib/ paths in ${url}`));
119
- }
120
- }
121
- // Store in cache
122
- await compilationCache.set(filePath, compiled, finalCode, (compiled) => this.getDependencies(compiled));
123
- // Debug: Verify no bare imports remain after rewriting
124
- if (bareImportPattern.test(finalCode)) {
125
- console.log(chalk.red(`[.uix] ERROR: Bare imports still present after rewriting: ${url}`));
126
- const matches = Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g));
127
- for (const match of matches.slice(0, 3)) {
128
- console.log(chalk.red(`[.uix] Unresolved import: ${match[1]}`));
129
- }
130
- }
131
- setDevHeaders(res);
132
- res.setHeader("Content-Type", "application/javascript; charset=utf-8");
133
- res.send(finalCode);
134
- }
135
- }
package/dist/hmr.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../src/hmr.ts"],"names":[],"mappings":"AASA,qBAAa,SAAS;IAOlB,OAAO,CAAC,IAAI;IANd,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAS;gBAGX,IAAI,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM;IAOZ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBnB,kBAAkB;IAUhC,OAAO,CAAC,cAAc;YAYR,YAAY;IAmB1B,OAAO,IAAI,MAAM;IAIX,KAAK;IA4BX,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAYpC,eAAe,IAAI,MAAM;IAyIzB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,SAAS;IAcX,IAAI;CAIX"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"import-rewriter.d.ts","sourceRoot":"","sources":["../src/import-rewriter.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/C,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAkbjB"}