@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwiteProxyError.d.ts","sourceRoot":"","sources":["../../../src/adapters/proxy/SwiteProxyError.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;gBAEnB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;CAOpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxyToPython.d.ts","sourceRoot":"","sources":["../../../src/adapters/proxy/proxyToPython.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAMlE;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAEjE;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAiDxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/build-engine/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;YAqBd,cAAc;YAMd,iBAAiB;YA+BjB,gBAAgB;YAsEhB,6BAA6B;YA+J7B,MAAM;YAmdN,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"}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
import { build as esbuild } from "esbuild";
|
|
7
|
-
import { UiCompiler } from "@
|
|
7
|
+
import { UiCompiler } from "@swissjs/compiler";
|
|
8
8
|
import { promises as fs } from "node:fs";
|
|
9
9
|
import path from "node:path";
|
|
10
10
|
import chalk from "chalk";
|
|
11
|
-
import { ModuleResolver } from "
|
|
11
|
+
import { ModuleResolver } from "../resolution/resolver.js";
|
|
12
12
|
export class SwiteBuilder {
|
|
13
13
|
constructor(config) {
|
|
14
14
|
this.compiler = new UiCompiler();
|
|
@@ -28,18 +28,12 @@ export class SwiteBuilder {
|
|
|
28
28
|
async build() {
|
|
29
29
|
const startTime = Date.now();
|
|
30
30
|
console.log(chalk.cyan("\n⚡ SWITE - Production Build\n"));
|
|
31
|
+
const tempDir = path.join(this.config.root, ".swite-build");
|
|
31
32
|
try {
|
|
32
|
-
// Step 1: Clean output directory
|
|
33
33
|
await this.cleanOutputDir();
|
|
34
|
-
// Step 2: Compile Swiss files to temp directory
|
|
35
|
-
const tempDir = path.join(this.config.root, ".swite-build");
|
|
36
34
|
await this.compileSwissFiles(tempDir);
|
|
37
|
-
// Step 3: Bundle with esbuild
|
|
38
35
|
await this.bundle(tempDir);
|
|
39
|
-
// Step 4: Copy public assets
|
|
40
36
|
await this.copyPublicAssets();
|
|
41
|
-
// Step 5: Clean up temp directory
|
|
42
|
-
await fs.rm(tempDir, { recursive: true, force: true });
|
|
43
37
|
const duration = Date.now() - startTime;
|
|
44
38
|
console.log(chalk.green(`\n✅ Build completed in ${duration}ms\n`));
|
|
45
39
|
}
|
|
@@ -47,6 +41,9 @@ export class SwiteBuilder {
|
|
|
47
41
|
console.error(chalk.red("\n❌ Build failed:"), error);
|
|
48
42
|
throw error;
|
|
49
43
|
}
|
|
44
|
+
finally {
|
|
45
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
46
|
+
}
|
|
50
47
|
}
|
|
51
48
|
async cleanOutputDir() {
|
|
52
49
|
console.log(chalk.blue("🧹 Cleaning output directory..."));
|
|
@@ -284,12 +281,9 @@ export class SwiteBuilder {
|
|
|
284
281
|
// Configure esbuild to resolve workspace packages from temp directory
|
|
285
282
|
const absWorkingDir = workspaceRoot || this.config.root;
|
|
286
283
|
// const aliases = workspaceRoot ? await this.createAliases(workspaceRoot, tempDir) : {}; // Unused
|
|
287
|
-
// Mark Node.js built-ins
|
|
284
|
+
// Mark Node.js built-ins as external; user-facing framework packages are
|
|
285
|
+
// resolved at runtime — do not hardcode package scopes here
|
|
288
286
|
const nodeBuiltins = [
|
|
289
|
-
"@kibologic/swite",
|
|
290
|
-
"@kibologic/core",
|
|
291
|
-
"@kibologic/*",
|
|
292
|
-
"@kibologic/*",
|
|
293
287
|
"fs",
|
|
294
288
|
"path",
|
|
295
289
|
"os",
|
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
-
import { SwiteServer } from "./server.js";
|
|
5
|
-
import { loadUserConfig } from "./config-loader.js";
|
|
6
|
-
import { startPythonDevService, stopPythonDevService, } from "./dev/pythonDevManager.js";
|
|
7
|
-
import { setProductionMode } from "./proxy/proxyToPython.js";
|
|
4
|
+
import { SwiteServer } from "./dev-engine/server.js";
|
|
5
|
+
import { loadUserConfig } from "./config/config-loader.js";
|
|
6
|
+
import { startPythonDevService, stopPythonDevService, } from "./dev-engine/pythonDevManager.js";
|
|
7
|
+
import { setProductionMode } from "./adapters/proxy/proxyToPython.js";
|
|
8
8
|
const [, , command, ...args] = process.argv;
|
|
9
9
|
const root = resolve(process.cwd());
|
|
10
10
|
async function dev() {
|
|
@@ -49,7 +49,7 @@ async function start() {
|
|
|
49
49
|
await server.start();
|
|
50
50
|
}
|
|
51
51
|
async function build() {
|
|
52
|
-
const { SwiteBuilder } = await import("./builder.js");
|
|
52
|
+
const { SwiteBuilder } = await import("./build-engine/builder.js");
|
|
53
53
|
const config = await loadUserConfig(root);
|
|
54
54
|
const builder = new SwiteBuilder({
|
|
55
55
|
root,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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, prefix?: string): Record<string, string>;
|
|
10
|
+
/**
|
|
11
|
+
* Replace all import.meta.env references in compiled code with their literal values.
|
|
12
|
+
*
|
|
13
|
+
* This is the only correct approach for ES modules — import.meta is sealed and
|
|
14
|
+
* import.meta.env cannot be assigned at runtime. All substitution must happen at
|
|
15
|
+
* transform time (here, after esbuild strips TypeScript).
|
|
16
|
+
*
|
|
17
|
+
* Handles:
|
|
18
|
+
* - import.meta.env.KEY → JSON.stringify(env[KEY]) or "undefined"
|
|
19
|
+
* - import.meta.env.DEV → true/false literal
|
|
20
|
+
* - import.meta.env.PROD → true/false literal
|
|
21
|
+
* - import.meta.env.MODE → "development"/"production" literal
|
|
22
|
+
* - bare import.meta.env → serialized object literal (for spread, typeof, etc.)
|
|
23
|
+
*/
|
|
24
|
+
export declare function inlineEnvReferences(code: string, env: Record<string, string>, mode?: string): string;
|
|
25
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/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,EAC5B,MAAM,GAAE,MAAiB,GACxB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,IAAI,GAAE,MAAsB,GAC3B,MAAM,CAsBR"}
|
|
@@ -0,0 +1,84 @@
|
|
|
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", prefix = "SWITE_") {
|
|
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
|
+
continue;
|
|
18
|
+
const content = readFileSync(envPath, "utf-8");
|
|
19
|
+
for (const line of content.split("\n")) {
|
|
20
|
+
const trimmed = line.trim();
|
|
21
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
22
|
+
continue;
|
|
23
|
+
const match = trimmed.match(/^([^=]+)=(.*)$/);
|
|
24
|
+
if (!match)
|
|
25
|
+
continue;
|
|
26
|
+
const key = match[1].trim();
|
|
27
|
+
const value = match[2].replace(/^["']|["']$/g, "");
|
|
28
|
+
if (key.startsWith(prefix) || key.startsWith("PUBLIC_")) {
|
|
29
|
+
env[key] = value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return env;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Replace all import.meta.env references in compiled code with their literal values.
|
|
37
|
+
*
|
|
38
|
+
* This is the only correct approach for ES modules — import.meta is sealed and
|
|
39
|
+
* import.meta.env cannot be assigned at runtime. All substitution must happen at
|
|
40
|
+
* transform time (here, after esbuild strips TypeScript).
|
|
41
|
+
*
|
|
42
|
+
* Handles:
|
|
43
|
+
* - import.meta.env.KEY → JSON.stringify(env[KEY]) or "undefined"
|
|
44
|
+
* - import.meta.env.DEV → true/false literal
|
|
45
|
+
* - import.meta.env.PROD → true/false literal
|
|
46
|
+
* - import.meta.env.MODE → "development"/"production" literal
|
|
47
|
+
* - bare import.meta.env → serialized object literal (for spread, typeof, etc.)
|
|
48
|
+
*/
|
|
49
|
+
export function inlineEnvReferences(code, env, mode = "development") {
|
|
50
|
+
if (!code.includes("import.meta.env"))
|
|
51
|
+
return code;
|
|
52
|
+
const isDev = mode !== "production";
|
|
53
|
+
// Named key access first (most specific)
|
|
54
|
+
code = code.replace(/\bimport\.meta\.env\.([A-Z_][A-Z0-9_]*)\b/g, (_, key) => {
|
|
55
|
+
if (key === "DEV")
|
|
56
|
+
return String(isDev);
|
|
57
|
+
if (key === "PROD")
|
|
58
|
+
return String(!isDev);
|
|
59
|
+
if (key === "MODE")
|
|
60
|
+
return JSON.stringify(mode);
|
|
61
|
+
if (key === "SSR")
|
|
62
|
+
return "false";
|
|
63
|
+
if (key in env)
|
|
64
|
+
return JSON.stringify(env[key]);
|
|
65
|
+
return "undefined";
|
|
66
|
+
});
|
|
67
|
+
// Bare import.meta.env (spread/typeof patterns)
|
|
68
|
+
if (code.includes("import.meta.env")) {
|
|
69
|
+
const envLiteral = buildEnvLiteral(env, mode);
|
|
70
|
+
code = code.replace(/\bimport\.meta\.env\b/g, envLiteral);
|
|
71
|
+
}
|
|
72
|
+
return code;
|
|
73
|
+
}
|
|
74
|
+
function buildEnvLiteral(env, mode) {
|
|
75
|
+
const isDev = mode !== "production";
|
|
76
|
+
const entries = [
|
|
77
|
+
`MODE:${JSON.stringify(mode)}`,
|
|
78
|
+
`DEV:${isDev}`,
|
|
79
|
+
`PROD:${!isDev}`,
|
|
80
|
+
`SSR:false`,
|
|
81
|
+
...Object.entries(env).map(([k, v]) => `${JSON.stringify(k)}:${JSON.stringify(v)}`),
|
|
82
|
+
];
|
|
83
|
+
return `({${entries.join(",")}})`;
|
|
84
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { Response } from "express";
|
|
2
|
-
import { ModuleResolver } from "
|
|
2
|
+
import { ModuleResolver } from "../../resolution/resolver.js";
|
|
3
3
|
export interface HandlerContext {
|
|
4
4
|
resolver: ModuleResolver;
|
|
5
5
|
root: string;
|
|
6
6
|
workspaceRoot: string | null;
|
|
7
|
+
env: Record<string, string>;
|
|
7
8
|
}
|
|
8
9
|
/**
|
|
9
10
|
* Set cache-busting headers for development
|
|
@@ -17,5 +18,6 @@ export declare class BaseHandler {
|
|
|
17
18
|
constructor(context: HandlerContext);
|
|
18
19
|
protected resolveFilePath(url: string): Promise<string>;
|
|
19
20
|
protected fileExists(filePath: string): Promise<boolean>;
|
|
21
|
+
protected getDependencies(compiled: string): Promise<string[]>;
|
|
20
22
|
}
|
|
21
23
|
//# sourceMappingURL=base-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/base-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;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;cAS9C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAmBrE"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
import { promises as fs } from "node:fs";
|
|
7
|
-
import { ModuleResolver } from "
|
|
8
|
-
import { resolveFilePath } from "
|
|
7
|
+
import { ModuleResolver } from "../../resolution/resolver.js";
|
|
8
|
+
import { resolveFilePath } from "../../resolution/path/file-path-resolver.js";
|
|
9
9
|
/**
|
|
10
10
|
* Set cache-busting headers for development
|
|
11
11
|
*/
|
|
@@ -35,4 +35,24 @@ export class BaseHandler {
|
|
|
35
35
|
return false;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
+
async getDependencies(compiled) {
|
|
39
|
+
const deps = [];
|
|
40
|
+
const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
|
|
41
|
+
let match;
|
|
42
|
+
while ((match = importPattern.exec(compiled)) !== null) {
|
|
43
|
+
const specifier = match[1];
|
|
44
|
+
if (specifier.startsWith("/") || specifier.startsWith("@")) {
|
|
45
|
+
try {
|
|
46
|
+
const resolved = await this.context.resolver.resolve(specifier, "");
|
|
47
|
+
if (resolved && !resolved.startsWith("http")) {
|
|
48
|
+
deps.push(resolved);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// ignore resolution errors during dependency tracking
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return deps;
|
|
57
|
+
}
|
|
38
58
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { promises as fs } from "node:fs";
|
|
7
7
|
import chalk from "chalk";
|
|
8
|
-
import { rewriteImports } from "
|
|
8
|
+
import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
|
|
9
9
|
import { BaseHandler, setDevHeaders, } from "./base-handler.js";
|
|
10
10
|
import { UIHandler } from "./ui-handler.js";
|
|
11
11
|
import { UIXHandler } from "./uix-handler.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mjs-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { promises as fs } from "node:fs";
|
|
7
7
|
import chalk from "chalk";
|
|
8
|
-
import { rewriteImports } from "
|
|
8
|
+
import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
|
|
9
9
|
import { BaseHandler, setDevHeaders, } from "./base-handler.js";
|
|
10
10
|
import { JSHandler } from "./js-handler.js";
|
|
11
11
|
export class MJSHandler extends BaseHandler {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-module-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/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"}
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
import { promises as fs } from "node:fs";
|
|
7
7
|
import * as path from "node:path";
|
|
8
8
|
import chalk from "chalk";
|
|
9
|
-
import { rewriteImports } from "
|
|
9
|
+
import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
|
|
10
10
|
import { BaseHandler } from "./base-handler.js";
|
|
11
11
|
import { UIHandler } from "./ui-handler.js";
|
|
12
12
|
import { UIXHandler } from "./uix-handler.js";
|
|
13
13
|
import { TSHandler } from "./ts-handler.js";
|
|
14
|
-
import { findWorkspaceRoot } from "
|
|
15
|
-
import { shouldUseCdnFallback } from "
|
|
14
|
+
import { findWorkspaceRoot } from "../../kernel/workspace.js";
|
|
15
|
+
import { shouldUseCdnFallback } from "../../resolution/cdn/cdn-fallback.js";
|
|
16
16
|
export class NodeModuleHandler extends BaseHandler {
|
|
17
17
|
constructor(context) {
|
|
18
18
|
super(context);
|
|
@@ -81,7 +81,7 @@ export class NodeModuleHandler extends BaseHandler {
|
|
|
81
81
|
catch (err2) {
|
|
82
82
|
console.log(chalk.yellow(`[node_modules] Workspace path failed: ${err2 instanceof Error ? err2.message : String(err2)}`));
|
|
83
83
|
// Try swiss-lib monorepo node_modules (dynamically found)
|
|
84
|
-
const { findSwissLibMonorepo } = await import("
|
|
84
|
+
const { findSwissLibMonorepo } = await import("../../kernel/package-finder.js");
|
|
85
85
|
const swissLib = await findSwissLibMonorepo(this.context.root);
|
|
86
86
|
if (swissLib) {
|
|
87
87
|
const swissNodeModulesPath = path.join(swissLib, urlPath);
|
|
@@ -2,10 +2,6 @@ import type { Response } from "express";
|
|
|
2
2
|
import { BaseHandler, type HandlerContext } from "./base-handler.js";
|
|
3
3
|
export declare class TSHandler extends BaseHandler {
|
|
4
4
|
constructor(context: HandlerContext);
|
|
5
|
-
/**
|
|
6
|
-
* Extract dependencies from compiled code (import paths)
|
|
7
|
-
*/
|
|
8
|
-
private getDependencies;
|
|
9
5
|
handle(url: string, res: Response): Promise<void>;
|
|
10
6
|
}
|
|
11
7
|
//# sourceMappingURL=ts-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/ts-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;gBAC5B,OAAO,EAAE,cAAc;IAI7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuHxD"}
|
|
@@ -5,37 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { promises as fs } from "node:fs";
|
|
7
7
|
import chalk from "chalk";
|
|
8
|
-
import { rewriteImports } from "
|
|
9
|
-
import {
|
|
8
|
+
import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
|
|
9
|
+
import { inlineEnvReferences } from "../../config/env.js";
|
|
10
|
+
import { compilationCache } from "../../internal/cache/compilation-cache.js";
|
|
10
11
|
import { BaseHandler, setDevHeaders, } from "./base-handler.js";
|
|
11
12
|
export class TSHandler extends BaseHandler {
|
|
12
13
|
constructor(context) {
|
|
13
14
|
super(context);
|
|
14
15
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Extract dependencies from compiled code (import paths)
|
|
17
|
-
*/
|
|
18
|
-
async getDependencies(compiled) {
|
|
19
|
-
const deps = [];
|
|
20
|
-
const importPattern = /(?:import|from|export).*['"]([^'"]+)['"]/g;
|
|
21
|
-
let match;
|
|
22
|
-
while ((match = importPattern.exec(compiled)) !== null) {
|
|
23
|
-
const specifier = match[1];
|
|
24
|
-
// Only track absolute paths and workspace paths (not relative)
|
|
25
|
-
if (specifier.startsWith("/") || specifier.startsWith("@")) {
|
|
26
|
-
try {
|
|
27
|
-
const resolved = await this.context.resolver.resolve(specifier, "");
|
|
28
|
-
if (resolved && !resolved.startsWith("http")) {
|
|
29
|
-
deps.push(resolved);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
// Ignore resolution errors
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return deps;
|
|
38
|
-
}
|
|
39
16
|
async handle(url, res) {
|
|
40
17
|
const filePath = await this.resolveFilePath(url);
|
|
41
18
|
console.log(chalk.gray(`[.ts] ${url}`));
|
|
@@ -101,8 +78,8 @@ export class TSHandler extends BaseHandler {
|
|
|
101
78
|
target: "esnext",
|
|
102
79
|
sourcefile: filePath,
|
|
103
80
|
});
|
|
104
|
-
const
|
|
105
|
-
|
|
81
|
+
const inlined = inlineEnvReferences(result.code, this.context.env);
|
|
82
|
+
const rewritten = await rewriteImports(inlined, filePath, this.context.resolver);
|
|
106
83
|
await compilationCache.set(filePath, result.code, rewritten, (compiled) => this.getDependencies(compiled));
|
|
107
84
|
// Debug: Check for bare imports after rewriting
|
|
108
85
|
const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
|
|
@@ -3,10 +3,6 @@ import { BaseHandler, type HandlerContext } from "./base-handler.js";
|
|
|
3
3
|
export declare class UIHandler extends BaseHandler {
|
|
4
4
|
private compiler;
|
|
5
5
|
constructor(context: HandlerContext);
|
|
6
|
-
/**
|
|
7
|
-
* Extract dependencies from compiled code (import paths)
|
|
8
|
-
*/
|
|
9
|
-
private getDependencies;
|
|
10
6
|
handle(url: string, res: Response): Promise<void>;
|
|
11
7
|
}
|
|
12
8
|
//# sourceMappingURL=ui-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/ui-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,SAAU,SAAQ,WAAW;IACxC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAI7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAkExD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
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 "@swissjs/compiler";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
|
|
10
|
+
import { inlineEnvReferences } from "../../config/env.js";
|
|
11
|
+
import { compilationCache } from "../../internal/cache/compilation-cache.js";
|
|
12
|
+
import { fixSwissLibPaths } from "../../resolution/path/path-fixup.js";
|
|
13
|
+
import { BaseHandler, setDevHeaders, } from "./base-handler.js";
|
|
14
|
+
export class UIHandler extends BaseHandler {
|
|
15
|
+
constructor(context) {
|
|
16
|
+
super(context);
|
|
17
|
+
this.compiler = new UiCompiler();
|
|
18
|
+
}
|
|
19
|
+
async handle(url, res) {
|
|
20
|
+
const filePath = await this.resolveFilePath(url);
|
|
21
|
+
console.log(chalk.blue(`[.ui] ${url} → ${filePath}`));
|
|
22
|
+
try {
|
|
23
|
+
await fs.access(filePath);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
console.error(chalk.red(`[.ui] File not found: ${filePath}`));
|
|
27
|
+
throw new Error(`File not found: ${url} (resolved to: ${filePath})`);
|
|
28
|
+
}
|
|
29
|
+
// Cache hit
|
|
30
|
+
const cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
|
|
31
|
+
if (cached) {
|
|
32
|
+
const fixed = fixSwissLibPaths(cached);
|
|
33
|
+
setDevHeaders(res);
|
|
34
|
+
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
35
|
+
res.setHeader("Content-Length", Buffer.byteLength(fixed, "utf-8"));
|
|
36
|
+
res.end(fixed, "utf-8");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Cache miss — compile
|
|
40
|
+
const source = await fs.readFile(filePath, "utf-8");
|
|
41
|
+
let compiled = await this.compiler.compileAsync(source, filePath);
|
|
42
|
+
const esbuild = await import("esbuild");
|
|
43
|
+
const tsResult = await esbuild.transform(compiled, {
|
|
44
|
+
loader: "ts",
|
|
45
|
+
format: "esm",
|
|
46
|
+
target: "esnext",
|
|
47
|
+
sourcefile: filePath,
|
|
48
|
+
});
|
|
49
|
+
compiled = tsResult.code;
|
|
50
|
+
// Fix compiler-emitted wrong paths before import rewriting
|
|
51
|
+
compiled = fixSwissLibPaths(compiled);
|
|
52
|
+
// Inline import.meta.env references before import rewriting
|
|
53
|
+
compiled = inlineEnvReferences(compiled, this.context.env);
|
|
54
|
+
// Strip CSS static-asset imports — they are not ES modules
|
|
55
|
+
compiled = stripCssImports(compiled, url);
|
|
56
|
+
const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
|
|
57
|
+
if (bareImportPattern.test(compiled)) {
|
|
58
|
+
console.warn(`[.ui] Compiled output contains bare imports: ${url}`);
|
|
59
|
+
}
|
|
60
|
+
const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
|
|
61
|
+
const finalCode = fixSwissLibPaths(rewritten);
|
|
62
|
+
await compilationCache.set(filePath, compiled, finalCode, (c) => this.getDependencies(c));
|
|
63
|
+
if (bareImportPattern.test(finalCode)) {
|
|
64
|
+
console.error(`[.ui] Bare imports still present after rewriting: ${url}`);
|
|
65
|
+
for (const m of Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g)).slice(0, 3)) {
|
|
66
|
+
console.error(`[.ui] Unresolved import: ${m[1]}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
setDevHeaders(res);
|
|
70
|
+
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
71
|
+
res.setHeader("Content-Length", Buffer.byteLength(finalCode, "utf-8"));
|
|
72
|
+
res.end(finalCode, "utf-8");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function stripCssImports(code, url) {
|
|
76
|
+
// Single well-ordered pass: static imports first, then dynamic imports
|
|
77
|
+
const before = code;
|
|
78
|
+
code = code.replace(/^[^\S\r\n]*import\s[^'"]*['"][^'"]*\.css['"]\s*;?[^\S\r\n]*$/gm, "");
|
|
79
|
+
code = code.replace(/\bimport\s*\(\s*['"][^'"]*\.css['"]\s*\)/g, "undefined");
|
|
80
|
+
if (before !== code) {
|
|
81
|
+
console.log(chalk.blue(`[.ui] Stripped CSS imports from ${url}`));
|
|
82
|
+
}
|
|
83
|
+
return code;
|
|
84
|
+
}
|
|
@@ -3,10 +3,6 @@ import { BaseHandler, type HandlerContext } from "./base-handler.js";
|
|
|
3
3
|
export declare class UIXHandler extends BaseHandler {
|
|
4
4
|
private compiler;
|
|
5
5
|
constructor(context: HandlerContext);
|
|
6
|
-
/**
|
|
7
|
-
* Extract dependencies from compiled code (import paths)
|
|
8
|
-
*/
|
|
9
|
-
private getDependencies;
|
|
10
6
|
handle(url: string, res: Response): Promise<void>;
|
|
11
7
|
}
|
|
12
8
|
//# sourceMappingURL=uix-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uix-handler.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/handlers/uix-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQxC,OAAO,EACL,WAAW,EAEX,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE,cAAc;IAI7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA8DxD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
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 "@swissjs/compiler";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
import { rewriteImports } from "../../resolution/rewriting/import-rewriter.js";
|
|
10
|
+
import { inlineEnvReferences } from "../../config/env.js";
|
|
11
|
+
import { compilationCache } from "../../internal/cache/compilation-cache.js";
|
|
12
|
+
import { fixSwissLibPaths } from "../../resolution/path/path-fixup.js";
|
|
13
|
+
import { BaseHandler, setDevHeaders, } from "./base-handler.js";
|
|
14
|
+
export class UIXHandler extends BaseHandler {
|
|
15
|
+
constructor(context) {
|
|
16
|
+
super(context);
|
|
17
|
+
this.compiler = new UiCompiler();
|
|
18
|
+
}
|
|
19
|
+
async handle(url, res) {
|
|
20
|
+
const filePath = await this.resolveFilePath(url);
|
|
21
|
+
console.log(chalk.blue(`[.uix] ${url}`));
|
|
22
|
+
// Cache hit
|
|
23
|
+
const cached = await compilationCache.get(filePath, (compiled) => this.getDependencies(compiled));
|
|
24
|
+
if (cached) {
|
|
25
|
+
const fixed = fixSwissLibPaths(cached);
|
|
26
|
+
setDevHeaders(res);
|
|
27
|
+
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
28
|
+
res.send(fixed);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Cache miss — compile
|
|
32
|
+
const source = await fs.readFile(filePath, "utf-8");
|
|
33
|
+
let compiled = await this.compiler.compileAsync(source, filePath);
|
|
34
|
+
const esbuild = await import("esbuild");
|
|
35
|
+
const tsResult = await esbuild.transform(compiled, {
|
|
36
|
+
loader: "ts",
|
|
37
|
+
format: "esm",
|
|
38
|
+
target: "esnext",
|
|
39
|
+
sourcefile: filePath,
|
|
40
|
+
});
|
|
41
|
+
compiled = tsResult.code;
|
|
42
|
+
// Fix compiler-emitted wrong paths before import rewriting
|
|
43
|
+
compiled = fixSwissLibPaths(compiled);
|
|
44
|
+
// Inline import.meta.env references before import rewriting
|
|
45
|
+
compiled = inlineEnvReferences(compiled, this.context.env);
|
|
46
|
+
// Strip CSS static-asset imports — they are not ES modules
|
|
47
|
+
const beforeCss = compiled;
|
|
48
|
+
compiled = compiled.replace(/^[^\S\r\n]*import\s[^'"]*['"][^'"]*\.css['"]\s*;?[^\S\r\n]*$/gm, "");
|
|
49
|
+
compiled = compiled.replace(/\bimport\s*\(\s*['"][^'"]*\.css['"]\s*\)/g, "undefined");
|
|
50
|
+
if (beforeCss !== compiled) {
|
|
51
|
+
console.log(chalk.blue(`[.uix] Stripped CSS imports from ${url}`));
|
|
52
|
+
}
|
|
53
|
+
const bareImportPattern = /(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/;
|
|
54
|
+
if (bareImportPattern.test(compiled)) {
|
|
55
|
+
console.warn(`[.uix] Compiled output contains bare imports: ${url}`);
|
|
56
|
+
}
|
|
57
|
+
const rewritten = await rewriteImports(compiled, filePath, this.context.resolver);
|
|
58
|
+
const finalCode = fixSwissLibPaths(rewritten);
|
|
59
|
+
await compilationCache.set(filePath, compiled, finalCode, (c) => this.getDependencies(c));
|
|
60
|
+
if (bareImportPattern.test(finalCode)) {
|
|
61
|
+
console.error(`[.uix] Bare imports still present after rewriting: ${url}`);
|
|
62
|
+
for (const m of Array.from(rewritten.matchAll(/(?:import|from|export).*['"](@[^'"]+\/[^'"]+)(?!\/)[^'"]*['"]/g)).slice(0, 3)) {
|
|
63
|
+
console.error(`[.uix] Unresolved import: ${m[1]}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
setDevHeaders(res);
|
|
67
|
+
res.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
68
|
+
res.send(finalCode);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the HMR client script served to the browser at /__swite_hmr_client.
|
|
3
|
+
*
|
|
4
|
+
* The client is plain JavaScript (no TS syntax) because it is injected into
|
|
5
|
+
* browser pages as-is. Keeping it in a separate module rather than embedded
|
|
6
|
+
* inside hmr.ts makes it editable with syntax highlighting and avoids
|
|
7
|
+
* template-literal escaping issues.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildHmrClientScript(port: number): string;
|
|
10
|
+
//# sourceMappingURL=hmr-client-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-client-template.d.ts","sourceRoot":"","sources":["../../../src/dev-engine/hmr/hmr-client-template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiHzD"}
|