@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.
- package/CHANGELOG.md +15 -0
- package/dist/adapters/proxy/SwiteProxyError.d.ts.map +1 -0
- package/dist/{proxy → adapters/proxy}/proxyToPython.d.ts +1 -1
- package/dist/adapters/proxy/proxyToPython.d.ts.map +1 -0
- package/dist/build-engine/builder.d.ts.map +1 -0
- package/dist/{builder.js → build-engine/builder.js} +8 -14
- package/dist/cli.js +5 -5
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/{config.d.ts → config/config.d.ts} +11 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/env.d.ts +25 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +84 -0
- package/dist/{handlers → dev-engine/handlers}/base-handler.d.ts +5 -1
- package/dist/dev-engine/handlers/base-handler.d.ts.map +1 -0
- package/dist/dev-engine/handlers/base-handler.js +58 -0
- package/dist/dev-engine/handlers/js-handler.d.ts.map +1 -0
- package/dist/{handlers → dev-engine/handlers}/js-handler.js +1 -1
- package/dist/dev-engine/handlers/mjs-handler.d.ts.map +1 -0
- package/dist/{handlers → dev-engine/handlers}/mjs-handler.js +1 -1
- package/dist/dev-engine/handlers/node-module-handler.d.ts.map +1 -0
- package/dist/{handlers → dev-engine/handlers}/node-module-handler.js +33 -44
- package/dist/{handlers → dev-engine/handlers}/ts-handler.d.ts +0 -4
- package/dist/dev-engine/handlers/ts-handler.d.ts.map +1 -0
- package/dist/{handlers → dev-engine/handlers}/ts-handler.js +5 -28
- package/dist/{handlers → dev-engine/handlers}/ui-handler.d.ts +0 -4
- package/dist/dev-engine/handlers/ui-handler.d.ts.map +1 -0
- package/dist/dev-engine/handlers/ui-handler.js +84 -0
- package/dist/{handlers → dev-engine/handlers}/uix-handler.d.ts +0 -4
- package/dist/dev-engine/handlers/uix-handler.d.ts.map +1 -0
- package/dist/dev-engine/handlers/uix-handler.js +70 -0
- package/dist/dev-engine/hmr/hmr-client-template.d.ts +10 -0
- package/dist/dev-engine/hmr/hmr-client-template.d.ts.map +1 -0
- package/dist/dev-engine/hmr/hmr-client-template.js +122 -0
- package/dist/dev-engine/hmr/hmr.d.ts.map +1 -0
- package/dist/{hmr.js → dev-engine/hmr/hmr.js} +2 -134
- package/dist/{middleware → dev-engine/middleware}/hmr-routes.d.ts +2 -2
- package/dist/dev-engine/middleware/hmr-routes.d.ts.map +1 -0
- package/dist/{middleware → dev-engine/middleware}/hmr-routes.js +1 -1
- package/dist/dev-engine/middleware/middleware-setup.d.ts +35 -0
- package/dist/dev-engine/middleware/middleware-setup.d.ts.map +1 -0
- package/dist/dev-engine/middleware/middleware-setup.js +327 -0
- package/dist/dev-engine/middleware/static-files.d.ts.map +1 -0
- package/dist/{middleware → dev-engine/middleware}/static-files.js +2 -2
- package/dist/{dev → dev-engine}/pythonDevManager.d.ts +1 -1
- package/dist/dev-engine/pythonDevManager.d.ts.map +1 -0
- package/dist/{dev → dev-engine}/pythonDevManager.js +1 -1
- package/dist/{router → dev-engine/router}/file-router.d.ts +4 -4
- package/dist/dev-engine/router/file-router.d.ts.map +1 -0
- package/dist/{router → dev-engine/router}/file-router.js +4 -4
- package/dist/dev-engine/server.d.ts.map +1 -0
- package/dist/{server.js → dev-engine/server.js} +10 -6
- package/dist/index.d.ts +13 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -9
- package/dist/internal/cache/compilation-cache.d.ts.map +1 -0
- package/dist/{cache → internal/cache}/compilation-cache.js +3 -2
- package/dist/internal/generate-import-map-cli.d.ts.map +1 -0
- package/dist/{utils → internal}/generate-import-map-cli.js +1 -1
- package/dist/internal/generate-import-map.d.ts.map +1 -0
- package/dist/{utils → internal}/generate-import-map.js +3 -3
- package/dist/{utils → kernel}/package-finder.d.ts +7 -5
- package/dist/kernel/package-finder.d.ts.map +1 -0
- package/dist/kernel/package-finder.js +154 -0
- package/dist/kernel/package-registry.d.ts.map +1 -0
- package/dist/kernel/workspace.d.ts.map +1 -0
- package/dist/{resolver → resolution}/bare-import-resolver.d.ts +1 -1
- package/dist/resolution/bare-import-resolver.d.ts.map +1 -0
- package/dist/{resolver → resolution}/bare-import-resolver.js +25 -53
- package/dist/resolution/cdn/cdn-fallback.d.ts.map +1 -0
- package/dist/{utils → resolution/path}/file-path-resolver.d.ts +2 -1
- package/dist/resolution/path/file-path-resolver.d.ts.map +1 -0
- package/dist/{utils → resolution/path}/file-path-resolver.js +46 -28
- package/dist/resolution/path/path-fixup.d.ts +13 -0
- package/dist/resolution/path/path-fixup.d.ts.map +1 -0
- package/dist/resolution/path/path-fixup.js +20 -0
- package/dist/{resolver.d.ts → resolution/resolver.d.ts} +1 -1
- package/dist/resolution/resolver.d.ts.map +1 -0
- package/dist/{resolver.js → resolution/resolver.js} +8 -37
- package/dist/{import-rewriter.d.ts → resolution/rewriting/import-rewriter.d.ts} +1 -1
- package/dist/resolution/rewriting/import-rewriter.d.ts.map +1 -0
- package/dist/resolution/rewriting/import-rewriter.js +199 -0
- package/dist/{resolver → resolution}/symlink-registry.d.ts +1 -1
- package/dist/resolution/symlink-registry.d.ts.map +1 -0
- package/dist/{resolver → resolution}/symlink-registry.js +1 -1
- package/dist/resolution/url-resolver.d.ts.map +1 -0
- package/dist/{resolver → resolution}/url-resolver.js +38 -109
- package/dist/resolution/workspace-package-resolver.d.ts.map +1 -0
- package/dist/resolution/workspace-package-resolver.js +77 -0
- package/docs/architecture/build-pipeline.md +97 -0
- package/docs/architecture/dev-server.md +87 -0
- package/docs/architecture/hmr.md +78 -0
- package/docs/architecture/import-rewriting.md +101 -0
- package/docs/architecture/index.md +16 -0
- package/docs/architecture/python-integration.md +93 -0
- package/docs/architecture/resolution.md +92 -0
- package/docs/cli/build.md +78 -0
- package/docs/cli/dev.md +90 -0
- package/docs/cli/index.md +15 -0
- package/docs/cli/start.md +45 -0
- package/docs/development/contributing.md +74 -0
- package/docs/development/index.md +12 -0
- package/docs/development/internals.md +101 -0
- package/docs/guide/configuration.md +89 -0
- package/docs/guide/index.md +13 -0
- package/docs/guide/project-structure.md +75 -0
- package/docs/guide/quickstart.md +113 -0
- package/docs/index.md +16 -0
- package/package.json +5 -5
- package/src/cli.ts +1 -1
- package/src/config/config.ts +11 -0
- package/src/dev-engine/handlers/base-handler.ts +4 -2
- package/src/dev-engine/handlers/node-module-handler.ts +51 -78
- package/src/dev-engine/middleware/middleware-setup.ts +1 -0
- package/src/dev-engine/server.ts +38 -33
- package/src/kernel/package-finder.ts +59 -43
- package/src/resolution/bare-import-resolver.ts +14 -4
- package/src/resolution/path/file-path-resolver.ts +44 -10
- package/src/resolution/url-resolver.ts +1 -1
- package/dist/builder.d.ts.map +0 -1
- package/dist/cache/compilation-cache.d.ts.map +0 -1
- package/dist/config-loader.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/dev/pythonDevManager.d.ts.map +0 -1
- package/dist/env.d.ts +0 -19
- package/dist/env.d.ts.map +0 -1
- package/dist/env.js +0 -112
- package/dist/handlers/base-handler.d.ts.map +0 -1
- package/dist/handlers/base-handler.js +0 -38
- package/dist/handlers/js-handler.d.ts.map +0 -1
- package/dist/handlers/mjs-handler.d.ts.map +0 -1
- package/dist/handlers/node-module-handler.d.ts.map +0 -1
- package/dist/handlers/ts-handler.d.ts.map +0 -1
- package/dist/handlers/ui-handler.d.ts.map +0 -1
- package/dist/handlers/ui-handler.js +0 -182
- package/dist/handlers/uix-handler.d.ts.map +0 -1
- package/dist/handlers/uix-handler.js +0 -135
- package/dist/hmr.d.ts.map +0 -1
- package/dist/import-rewriter.d.ts.map +0 -1
- package/dist/import-rewriter.js +0 -351
- package/dist/middleware/hmr-routes.d.ts.map +0 -1
- package/dist/middleware/middleware-setup.d.ts +0 -23
- package/dist/middleware/middleware-setup.d.ts.map +0 -1
- package/dist/middleware/middleware-setup.js +0 -596
- package/dist/middleware/static-files.d.ts.map +0 -1
- package/dist/proxy/SwiteProxyError.d.ts.map +0 -1
- package/dist/proxy/proxyToPython.d.ts.map +0 -1
- package/dist/resolver/bare-import-resolver.d.ts.map +0 -1
- package/dist/resolver/symlink-registry.d.ts.map +0 -1
- package/dist/resolver/url-resolver.d.ts.map +0 -1
- package/dist/resolver/workspace-package-resolver.d.ts.map +0 -1
- package/dist/resolver/workspace-package-resolver.js +0 -185
- package/dist/resolver.d.ts.map +0 -1
- package/dist/router/file-router.d.ts.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/utils/cdn-fallback.d.ts.map +0 -1
- package/dist/utils/file-path-resolver.d.ts.map +0 -1
- package/dist/utils/generate-import-map-cli.d.ts.map +0 -1
- package/dist/utils/generate-import-map.d.ts.map +0 -1
- package/dist/utils/package-finder.d.ts.map +0 -1
- package/dist/utils/package-finder.js +0 -161
- package/dist/utils/package-registry.d.ts.map +0 -1
- package/dist/utils/workspace.d.ts.map +0 -1
- /package/dist/{proxy → adapters/proxy}/SwiteProxyError.d.ts +0 -0
- /package/dist/{proxy → adapters/proxy}/SwiteProxyError.js +0 -0
- /package/dist/{proxy → adapters/proxy}/proxyToPython.js +0 -0
- /package/dist/{builder.d.ts → build-engine/builder.d.ts} +0 -0
- /package/dist/{config-loader.d.ts → config/config-loader.d.ts} +0 -0
- /package/dist/{config-loader.js → config/config-loader.js} +0 -0
- /package/dist/{config.js → config/config.js} +0 -0
- /package/dist/{handlers → dev-engine/handlers}/js-handler.d.ts +0 -0
- /package/dist/{handlers → dev-engine/handlers}/mjs-handler.d.ts +0 -0
- /package/dist/{handlers → dev-engine/handlers}/node-module-handler.d.ts +0 -0
- /package/dist/{hmr.d.ts → dev-engine/hmr/hmr.d.ts} +0 -0
- /package/dist/{middleware → dev-engine/middleware}/static-files.d.ts +0 -0
- /package/dist/{server.d.ts → dev-engine/server.d.ts} +0 -0
- /package/dist/{cache → internal/cache}/compilation-cache.d.ts +0 -0
- /package/dist/{utils → internal}/generate-import-map-cli.d.ts +0 -0
- /package/dist/{utils → internal}/generate-import-map.d.ts +0 -0
- /package/dist/{utils → kernel}/package-registry.d.ts +0 -0
- /package/dist/{utils → kernel}/package-registry.js +0 -0
- /package/dist/{utils → kernel}/workspace.d.ts +0 -0
- /package/dist/{utils → kernel}/workspace.js +0 -0
- /package/dist/{utils → resolution/cdn}/cdn-fallback.d.ts +0 -0
- /package/dist/{utils → resolution/cdn}/cdn-fallback.js +0 -0
- /package/dist/{resolver → resolution}/url-resolver.d.ts +0 -0
- /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., @
|
|
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 (@
|
|
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 "../
|
|
9
|
-
import { shouldUseCdnFallback } from "
|
|
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., @
|
|
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
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
197
|
-
|
|
198
|
-
|
|
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 "
|
|
9
|
-
import { findSwissLibMonorepo } from "
|
|
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
|
-
//
|
|
88
|
+
// /swiss-packages/ URLs point to files in the co-located framework monorepo's packages/ dir
|
|
58
89
|
if (url.startsWith("/swiss-packages/")) {
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
if (
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
@@ -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 {
|
|
8
|
-
import { toUrl } from "./
|
|
9
|
-
import { resolveWorkspacePackage } from "./
|
|
10
|
-
import { resolveBareImport } from "./
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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
|
|
@@ -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"}
|