@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.
- 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/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 +3 -1
- package/dist/dev-engine/handlers/base-handler.d.ts.map +1 -0
- package/dist/{handlers → dev-engine/handlers}/base-handler.js +22 -2
- 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 +4 -4
- 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 +34 -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} +6 -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 +3 -1
- package/dist/kernel/package-finder.d.ts.map +1 -0
- package/dist/{utils → kernel}/package-finder.js +29 -52
- 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 +12 -49
- package/dist/resolution/cdn/cdn-fallback.d.ts.map +1 -0
- package/dist/resolution/path/file-path-resolver.d.ts.map +1 -0
- package/dist/{utils → resolution/path}/file-path-resolver.js +11 -20
- 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/package.json +24 -15
- package/src/cli.ts +1 -1
- 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/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-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.d.ts → config/config.d.ts} +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/{utils → resolution/path}/file-path-resolver.d.ts +0 -0
- /package/dist/{resolver → resolution}/url-resolver.d.ts +0 -0
- /package/dist/{resolver → resolution}/workspace-package-resolver.d.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swissjs/swite",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "SWITE - SWISS Development Server (Vite replacement)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -8,10 +8,20 @@
|
|
|
8
8
|
"bin": {
|
|
9
9
|
"swite": "dist/cli.js"
|
|
10
10
|
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc -b",
|
|
13
|
+
"dev": "tsc -b --watch",
|
|
14
|
+
"clean": "rm -rf dist node_modules && rm -f tsconfig.tsbuildinfo",
|
|
15
|
+
"generate-import-map": "tsx src/internal/generate-import-map-cli.ts",
|
|
16
|
+
"test": "node --import tsx --test __tests__/import-rewriter-bug.test.ts",
|
|
17
|
+
"changeset": "changeset",
|
|
18
|
+
"release:version": "changeset version",
|
|
19
|
+
"release:publish": "changeset publish"
|
|
20
|
+
},
|
|
11
21
|
"dependencies": {
|
|
12
|
-
"@swissjs/core": "
|
|
13
|
-
"@swissjs/compiler": "
|
|
14
|
-
"@swissjs/plugin-file-router": "
|
|
22
|
+
"@swissjs/core": "0.1.5",
|
|
23
|
+
"@swissjs/compiler": "0.1.4",
|
|
24
|
+
"@swissjs/plugin-file-router": "1.0.2",
|
|
15
25
|
"chalk": "^5.3.0",
|
|
16
26
|
"chokidar": "^3.5.3",
|
|
17
27
|
"es-module-lexer": "^1.3.1",
|
|
@@ -32,18 +42,17 @@
|
|
|
32
42
|
"access": "public"
|
|
33
43
|
},
|
|
34
44
|
"license": "MIT",
|
|
45
|
+
"pnpm": {
|
|
46
|
+
"onlyBuiltDependencies": [
|
|
47
|
+
"esbuild"
|
|
48
|
+
],
|
|
49
|
+
"overrides": {
|
|
50
|
+
"path-to-regexp": "^0.1.13",
|
|
51
|
+
"picomatch": "^2.3.2"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
35
54
|
"repository": {
|
|
36
55
|
"type": "git",
|
|
37
56
|
"url": "git+https://github.com/kibologic/alpine-erp-core.git"
|
|
38
|
-
},
|
|
39
|
-
"scripts": {
|
|
40
|
-
"build": "tsc -b",
|
|
41
|
-
"dev": "tsc -b --watch",
|
|
42
|
-
"clean": "rm -rf dist node_modules && rm -f tsconfig.tsbuildinfo",
|
|
43
|
-
"generate-import-map": "tsx src/internal/generate-import-map-cli.ts",
|
|
44
|
-
"test": "node --import tsx --test __tests__/import-rewriter-bug.test.ts",
|
|
45
|
-
"changeset": "changeset",
|
|
46
|
-
"release:version": "changeset version",
|
|
47
|
-
"release:publish": "changeset publish"
|
|
48
57
|
}
|
|
49
|
-
}
|
|
58
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -69,7 +69,7 @@ async function start(): Promise<void> {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
async function build(): Promise<void> {
|
|
72
|
-
const { SwiteBuilder } = await import("./builder.js");
|
|
72
|
+
const { SwiteBuilder } = await import("./build-engine/builder.js");
|
|
73
73
|
const config = await loadUserConfig(root);
|
|
74
74
|
const builder = new SwiteBuilder({
|
|
75
75
|
root,
|
|
@@ -97,7 +97,7 @@ export async function toUrl(
|
|
|
97
97
|
// Only prefer src over dist for workspace packages — never for node_modules
|
|
98
98
|
if (normalized.includes("/dist/") && !normalized.includes("/src/") && !normalized.includes("/node_modules/")) {
|
|
99
99
|
const srcPath = normalized.replace("/dist/", "/src/").replace(/\.js$/, ".ts");
|
|
100
|
-
const { resolveFilePath } = await import("
|
|
100
|
+
const { resolveFilePath } = await import("./path/file-path-resolver.js");
|
|
101
101
|
const workspaceRoot = await context.getWorkspaceRoot();
|
|
102
102
|
const srcFilePath = await resolveFilePath(srcPath, context.root, workspaceRoot);
|
|
103
103
|
if (await context.fileExists(srcFilePath)) {
|
package/dist/builder.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,EAAE,WAAW;IAezB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA6Bd,cAAc;YAMd,iBAAiB;YA+BjB,gBAAgB;YAsEhB,6BAA6B;YA+J7B,MAAM;YAsdN,gBAAgB;YAchB,cAAc;YAuBd,SAAS;YAuBT,OAAO;IAgBrB,OAAO,CAAC,WAAW;YAQL,iBAAiB;YAyBjB,UAAU;YASV,aAAa;CAiC5B;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compilation-cache.d.ts","sourceRoot":"","sources":["../../src/cache/compilation-cache.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAEhC;;OAEG;IACG,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GACvD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+EzB;;OAEG;IACG,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GACvD,OAAO,CAAC,IAAI,CAAC;IAiChB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAM9C;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgC3E"}
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,SAAS,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAErE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pythonDevManager.d.ts","sourceRoot":"","sources":["../../src/dev/pythonDevManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAQxD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C"}
|
package/dist/env.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export interface EnvConfig {
|
|
2
|
-
mode?: "development" | "production";
|
|
3
|
-
prefix?: string;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Load environment variables from .env files
|
|
7
|
-
* Supports .env, .env.local, .env.[mode], .env.[mode].local
|
|
8
|
-
*/
|
|
9
|
-
export declare function loadEnv(root: string, mode?: string): Record<string, string>;
|
|
10
|
-
/**
|
|
11
|
-
* Generate import.meta.env replacement code
|
|
12
|
-
* Injects environment variables as a module that can be imported
|
|
13
|
-
*/
|
|
14
|
-
export declare function generateEnvModule(env: Record<string, string>, prefix?: string): string;
|
|
15
|
-
/**
|
|
16
|
-
* Inject import.meta.env polyfill into code
|
|
17
|
-
*/
|
|
18
|
-
export declare function injectEnvPolyfill(code: string): string;
|
|
19
|
-
//# sourceMappingURL=env.d.ts.map
|
package/dist/env.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAsB,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,MAAM,GAAE,MAAiB,GACxB,MAAM,CAwCR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqCtD"}
|
package/dist/env.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Environment Variable Support for SWITE
|
|
3
|
-
* Provides import.meta.env replacement for SWITE
|
|
4
|
-
*/
|
|
5
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
6
|
-
import { join } from "node:path";
|
|
7
|
-
/**
|
|
8
|
-
* Load environment variables from .env files
|
|
9
|
-
* Supports .env, .env.local, .env.[mode], .env.[mode].local
|
|
10
|
-
*/
|
|
11
|
-
export function loadEnv(root, mode = "development") {
|
|
12
|
-
const env = {};
|
|
13
|
-
const envFiles = [`.env.${mode}.local`, `.env.${mode}`, `.env.local`, `.env`];
|
|
14
|
-
for (const file of envFiles) {
|
|
15
|
-
const envPath = join(root, file);
|
|
16
|
-
if (existsSync(envPath)) {
|
|
17
|
-
const content = readFileSync(envPath, "utf-8");
|
|
18
|
-
for (const line of content.split("\n")) {
|
|
19
|
-
const trimmed = line.trim();
|
|
20
|
-
if (trimmed && !trimmed.startsWith("#")) {
|
|
21
|
-
const match = trimmed.match(/^([^=]+)=(.*)$/);
|
|
22
|
-
if (match) {
|
|
23
|
-
const [, key, value] = match;
|
|
24
|
-
// Remove quotes if present
|
|
25
|
-
const cleanValue = value.replace(/^["']|["']$/g, "");
|
|
26
|
-
env[key.trim()] = cleanValue;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return env;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Generate import.meta.env replacement code
|
|
36
|
-
* Injects environment variables as a module that can be imported
|
|
37
|
-
*/
|
|
38
|
-
export function generateEnvModule(env, prefix = "SWITE_") {
|
|
39
|
-
// Filter env vars by prefix and expose them
|
|
40
|
-
const switeEnv = {};
|
|
41
|
-
const publicEnv = {};
|
|
42
|
-
for (const [key, value] of Object.entries(env)) {
|
|
43
|
-
if (key.startsWith(prefix)) {
|
|
44
|
-
// Remove prefix for SWITE_ prefixed vars
|
|
45
|
-
const cleanKey = key.slice(prefix.length);
|
|
46
|
-
switeEnv[cleanKey] = value;
|
|
47
|
-
publicEnv[key] = value;
|
|
48
|
-
}
|
|
49
|
-
else if (key.startsWith("PUBLIC_")) {
|
|
50
|
-
// PUBLIC_ vars are always exposed
|
|
51
|
-
publicEnv[key] = value;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Build env object with all variables
|
|
55
|
-
const allEnvEntries = [
|
|
56
|
-
...Object.entries(switeEnv).map(([key, value]) => [key, value]),
|
|
57
|
-
...Object.entries(publicEnv).map(([key, value]) => [key, value]),
|
|
58
|
-
["MODE", process.env.NODE_ENV || "development"],
|
|
59
|
-
["DEV", process.env.NODE_ENV !== "production"],
|
|
60
|
-
["PROD", process.env.NODE_ENV === "production"],
|
|
61
|
-
];
|
|
62
|
-
return `
|
|
63
|
-
// SWITE Environment Variables
|
|
64
|
-
// Generated at runtime - do not edit manually
|
|
65
|
-
export const env = {
|
|
66
|
-
${allEnvEntries
|
|
67
|
-
.map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
|
|
68
|
-
.join(",\n ")},
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
// For import.meta.env compatibility
|
|
72
|
-
if (typeof globalThis !== 'undefined') {
|
|
73
|
-
globalThis.__swite_env__ = env;
|
|
74
|
-
}
|
|
75
|
-
`;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Inject import.meta.env polyfill into code
|
|
79
|
-
*/
|
|
80
|
-
export function injectEnvPolyfill(code) {
|
|
81
|
-
// Check if import.meta.env is used
|
|
82
|
-
if (!code.includes("import.meta.env") && !code.includes("__swite_env__")) {
|
|
83
|
-
return code;
|
|
84
|
-
}
|
|
85
|
-
// Inject polyfill at the top - load env module first
|
|
86
|
-
const polyfill = `
|
|
87
|
-
// SWITE import.meta.env polyfill
|
|
88
|
-
import { env as switeEnv } from '/__swite_env';
|
|
89
|
-
if (typeof globalThis !== 'undefined') {
|
|
90
|
-
globalThis.__swite_env__ = switeEnv;
|
|
91
|
-
}
|
|
92
|
-
if (typeof import !== 'undefined' && import.meta) {
|
|
93
|
-
import.meta.env = switeEnv;
|
|
94
|
-
} else if (typeof globalThis !== 'undefined') {
|
|
95
|
-
// Fallback for environments without import.meta
|
|
96
|
-
if (!globalThis.import) {
|
|
97
|
-
globalThis.import = { meta: {} };
|
|
98
|
-
}
|
|
99
|
-
if (!globalThis.import.meta) {
|
|
100
|
-
globalThis.import.meta = {};
|
|
101
|
-
}
|
|
102
|
-
globalThis.import.meta.env = switeEnv;
|
|
103
|
-
}
|
|
104
|
-
`;
|
|
105
|
-
// Find the first import statement or start of file
|
|
106
|
-
const firstImport = code.match(/^import\s+/m);
|
|
107
|
-
if (firstImport) {
|
|
108
|
-
const insertIndex = firstImport.index;
|
|
109
|
-
return (code.slice(0, insertIndex) + polyfill + "\n" + code.slice(insertIndex));
|
|
110
|
-
}
|
|
111
|
-
return polyfill + "\n" + code;
|
|
112
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/base-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAMjD;AAED;;GAEG;AACH,qBAAa,WAAW;IACV,SAAS,CAAC,OAAO,EAAE,cAAc;gBAAvB,OAAO,EAAE,cAAc;cAE7B,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAI7C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ/D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"js-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/js-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAK3B,qBAAa,SAAU,SAAQ,WAAW;IACxC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,cAAc;IAO7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAsGxD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mjs-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/mjs-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAG3B,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,cAAc;IAK7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuCxD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-module-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/node-module-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOrE,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,cAAc;IAO7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAqRvD;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CA0BjC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/ts-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,SAAU,SAAQ,WAAW;gBAC5B,OAAO,EAAE,cAAc;IAInC;;OAEG;YACW,eAAe;IAwBvB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuHxD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ui-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/ui-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,SAAU,SAAQ,WAAW;IACxC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAInC;;OAEG;YACW,eAAe;IAyBvB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAwLxD"}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2024 Themba Mzumara
|
|
3
|
-
* SWITE - SWISS Development Server
|
|
4
|
-
* Licensed under the MIT License.
|
|
5
|
-
*/
|
|
6
|
-
import { promises as fs } from "node:fs";
|
|
7
|
-
import { UiCompiler } from "@kibologic/compiler";
|
|
8
|
-
import chalk from "chalk";
|
|
9
|
-
import { rewriteImports } from "../import-rewriter.js";
|
|
10
|
-
import { compilationCache } from "../cache/compilation-cache.js";
|
|
11
|
-
import { BaseHandler, setDevHeaders, } from "./base-handler.js";
|
|
12
|
-
export class UIHandler extends BaseHandler {
|
|
13
|
-
constructor(context) {
|
|
14
|
-
super(context);
|
|
15
|
-
this.compiler = new UiCompiler();
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Extract dependencies from compiled code (import paths)
|
|
19
|
-
*/
|
|
20
|
-
async getDependencies(compiled) {
|
|
21
|
-
const deps = [];
|
|
22
|
-
const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
|
|
23
|
-
let match;
|
|
24
|
-
while ((match = importPattern.exec(compiled)) !== null) {
|
|
25
|
-
const specifier = match[1];
|
|
26
|
-
// Only track absolute paths and workspace paths (not relative)
|
|
27
|
-
if (specifier.startsWith("/") || specifier.startsWith("@")) {
|
|
28
|
-
try {
|
|
29
|
-
// Try to resolve to actual file path
|
|
30
|
-
const resolved = await this.context.resolver.resolve(specifier, "");
|
|
31
|
-
if (resolved && !resolved.startsWith("http")) {
|
|
32
|
-
deps.push(resolved);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
// Ignore resolution errors for dependency tracking
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return deps;
|
|
41
|
-
}
|
|
42
|
-
async handle(url, res) {
|
|
43
|
-
const filePath = await this.resolveFilePath(url);
|
|
44
|
-
console.log(chalk.blue(`[.ui] ${url} → ${filePath}`));
|
|
45
|
-
// Check if file exists
|
|
46
|
-
try {
|
|
47
|
-
await fs.access(filePath);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
console.error(chalk.red(`[.ui] File not found: ${filePath}`));
|
|
51
|
-
throw new Error(`File not found: ${url} (resolved to: ${filePath})`);
|
|
52
|
-
}
|
|
53
|
-
// Check cache first
|
|
54
|
-
let cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
|
|
55
|
-
if (cached) {
|
|
56
|
-
console.log(chalk.yellow(`[.ui] Cache hit for ${url}`));
|
|
57
|
-
console.log(chalk.yellow(`[.ui] Cached content starts with: ${cached.substring(0, 50).replace(/\n/g, "\\n")}`));
|
|
58
|
-
// CRITICAL: Strip /swiss-lib/ paths from cached code too
|
|
59
|
-
// Old cache entries may have /swiss-lib/ paths from before the fix
|
|
60
|
-
if (cached.includes("/swiss-lib/")) {
|
|
61
|
-
console.log(chalk.yellow(`[.ui] Fixing /swiss-lib/ paths in cached code for ${url}`));
|
|
62
|
-
cached = cached.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
|
|
63
|
-
cached = cached.replace(/\/swiss-lib\//g, "/swiss-packages/");
|
|
64
|
-
// Also fix in import statements and URLs (preserve quote type)
|
|
65
|
-
cached = cached.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
|
|
66
|
-
}
|
|
67
|
-
setDevHeaders(res);
|
|
68
|
-
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
69
|
-
res.setHeader("Content-Length", Buffer.byteLength(cached, "utf-8"));
|
|
70
|
-
res.end(cached, "utf-8");
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
// Cache miss - compile
|
|
74
|
-
const source = await fs.readFile(filePath, "utf-8");
|
|
75
|
-
console.log(chalk.yellow(`[.ui] Compiling file: ${filePath}`));
|
|
76
|
-
console.log(chalk.yellow(`[.ui] Source starts with: ${source.substring(0, 50).replace(/\n/g, "\\n")}`));
|
|
77
|
-
let compiled = await this.compiler.compileAsync(source, filePath);
|
|
78
|
-
// Transform TypeScript output to plain JavaScript via esbuild
|
|
79
|
-
const esbuild = await import("esbuild");
|
|
80
|
-
const tsResult = await esbuild.transform(compiled, {
|
|
81
|
-
loader: "ts",
|
|
82
|
-
format: "esm",
|
|
83
|
-
target: "esnext",
|
|
84
|
-
sourcefile: filePath,
|
|
85
|
-
});
|
|
86
|
-
compiled = tsResult.code;
|
|
87
|
-
console.log(chalk.yellow(`[.ui] Compiled result starts with: ${compiled.substring(0, 50).replace(/\n/g, "\\n")}`));
|
|
88
|
-
// CRITICAL: Strip /swiss-lib/ paths from compiled output BEFORE import rewriting
|
|
89
|
-
// The compiler may output /swiss-lib/ paths directly in the code
|
|
90
|
-
if (compiled.includes("/swiss-lib/")) {
|
|
91
|
-
const beforeSwissLibFix = compiled;
|
|
92
|
-
// Fix all variations of /swiss-lib/ paths
|
|
93
|
-
compiled = compiled.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
|
|
94
|
-
compiled = compiled.replace(/\/swiss-lib\//g, "/swiss-packages/");
|
|
95
|
-
// Also fix in import statements and URLs (preserve quote type)
|
|
96
|
-
compiled = compiled.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
|
|
97
|
-
if (beforeSwissLibFix !== compiled) {
|
|
98
|
-
console.log(chalk.yellow(`[.ui] Fixed /swiss-lib/ paths in compiled output for ${url}`));
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// Strip CSS imports - they should be handled as static assets, not modules
|
|
102
|
-
// Use aggressive regex that matches all CSS import patterns
|
|
103
|
-
const beforeCssStrip = compiled;
|
|
104
|
-
// Pattern 1: Match standalone import statements for CSS (with or without semicolon, on their own line)
|
|
105
|
-
compiled = compiled.replace(/^\s*import\s+.*?\.css\s*['"];?\s*$/gm, '');
|
|
106
|
-
// Pattern 2: Match CSS imports anywhere in the code (more aggressive) - including without quotes
|
|
107
|
-
compiled = compiled.replace(/\bimport\s+.*?\.css\s*['"];?/g, '');
|
|
108
|
-
compiled = compiled.replace(/\bimport\s+['"].*?\.css['"];?/g, '');
|
|
109
|
-
// Pattern 3: Match dynamic imports for CSS
|
|
110
|
-
compiled = compiled.replace(/import\s*\(\s*['"].*?\.css['"]\s*\)/g, '');
|
|
111
|
-
// Pattern 4: Match CSS imports with different quote styles and whitespace
|
|
112
|
-
compiled = compiled.replace(/import\s+['"](.*?\.css)['"];?/g, '');
|
|
113
|
-
if (beforeCssStrip !== compiled) {
|
|
114
|
-
console.log(chalk.blue(`[.ui] Stripped CSS imports from ${url}`));
|
|
115
|
-
}
|
|
116
|
-
// Debug: Check for bare imports (only match actual bare imports, not paths)
|
|
117
|
-
// Pattern matches: import ... from "@package/name" or import("@package/name")
|
|
118
|
-
// But NOT: import ... from "/path/to/@package/name" (already a path)
|
|
119
|
-
const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
|
|
120
|
-
if (bareImportPattern.test(compiled)) {
|
|
121
|
-
console.log(chalk.yellow(`[.ui] WARNING: Compiled code contains bare imports: ${url}`));
|
|
122
|
-
}
|
|
123
|
-
const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
|
|
124
|
-
// FINAL SAFETY: Strip any remaining /swiss-lib/ paths after import rewriting
|
|
125
|
-
// This catches any paths that might have slipped through
|
|
126
|
-
let finalCode = rewritten;
|
|
127
|
-
if (finalCode.includes("/swiss-lib/")) {
|
|
128
|
-
const beforeFinal = finalCode;
|
|
129
|
-
const count = (beforeFinal.match(/\/swiss-lib\//g) || []).length;
|
|
130
|
-
console.log(chalk.red(`[.ui] 🚨 FINAL PASS TRIGGERED: Found ${count} /swiss-lib/ paths in ${url}`));
|
|
131
|
-
// Multiple passes to catch all variations
|
|
132
|
-
finalCode = finalCode.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
|
|
133
|
-
finalCode = finalCode.replace(/\/swiss-lib\//g, "/swiss-packages/");
|
|
134
|
-
finalCode = finalCode.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
|
|
135
|
-
if (beforeFinal !== finalCode) {
|
|
136
|
-
const afterCount = (finalCode.match(/\/swiss-lib\//g) || []).length;
|
|
137
|
-
console.log(chalk.green(`[.ui] ✅ FINAL PASS: Fixed ${count} /swiss-lib/ paths (${afterCount} remaining) in ${url}`));
|
|
138
|
-
if (afterCount > 0) {
|
|
139
|
-
console.log(chalk.red(`[.ui] ❌ STILL HAS /swiss-lib/: ${finalCode.substring(0, 500)}`));
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
console.log(chalk.red(`[.ui] ❌ FINAL PASS FAILED: No changes made!`));
|
|
144
|
-
console.log(chalk.yellow(`[.ui] Sample: ${beforeFinal.substring(0, 200)}`));
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// Store in cache
|
|
148
|
-
await compilationCache.set(filePath, compiled, finalCode, (compiled) => this.getDependencies(compiled));
|
|
149
|
-
// Debug: Verify no bare imports remain after rewriting
|
|
150
|
-
if (bareImportPattern.test(finalCode)) {
|
|
151
|
-
console.log(chalk.red(`[.ui] ERROR: Bare imports still present after rewriting: ${url}`));
|
|
152
|
-
const matches = Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g));
|
|
153
|
-
for (const match of matches.slice(0, 3)) {
|
|
154
|
-
console.log(chalk.red(`[.ui] Unresolved import: ${match[1]}`));
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
// Set headers BEFORE sending response
|
|
158
|
-
setDevHeaders(res);
|
|
159
|
-
// Explicitly set Content-Type to ensure it's not overridden
|
|
160
|
-
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
161
|
-
// Log the Content-Type being sent
|
|
162
|
-
console.log(chalk.green(`[.ui] Sending response with Content-Type: ${res.getHeader("Content-Type")}`));
|
|
163
|
-
console.log(chalk.green(`[.ui] Response body length: ${rewritten.length} chars`));
|
|
164
|
-
console.log(chalk.green(`[.ui] Response body preview: ${rewritten.substring(0, 100)}...`));
|
|
165
|
-
// Send response - use res.end() to ensure headers are final
|
|
166
|
-
// Double-check Content-Type one more time
|
|
167
|
-
const finalContentType = res.getHeader("Content-Type");
|
|
168
|
-
if (finalContentType !== "application/javascript; charset=utf-8") {
|
|
169
|
-
console.error(chalk.red(`[.ui] ⚠️ Content-Type is wrong before send! Expected: application/javascript, Got: ${finalContentType}`));
|
|
170
|
-
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
171
|
-
}
|
|
172
|
-
console.log(chalk.green(`[.ui] Final Content-Type: ${res.getHeader("Content-Type")}`));
|
|
173
|
-
console.log(chalk.green(`[.ui] Sending ${finalCode.length} bytes of JavaScript`));
|
|
174
|
-
// Use res.end() instead of res.send() to have more control
|
|
175
|
-
res.setHeader("Content-Length", Buffer.byteLength(finalCode, "utf-8"));
|
|
176
|
-
res.end(finalCode, "utf-8");
|
|
177
|
-
// Ensure headersSent is set (should be set by res.end(), but verify)
|
|
178
|
-
if (!res.headersSent) {
|
|
179
|
-
console.error(chalk.red(`[.ui] ⚠️ res.end() called but headersSent is still false!`));
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uix-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/uix-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAInC;;OAEG;YACW,eAAe;IAwBvB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuIxD"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2024 Themba Mzumara
|
|
3
|
-
* SWITE - SWISS Development Server
|
|
4
|
-
* Licensed under the MIT License.
|
|
5
|
-
*/
|
|
6
|
-
import { promises as fs } from "node:fs";
|
|
7
|
-
import { UiCompiler } from "@kibologic/compiler";
|
|
8
|
-
import chalk from "chalk";
|
|
9
|
-
import { rewriteImports } from "../import-rewriter.js";
|
|
10
|
-
import { compilationCache } from "../cache/compilation-cache.js";
|
|
11
|
-
import { BaseHandler, setDevHeaders, } from "./base-handler.js";
|
|
12
|
-
export class UIXHandler extends BaseHandler {
|
|
13
|
-
constructor(context) {
|
|
14
|
-
super(context);
|
|
15
|
-
this.compiler = new UiCompiler();
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Extract dependencies from compiled code (import paths)
|
|
19
|
-
*/
|
|
20
|
-
async getDependencies(compiled) {
|
|
21
|
-
const deps = [];
|
|
22
|
-
const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
|
|
23
|
-
let match;
|
|
24
|
-
while ((match = importPattern.exec(compiled)) !== null) {
|
|
25
|
-
const specifier = match[1];
|
|
26
|
-
// Only track absolute paths and workspace paths (not relative)
|
|
27
|
-
if (specifier.startsWith("/") || specifier.startsWith("@")) {
|
|
28
|
-
try {
|
|
29
|
-
const resolved = await this.context.resolver.resolve(specifier, "");
|
|
30
|
-
if (resolved && !resolved.startsWith("http")) {
|
|
31
|
-
deps.push(resolved);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
// Ignore resolution errors
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return deps;
|
|
40
|
-
}
|
|
41
|
-
async handle(url, res) {
|
|
42
|
-
const filePath = await this.resolveFilePath(url);
|
|
43
|
-
console.log(chalk.blue(`[.uix] ${url}`));
|
|
44
|
-
// Check cache first
|
|
45
|
-
let cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
|
|
46
|
-
if (cached) {
|
|
47
|
-
// CRITICAL: Strip /swiss-lib/ paths from cached code too
|
|
48
|
-
// Old cache entries may have /swiss-lib/ paths from before the fix
|
|
49
|
-
if (cached.includes("/swiss-lib/")) {
|
|
50
|
-
console.log(chalk.yellow(`[.uix] Fixing /swiss-lib/ paths in cached code for ${url}`));
|
|
51
|
-
cached = cached.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
|
|
52
|
-
cached = cached.replace(/\/swiss-lib\//g, "/swiss-packages/");
|
|
53
|
-
// Also fix in import statements and URLs (preserve quote type)
|
|
54
|
-
cached = cached.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
|
|
55
|
-
}
|
|
56
|
-
setDevHeaders(res);
|
|
57
|
-
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
58
|
-
res.send(cached);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
// Cache miss - compile
|
|
62
|
-
const source = await fs.readFile(filePath, "utf-8");
|
|
63
|
-
let compiled = await this.compiler.compileAsync(source, filePath);
|
|
64
|
-
// Transform TypeScript output to plain JavaScript via esbuild
|
|
65
|
-
const esbuild = await import("esbuild");
|
|
66
|
-
const tsResult = await esbuild.transform(compiled, {
|
|
67
|
-
loader: "ts",
|
|
68
|
-
format: "esm",
|
|
69
|
-
target: "esnext",
|
|
70
|
-
sourcefile: filePath,
|
|
71
|
-
});
|
|
72
|
-
compiled = tsResult.code;
|
|
73
|
-
// CRITICAL: Strip /swiss-lib/ paths from compiled output BEFORE import rewriting
|
|
74
|
-
// The compiler may output /swiss-lib/ paths directly in the code
|
|
75
|
-
if (compiled.includes("/swiss-lib/")) {
|
|
76
|
-
const beforeSwissLibFix = compiled;
|
|
77
|
-
// Fix all variations of /swiss-lib/ paths
|
|
78
|
-
compiled = compiled.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
|
|
79
|
-
compiled = compiled.replace(/\/swiss-lib\//g, "/swiss-packages/");
|
|
80
|
-
// Also fix in import statements and URLs (preserve quote type)
|
|
81
|
-
compiled = compiled.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
|
|
82
|
-
if (beforeSwissLibFix !== compiled) {
|
|
83
|
-
console.log(chalk.yellow(`[.uix] Fixed /swiss-lib/ paths in compiled output for ${url}`));
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
// Strip CSS imports - they should be handled as static assets, not modules
|
|
87
|
-
// Use aggressive regex that matches all CSS import patterns
|
|
88
|
-
const beforeCssStrip = compiled;
|
|
89
|
-
// Pattern 1: Match standalone import statements for CSS (with or without semicolon, on their own line)
|
|
90
|
-
compiled = compiled.replace(/^\s*import\s+.*?\.css\s*['"];?\s*$/gm, '');
|
|
91
|
-
// Pattern 2: Match CSS imports anywhere in the code (more aggressive) - including without quotes
|
|
92
|
-
compiled = compiled.replace(/\bimport\s+.*?\.css\s*['"];?/g, '');
|
|
93
|
-
compiled = compiled.replace(/\bimport\s+['"].*?\.css['"];?/g, '');
|
|
94
|
-
// Pattern 3: Match dynamic imports for CSS
|
|
95
|
-
compiled = compiled.replace(/import\s*\(\s*['"].*?\.css['"]\s*\)/g, '');
|
|
96
|
-
// Pattern 4: Match CSS imports with different quote styles and whitespace
|
|
97
|
-
compiled = compiled.replace(/import\s+['"](.*?\.css)['"];?/g, '');
|
|
98
|
-
if (beforeCssStrip !== compiled) {
|
|
99
|
-
console.log(chalk.blue(`[.uix] Stripped CSS imports from ${url}`));
|
|
100
|
-
}
|
|
101
|
-
// Debug: Check for bare imports (only match actual bare imports, not paths)
|
|
102
|
-
// Pattern matches: import ... from "@package/name" or import("@package/name")
|
|
103
|
-
// But NOT: import ... from "/path/to/@package/name" (already a path)
|
|
104
|
-
const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
|
|
105
|
-
if (bareImportPattern.test(compiled)) {
|
|
106
|
-
console.log(chalk.yellow(`[.uix] WARNING: Compiled code contains bare imports: ${url}`));
|
|
107
|
-
}
|
|
108
|
-
const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
|
|
109
|
-
// FINAL SAFETY: Strip any remaining /swiss-lib/ paths after import rewriting
|
|
110
|
-
// This catches any paths that might have slipped through
|
|
111
|
-
let finalCode = rewritten;
|
|
112
|
-
if (finalCode.includes("/swiss-lib/")) {
|
|
113
|
-
const beforeFinal = finalCode;
|
|
114
|
-
finalCode = finalCode.replace(/\/swiss-lib\/packages\//g, "/swiss-packages/");
|
|
115
|
-
finalCode = finalCode.replace(/\/swiss-lib\//g, "/swiss-packages/");
|
|
116
|
-
finalCode = finalCode.replace(/(['"])\/swiss-lib\//g, '$1/swiss-packages/');
|
|
117
|
-
if (beforeFinal !== finalCode) {
|
|
118
|
-
console.log(chalk.red(`[.uix] ⚠️ FINAL PASS: Fixed ${beforeFinal.split('/swiss-lib/').length - 1} remaining /swiss-lib/ paths in ${url}`));
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Store in cache
|
|
122
|
-
await compilationCache.set(filePath, compiled, finalCode, (compiled) => this.getDependencies(compiled));
|
|
123
|
-
// Debug: Verify no bare imports remain after rewriting
|
|
124
|
-
if (bareImportPattern.test(finalCode)) {
|
|
125
|
-
console.log(chalk.red(`[.uix] ERROR: Bare imports still present after rewriting: ${url}`));
|
|
126
|
-
const matches = Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g));
|
|
127
|
-
for (const match of matches.slice(0, 3)) {
|
|
128
|
-
console.log(chalk.red(`[.uix] Unresolved import: ${match[1]}`));
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
setDevHeaders(res);
|
|
132
|
-
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
133
|
-
res.send(finalCode);
|
|
134
|
-
}
|
|
135
|
-
}
|
package/dist/hmr.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../src/hmr.ts"],"names":[],"mappings":"AASA,qBAAa,SAAS;IAOlB,OAAO,CAAC,IAAI;IANd,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAS;gBAGX,IAAI,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM;IAOZ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBnB,kBAAkB;IAUhC,OAAO,CAAC,cAAc;YAYR,YAAY;IAmB1B,OAAO,IAAI,MAAM;IAIX,KAAK;IA4BX,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAYpC,eAAe,IAAI,MAAM;IAyIzB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,SAAS;IAcX,IAAI;CAIX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"import-rewriter.d.ts","sourceRoot":"","sources":["../src/import-rewriter.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/C,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAkbjB"}
|