@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
@@ -0,0 +1,154 @@
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 path from "node:path";
8
+ /**
9
+ * Find any sibling monorepo by searching for its package.json
10
+ */
11
+ export async function findSiblingRepository(startPath, repoName) {
12
+ let current = startPath;
13
+ for (let i = 0; i < 20; i++) {
14
+ const siblingPath = path.join(current, repoName);
15
+ const pkgJson = path.join(siblingPath, "package.json");
16
+ if (await fileExists(pkgJson)) {
17
+ return siblingPath;
18
+ }
19
+ try {
20
+ const entries = await fs.readdir(current, { withFileTypes: true });
21
+ for (const entry of entries) {
22
+ if (entry.name === repoName && (entry.isDirectory() || entry.isSymbolicLink())) {
23
+ const subDir = path.join(current, entry.name);
24
+ if (await fileExists(path.join(subDir, "package.json"))) {
25
+ return subDir;
26
+ }
27
+ }
28
+ }
29
+ }
30
+ catch { /* Continue */ }
31
+ current = path.dirname(current);
32
+ if (current === path.dirname(current))
33
+ break;
34
+ }
35
+ return null;
36
+ }
37
+ /**
38
+ * Backward compatibility wrapper for finding swiss-lib
39
+ */
40
+ export async function findSwissLibMonorepo(startPath) {
41
+ return findSiblingRepository(startPath, 'swiss-lib');
42
+ }
43
+ /**
44
+ * Find a specific package by name, with priority given based on environment.
45
+ * In development, we prioritize local sibling source code.
46
+ */
47
+ export async function findPackage(packageName, startPath, workspaceRoot) {
48
+ const isDev = process.env.NODE_ENV !== 'production';
49
+ // 1. Check local node_modules (Standard resolution) - HIGHEST PRIORITY in Remote-First
50
+ const localNodeModules = path.join(startPath, "node_modules", packageName);
51
+ if (await fileExists(path.join(localNodeModules, "package.json"))) {
52
+ return { path: localNodeModules, type: 'node_modules' };
53
+ }
54
+ // 2. Check workspace root node_modules
55
+ if (workspaceRoot) {
56
+ const workspaceNodeModules = path.join(workspaceRoot, "node_modules", packageName);
57
+ if (await fileExists(path.join(workspaceNodeModules, "package.json"))) {
58
+ return { path: workspaceNodeModules, type: 'node_modules' };
59
+ }
60
+ }
61
+ // 3. Check co-located framework monorepo packages/ for any scoped package
62
+ if (packageName.startsWith("@")) {
63
+ const monorepo = await findSwissLibMonorepo(startPath);
64
+ if (monorepo) {
65
+ const shortName = packageName.split("/")[1];
66
+ const monorepoPackage = path.join(monorepo, "packages", shortName);
67
+ if (await fileExists(path.join(monorepoPackage, "package.json"))) {
68
+ return { path: monorepoPackage, type: 'swiss-lib' };
69
+ }
70
+ }
71
+ }
72
+ // 4. In dev: broader sibling scan across parent directories
73
+ if (isDev && packageName.includes("/")) {
74
+ const parts = packageName.split("/");
75
+ const unscoped = parts[parts.length - 1];
76
+ const parentDirs = [
77
+ path.join(startPath, ".."),
78
+ path.join(startPath, "../.."),
79
+ path.join(startPath, "../../.."),
80
+ ];
81
+ for (const parent of parentDirs) {
82
+ try {
83
+ const potentialRepos = await fs.readdir(parent);
84
+ for (const repo of potentialRepos) {
85
+ const siblingPath = path.join(parent, repo);
86
+ const packagePath = path.join(siblingPath, "packages", unscoped);
87
+ if (await fileExists(path.join(packagePath, "package.json"))) {
88
+ console.log(`[package-finder] Dev Intercept: Serving ${packageName} from local source: ${packagePath}`);
89
+ return { path: packagePath, type: 'swiss-lib' };
90
+ }
91
+ }
92
+ }
93
+ catch { /* Continue */ }
94
+ }
95
+ }
96
+ // 5. Fallback search in internal workspace packages (lib/, packages/, modules/)
97
+ if (workspaceRoot) {
98
+ const packageDirs = ["lib", "packages", "modules", "libraries", "apps"];
99
+ for (const dir of packageDirs) {
100
+ const searchDir = path.join(workspaceRoot, dir);
101
+ if (!(await fileExists(searchDir)))
102
+ continue;
103
+ const parts = packageName.split("/");
104
+ const unscoped = parts.length > 1 ? parts[1] : parts[0];
105
+ const packagePath = path.join(searchDir, unscoped);
106
+ if (await fileExists(path.join(packagePath, "package.json"))) {
107
+ return { path: packagePath, type: 'workspace' };
108
+ }
109
+ }
110
+ }
111
+ return null;
112
+ }
113
+ /**
114
+ * Find all possible workspace roots by searching up the tree
115
+ */
116
+ export async function findWorkspaceRoots(startPath) {
117
+ const roots = [];
118
+ let current = startPath;
119
+ for (let i = 0; i < 20; i++) {
120
+ const workspaceFile = path.join(current, "pnpm-workspace.yaml");
121
+ const packageJson = path.join(current, "package.json");
122
+ try {
123
+ if (await fileExists(workspaceFile)) {
124
+ roots.push(current);
125
+ }
126
+ else if (await fileExists(packageJson)) {
127
+ const pkg = JSON.parse(await fs.readFile(packageJson, "utf-8"));
128
+ if (pkg?.workspaces) {
129
+ roots.push(current);
130
+ }
131
+ }
132
+ }
133
+ catch {
134
+ // Continue
135
+ }
136
+ const parent = path.dirname(current);
137
+ if (parent === current)
138
+ break;
139
+ current = parent;
140
+ }
141
+ return roots;
142
+ }
143
+ /**
144
+ * Check if a file exists
145
+ */
146
+ async function fileExists(filePath) {
147
+ try {
148
+ await fs.access(filePath);
149
+ return true;
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-registry.d.ts","sourceRoot":"","sources":["../../src/kernel/package-registry.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,GAAG,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAgB;IAEjC;;OAEG;IACG,aAAa,CACjB,aAAa,EAAE,MAAM,EACrB,eAAe,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,IAAI,CAAC;IAwChB;;OAEG;YACW,aAAa;IAmF3B;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIpD;;OAEG;IACH,cAAc,IAAI,WAAW,EAAE;IAI/B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAW7B;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/kernel/workspace.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgD5E"}
@@ -3,7 +3,7 @@ export interface BareImportResolverContext extends UrlResolverContext {
3
3
  resolveWorkspacePackage: (pkgName: string) => Promise<string | null>;
4
4
  }
5
5
  /**
6
- * Resolve bare import specifier (e.g., @kibologic/core, react, etc.)
6
+ * Resolve bare import specifier (e.g., @swissjs/core, react, etc.)
7
7
  */
8
8
  export declare function resolveBareImport(specifier: string, context: BareImportResolverContext): Promise<string>;
9
9
  //# sourceMappingURL=bare-import-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-import-resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/bare-import-resolver.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAmC,MAAM,mBAAmB,CAAC;AAI7F,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CA4NjB"}
@@ -1,19 +1,18 @@
1
1
  /*
2
- * Bare Import Resolver - Resolves bare module specifiers (@kibologic/core, etc.)
2
+ * Bare Import Resolver - Resolves bare module specifiers (@swissjs/core, etc.)
3
3
  * Extracted from resolver.ts for modularity
4
4
  */
5
5
  import path from "node:path";
6
6
  import { promises as fs } from "node:fs";
7
7
  import chalk from "chalk";
8
- import { findSwissLibMonorepo } from "../utils/package-finder.js";
9
- import { shouldUseCdnFallback } from "../utils/cdn-fallback.js";
8
+ import { findSwissLibMonorepo } from "../kernel/package-finder.js";
9
+ import { shouldUseCdnFallback } from "./cdn/cdn-fallback.js";
10
10
  import { resolveWorkspacePackage } from "./workspace-package-resolver.js";
11
11
  import { toUrl } from "./url-resolver.js";
12
12
  /**
13
- * Resolve bare import specifier (e.g., @kibologic/core, react, etc.)
13
+ * Resolve bare import specifier (e.g., @swissjs/core, react, etc.)
14
14
  */
15
15
  export async function resolveBareImport(specifier, context) {
16
- console.log(`[SWITE] resolveBareImport CALLED: ${specifier}`);
17
16
  // Extract package name outside the try/catch so fallback logic can reference it.
18
17
  // This must stay project-agnostic: works for both scoped and unscoped packages.
19
18
  const parts = specifier.split("/");
@@ -21,7 +20,6 @@ export async function resolveBareImport(specifier, context) {
21
20
  const pkgName = isScoped ? `${parts[0]}/${parts[1]}` : parts[0];
22
21
  const subPath = isScoped ? parts.slice(2).join("/") : parts.slice(1).join("/");
23
22
  try {
24
- console.log(`[SWITE] resolveBareImport: ${specifier} -> pkgName: ${pkgName}, subPath: ${subPath}`);
25
23
  // Find package.json - check multiple node_modules locations
26
24
  let pkgDir = null;
27
25
  let pkgJsonPath = null;
@@ -34,13 +32,12 @@ export async function resolveBareImport(specifier, context) {
34
32
  if (workspaceRoot) {
35
33
  nodeModulesLocations.push(path.join(workspaceRoot, "node_modules"));
36
34
  }
37
- // Add swiss-lib monorepo node_modules
35
+ // Add monorepo node_modules if present
38
36
  const swissLib = await findSwissLibMonorepo(context.root);
39
37
  if (swissLib) {
40
38
  const swissNodeModules = path.join(swissLib, "node_modules");
41
39
  if (await context.fileExists(swissNodeModules)) {
42
40
  nodeModulesLocations.push(swissNodeModules);
43
- console.log(`[SWITE] Added swiss-lib monorepo node_modules for ${pkgName}`);
44
41
  }
45
42
  }
46
43
  // Try each location
@@ -50,48 +47,20 @@ export async function resolveBareImport(specifier, context) {
50
47
  if (await context.fileExists(testPkgJsonPath)) {
51
48
  pkgDir = testPkgDir;
52
49
  pkgJsonPath = testPkgJsonPath;
53
- console.log(`[SWITE] Found ${pkgName} in ${nodeModulesPath}`);
54
50
  break;
55
51
  }
56
52
  }
57
53
  if (!pkgJsonPath || !pkgDir) {
58
- console.log(`[SWITE] Package ${pkgName} not in node_modules, checking workspace...`);
59
- // EMERGENCY FIX: For @kibologic/* packages, try direct path first
60
- if (pkgName.startsWith('@kibologic/')) {
61
- const pkgShortName = pkgName.replace('@kibologic/', '');
62
- // Try relative path from SWS to swiss-lib
63
- const potentialPaths = [
64
- path.join(context.root, '../swiss-lib/packages', pkgShortName),
65
- path.join(context.root, '../../swiss-lib/packages', pkgShortName),
66
- path.join(context.root, '../../../swiss-lib/packages', pkgShortName),
67
- ];
68
- for (const candidatePath of potentialPaths) {
69
- const candidatePkgJson = path.join(candidatePath, 'package.json');
70
- if (await context.fileExists(candidatePkgJson)) {
71
- console.log(`[SWITE] Emergency: Found ${pkgName} at ${candidatePath}`);
72
- pkgDir = candidatePath;
73
- pkgJsonPath = candidatePkgJson;
74
- break;
75
- }
76
- }
54
+ const workspacePkg = await context.resolveWorkspacePackage(pkgName);
55
+ if (workspacePkg) {
56
+ return await resolveWorkspacePackageEntry(workspacePkg, pkgName, subPath, specifier, context);
77
57
  }
78
- // If still not found, try workspace resolver
79
- if (!pkgJsonPath || !pkgDir) {
80
- const workspacePkg = await context.resolveWorkspacePackage(pkgName);
81
- if (workspacePkg) {
82
- return await resolveWorkspacePackageEntry(workspacePkg, pkgName, subPath, specifier, context);
83
- }
84
- // Last resort: CDN fallback
85
- if (!shouldUseCdnFallback(pkgName)) {
86
- // Scoped packages may be private and are not necessarily available on public npm CDNs.
87
- console.warn(`[SWITE] Package ${pkgName} not found anywhere. Scoped package detected; CDN fallback is disabled by default.`);
88
- // Return a same-origin node_modules URL to make failures explicit and allow the
89
- // node-module handler to try serving it.
90
- return `/node_modules/${specifier}`;
91
- }
92
- console.warn(`[SWITE] Package ${pkgName} not found anywhere, using CDN fallback`);
93
- return `https://cdn.jsdelivr.net/npm/${specifier}/+esm`;
58
+ if (!shouldUseCdnFallback(pkgName)) {
59
+ console.warn(`[SWITE] Package ${pkgName} not found anywhere. Scoped package detected; CDN fallback is disabled by default.`);
60
+ return `/node_modules/${specifier}`;
94
61
  }
62
+ console.warn(`[SWITE] Package ${pkgName} not found anywhere, using CDN fallback`);
63
+ return `https://cdn.jsdelivr.net/npm/${specifier}/+esm`;
95
64
  }
96
65
  // Continue with normal resolution if we found it
97
66
  if (pkgJsonPath && pkgDir) {
@@ -106,7 +75,6 @@ export async function resolveBareImport(specifier, context) {
106
75
  realPkgDir = pkgDir;
107
76
  }
108
77
  const workspacePkg = await context.resolveWorkspacePackage(pkgName);
109
- console.log(`[SWITE] resolveBareImport (node_modules): workspacePkg=${workspacePkg}, realPkgDir=${realPkgDir}, pkgName=${pkgName}`);
110
78
  if (workspacePkg) {
111
79
  const normalizedWorkspacePkg = path
112
80
  .resolve(workspacePkg)
@@ -119,7 +87,6 @@ export async function resolveBareImport(specifier, context) {
119
87
  // If the real path is the workspace package, use workspace resolution
120
88
  if (normalizedRealPkgDir === normalizedWorkspacePkg ||
121
89
  normalizedRealPkgDir.includes(normalizedWorkspacePkg)) {
122
- console.log(`[SWITE] resolveBareImport (node_modules): Using workspace resolution for ${pkgName}`);
123
90
  return await resolveWorkspacePackageEntry(workspacePkg, pkgName, subPath, specifier, context);
124
91
  }
125
92
  }
@@ -151,7 +118,6 @@ export async function resolveBareImport(specifier, context) {
151
118
  .replace("/dist/", "/src/")
152
119
  .replace(/\.js$/, ".ts");
153
120
  if (await context.fileExists(srcFullPath)) {
154
- console.log(`[SWITE] resolveBareImport: Using source file instead of dist: ${srcFullPath}`);
155
121
  return await toUrl(srcFullPath, context);
156
122
  }
157
123
  }
@@ -193,9 +159,18 @@ export async function resolveBareImport(specifier, context) {
193
159
  entryPoint = pkgJson.module || pkgJson.main || "index.js";
194
160
  }
195
161
  const fullPath = path.join(pkgDir, entryPoint);
196
- // Try the exact path first
197
- if (await context.fileExists(fullPath)) {
198
- return await toUrl(fullPath, context);
162
+ // Try a few Swiss-specific variations of the entry point before CDN fallback
163
+ const swissVariations = [
164
+ fullPath,
165
+ fullPath.replace(/\.(js|mjs|ts)$/, '.ui'),
166
+ fullPath.replace(/\.(js|mjs|ts)$/, '.uix'),
167
+ path.join(pkgDir, 'src/index.ui'),
168
+ path.join(pkgDir, 'src/index.uix'),
169
+ ];
170
+ for (const v of swissVariations) {
171
+ if (await context.fileExists(v)) {
172
+ return await toUrl(v, context);
173
+ }
199
174
  }
200
175
  // Try with extensions
201
176
  for (const ext of [".js", ".mjs", ".ts", ".ui", ".uix"]) {
@@ -227,7 +202,6 @@ async function resolveWorkspacePackageEntry(workspacePkg, pkgName, subPath, spec
227
202
  ? subPath.replace(/\.(js|ts|ui|uix)$/, "")
228
203
  : "";
229
204
  let exportKey = subPathWithoutExt ? `./${subPathWithoutExt}` : ".";
230
- console.log(`[SWITE] resolveBareImport (workspace): pkgName=${pkgName}, subPath=${subPath}, subPathWithoutExt=${subPathWithoutExt}, exportKey=${exportKey}`);
231
205
  // Try to find matching export
232
206
  if (subPath && !workspacePkgJson.exports[exportKey]) {
233
207
  if (subPathWithoutExt) {
@@ -285,7 +259,6 @@ async function resolveWorkspacePackageEntry(workspacePkg, pkgName, subPath, spec
285
259
  if (normalizedFull.includes("/dist/")) {
286
260
  const srcPath = fullPath.replace(/[/\\]dist[/\\]/, path.sep + "src" + path.sep).replace(/\.js$/i, ".ts");
287
261
  if (await context.fileExists(srcPath)) {
288
- console.log(`[SWITE] resolveBareImport (workspace): preferring src over dist: ${srcPath}`);
289
262
  return await toUrl(srcPath, context);
290
263
  }
291
264
  }
@@ -316,7 +289,6 @@ async function resolveWorkspacePackageEntry(workspacePkg, pkgName, subPath, spec
316
289
  if (normalizedFull.includes("/dist/")) {
317
290
  const srcPath = fullPath.replace(/[/\\]dist[/\\]/, path.sep + "src" + path.sep).replace(/\.js$/i, ".ts");
318
291
  if (await context.fileExists(srcPath)) {
319
- console.log(`[SWITE] resolveBareImport (fallback): preferring src over dist: ${srcPath}`);
320
292
  return await toUrl(srcPath, context);
321
293
  }
322
294
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn-fallback.d.ts","sourceRoot":"","sources":["../../../src/resolution/cdn/cdn-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAKpE"}
@@ -1,9 +1,10 @@
1
1
  export interface PathResolverContext {
2
2
  root: string;
3
3
  workspaceRoot: string | null;
4
+ userConfig?: any;
4
5
  }
5
6
  /**
6
7
  * Resolve file path from URL, handling SWISS packages, workspace packages, and app files
7
8
  */
8
- export declare function resolveFilePath(url: string, root: string, workspaceRoot?: string | null): Promise<string>;
9
+ export declare function resolveFilePath(url: string, root: string, workspaceRoot?: string | null, userConfig?: any): Promise<string>;
9
10
  //# sourceMappingURL=file-path-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-path-resolver.d.ts","sourceRoot":"","sources":["../../../src/resolution/path/file-path-resolver.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,MAAM,GAAG,IAAW,EACnC,UAAU,CAAC,EAAE,GAAG,GACf,OAAO,CAAC,MAAM,CAAC,CAsMjB"}
@@ -5,17 +5,49 @@
5
5
  */
6
6
  import { promises as fs } from "node:fs";
7
7
  import path from "node:path";
8
- import { findWorkspaceRoot } from "./workspace.js";
9
- import { findSwissLibMonorepo } from "./package-finder.js";
8
+ import { findWorkspaceRoot } from "../../kernel/workspace.js";
9
+ import { findSwissLibMonorepo, findPackage } from "../../kernel/package-finder.js";
10
10
  /**
11
11
  * Resolve file path from URL, handling SWISS packages, workspace packages, and app files
12
12
  */
13
- export async function resolveFilePath(url, root, workspaceRoot = null) {
13
+ export async function resolveFilePath(url, root, workspaceRoot = null, userConfig) {
14
+ // Consolidate workspace root discovery for consistency across resolution blocks
15
+ const wsRoot = workspaceRoot || (await findWorkspaceRoot(root));
14
16
  // /node_modules/ URLs: walk up from app root until we find the package.
15
17
  // pnpm may place deps at the app root, one level up (workspace pkg), or at
16
18
  // the monorepo root depending on hoisting config and pnpm version.
17
19
  if (url.startsWith("/node_modules/")) {
18
20
  const urlPath = url.startsWith("/") ? url.slice(1) : url;
21
+ const parts = urlPath.split("/");
22
+ // Handle @scoped/package or standard-package
23
+ const packageName = parts[1].startsWith("@") ? `${parts[1]}/${parts[2]}` : parts[1];
24
+ // NEW: PNPM-aware Interceptor. Check if this request is for an "internal" scope package.
25
+ // In development, we always prioritize local siblings if they exist.
26
+ const internalScopes = userConfig?.internalScopes || [];
27
+ const match = internalScopes.length > 0
28
+ ? url.match(new RegExp(`(${internalScopes.join("|")})\/([^/]+)`))
29
+ : null;
30
+ if (process.env.NODE_ENV !== 'production' && match) {
31
+ const packageName = match[0];
32
+ const remainingPath = url.split(match[0])[1];
33
+ const localLoc = await findPackage(packageName, root, wsRoot);
34
+ if (localLoc && localLoc.type !== 'node_modules') {
35
+ // Found local source! Redirect the base path
36
+ const fullPath = path.join(localLoc.path, remainingPath);
37
+ // Re-use workspace fallback logic for dist -> src transition
38
+ if (fullPath.includes("/dist/")) {
39
+ const srcPath = fullPath.replace("/dist/", "/src/").replace(/\.[mc]?js$/, ".ts");
40
+ try {
41
+ await fs.access(srcPath);
42
+ console.log(`[file-path-resolver] Intercept: ${packageName} redirecting to local src: ${srcPath}`);
43
+ return srcPath;
44
+ }
45
+ catch { /* Fallback to dist if src not found */ }
46
+ }
47
+ console.log(`[file-path-resolver] Intercept: ${packageName} redirecting to local source: ${fullPath}`);
48
+ return fullPath;
49
+ }
50
+ }
19
51
  // Walk up the directory tree from root, trying node_modules at each level
20
52
  let current = path.resolve(root);
21
53
  const visited = new Set();
@@ -38,7 +70,6 @@ export async function resolveFilePath(url, root, workspaceRoot = null) {
38
70
  current = parent;
39
71
  }
40
72
  // Explicit workspace root (covers hoisted-to-root installs)
41
- const wsRoot = workspaceRoot || (await findWorkspaceRoot(root));
42
73
  if (wsRoot) {
43
74
  const wsPath = path.join(wsRoot, urlPath);
44
75
  if (!visited.has(wsPath)) {
@@ -54,32 +85,23 @@ export async function resolveFilePath(url, root, workspaceRoot = null) {
54
85
  }
55
86
  return path.join(path.resolve(root), urlPath); // fallback; handler will 404
56
87
  }
57
- // Check if this is a swiss-lib package file
88
+ // /swiss-packages/ URLs point to files in the co-located framework monorepo's packages/ dir
58
89
  if (url.startsWith("/swiss-packages/")) {
59
- // Dynamically find swiss-lib monorepo instead of hardcoded paths
60
- const swissLib = await findSwissLibMonorepo(root);
61
- if (swissLib) {
62
- // Remove /swiss-packages prefix and use the rest as relative path
63
- const relativePath = url.replace(/^\/swiss-packages\//, "");
64
- const swissPackagesPath = path.join(swissLib, "packages");
65
- const fullPath = path.join(swissPackagesPath, relativePath);
90
+ const relativePath = url.replace(/^\/swiss-packages\//, "");
91
+ const monorepo = await findSwissLibMonorepo(root);
92
+ if (monorepo) {
93
+ const fullPath = path.join(monorepo, "packages", relativePath);
66
94
  try {
67
95
  await fs.access(fullPath);
68
- console.log(`[file-path-resolver] Found swiss-lib package at: ${fullPath}`);
69
96
  return fullPath;
70
97
  }
71
98
  catch {
72
- console.warn(`[file-path-resolver] swiss-lib package file not found: ${fullPath}`);
73
- return fullPath; // Return path anyway, will error later if needed
99
+ return fullPath; // Return anyway; handler will 404 if missing
74
100
  }
75
101
  }
76
- else {
77
- // Fallback: construct path from root (may not work, but better than nothing)
78
- const relativePath = url.replace(/^\/swiss-packages\//, "");
79
- const fallbackPath = path.join(root, "..", "..", "..", "swiss-lib", "packages", relativePath);
80
- console.warn(`[file-path-resolver] swiss-lib not found, using fallback: ${fallbackPath}`);
81
- return fallbackPath;
82
- }
102
+ // No co-located monorepo found — return a path that will 404 cleanly
103
+ console.warn(`[file-path-resolver] No framework monorepo found for /swiss-packages/${relativePath}`);
104
+ return path.join(root, "node_modules", relativePath);
83
105
  }
84
106
  // Workspace-level directories: always resolve from workspace root
85
107
  // Updated: lib/ now contains all packages (moved from packages/)
@@ -87,13 +109,10 @@ export async function resolveFilePath(url, root, workspaceRoot = null) {
87
109
  url.startsWith("/libraries/") ||
88
110
  url.startsWith("/packages/") ||
89
111
  url.startsWith("/modules/")) {
90
- let wsRoot = workspaceRoot;
91
- if (!wsRoot) {
92
- wsRoot = await findWorkspaceRoot(root);
93
- console.log(`[file-path-resolver] Detected workspace root: ${wsRoot} (from app root: ${root})`);
94
- }
112
+ // Already detected wsRoot at function start
95
113
  // Normalize URL: path.join with leading slash is wrong on Windows (treats as drive root)
96
114
  const urlPath = url.startsWith("/") ? url.slice(1) : url;
115
+ // ...
97
116
  // CRITICAL: For /lib/ paths, we MUST find the SWS root (which has lib/ directory)
98
117
  // Start from app root and walk up until we find a directory with both pnpm-workspace.yaml AND lib/
99
118
  if (url.startsWith("/lib/")) {
@@ -150,7 +169,6 @@ export async function resolveFilePath(url, root, workspaceRoot = null) {
150
169
  }
151
170
  }
152
171
  // For app files, check if URL already includes the app path
153
- const wsRoot = workspaceRoot || (await findWorkspaceRoot(root));
154
172
  if (wsRoot) {
155
173
  const appRelativeToWorkspace = path
156
174
  .relative(wsRoot, root)
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Centralised /swiss-lib/ → /swiss-packages/ path fixup.
3
+ *
4
+ * Root cause: the UiCompiler emits absolute `/swiss-lib/` paths in some code
5
+ * paths (compiler was written against an older directory structure). Until the
6
+ * compiler is fixed at source this single function is the authoritative fixup.
7
+ * Apply it once per compilation, before passing code to the import rewriter.
8
+ *
9
+ * All seven previous fixup locations across ui-handler, uix-handler, and
10
+ * import-rewriter have been removed in favour of this call.
11
+ */
12
+ export declare function fixSwissLibPaths(code: string): string;
13
+ //# sourceMappingURL=path-fixup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-fixup.d.ts","sourceRoot":"","sources":["../../../src/resolution/path/path-fixup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Centralised /swiss-lib/ → /swiss-packages/ path fixup.
3
+ *
4
+ * Root cause: the UiCompiler emits absolute `/swiss-lib/` paths in some code
5
+ * paths (compiler was written against an older directory structure). Until the
6
+ * compiler is fixed at source this single function is the authoritative fixup.
7
+ * Apply it once per compilation, before passing code to the import rewriter.
8
+ *
9
+ * All seven previous fixup locations across ui-handler, uix-handler, and
10
+ * import-rewriter have been removed in favour of this call.
11
+ */
12
+ export function fixSwissLibPaths(code) {
13
+ if (!code.includes('/swiss-lib/'))
14
+ return code;
15
+ // More-specific pattern first so `/swiss-lib/packages/` doesn't leave a
16
+ // dangling `/swiss-packages/packages/` if the replacement ran twice.
17
+ return code
18
+ .replace(/\/swiss-lib\/packages\//g, '/swiss-packages/')
19
+ .replace(/\/swiss-lib\//g, '/swiss-packages/');
20
+ }
@@ -1,4 +1,4 @@
1
- import type { ImportMap } from "./utils/generate-import-map.js";
1
+ import type { ImportMap } from "../internal/generate-import-map.js";
2
2
  export declare class ModuleResolver {
3
3
  private root;
4
4
  private workspaceRoot;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/resolver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAMpE,qBAAa,cAAc;IAIb,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,SAAS,CAA0B;gBAEvB,IAAI,EAAE,MAAM;IAEhC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;YAWjC,gBAAgB;IAMxB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YA8HrD,UAAU;YASV,uBAAuB;YAavB,KAAK;CAUpB"}
@@ -4,10 +4,10 @@
4
4
  import path from "node:path";
5
5
  import { promises as fs } from "node:fs";
6
6
  import chalk from "chalk";
7
- import { findSwissLibMonorepo } from "./utils/package-finder.js";
8
- import { toUrl } from "./resolver/url-resolver.js";
9
- import { resolveWorkspacePackage } from "./resolver/workspace-package-resolver.js";
10
- import { resolveBareImport } from "./resolver/bare-import-resolver.js";
7
+ import { findWorkspaceRoot } from "../kernel/workspace.js";
8
+ import { toUrl } from "./url-resolver.js";
9
+ import { resolveWorkspacePackage } from "./workspace-package-resolver.js";
10
+ import { resolveBareImport } from "./bare-import-resolver.js";
11
11
  export class ModuleResolver {
12
12
  constructor(root) {
13
13
  this.root = root;
@@ -26,28 +26,10 @@ export class ModuleResolver {
26
26
  async getWorkspaceRoot() {
27
27
  if (this.workspaceRoot)
28
28
  return this.workspaceRoot;
29
- const findWorkspaceRoot = async (startDir) => {
30
- let current = startDir;
31
- for (let i = 0; i < 5; i++) {
32
- const workspaceFile = path.join(current, "pnpm-workspace.yaml");
33
- const packageJson = path.join(current, "package.json");
34
- if ((await this.fileExists(workspaceFile)) ||
35
- ((await this.fileExists(packageJson)) &&
36
- JSON.parse(await fs.readFile(packageJson, "utf-8")).workspaces)) {
37
- return current;
38
- }
39
- const parent = path.dirname(current);
40
- if (parent === current)
41
- break;
42
- current = parent;
43
- }
44
- return null;
45
- };
46
29
  this.workspaceRoot = await findWorkspaceRoot(this.root);
47
30
  return this.workspaceRoot;
48
31
  }
49
32
  async resolve(specifier, importer) {
50
- console.log(`[SWITE] resolve CALLED: specifier: ${specifier}, importer: ${importer}`);
51
33
  // Check import map first (fast path)
52
34
  if (this.importMap && !specifier.startsWith(".") && !specifier.startsWith("/")) {
53
35
  const mapped = this.importMap.imports[specifier];
@@ -81,9 +63,7 @@ export class ModuleResolver {
81
63
  fileExists: (p) => this.fileExists(p),
82
64
  resolveWorkspacePackage: (pkgName) => this.resolveWorkspacePackage(pkgName),
83
65
  };
84
- const result = await resolveBareImport(specifier, context);
85
- console.log(`[SWITE] resolve RESULT: ${specifier} -> ${result}`);
86
- return result;
66
+ return await resolveBareImport(specifier, context);
87
67
  }
88
68
  // Handle absolute paths (already URLs)
89
69
  if (specifier.startsWith("/")) {
@@ -126,30 +106,21 @@ export class ModuleResolver {
126
106
  // This preserves .ui/.uix extensions for SWISS files
127
107
  const hasExtension = /\.(ui|uix|ts|tsx|js|jsx|mjs)$/.test(specifier);
128
108
  if (hasExtension) {
129
- // Specifier has extension, resolve it directly
130
109
  const resolved = path.resolve(importerDir, specifier);
131
- console.log(`[SWITE] resolve relative (hasExt): ${specifier}, importerDir: ${importerDir}, resolved: ${resolved}, exists: ${await this.fileExists(resolved)}`);
132
110
  if (await this.fileExists(resolved)) {
133
- const url = await this.toUrl(resolved);
134
- console.log(`[SWITE] resolve relative: ${specifier} -> ${resolved} -> ${url}`);
135
- return url;
111
+ return await this.toUrl(resolved);
136
112
  }
137
113
  }
138
114
  // If no extension or file not found, try adding extensions
139
115
  // Strip any existing extension from specifier (but preserve .ui/.uix if present)
140
116
  const specifierWithoutExt = specifier.replace(/\.(js|ts|jsx|tsx|mjs)$/, "");
141
117
  const resolved = path.resolve(importerDir, specifierWithoutExt);
142
- console.log(`[SWITE] resolve relative (trying extensions): specifierWithoutExt: ${specifierWithoutExt}, resolved: ${resolved}`);
143
118
  // Try adding extensions (prioritize .ui and .uix for SWISS files)
144
119
  const extensions = [".ui", ".uix", ".ts", ".tsx", ".js", ".jsx", ".mjs"];
145
120
  for (const ext of extensions) {
146
121
  const withExt = resolved + ext;
147
- const exists = await this.fileExists(withExt);
148
- console.log(`[SWITE] trying extension ${ext}: ${withExt}, exists: ${exists}`);
149
- if (exists) {
150
- const url = await this.toUrl(withExt);
151
- console.log(`[SWITE] found with ${ext}: ${url}`);
152
- return url;
122
+ if (await this.fileExists(withExt)) {
123
+ return await this.toUrl(withExt);
153
124
  }
154
125
  }
155
126
  // Try index files
@@ -1,3 +1,3 @@
1
- import { ModuleResolver } from "./resolver.js";
1
+ import { ModuleResolver } from "../resolver.js";
2
2
  export declare function rewriteImports(code: string, importer: string, resolver: ModuleResolver): Promise<string>;
3
3
  //# sourceMappingURL=import-rewriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-rewriter.d.ts","sourceRoot":"","sources":["../../../src/resolution/rewriting/import-rewriter.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAYhD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAqHjB"}