@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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Generalize resolution system and add internalScopes support
|
|
8
|
+
|
|
9
|
+
- Add `findSiblingRepository(startPath, repoName)` — replaces hardcoded swiss-lib discovery with a generic sibling repo finder. `findSwissLibMonorepo` preserved as a backward-compat wrapper.
|
|
10
|
+
- Add `findPackage` with local-first dev precedence — in development, resolves `@scoped/*` packages from local sibling source trees before falling back to `node_modules`.
|
|
11
|
+
- `internalScopes` from `swiss.config.ts` now flows through to all handlers at startup — prevents internal-scoped packages from being routed to jsDelivr CDN.
|
|
12
|
+
- `NodeModuleHandler` rewritten to use `findPackage` — replaces verbose walk-up/swiss-lib fallback chain with unified local-first resolver. Adds dist→src redirect for local sibling packages.
|
|
13
|
+
- CDN blacklist: packages matching `internalScopes` are blocked from jsDelivr fallback with a clear error log.
|
|
14
|
+
- Fix `cli.ts` builder import path (`./build-engine/builder.js`).
|
|
15
|
+
- Fix `url-resolver.ts` dynamic import path for `file-path-resolver`.
|
|
16
|
+
- Update peer deps: `@swissjs/core` → `0.1.8`, `@swissjs/compiler` → `0.1.5`.
|
|
17
|
+
|
|
3
18
|
## 0.2.31
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
@@ -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"}
|
|
@@ -20,6 +20,17 @@ export interface ServerConfig {
|
|
|
20
20
|
export interface SwiteUserConfig {
|
|
21
21
|
server?: ServerConfig;
|
|
22
22
|
services?: ServicesConfig;
|
|
23
|
+
/**
|
|
24
|
+
* Package scopes that should be treated as "internal" or "private".
|
|
25
|
+
* These scopes prioritize local/monorepo resolution and are forbidden from CDN redirects.
|
|
26
|
+
* e.g. ["@kibologic", "@alpine"]
|
|
27
|
+
*/
|
|
28
|
+
internalScopes?: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Manual override for sibling repository lookup.
|
|
31
|
+
* Swite will search these directories for local package source code.
|
|
32
|
+
*/
|
|
33
|
+
siblingRepositories?: string[];
|
|
23
34
|
}
|
|
24
35
|
/**
|
|
25
36
|
* Define swite configuration with full TypeScript validation.
|
|
@@ -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;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;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,12 @@
|
|
|
1
1
|
import type { Response } from "express";
|
|
2
|
-
import { ModuleResolver } from "
|
|
2
|
+
import { ModuleResolver } from "../../resolution/resolver.js";
|
|
3
|
+
import type { SwiteUserConfig } from "../../config/config.js";
|
|
3
4
|
export interface HandlerContext {
|
|
4
5
|
resolver: ModuleResolver;
|
|
5
6
|
root: string;
|
|
6
7
|
workspaceRoot: string | null;
|
|
8
|
+
env?: Record<string, string>;
|
|
9
|
+
userConfig?: SwiteUserConfig;
|
|
7
10
|
}
|
|
8
11
|
/**
|
|
9
12
|
* Set cache-busting headers for development
|
|
@@ -17,5 +20,6 @@ export declare class BaseHandler {
|
|
|
17
20
|
constructor(context: HandlerContext);
|
|
18
21
|
protected resolveFilePath(url: string): Promise<string>;
|
|
19
22
|
protected fileExists(filePath: string): Promise<boolean>;
|
|
23
|
+
protected getDependencies(compiled: string): Promise<string[]>;
|
|
20
24
|
}
|
|
21
25
|
//# 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;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,eAAe,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;cAS9C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAmBrE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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 { ModuleResolver } from "../../resolution/resolver.js";
|
|
8
|
+
import { resolveFilePath } from "../../resolution/path/file-path-resolver.js";
|
|
9
|
+
/**
|
|
10
|
+
* Set cache-busting headers for development
|
|
11
|
+
*/
|
|
12
|
+
export function setDevHeaders(res) {
|
|
13
|
+
// Prevent all caching during development
|
|
14
|
+
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
|
|
15
|
+
res.setHeader("Pragma", "no-cache");
|
|
16
|
+
res.setHeader("Expires", "0");
|
|
17
|
+
res.setHeader("Surrogate-Control", "no-store");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Base handler utilities
|
|
21
|
+
*/
|
|
22
|
+
export class BaseHandler {
|
|
23
|
+
constructor(context) {
|
|
24
|
+
this.context = context;
|
|
25
|
+
}
|
|
26
|
+
async resolveFilePath(url) {
|
|
27
|
+
return resolveFilePath(url, this.context.root, this.context.workspaceRoot, this.context.userConfig);
|
|
28
|
+
}
|
|
29
|
+
async fileExists(filePath) {
|
|
30
|
+
try {
|
|
31
|
+
await fs.access(filePath);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
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
|
+
}
|
|
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;AAQrE,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;IAgPvD;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CAmCjC"}
|
|
@@ -6,13 +6,14 @@
|
|
|
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 {
|
|
14
|
+
import { findWorkspaceRoot } from "../../kernel/workspace.js";
|
|
15
|
+
import { findPackage } from "../../kernel/package-finder.js";
|
|
16
|
+
import { shouldUseCdnFallback } from "../../resolution/cdn/cdn-fallback.js";
|
|
16
17
|
export class NodeModuleHandler extends BaseHandler {
|
|
17
18
|
constructor(context) {
|
|
18
19
|
super(context);
|
|
@@ -64,52 +65,33 @@ export class NodeModuleHandler extends BaseHandler {
|
|
|
64
65
|
current = parent;
|
|
65
66
|
}
|
|
66
67
|
}
|
|
68
|
+
// CONSOLIDATED DISCOVERY: Use the Generalized Package Finder
|
|
69
|
+
// This follows our "Local-First" priority: Siblings > Local node_modules > Workspace node_modules
|
|
67
70
|
if (!filePath) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const { findSwissLibMonorepo } = await import("../utils/package-finder.js");
|
|
85
|
-
const swissLib = await findSwissLibMonorepo(this.context.root);
|
|
86
|
-
if (swissLib) {
|
|
87
|
-
const swissNodeModulesPath = path.join(swissLib, urlPath);
|
|
88
|
-
console.log(chalk.blue(`[node_modules] Trying swiss-lib path: ${swissNodeModulesPath}`));
|
|
89
|
-
try {
|
|
90
|
-
// Try to resolve symlinks first (realpath works even if path is a symlink)
|
|
91
|
-
const resolvedPath = await fs.realpath(swissNodeModulesPath);
|
|
92
|
-
console.log(chalk.blue(`[node_modules] Resolved to: ${resolvedPath}`));
|
|
93
|
-
// Verify the resolved path exists
|
|
94
|
-
await fs.access(resolvedPath);
|
|
95
|
-
filePath = resolvedPath;
|
|
96
|
-
console.log(chalk.green(`[node_modules] ✓ Found in swiss-lib monorepo: ${urlPath}`));
|
|
97
|
-
}
|
|
98
|
-
catch (err3) {
|
|
99
|
-
console.log(chalk.yellow(`[node_modules] swiss-lib path failed: ${err3 instanceof Error ? err3.message : String(err3)}`));
|
|
100
|
-
// File not found in any location, will trigger case-insensitive search below
|
|
101
|
-
filePath = path.join(this.context.root, urlPath);
|
|
71
|
+
const urlParts = urlPath.split("/");
|
|
72
|
+
const packageName = urlParts[1].startsWith("@") ? `${urlParts[1]}/${urlParts[2]}` : urlParts[1];
|
|
73
|
+
const remainingPath = urlParts[1].startsWith("@") ? urlParts.slice(3).join("/") : urlParts.slice(2).join("/");
|
|
74
|
+
const location = await findPackage(packageName, this.context.root, workspaceRoot);
|
|
75
|
+
if (location) {
|
|
76
|
+
filePath = path.join(location.path, remainingPath);
|
|
77
|
+
console.log(chalk.green(`[node_modules] ✓ Found ${packageName} via ${location.type}: ${filePath}`));
|
|
78
|
+
// Re-use dist -> src fallback for local siblings
|
|
79
|
+
if (location.type !== 'node_modules' && filePath.includes("/dist/")) {
|
|
80
|
+
const srcPath = filePath.replace("/dist/", "/src/").replace(/\.[mc]?js$/, ".ts");
|
|
81
|
+
try {
|
|
82
|
+
await fs.access(srcPath);
|
|
83
|
+
console.log(chalk.yellow(`[node_modules] Intercept: Serving local source instead of dist: ${srcPath}`));
|
|
84
|
+
filePath = srcPath;
|
|
85
|
+
if (srcPath.endsWith(".ts")) {
|
|
86
|
+
return await this.tsHandler.handle(url.replace(/\.[mc]?js$/, ".ts"), res);
|
|
102
87
|
}
|
|
103
88
|
}
|
|
104
|
-
|
|
105
|
-
// File not found in any location, will trigger case-insensitive search below
|
|
106
|
-
filePath = path.join(this.context.root, urlPath);
|
|
107
|
-
}
|
|
89
|
+
catch { /* Fallback to original filePath */ }
|
|
108
90
|
}
|
|
109
91
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
92
|
+
}
|
|
93
|
+
if (!filePath) {
|
|
94
|
+
filePath = path.join(this.context.root, urlPath);
|
|
113
95
|
}
|
|
114
96
|
console.log(chalk.gray(`[node_modules] Resolving: ${url} -> ${filePath}`));
|
|
115
97
|
// File path is already resolved from above, no need to resolve again
|
|
@@ -259,6 +241,13 @@ export class NodeModuleHandler extends BaseHandler {
|
|
|
259
241
|
}
|
|
260
242
|
if (!pkgName || pkgName === "." || pkgName === "..")
|
|
261
243
|
return null;
|
|
244
|
+
// Never redirect internal/private scoped packages to public CDNs
|
|
245
|
+
const internalScopes = this.context.userConfig?.internalScopes || [];
|
|
246
|
+
const isInternal = internalScopes.some(scope => pkgName === scope || pkgName.startsWith(scope + "/"));
|
|
247
|
+
if (isInternal) {
|
|
248
|
+
console.log(chalk.red(`[node_modules] CDN Blocked: Internal scope package ${pkgName} cannot be served from jsDelivr.`));
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
262
251
|
if (!shouldUseCdnFallback(pkgName))
|
|
263
252
|
return null;
|
|
264
253
|
// jsDelivr +esm serves ESM build; works for reflect-metadata and most npm packages
|
|
@@ -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"}
|