@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
@@ -1,351 +0,0 @@
1
- /*
2
- * Import Rewriter for SWITE
3
- *
4
- * SIMPLIFIED APPROACH:
5
- * - es-module-lexer ONLY returns static import specifiers (string literals)
6
- * - If es-module-lexer found it, it's ALWAYS an import, never a variable
7
- * - Trust the lexer and rewrite everything it finds (except relative imports)
8
- * - Let the resolver handle resolution, fallback to CDN if needed
9
- */
10
- import { init, parse } from "es-module-lexer";
11
- import { ModuleResolver } from "./resolver.js";
12
- import { promises as fs } from "node:fs";
13
- import path from "node:path";
14
- import chalk from "chalk";
15
- import { shouldUseCdnFallback } from "./utils/cdn-fallback.js";
16
- export async function rewriteImports(code, importer, resolver) {
17
- await init;
18
- try {
19
- const [imports] = parse(code);
20
- console.log(`[SWITE] import-rewriter: Found ${imports.length} import(s) in ${importer}`);
21
- if (imports.length === 0) {
22
- console.log(`[SWITE] import-rewriter: No imports found, returning original code`);
23
- return code;
24
- }
25
- let rewritten = code;
26
- let offset = 0;
27
- for (const imp of imports) {
28
- let { s: start, e: end } = imp;
29
- const specifier = code.slice(start, end);
30
- console.log(`[SWITE] import-rewriter: Processing import: "${specifier}"`);
31
- // Skip CSS imports - these should be handled as static assets, not modules
32
- if (specifier.includes(".css")) {
33
- console.log(`[SWITE] import-rewriter: Skipping CSS import: "${specifier}"`);
34
- continue;
35
- }
36
- // Extract quote character and actual specifier
37
- const firstChar = specifier[0];
38
- const lastChar = specifier[specifier.length - 1];
39
- const hasQuotes = (firstChar === '"' || firstChar === "'") && firstChar === lastChar;
40
- let actualSpecifier;
41
- let quoteChar = null;
42
- if (hasQuotes) {
43
- actualSpecifier = specifier.slice(1, -1);
44
- quoteChar = firstChar;
45
- }
46
- else {
47
- // Unquoted - check surrounding code for quotes
48
- const codeBefore = code.slice(Math.max(0, start - 1), start);
49
- const codeAfter = code.slice(end, Math.min(code.length, end + 1));
50
- if ((codeBefore === '"' || codeBefore === "'") &&
51
- codeBefore === codeAfter) {
52
- quoteChar = codeBefore;
53
- actualSpecifier = specifier;
54
- start = start - 1;
55
- end = end + 1;
56
- }
57
- else {
58
- // No quotes found - this shouldn't happen with es-module-lexer for static imports
59
- // But if it does, try to find the quoted version in the code
60
- const escapedSpecifier = specifier.replace(/[.*+?^${}()|[\]\\-]/g, "\\$&");
61
- const quotedPattern = new RegExp(`(['"])${escapedSpecifier}\\1`);
62
- const match = quotedPattern.exec(code);
63
- if (match) {
64
- quoteChar = match[1];
65
- actualSpecifier = specifier;
66
- start = match.index;
67
- end = match.index + match[0].length;
68
- }
69
- else {
70
- // Can't find quotes, skip this import (shouldn't happen)
71
- console.warn(`[SWITE] import-rewriter: Could not find quotes for specifier: ${specifier}`);
72
- continue;
73
- }
74
- }
75
- }
76
- // CRITICAL: Fix compiler bug where .uix/.ui imports are changed to .js or .tsx
77
- // In dev mode, we need to preserve correct extensions for relative imports
78
- // Context-aware: SWISS packages use .ts, app files use .uix/.ui
79
- if (actualSpecifier.startsWith(".") && (actualSpecifier.endsWith(".js") || actualSpecifier.endsWith(".tsx")) && !actualSpecifier.includes("node_modules")) {
80
- console.log(`[SWITE] import-rewriter: 🔧 Found relative .js import that needs fixing: "${actualSpecifier}"`);
81
- // Determine correct extension based on context
82
- // IMPORTANT: Check /lib/ and /swiss-packages/ FIRST before checking file extension
83
- // Normalize path separators for Windows compatibility
84
- const normalizedImporter = importer.replace(/\\/g, "/");
85
- const isSwissPackage = normalizedImporter.includes("/swiss-packages/");
86
- const isLibPath = normalizedImporter.includes("/lib/");
87
- const isUixFile = normalizedImporter.endsWith(".uix") || normalizedImporter.endsWith(".ui");
88
- let newExtension;
89
- if (isSwissPackage) {
90
- // SWISS packages use .ts files
91
- newExtension = ".ts";
92
- }
93
- else if (isLibPath) {
94
- // /lib/ paths can have .ts, .ui, or .uix files
95
- // Default to .ts for /lib/ paths (most common - types, core logic, etc.)
96
- // Handlers will try .ui/.uix if .ts doesn't exist
97
- newExtension = ".ts";
98
- console.log(`[SWITE] import-rewriter: 🎯 /lib/ path detected - using .ts extension (importer: ${importer}, specifier: ${actualSpecifier})`);
99
- }
100
- else if (isUixFile) {
101
- // If importing from a .uix/.ui file, try to preserve the original extension
102
- // Check if the file exists with .ui extension first, then .uix
103
- const baseSpecifier = actualSpecifier.endsWith(".tsx") ? actualSpecifier.slice(0, -4) : actualSpecifier.slice(0, -3); // Remove .tsx or .js
104
- // Get the directory of the CURRENT file being rewritten (not project root)
105
- const currentDir = path.dirname(importer);
106
- // Clean the import path - remove leading './' if present
107
- const cleanImportPath = baseSpecifier.startsWith('./')
108
- ? baseSpecifier.slice(2)
109
- : baseSpecifier.startsWith('../')
110
- ? baseSpecifier
111
- : baseSpecifier;
112
- // Construct the absolute path to the potential .ui dependency
113
- const absoluteUiPath = path.resolve(currentDir, cleanImportPath + '.ui');
114
- const absoluteUixPath = path.resolve(currentDir, cleanImportPath + '.uix');
115
- console.log(`[SWITE] import-rewriter: Checking for .ui/.uix files: baseSpecifier="${baseSpecifier}", currentDir="${currentDir}", cleanImportPath="${cleanImportPath}"`);
116
- console.log(`[SWITE] import-rewriter: Checking paths: ${absoluteUiPath}, ${absoluteUixPath}`);
117
- // Check which file exists (prefer .ui since that's what source code uses)
118
- try {
119
- await fs.access(absoluteUiPath);
120
- newExtension = ".ui";
121
- console.log(`[SWITE] import-rewriter: ✅ Found .ui file: ${absoluteUiPath}`);
122
- }
123
- catch (err) {
124
- console.log(`[SWITE] import-rewriter: ❌ .ui file not found: ${absoluteUiPath} (${err instanceof Error ? err.message : String(err)})`);
125
- try {
126
- await fs.access(absoluteUixPath);
127
- newExtension = ".uix";
128
- console.log(`[SWITE] import-rewriter: ✅ Found .uix file: ${absoluteUixPath}`);
129
- }
130
- catch (err2) {
131
- // Neither exists, default to .ui (matches source code convention)
132
- newExtension = ".ui";
133
- console.log(`[SWITE] import-rewriter: ⚠️ Neither .ui nor .uix found, defaulting to .ui for ${baseSpecifier} (checked: ${absoluteUiPath}, ${absoluteUixPath})`);
134
- }
135
- }
136
- }
137
- else {
138
- // Default: TypeScript files use .ts
139
- newExtension = ".ts";
140
- }
141
- const baseSpecifier = actualSpecifier.endsWith(".tsx") ? actualSpecifier.slice(0, -4) : actualSpecifier.slice(0, -3); // Remove .tsx or .js
142
- const newSpecifier = baseSpecifier + newExtension;
143
- console.log(`[SWITE] import-rewriter: 🔧 Changing "${actualSpecifier}" -> "${newSpecifier}" (context: ${isSwissPackage ? 'swiss-pkg' : isUixFile ? 'uix' : 'ts'})`);
144
- // Replace in the code using the original start/end positions
145
- // If hasQuotes was true, start/end point to specifier WITHOUT quotes
146
- // If hasQuotes was false but quotes found, start/end were adjusted to include quotes
147
- const originalLength = end - start;
148
- const before = rewritten.slice(0, start + offset);
149
- const after = rewritten.slice(end + offset);
150
- const finalSpecifier = quoteChar ? quoteChar + newSpecifier + quoteChar : `"${newSpecifier}"`;
151
- rewritten = before + finalSpecifier + after;
152
- offset += finalSpecifier.length - originalLength;
153
- console.log(`[SWITE] import-rewriter: ✅ Fixed relative import: "${actualSpecifier}" -> "${newSpecifier}"`);
154
- continue; // Don't process further (relative imports don't need module resolution)
155
- }
156
- // Skip other relative imports - they don't need rewriting
157
- // BUT: Convert /swiss-lib/ paths to /swiss-packages/ paths
158
- // Check for /swiss-lib/ anywhere in the path, not just at the start
159
- if (actualSpecifier.includes("/swiss-lib/")) {
160
- // Replace /swiss-lib/packages/ with /swiss-packages/ (not /swiss-packages/packages/)
161
- const converted = actualSpecifier.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
162
- console.log(`[SWITE] import-rewriter: Converting /swiss-lib/ to /swiss-packages/: "${actualSpecifier}" -> "${converted}"`);
163
- const originalLength = end - start;
164
- const before = rewritten.slice(0, start + offset);
165
- const after = rewritten.slice(end + offset);
166
- const finalSpecifier = quoteChar ? quoteChar + converted + quoteChar : `"${converted}"`;
167
- rewritten = before + finalSpecifier + after;
168
- offset += finalSpecifier.length - originalLength;
169
- continue;
170
- }
171
- if (actualSpecifier.startsWith(".") || actualSpecifier.startsWith("/")) {
172
- continue;
173
- }
174
- // CRITICAL: es-module-lexer only returns static import specifiers
175
- // If we got here, it's ALWAYS a module specifier, never a variable
176
- // Just validate basic format (starts with letter or @)
177
- if (!/^[@a-zA-Z]/.test(actualSpecifier)) {
178
- console.warn(`[SWITE] import-rewriter: Invalid specifier format: ${actualSpecifier}`);
179
- continue;
180
- }
181
- // Resolve the import
182
- console.log(`[SWITE] import-rewriter: Resolving ${actualSpecifier} from ${importer}`);
183
- let resolved;
184
- try {
185
- resolved = await resolver.resolve(actualSpecifier, importer);
186
- console.log(`[SWITE] import-rewriter: Resolved ${actualSpecifier} -> ${resolved}`);
187
- // CRITICAL: If resolver returns unchanged or invalid, use CDN fallback (when allowed).
188
- if (!resolved ||
189
- resolved === actualSpecifier ||
190
- (!resolved.startsWith("/") && !resolved.startsWith("http"))) {
191
- console.warn(`[SWITE] import-rewriter: Resolver returned invalid/unchanged result for ${actualSpecifier}, using CDN fallback`);
192
- resolved = shouldUseCdnFallback(actualSpecifier)
193
- ? `https://cdn.jsdelivr.net/npm/${actualSpecifier}/+esm`
194
- : `/node_modules/${actualSpecifier}`;
195
- }
196
- }
197
- catch (error) {
198
- console.error(`[SWITE] import-rewriter: Error resolving ${actualSpecifier}:`, error);
199
- resolved = shouldUseCdnFallback(actualSpecifier)
200
- ? `https://cdn.jsdelivr.net/npm/${actualSpecifier}/+esm`
201
- : `/node_modules/${actualSpecifier}`;
202
- }
203
- // For development: prefer src/ over dist/ for SWISS and workspace packages
204
- if (resolved.includes("/dist/")) {
205
- const isSwissOrPackages = resolved.includes("/swiss-packages/") || resolved.includes("/packages/");
206
- if (isSwissOrPackages) {
207
- resolved = resolved.replace("/dist/", "/src/").replace(/\.js$/, ".ts");
208
- }
209
- }
210
- // Replace the specifier
211
- console.log(`[SWITE] import-rewriter: Replacing "${actualSpecifier}" with "${resolved}" (quoteChar: ${quoteChar})`);
212
- if (quoteChar) {
213
- const originalLength = end - start;
214
- const before = rewritten.slice(0, start + offset);
215
- const after = rewritten.slice(end + offset);
216
- const finalResolved = quoteChar + resolved + quoteChar;
217
- rewritten = before + finalResolved + after;
218
- offset += finalResolved.length - originalLength;
219
- console.log(`[SWITE] import-rewriter: ✅ Replaced "${actualSpecifier}" with "${finalResolved}"`);
220
- }
221
- else {
222
- // No quote char (shouldn't happen, but handle it)
223
- const before = rewritten.slice(0, start + offset);
224
- const after = rewritten.slice(end + offset);
225
- const finalResolved = `"${resolved}"`;
226
- rewritten = before + finalResolved + after;
227
- offset += finalResolved.length - (end - start);
228
- console.log(`[SWITE] import-rewriter: ✅ Replaced (no quote) "${actualSpecifier}" with "${finalResolved}"`);
229
- }
230
- // CRITICAL: Verify the replacement worked
231
- if (rewritten.includes(actualSpecifier) &&
232
- !rewritten.includes(resolved)) {
233
- console.error(`[SWITE] import-rewriter: ⚠️ WARNING - Replacement failed! Import "${actualSpecifier}" still in code but "${resolved}" not found`);
234
- // FORCE replacement as last resort
235
- console.error(`[SWITE] import-rewriter: 🔧 FORCING replacement of "${actualSpecifier}" with "${resolved}"`);
236
- rewritten = rewritten.replace(new RegExp(actualSpecifier.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), resolved);
237
- }
238
- }
239
- // FINAL CHECK: Ensure no bare imports remain
240
- const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)[^'"]*['"]/;
241
- if (bareImportPattern.test(rewritten)) {
242
- const matches = Array.from(rewritten.matchAll(bareImportPattern));
243
- for (const match of matches) {
244
- const bareImport = match[1];
245
- if (!bareImport.startsWith("/") &&
246
- !bareImport.startsWith("http") &&
247
- !bareImport.startsWith(".")) {
248
- console.error(`[SWITE] import-rewriter: ⚠️ CRITICAL - Bare import "${bareImport}" still in code after rewriting!`);
249
- const replacement = shouldUseCdnFallback(bareImport)
250
- ? `https://cdn.jsdelivr.net/npm/${bareImport}/+esm`
251
- : `/node_modules/${bareImport}`;
252
- rewritten = rewritten.replace(new RegExp(bareImport.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), replacement);
253
- console.error(`[SWITE] import-rewriter: 🔧 FORCED replacement of "${bareImport}" with "${replacement}"`);
254
- }
255
- }
256
- }
257
- // CRITICAL: Apply additional regex-based fix for relative .js imports
258
- // This catches any cases the lexer-based approach might miss
259
- // BUT: We need to be context-aware:
260
- // - If importer is in /swiss-packages/, change .js to .ts (SWISS packages use .ts)
261
- // - If importer is a .uix/.ui file, change .js to .uix (app files)
262
- // - Otherwise, change .js to .ts (default for TypeScript files)
263
- const relativeJsImportRegex = /from\s+(["'])(\.\.?\/[^"']*?)(\.js|\.tsx)(\1)/g;
264
- const beforeRegexFix = rewritten;
265
- let regexFixCount = 0;
266
- // Normalize path separators for Windows compatibility
267
- const normalizedImporter = importer.replace(/\\/g, "/");
268
- const isSwissPackage = normalizedImporter.includes("/swiss-packages/");
269
- const isUixFile = normalizedImporter.endsWith(".uix") || normalizedImporter.endsWith(".ui");
270
- rewritten = rewritten.replace(relativeJsImportRegex, (match, quote, path, jsExt, endQuote) => {
271
- // Skip if it's in node_modules or absolute paths
272
- if (path.includes("node_modules") || !path.startsWith(".")) {
273
- return match;
274
- }
275
- // Determine correct extension based on context
276
- // IMPORTANT: Check /lib/ and /swiss-packages/ FIRST before checking file extension
277
- // Normalize path separators for Windows compatibility (importer is a file system path)
278
- const normalizedImporter = importer.replace(/\\/g, "/");
279
- const isLibPath = normalizedImporter.includes("/lib/");
280
- let newExtension;
281
- if (isSwissPackage) {
282
- // SWISS packages use .ts files
283
- newExtension = ".ts";
284
- }
285
- else if (isLibPath) {
286
- // /lib/ paths can have .ts, .ui, or .uix files
287
- // Default to .ts for /lib/ paths (most common - types, core logic, etc.)
288
- // Handlers will try .ui/.uix if .ts doesn't exist
289
- newExtension = ".ts";
290
- console.log(`[SWITE] import-rewriter: 🎯 Regex /lib/ path detected - using .ts extension (importer: ${importer})`);
291
- }
292
- else if (isUixFile) {
293
- // If importing from a .uix/.ui file, check what the actual file extension is
294
- // The source code uses .ui, so we should preserve that
295
- // Only use .uix if the source file is actually .uix
296
- if (normalizedImporter.endsWith(".ui")) {
297
- // Source is .ui, so imports should also be .ui (not .uix)
298
- newExtension = ".ui";
299
- }
300
- else {
301
- // Source is .uix, imports can be .uix
302
- newExtension = ".uix";
303
- }
304
- }
305
- else {
306
- // Default: TypeScript files use .ts
307
- newExtension = ".ts";
308
- }
309
- const newPath = path + newExtension;
310
- console.log(`[SWITE] import-rewriter: 🔧 Regex fix (context: ${isSwissPackage ? 'swiss-pkg' : isUixFile ? 'uix' : 'ts'}): ${match} -> from ${quote}${newPath}${endQuote}`);
311
- regexFixCount++;
312
- return `from ${quote}${newPath}${endQuote}`;
313
- });
314
- if (regexFixCount > 0) {
315
- console.log(`[SWITE] import-rewriter: ✅ Regex fix applied ${regexFixCount} change(s)`);
316
- }
317
- else {
318
- // Debug: Check if there are any relative .js imports that weren't caught
319
- const testRegex = /from\s+["'](\.\.?\/[^"']+\.js)["']/g;
320
- const testMatches = Array.from(rewritten.matchAll(testRegex));
321
- if (testMatches.length > 0) {
322
- console.log(`[SWITE] import-rewriter: ⚠️ Found ${testMatches.length} relative .js import(s) that weren't fixed:`);
323
- testMatches.slice(0, 3).forEach(m => console.log(` - ${m[0]}`));
324
- }
325
- }
326
- // Final pass: Convert any remaining /swiss-lib/ paths to /swiss-packages/
327
- // This catches paths that might have been generated by the compiler or resolver
328
- // Use multiple passes to catch all variations
329
- if (rewritten.includes("/swiss-lib/")) {
330
- const beforeFinal = rewritten;
331
- // Pass 1: Replace /swiss-lib/packages/ with /swiss-packages/
332
- rewritten = rewritten.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
333
- // Pass 2: Replace any remaining /swiss-lib/ with /swiss-packages/
334
- rewritten = rewritten.replace(/\/swiss-lib\//g, "/swiss-packages/");
335
- // Pass 3: Fix in quoted strings (both single and double quotes)
336
- rewritten = rewritten.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
337
- if (beforeFinal !== rewritten) {
338
- console.log(chalk.yellow(`[SWITE] import-rewriter: Final pass converted /swiss-lib/ to /swiss-packages/ (${beforeFinal.split('/swiss-lib/').length - 1} occurrences)`));
339
- }
340
- }
341
- console.log(`[SWITE] import-rewriter: Finished rewriting ${imports.length} import(s) in ${importer}`);
342
- return rewritten;
343
- }
344
- catch (error) {
345
- console.error(`[SWITE] import-rewriter: Error rewriting imports in ${importer}:`, error);
346
- if (error instanceof Error) {
347
- console.error(`[SWITE] import-rewriter: Error stack:`, error.stack);
348
- }
349
- return code; // Return original on error
350
- }
351
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"hmr-routes.d.ts","sourceRoot":"","sources":["../../src/middleware/hmr-routes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAqG1E"}
@@ -1,23 +0,0 @@
1
- import type { Express } from "express";
2
- import type { RouteDefinition } from "@kibologic/core";
3
- import { RouteScanner } from "@kibologic/plugin-file-router/core";
4
- import { createFileWatcher } from "@kibologic/plugin-file-router/dev";
5
- import { ModuleResolver } from "../resolver.js";
6
- import { HMREngine } from "../hmr.js";
7
- export interface MiddlewareConfig {
8
- root: string;
9
- workspaceRoot?: string | null;
10
- publicDir: string;
11
- resolver: ModuleResolver;
12
- hmr: HMREngine;
13
- }
14
- export interface MiddlewareResult {
15
- routes: RouteDefinition[];
16
- routeScanner: RouteScanner | null;
17
- routeWatcher: Awaited<ReturnType<typeof createFileWatcher>> | null;
18
- }
19
- /**
20
- * Setup all middleware for the SWITE server
21
- */
22
- export declare function setupMiddleware(app: Express, config: MiddlewareConfig): Promise<MiddlewareResult>;
23
- //# sourceMappingURL=middleware-setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware-setup.d.ts","sourceRoot":"","sources":["../../src/middleware/middleware-setup.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAItE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAahD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC;CACpE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAw0B3B"}