@decohere/flux 0.0.1-dev.8 → 0.0.1-dev.80
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/commonjs/src/deferred-script-runner.js +58 -0
- package/commonjs/src/flux.command.js +29 -0
- package/commonjs/src/flux.module.js +38 -0
- package/commonjs/src/hot-reload-server.js +293 -160
- package/commonjs/src/index.js +33 -32
- package/commonjs/src/rewrite-serve-specifier.js +46 -0
- package/commonjs/src/run.action.js +71 -0
- package/commonjs/src/run.command.js +67 -0
- package/commonjs/src/serve.action.js +94 -10
- package/commonjs/src/serve.command.js +36 -4
- package/commonjs/src/slice-serve.js +132 -0
- package/commonjs/src/source-module-loader.js +216 -0
- package/es6/src/deferred-script-runner.js +48 -0
- package/es6/src/flux.command.js +19 -0
- package/es6/src/flux.module.js +28 -0
- package/es6/src/hot-reload-server.js +280 -117
- package/es6/src/index.js +6 -7
- package/es6/src/rewrite-serve-specifier.js +40 -0
- package/es6/src/run.action.js +58 -0
- package/es6/src/run.command.js +57 -0
- package/es6/src/serve.action.js +92 -10
- package/es6/src/serve.command.js +37 -5
- package/es6/src/slice-serve.js +107 -0
- package/es6/src/source-module-loader.js +160 -0
- package/package.json +8 -12
- package/types/src/deferred-script-runner.d.ts +18 -0
- package/types/src/{ember.command.d.ts → flux.command.d.ts} +1 -1
- package/types/src/flux.module.d.ts +16 -0
- package/types/src/hot-reload-server.d.ts +62 -22
- package/types/src/index.d.ts +8 -8
- package/types/src/rewrite-serve-specifier.d.ts +13 -0
- package/types/src/run.action.d.ts +17 -0
- package/types/src/run.command.d.ts +11 -0
- package/types/src/serve.action.d.ts +17 -2
- package/types/src/serve.command.d.ts +7 -2
- package/types/src/slice-serve.d.ts +52 -0
- package/types/src/source-module-loader.d.ts +49 -0
- package/commonjs/src/ember.command.js +0 -27
- package/commonjs/src/ember.module.js +0 -37
- package/commonjs/src/hot-module-hooks.js +0 -47
- package/commonjs/src/serve.js +0 -36
- package/commonjs/src/workspace-serve.action.js +0 -59
- package/es6/src/ember.command.js +0 -17
- package/es6/src/ember.module.js +0 -19
- package/es6/src/hot-module-hooks.js +0 -26
- package/es6/src/serve.js +0 -32
- package/es6/src/workspace-serve.action.js +0 -45
- package/types/src/ember.module.d.ts +0 -22
- package/types/src/hot-module-hooks.d.ts +0 -5
- package/types/src/serve.d.ts +0 -1
- package/types/src/workspace-serve.action.d.ts +0 -11
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
2
|
+
import { packageAliases } from "@decohere/mesh";
|
|
3
|
+
/**
|
|
4
|
+
* Map a resolve-hook specifier to a versioned watched `.ts` file URL.
|
|
5
|
+
* Covers relative `.js` / `.ts` / extensionless imports and bare workspace
|
|
6
|
+
* package names (dynamic `import()` never goes through SWC path rewrite).
|
|
7
|
+
*/ export function rewriteServeSpecifier(options) {
|
|
8
|
+
const { specifier, parentUrl, isWatchedTs, resolveBare, versionFileUrl } = options;
|
|
9
|
+
const relativeTs = resolveRelativeWatchedTs(specifier, parentUrl, isWatchedTs);
|
|
10
|
+
if (relativeTs != null) {
|
|
11
|
+
return versionFileUrl(pathToFileURL(relativeTs).toString());
|
|
12
|
+
}
|
|
13
|
+
const bareTarget = resolveBare(specifier);
|
|
14
|
+
if (bareTarget != null && isWatchedTs(bareTarget)) {
|
|
15
|
+
return versionFileUrl(pathToFileURL(bareTarget).toString());
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function resolveRelativeWatchedTs(specifier, parentUrl, isWatchedTs) {
|
|
20
|
+
if (packageAliases.isBareSpecifier(specifier)) return null;
|
|
21
|
+
if (!(specifier.startsWith(".") || specifier.startsWith("/"))) return null;
|
|
22
|
+
const parentClean = parentUrl.split("?")[0];
|
|
23
|
+
if (parentClean == null || parentClean === "") return null;
|
|
24
|
+
let resolved;
|
|
25
|
+
try {
|
|
26
|
+
resolved = new URL(specifier, parentClean);
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
if (resolved.protocol !== "file:") return null;
|
|
31
|
+
let filePath = fileURLToPath(resolved);
|
|
32
|
+
if (filePath.endsWith(".js")) {
|
|
33
|
+
filePath = `${filePath.slice(0, -3)}.ts`;
|
|
34
|
+
} else if (!filePath.endsWith(".ts")) {
|
|
35
|
+
filePath = `${filePath}.ts`;
|
|
36
|
+
}
|
|
37
|
+
return isWatchedTs(filePath) ? filePath : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3Jld3JpdGUtc2VydmUtc3BlY2lmaWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbGVVUkxUb1BhdGgsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcbmltcG9ydCB7IHBhY2thZ2VBbGlhc2VzIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5cbmV4cG9ydCB0eXBlIFJld3JpdGVTZXJ2ZVNwZWNpZmllck9wdGlvbnMgPSB7XG5cdHNwZWNpZmllcjogc3RyaW5nO1xuXHRwYXJlbnRVcmw6IHN0cmluZztcblx0aXNXYXRjaGVkVHM6IChhYnNvbHV0ZVBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblx0cmVzb2x2ZUJhcmU6IChzcGVjaWZpZXI6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbDtcblx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsOiBzdHJpbmcpID0+IHN0cmluZztcbn07XG5cbi8qKlxuICogTWFwIGEgcmVzb2x2ZS1ob29rIHNwZWNpZmllciB0byBhIHZlcnNpb25lZCB3YXRjaGVkIGAudHNgIGZpbGUgVVJMLlxuICogQ292ZXJzIHJlbGF0aXZlIGAuanNgIC8gYC50c2AgLyBleHRlbnNpb25sZXNzIGltcG9ydHMgYW5kIGJhcmUgd29ya3NwYWNlXG4gKiBwYWNrYWdlIG5hbWVzIChkeW5hbWljIGBpbXBvcnQoKWAgbmV2ZXIgZ29lcyB0aHJvdWdoIFNXQyBwYXRoIHJld3JpdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVNlcnZlU3BlY2lmaWVyKG9wdGlvbnM6IFJld3JpdGVTZXJ2ZVNwZWNpZmllck9wdGlvbnMpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3QgeyBzcGVjaWZpZXIsIHBhcmVudFVybCwgaXNXYXRjaGVkVHMsIHJlc29sdmVCYXJlLCB2ZXJzaW9uRmlsZVVybCB9ID0gb3B0aW9ucztcblxuXHRjb25zdCByZWxhdGl2ZVRzID0gcmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzKHNwZWNpZmllciwgcGFyZW50VXJsLCBpc1dhdGNoZWRUcyk7XG5cdGlmIChyZWxhdGl2ZVRzICE9IG51bGwpIHtcblx0XHRyZXR1cm4gdmVyc2lvbkZpbGVVcmwocGF0aFRvRmlsZVVSTChyZWxhdGl2ZVRzKS50b1N0cmluZygpKTtcblx0fVxuXG5cdGNvbnN0IGJhcmVUYXJnZXQgPSByZXNvbHZlQmFyZShzcGVjaWZpZXIpO1xuXHRpZiAoYmFyZVRhcmdldCAhPSBudWxsICYmIGlzV2F0Y2hlZFRzKGJhcmVUYXJnZXQpKSB7XG5cdFx0cmV0dXJuIHZlcnNpb25GaWxlVXJsKHBhdGhUb0ZpbGVVUkwoYmFyZVRhcmdldCkudG9TdHJpbmcoKSk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzKFxuXHRzcGVjaWZpZXI6IHN0cmluZyxcblx0cGFyZW50VXJsOiBzdHJpbmcsXG5cdGlzV2F0Y2hlZFRzOiAoYWJzb2x1dGVQYXRoOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4pOiBzdHJpbmcgfCBudWxsIHtcblx0aWYgKHBhY2thZ2VBbGlhc2VzLmlzQmFyZVNwZWNpZmllcihzcGVjaWZpZXIpKSByZXR1cm4gbnVsbDtcblx0aWYgKCEoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKFwiL1wiKSkpIHJldHVybiBudWxsO1xuXG5cdGNvbnN0IHBhcmVudENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblx0aWYgKHBhcmVudENsZWFuID09IG51bGwgfHwgcGFyZW50Q2xlYW4gPT09IFwiXCIpIHJldHVybiBudWxsO1xuXG5cdGxldCByZXNvbHZlZDogVVJMO1xuXHR0cnkge1xuXHRcdHJlc29sdmVkID0gbmV3IFVSTChzcGVjaWZpZXIsIHBhcmVudENsZWFuKTtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0aWYgKHJlc29sdmVkLnByb3RvY29sICE9PSBcImZpbGU6XCIpIHJldHVybiBudWxsO1xuXG5cdGxldCBmaWxlUGF0aCA9IGZpbGVVUkxUb1BhdGgocmVzb2x2ZWQpO1xuXHRpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuanNcIikpIHtcblx0XHRmaWxlUGF0aCA9IGAke2ZpbGVQYXRoLnNsaWNlKDAsIC0zKX0udHNgO1xuXHR9IGVsc2UgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuXHRcdGZpbGVQYXRoID0gYCR7ZmlsZVBhdGh9LnRzYDtcblx0fVxuXG5cdHJldHVybiBpc1dhdGNoZWRUcyhmaWxlUGF0aCkgPyBmaWxlUGF0aCA6IG51bGw7XG59XG4iXSwibmFtZXMiOlsiZmlsZVVSTFRvUGF0aCIsInBhdGhUb0ZpbGVVUkwiLCJwYWNrYWdlQWxpYXNlcyIsInJld3JpdGVTZXJ2ZVNwZWNpZmllciIsIm9wdGlvbnMiLCJzcGVjaWZpZXIiLCJwYXJlbnRVcmwiLCJpc1dhdGNoZWRUcyIsInJlc29sdmVCYXJlIiwidmVyc2lvbkZpbGVVcmwiLCJyZWxhdGl2ZVRzIiwicmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzIiwidG9TdHJpbmciLCJiYXJlVGFyZ2V0IiwiaXNCYXJlU3BlY2lmaWVyIiwic3RhcnRzV2l0aCIsInBhcmVudENsZWFuIiwic3BsaXQiLCJyZXNvbHZlZCIsIlVSTCIsInByb3RvY29sIiwiZmlsZVBhdGgiLCJlbmRzV2l0aCIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxhQUFhLEVBQUVDLGFBQWEsUUFBUSxXQUFXO0FBQ3hELFNBQVNDLGNBQWMsUUFBUSxpQkFBaUI7QUFVaEQ7Ozs7Q0FJQyxHQUNELE9BQU8sU0FBU0Msc0JBQXNCQyxPQUFxQztJQUMxRSxNQUFNLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxXQUFXLEVBQUVDLFdBQVcsRUFBRUMsY0FBYyxFQUFFLEdBQUdMO0lBRTNFLE1BQU1NLGFBQWFDLHlCQUF5Qk4sV0FBV0MsV0FBV0M7SUFDbEUsSUFBSUcsY0FBYyxNQUFNO1FBQ3ZCLE9BQU9ELGVBQWVSLGNBQWNTLFlBQVlFLFFBQVE7SUFDekQ7SUFFQSxNQUFNQyxhQUFhTCxZQUFZSDtJQUMvQixJQUFJUSxjQUFjLFFBQVFOLFlBQVlNLGFBQWE7UUFDbEQsT0FBT0osZUFBZVIsY0FBY1ksWUFBWUQsUUFBUTtJQUN6RDtJQUVBLE9BQU87QUFDUjtBQUVBLFNBQVNELHlCQUNSTixTQUFpQixFQUNqQkMsU0FBaUIsRUFDakJDLFdBQThDO0lBRTlDLElBQUlMLGVBQWVZLGVBQWUsQ0FBQ1QsWUFBWSxPQUFPO0lBQ3RELElBQUksQ0FBRUEsQ0FBQUEsVUFBVVUsVUFBVSxDQUFDLFFBQVFWLFVBQVVVLFVBQVUsQ0FBQyxJQUFHLEdBQUksT0FBTztJQUV0RSxNQUFNQyxjQUFjVixVQUFVVyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDM0MsSUFBSUQsZUFBZSxRQUFRQSxnQkFBZ0IsSUFBSSxPQUFPO0lBRXRELElBQUlFO0lBQ0osSUFBSTtRQUNIQSxXQUFXLElBQUlDLElBQUlkLFdBQVdXO0lBQy9CLEVBQUUsT0FBTTtRQUNQLE9BQU87SUFDUjtJQUNBLElBQUlFLFNBQVNFLFFBQVEsS0FBSyxTQUFTLE9BQU87SUFFMUMsSUFBSUMsV0FBV3JCLGNBQWNrQjtJQUM3QixJQUFJRyxTQUFTQyxRQUFRLENBQUMsUUFBUTtRQUM3QkQsV0FBVyxHQUFHQSxTQUFTRSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLE9BQU8sSUFBSSxDQUFDRixTQUFTQyxRQUFRLENBQUMsUUFBUTtRQUNyQ0QsV0FBVyxHQUFHQSxTQUFTLEdBQUcsQ0FBQztJQUM1QjtJQUVBLE9BQU9kLFlBQVljLFlBQVlBLFdBQVc7QUFDM0MifQ==
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
function _ts_metadata(k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
}
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { injectable } from "@decohere/crucible/decorators";
|
|
12
|
+
// biome-ignore lint/style/useImportType: <DI>
|
|
13
|
+
import { Workspace } from "@decohere/mesh";
|
|
14
|
+
import { ActionResponse } from "@decohere/nexus/cli";
|
|
15
|
+
import { scribe } from "@decohere/scribe";
|
|
16
|
+
// biome-ignore lint/style/useImportType: <DI>
|
|
17
|
+
import { SourceModuleLoader } from "./source-module-loader.js";
|
|
18
|
+
export class RunAction {
|
|
19
|
+
loader;
|
|
20
|
+
workspace;
|
|
21
|
+
logger = scribe.logger(RunAction.name);
|
|
22
|
+
constructor(loader, workspace){
|
|
23
|
+
this.loader = loader;
|
|
24
|
+
this.workspace = workspace;
|
|
25
|
+
}
|
|
26
|
+
async run(options) {
|
|
27
|
+
const entry = options.entry?.trim();
|
|
28
|
+
if (entry == null || entry === "") {
|
|
29
|
+
throw new Error("flux run requires an entry file path");
|
|
30
|
+
}
|
|
31
|
+
const absoluteEntry = path.resolve(entry);
|
|
32
|
+
const passthrough = options.args ?? [];
|
|
33
|
+
await this.loader.configure({
|
|
34
|
+
workspace: this.workspace,
|
|
35
|
+
buildConfig: options.configuration
|
|
36
|
+
});
|
|
37
|
+
this.loader.registerHooks();
|
|
38
|
+
// Bin-style entries (forge.ts, flux.ts) read process.argv.slice(2).
|
|
39
|
+
process.argv = [
|
|
40
|
+
process.execPath,
|
|
41
|
+
absoluteEntry,
|
|
42
|
+
...passthrough
|
|
43
|
+
];
|
|
44
|
+
this.logger.trace(`Running ${absoluteEntry}`);
|
|
45
|
+
await this.loader.importEntry(absoluteEntry);
|
|
46
|
+
return ActionResponse.Success(RunAction.name);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
RunAction = _ts_decorate([
|
|
50
|
+
injectable(),
|
|
51
|
+
_ts_metadata("design:type", Function),
|
|
52
|
+
_ts_metadata("design:paramtypes", [
|
|
53
|
+
typeof SourceModuleLoader === "undefined" ? Object : SourceModuleLoader,
|
|
54
|
+
typeof Workspace === "undefined" ? Object : Workspace
|
|
55
|
+
])
|
|
56
|
+
], RunAction);
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBSdW5PcHRpb25zID0ge1xuXHQvKiogQWJzb2x1dGUgb3IgY3dkLXJlbGF0aXZlIHBhdGggdG8gYSBgLnRzYCBlbnRyeSBmaWxlLiAqL1xuXHRlbnRyeTogc3RyaW5nO1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bkFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxSdW5PcHRpb25zPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFJ1bkFjdGlvbi5uYW1lKTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXI6IFNvdXJjZU1vZHVsZUxvYWRlcixcblx0XHRwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZTogV29ya3NwYWNlLFxuXHQpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBSdW5PcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdGNvbnN0IGVudHJ5ID0gb3B0aW9ucy5lbnRyeT8udHJpbSgpO1xuXHRcdGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5ID09PSBcIlwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJmbHV4IHJ1biByZXF1aXJlcyBhbiBlbnRyeSBmaWxlIHBhdGhcIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWJzb2x1dGVFbnRyeSA9IHBhdGgucmVzb2x2ZShlbnRyeSk7XG5cdFx0Y29uc3QgcGFzc3Rocm91Z2ggPSBvcHRpb25zLmFyZ3MgPz8gW107XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24sXG5cdFx0fSk7XG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXG5cdFx0Ly8gQmluLXN0eWxlIGVudHJpZXMgKGZvcmdlLnRzLCBmbHV4LnRzKSByZWFkIHByb2Nlc3MuYXJndi5zbGljZSgyKS5cblx0XHRwcm9jZXNzLmFyZ3YgPSBbcHJvY2Vzcy5leGVjUGF0aCwgYWJzb2x1dGVFbnRyeSwgLi4ucGFzc3Rocm91Z2hdO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJ1bm5pbmcgJHthYnNvbHV0ZUVudHJ5fWApO1xuXHRcdGF3YWl0IHRoaXMubG9hZGVyLmltcG9ydEVudHJ5KGFic29sdXRlRW50cnkpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFJ1bkFjdGlvbi5uYW1lKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJzY3JpYmUiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJSdW5BY3Rpb24iLCJsb2dnZXIiLCJuYW1lIiwibG9hZGVyIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsImVudHJ5IiwidHJpbSIsIkVycm9yIiwiYWJzb2x1dGVFbnRyeSIsInJlc29sdmUiLCJwYXNzdGhyb3VnaCIsImFyZ3MiLCJjb25maWd1cmUiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWdpc3Rlckhvb2tzIiwicHJvY2VzcyIsImFyZ3YiLCJleGVjUGF0aCIsInRyYWNlIiwiaW1wb3J0RW50cnkiLCJTdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPQSxVQUFVLFlBQVk7QUFDN0IsU0FBU0MsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUMzQyxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUN2RCw4Q0FBOEM7QUFDOUMsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCO0FBVy9ELE9BQU8sTUFBTUM7OztJQUNLQyxTQUFpQkgsT0FBT0csTUFBTSxDQUFDRCxVQUFVRSxJQUFJLEVBQUU7SUFFaEUsWUFDQyxBQUFpQkMsTUFBMEIsRUFDM0MsQUFBaUJDLFNBQW9CLENBQ3BDO2FBRmdCRCxTQUFBQTthQUNBQyxZQUFBQTtJQUNmO0lBRUgsTUFBYUMsSUFBSUMsT0FBbUIsRUFBMkI7UUFDOUQsTUFBTUMsUUFBUUQsUUFBUUMsS0FBSyxFQUFFQztRQUM3QixJQUFJRCxTQUFTLFFBQVFBLFVBQVUsSUFBSTtZQUNsQyxNQUFNLElBQUlFLE1BQU07UUFDakI7UUFFQSxNQUFNQyxnQkFBZ0JoQixLQUFLaUIsT0FBTyxDQUFDSjtRQUNuQyxNQUFNSyxjQUFjTixRQUFRTyxJQUFJLElBQUksRUFBRTtRQUV0QyxNQUFNLElBQUksQ0FBQ1YsTUFBTSxDQUFDVyxTQUFTLENBQUM7WUFDM0JWLFdBQVcsSUFBSSxDQUFDQSxTQUFTO1lBQ3pCVyxhQUFhVCxRQUFRVSxhQUFhO1FBQ25DO1FBQ0EsSUFBSSxDQUFDYixNQUFNLENBQUNjLGFBQWE7UUFFekIsb0VBQW9FO1FBQ3BFQyxRQUFRQyxJQUFJLEdBQUc7WUFBQ0QsUUFBUUUsUUFBUTtZQUFFVjtlQUFrQkU7U0FBWTtRQUVoRSxJQUFJLENBQUNYLE1BQU0sQ0FBQ29CLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRVgsZUFBZTtRQUM1QyxNQUFNLElBQUksQ0FBQ1AsTUFBTSxDQUFDbUIsV0FBVyxDQUFDWjtRQUM5QixPQUFPYixlQUFlMEIsT0FBTyxDQUFDdkIsVUFBVUUsSUFBSTtJQUM3QztBQUNEIn0=
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ConfigurationOption, DecohereCommand } from "@decohere/nexus/cli";
|
|
2
|
+
import { RunAction } from "./run.action.js";
|
|
3
|
+
export class RunCommand extends DecohereCommand {
|
|
4
|
+
get actions() {
|
|
5
|
+
return [
|
|
6
|
+
RunAction
|
|
7
|
+
];
|
|
8
|
+
}
|
|
9
|
+
constructor(name){
|
|
10
|
+
super(name);
|
|
11
|
+
this.description("Compile and run a TypeScript entry on the fly (no watch / HMR)");
|
|
12
|
+
this.argument("<entry>", "Path to the TypeScript entry file");
|
|
13
|
+
this.argument("[args...]", "Arguments forwarded to the entry after rewriting argv");
|
|
14
|
+
this.addOption(new ConfigurationOption("debug"));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Commander passes positionals before options when `<entry> [args...]` is declared.
|
|
18
|
+
* The CLI host ModuleFactory expects `(opts, cmd)` — normalize and stash entry/args on opts.
|
|
19
|
+
*/ action(fn) {
|
|
20
|
+
return super.action((...args)=>{
|
|
21
|
+
const cmd = args.at(-1);
|
|
22
|
+
const opts = args.at(-2);
|
|
23
|
+
const { entry, entryArgs } = normalizeRunPositionals(args.slice(0, -2));
|
|
24
|
+
cmd.setOptionValue("entry", entry);
|
|
25
|
+
cmd.setOptionValue("args", entryArgs);
|
|
26
|
+
return fn(opts, cmd);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Commander yields `[entry, args[]]` or sometimes a flat list depending on arity. */ function normalizeRunPositionals(positionals) {
|
|
31
|
+
if (positionals.length === 0) {
|
|
32
|
+
return {
|
|
33
|
+
entry: "",
|
|
34
|
+
entryArgs: []
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const first = positionals[0];
|
|
38
|
+
if (typeof first !== "string" || first === "") {
|
|
39
|
+
return {
|
|
40
|
+
entry: "",
|
|
41
|
+
entryArgs: []
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const second = positionals[1];
|
|
45
|
+
if (Array.isArray(second)) {
|
|
46
|
+
return {
|
|
47
|
+
entry: first,
|
|
48
|
+
entryArgs: second.filter((s)=>typeof s === "string")
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
entry: first,
|
|
53
|
+
entryArgs: positionals.slice(1).filter((s)=>typeof s === "string" && s !== "")
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ3VyYXRpb25PcHRpb24sIERlY29oZXJlQ29tbWFuZCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvblZhbHVlcyB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IFJ1bkFjdGlvbiB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcblxuZXhwb3J0IGNsYXNzIFJ1bkNvbW1hbmQgZXh0ZW5kcyBEZWNvaGVyZUNvbW1hbmQge1xuXHRwdWJsaWMgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7XG5cdFx0cmV0dXJuIFtSdW5BY3Rpb25dO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24oXCJDb21waWxlIGFuZCBydW4gYSBUeXBlU2NyaXB0IGVudHJ5IG9uIHRoZSBmbHkgKG5vIHdhdGNoIC8gSE1SKVwiKTtcblx0XHR0aGlzLmFyZ3VtZW50KFwiPGVudHJ5PlwiLCBcIlBhdGggdG8gdGhlIFR5cGVTY3JpcHQgZW50cnkgZmlsZVwiKTtcblx0XHR0aGlzLmFyZ3VtZW50KFwiW2FyZ3MuLi5dXCIsIFwiQXJndW1lbnRzIGZvcndhcmRlZCB0byB0aGUgZW50cnkgYWZ0ZXIgcmV3cml0aW5nIGFyZ3ZcIik7XG5cdFx0dGhpcy5hZGRPcHRpb24obmV3IENvbmZpZ3VyYXRpb25PcHRpb24oXCJkZWJ1Z1wiKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29tbWFuZGVyIHBhc3NlcyBwb3NpdGlvbmFscyBiZWZvcmUgb3B0aW9ucyB3aGVuIGA8ZW50cnk+IFthcmdzLi4uXWAgaXMgZGVjbGFyZWQuXG5cdCAqIFRoZSBDTEkgaG9zdCBNb2R1bGVGYWN0b3J5IGV4cGVjdHMgYChvcHRzLCBjbWQpYCDigJQgbm9ybWFsaXplIGFuZCBzdGFzaCBlbnRyeS9hcmdzIG9uIG9wdHMuXG5cdCAqL1xuXHRwdWJsaWMgb3ZlcnJpZGUgYWN0aW9uKGZuOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KTogdGhpcyB7XG5cdFx0cmV0dXJuIHN1cGVyLmFjdGlvbigoLi4uYXJnczogYW55W10pID0+IHtcblx0XHRcdGNvbnN0IGNtZCA9IGFyZ3MuYXQoLTEpIGFzIERlY29oZXJlQ29tbWFuZDtcblx0XHRcdGNvbnN0IG9wdHMgPSBhcmdzLmF0KC0yKSBhcyBPcHRpb25WYWx1ZXM7XG5cdFx0XHRjb25zdCB7IGVudHJ5LCBlbnRyeUFyZ3MgfSA9IG5vcm1hbGl6ZVJ1blBvc2l0aW9uYWxzKGFyZ3Muc2xpY2UoMCwgLTIpKTtcblx0XHRcdGNtZC5zZXRPcHRpb25WYWx1ZShcImVudHJ5XCIsIGVudHJ5KTtcblx0XHRcdGNtZC5zZXRPcHRpb25WYWx1ZShcImFyZ3NcIiwgZW50cnlBcmdzKTtcblx0XHRcdHJldHVybiBmbihvcHRzLCBjbWQpO1xuXHRcdH0pO1xuXHR9XG59XG5cbi8qKiBDb21tYW5kZXIgeWllbGRzIGBbZW50cnksIGFyZ3NbXV1gIG9yIHNvbWV0aW1lcyBhIGZsYXQgbGlzdCBkZXBlbmRpbmcgb24gYXJpdHkuICovXG5mdW5jdGlvbiBub3JtYWxpemVSdW5Qb3NpdGlvbmFscyhwb3NpdGlvbmFsczogdW5rbm93bltdKToge1xuXHRlbnRyeTogc3RyaW5nO1xuXHRlbnRyeUFyZ3M6IHN0cmluZ1tdO1xufSB7XG5cdGlmIChwb3NpdGlvbmFscy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4geyBlbnRyeTogXCJcIiwgZW50cnlBcmdzOiBbXSB9O1xuXHR9XG5cblx0Y29uc3QgZmlyc3QgPSBwb3NpdGlvbmFsc1swXTtcblx0aWYgKHR5cGVvZiBmaXJzdCAhPT0gXCJzdHJpbmdcIiB8fCBmaXJzdCA9PT0gXCJcIikge1xuXHRcdHJldHVybiB7IGVudHJ5OiBcIlwiLCBlbnRyeUFyZ3M6IFtdIH07XG5cdH1cblxuXHRjb25zdCBzZWNvbmQgPSBwb3NpdGlvbmFsc1sxXTtcblx0aWYgKEFycmF5LmlzQXJyYXkoc2Vjb25kKSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRlbnRyeTogZmlyc3QsXG5cdFx0XHRlbnRyeUFyZ3M6IHNlY29uZC5maWx0ZXIoKHMpOiBzIGlzIHN0cmluZyA9PiB0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiksXG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0ZW50cnk6IGZpcnN0LFxuXHRcdGVudHJ5QXJnczogcG9zaXRpb25hbHNcblx0XHRcdC5zbGljZSgxKVxuXHRcdFx0LmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmIHMgIT09IFwiXCIpLFxuXHR9O1xufVxuIl0sIm5hbWVzIjpbIkNvbmZpZ3VyYXRpb25PcHRpb24iLCJEZWNvaGVyZUNvbW1hbmQiLCJSdW5BY3Rpb24iLCJSdW5Db21tYW5kIiwiYWN0aW9ucyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImFyZ3VtZW50IiwiYWRkT3B0aW9uIiwiYWN0aW9uIiwiZm4iLCJhcmdzIiwiY21kIiwiYXQiLCJvcHRzIiwiZW50cnkiLCJlbnRyeUFyZ3MiLCJub3JtYWxpemVSdW5Qb3NpdGlvbmFscyIsInNsaWNlIiwic2V0T3B0aW9uVmFsdWUiLCJwb3NpdGlvbmFscyIsImxlbmd0aCIsImZpcnN0Iiwic2Vjb25kIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwicyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsbUJBQW1CLEVBQUVDLGVBQWUsUUFBUSxzQkFBc0I7QUFFM0UsU0FBU0MsU0FBUyxRQUFRLGtCQUFrQjtBQUU1QyxPQUFPLE1BQU1DLG1CQUFtQkY7SUFDL0IsSUFBb0JHLFVBQVU7UUFDN0IsT0FBTztZQUFDRjtTQUFVO0lBQ25CO0lBRUEsWUFBbUJHLElBQVksQ0FBRTtRQUNoQyxLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxXQUFXLENBQUM7UUFDakIsSUFBSSxDQUFDQyxRQUFRLENBQUMsV0FBVztRQUN6QixJQUFJLENBQUNBLFFBQVEsQ0FBQyxhQUFhO1FBQzNCLElBQUksQ0FBQ0MsU0FBUyxDQUFDLElBQUlSLG9CQUFvQjtJQUN4QztJQUVBOzs7RUFHQyxHQUNELEFBQWdCUyxPQUFPQyxFQUE0QyxFQUFRO1FBQzFFLE9BQU8sS0FBSyxDQUFDRCxPQUFPLENBQUMsR0FBR0U7WUFDdkIsTUFBTUMsTUFBTUQsS0FBS0UsRUFBRSxDQUFDLENBQUM7WUFDckIsTUFBTUMsT0FBT0gsS0FBS0UsRUFBRSxDQUFDLENBQUM7WUFDdEIsTUFBTSxFQUFFRSxLQUFLLEVBQUVDLFNBQVMsRUFBRSxHQUFHQyx3QkFBd0JOLEtBQUtPLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDcEVOLElBQUlPLGNBQWMsQ0FBQyxTQUFTSjtZQUM1QkgsSUFBSU8sY0FBYyxDQUFDLFFBQVFIO1lBQzNCLE9BQU9OLEdBQUdJLE1BQU1GO1FBQ2pCO0lBQ0Q7QUFDRDtBQUVBLG9GQUFvRixHQUNwRixTQUFTSyx3QkFBd0JHLFdBQXNCO0lBSXRELElBQUlBLFlBQVlDLE1BQU0sS0FBSyxHQUFHO1FBQzdCLE9BQU87WUFBRU4sT0FBTztZQUFJQyxXQUFXLEVBQUU7UUFBQztJQUNuQztJQUVBLE1BQU1NLFFBQVFGLFdBQVcsQ0FBQyxFQUFFO0lBQzVCLElBQUksT0FBT0UsVUFBVSxZQUFZQSxVQUFVLElBQUk7UUFDOUMsT0FBTztZQUFFUCxPQUFPO1lBQUlDLFdBQVcsRUFBRTtRQUFDO0lBQ25DO0lBRUEsTUFBTU8sU0FBU0gsV0FBVyxDQUFDLEVBQUU7SUFDN0IsSUFBSUksTUFBTUMsT0FBTyxDQUFDRixTQUFTO1FBQzFCLE9BQU87WUFDTlIsT0FBT087WUFDUE4sV0FBV08sT0FBT0csTUFBTSxDQUFDLENBQUNDLElBQW1CLE9BQU9BLE1BQU07UUFDM0Q7SUFDRDtJQUVBLE9BQU87UUFDTlosT0FBT087UUFDUE4sV0FBV0ksWUFDVEYsS0FBSyxDQUFDLEdBQ05RLE1BQU0sQ0FBQyxDQUFDQyxJQUFtQixPQUFPQSxNQUFNLFlBQVlBLE1BQU07SUFDN0Q7QUFDRCJ9
|
package/es6/src/serve.action.js
CHANGED
|
@@ -4,25 +4,107 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
4
4
|
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
}
|
|
7
|
+
function _ts_metadata(k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
}
|
|
10
|
+
import path from "node:path";
|
|
7
11
|
import { injectable } from "@decohere/crucible/decorators";
|
|
12
|
+
// biome-ignore lint/style/useImportType: <DI>
|
|
13
|
+
import { Workspace } from "@decohere/mesh";
|
|
8
14
|
import { ActionResponse } from "@decohere/nexus/cli";
|
|
9
15
|
import { scribe } from "@decohere/scribe";
|
|
16
|
+
// biome-ignore lint/style/useImportType: <DI>
|
|
17
|
+
import { DeferredScriptRunner } from "./deferred-script-runner.js";
|
|
18
|
+
// biome-ignore lint/style/useImportType: <DI>
|
|
10
19
|
import { HotReloadServer } from "./hot-reload-server.js";
|
|
20
|
+
import { classifySliceProjects, resolveDeferScript } from "./slice-serve.js";
|
|
11
21
|
export class ServeAction {
|
|
22
|
+
server;
|
|
23
|
+
workspace;
|
|
24
|
+
deferredScripts;
|
|
25
|
+
logger = scribe.logger(ServeAction.name);
|
|
26
|
+
constructor(server, workspace, deferredScripts){
|
|
27
|
+
this.server = server;
|
|
28
|
+
this.workspace = workspace;
|
|
29
|
+
this.deferredScripts = deferredScripts;
|
|
30
|
+
}
|
|
12
31
|
async run(options) {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
32
|
+
const slices = (options.slices ?? []).filter((s)=>s !== "");
|
|
33
|
+
if (slices.length > 0 && options.project != null) {
|
|
34
|
+
throw new Error("Use either directory slices or --project, not both");
|
|
35
|
+
}
|
|
36
|
+
if (slices.length > 0) {
|
|
37
|
+
return this.runSlices(options, slices);
|
|
38
|
+
}
|
|
39
|
+
await this.server.start({
|
|
40
|
+
workspace: this.workspace,
|
|
41
|
+
buildConfig: options.configuration,
|
|
42
|
+
project: options.project,
|
|
43
|
+
rebootDebounceMs: options.rebootDebounceMs
|
|
19
44
|
});
|
|
20
|
-
|
|
21
|
-
|
|
45
|
+
return ActionResponse.Blocking(ServeAction.name);
|
|
46
|
+
}
|
|
47
|
+
async runSlices(options, slices) {
|
|
48
|
+
const views = await this.toSliceViews(options.configuration);
|
|
49
|
+
const classified = classifySliceProjects(views, slices);
|
|
50
|
+
const label = slices.join(" ");
|
|
51
|
+
for (const skipped of classified.skip){
|
|
52
|
+
this.logger.info(`skipped ${skipped.projectDirectory} — library (no Flux entry / scripts)`);
|
|
53
|
+
}
|
|
54
|
+
if (classified.flux.length === 0 && classified.defer.length === 0) {
|
|
55
|
+
throw new Error(`No runnable projects in slice(s) "${label}" (need Flux main.ts apps and/or package scripts.dev/serve)`);
|
|
56
|
+
}
|
|
57
|
+
const workspaceRoot = path.resolve(this.workspace.rootDir ?? process.cwd());
|
|
58
|
+
for (const deferred of classified.defer){
|
|
59
|
+
const script = resolveDeferScript(deferred.scripts);
|
|
60
|
+
if (script == null) continue;
|
|
61
|
+
const project = this.findProject(options.configuration, deferred.name);
|
|
62
|
+
this.deferredScripts.start({
|
|
63
|
+
label: deferred.projectDirectory,
|
|
64
|
+
cwd: project.projectRoot,
|
|
65
|
+
script,
|
|
66
|
+
workspaceRoot
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (classified.flux.length > 0) {
|
|
70
|
+
await this.server.start({
|
|
71
|
+
workspace: this.workspace,
|
|
72
|
+
buildConfig: options.configuration,
|
|
73
|
+
projects: classified.flux.map((p)=>p.name),
|
|
74
|
+
rebootDebounceMs: options.rebootDebounceMs
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return ActionResponse.Blocking(ServeAction.name);
|
|
78
|
+
}
|
|
79
|
+
async toSliceViews(configuration) {
|
|
80
|
+
const projects = this.workspace.getProjects(configuration);
|
|
81
|
+
return Promise.all(projects.map((project)=>this.toSliceView(project)));
|
|
82
|
+
}
|
|
83
|
+
async toSliceView(project) {
|
|
84
|
+
const pkg = await project.getPackageJson();
|
|
85
|
+
return {
|
|
86
|
+
name: project.name,
|
|
87
|
+
projectDirectory: project.projectDirectory.replaceAll("\\", "/"),
|
|
88
|
+
main: pkg.main ?? "src/index.ts",
|
|
89
|
+
scripts: pkg.scripts ?? {}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
findProject(configuration, name) {
|
|
93
|
+
const found = this.workspace.getProjects(configuration).find((p)=>p.name === name);
|
|
94
|
+
if (found == null) {
|
|
95
|
+
throw new Error(`Project "${name}" not found in workspace`);
|
|
96
|
+
}
|
|
97
|
+
return found;
|
|
22
98
|
}
|
|
23
99
|
}
|
|
24
100
|
ServeAction = _ts_decorate([
|
|
25
|
-
injectable()
|
|
101
|
+
injectable(),
|
|
102
|
+
_ts_metadata("design:type", Function),
|
|
103
|
+
_ts_metadata("design:paramtypes", [
|
|
104
|
+
typeof HotReloadServer === "undefined" ? Object : HotReloadServer,
|
|
105
|
+
typeof Workspace === "undefined" ? Object : Workspace,
|
|
106
|
+
typeof DeferredScriptRunner === "undefined" ? Object : DeferredScriptRunner
|
|
107
|
+
])
|
|
26
108
|
], ServeAction);
|
|
27
109
|
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNlcnZlT3B0aW9ucyA9IHtcblx0ZW50cnk6IHN0cmluZztcblx0d2F0Y2hEaXI6IHN0cmluZztcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBTZXJ2ZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBlbnRyeSwgd2F0Y2hEaXIgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcIlNlcnZlQWN0aW9uXCIpO1xuXHRcdGNvbnN0IHNlcnZlciA9IG5ldyBIb3RSZWxvYWRTZXJ2ZXIobG9nZ2VyKTtcblxuXHRcdHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgc2VydmVyLmRpc3Bvc2UoKTtcblx0XHRcdHByb2Nlc3MuZXhpdCgwKTtcblx0XHR9KTtcblxuXHRcdGF3YWl0IHNlcnZlci5zdGFydChlbnRyeSwgd2F0Y2hEaXIpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFNlcnZlQWN0aW9uLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIkFjdGlvblJlc3BvbnNlIiwic2NyaWJlIiwiSG90UmVsb2FkU2VydmVyIiwiU2VydmVBY3Rpb24iLCJydW4iLCJvcHRpb25zIiwiZW50cnkiLCJ3YXRjaERpciIsImxvZ2dlciIsInNlcnZlciIsInByb2Nlc3MiLCJvbiIsImRpc3Bvc2UiLCJleGl0Iiwic3RhcnQiLCJTdWNjZXNzIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLGVBQWUsUUFBUSx5QkFBeUI7QUFRekQsT0FBTyxNQUFNQztJQUNaLE1BQWFDLElBQUlDLE9BQXFCLEVBQTJCO1FBQ2hFLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0Y7UUFDNUIsTUFBTUcsU0FBU1AsT0FBT08sTUFBTSxDQUFDO1FBQzdCLE1BQU1DLFNBQVMsSUFBSVAsZ0JBQWdCTTtRQUVuQ0UsUUFBUUMsRUFBRSxDQUFDLFVBQVU7WUFDcEIsTUFBTUYsT0FBT0csT0FBTztZQUNwQkYsUUFBUUcsSUFBSSxDQUFDO1FBQ2Q7UUFFQSxNQUFNSixPQUFPSyxLQUFLLENBQUNSLE9BQU9DO1FBQzFCLE9BQU9QLGVBQWVlLE9BQU8sQ0FBQ1osWUFBWWEsSUFBSTtJQUMvQztBQUNEIn0=
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyB0eXBlIFByb2plY3QsIFdvcmtzcGFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgdHlwZSBBY3Rpb24sIEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuaW1wb3J0IHtcblx0Y2xhc3NpZnlTbGljZVByb2plY3RzLFxuXHRyZXNvbHZlRGVmZXJTY3JpcHQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcblxuZXhwb3J0IHR5cGUgU2VydmVPcHRpb25zID0ge1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKiBPbmUgb3IgbW9yZSBtb2R1bGUgZGlyZWN0b3J5IHRva2VucyAoYGZ1bmRpbmdgLCBgc2hlbGxgLCBgcHJvamVjdHMvZnVuZGluZ2ApLiAqL1xuXHRzbGljZXM/OiBzdHJpbmdbXTtcblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoU2VydmVBY3Rpb24ubmFtZSk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBIb3RSZWxvYWRTZXJ2ZXIsXG5cdFx0cHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcblx0XHRwcml2YXRlIHJlYWRvbmx5IGRlZmVycmVkU2NyaXB0czogRGVmZXJyZWRTY3JpcHRSdW5uZXIsXG5cdCkge31cblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFNlcnZlT3B0aW9ucyk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0XHRjb25zdCBzbGljZXMgPSAob3B0aW9ucy5zbGljZXMgPz8gW10pLmZpbHRlcigocykgPT4gcyAhPT0gXCJcIik7XG5cdFx0aWYgKHNsaWNlcy5sZW5ndGggPiAwICYmIG9wdGlvbnMucHJvamVjdCAhPSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVc2UgZWl0aGVyIGRpcmVjdG9yeSBzbGljZXMgb3IgLS1wcm9qZWN0LCBub3QgYm90aFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc2xpY2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnJ1blNsaWNlcyhvcHRpb25zLCBzbGljZXMpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdHdvcmtzcGFjZTogdGhpcy53b3Jrc3BhY2UsXG5cdFx0XHRidWlsZENvbmZpZzogb3B0aW9ucy5jb25maWd1cmF0aW9uLFxuXHRcdFx0cHJvamVjdDogb3B0aW9ucy5wcm9qZWN0LFxuXHRcdFx0cmVib290RGVib3VuY2VNczogb3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zLFxuXHRcdH0pO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuU2xpY2VzKG9wdGlvbnM6IFNlcnZlT3B0aW9ucywgc2xpY2VzOiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0XHRjb25zdCB2aWV3cyA9IGF3YWl0IHRoaXMudG9TbGljZVZpZXdzKG9wdGlvbnMuY29uZmlndXJhdGlvbik7XG5cdFx0Y29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5U2xpY2VQcm9qZWN0cyh2aWV3cywgc2xpY2VzKTtcblx0XHRjb25zdCBsYWJlbCA9IHNsaWNlcy5qb2luKFwiIFwiKTtcblxuXHRcdGZvciAoY29uc3Qgc2tpcHBlZCBvZiBjbGFzc2lmaWVkLnNraXApIHtcblx0XHRcdHRoaXMubG9nZ2VyLmluZm8oXG5cdFx0XHRcdGBza2lwcGVkICR7c2tpcHBlZC5wcm9qZWN0RGlyZWN0b3J5fSDigJQgbGlicmFyeSAobm8gRmx1eCBlbnRyeSAvIHNjcmlwdHMpYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNsYXNzaWZpZWQuZmx1eC5sZW5ndGggPT09IDAgJiYgY2xhc3NpZmllZC5kZWZlci5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YE5vIHJ1bm5hYmxlIHByb2plY3RzIGluIHNsaWNlKHMpIFwiJHtsYWJlbH1cIiAobmVlZCBGbHV4IG1haW4udHMgYXBwcyBhbmQvb3IgcGFja2FnZSBzY3JpcHRzLmRldi9zZXJ2ZSlgLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCB3b3Jrc3BhY2VSb290ID0gcGF0aC5yZXNvbHZlKHRoaXMud29ya3NwYWNlLnJvb3REaXIgPz8gcHJvY2Vzcy5jd2QoKSk7XG5cblx0XHRmb3IgKGNvbnN0IGRlZmVycmVkIG9mIGNsYXNzaWZpZWQuZGVmZXIpIHtcblx0XHRcdGNvbnN0IHNjcmlwdCA9IHJlc29sdmVEZWZlclNjcmlwdChkZWZlcnJlZC5zY3JpcHRzKTtcblx0XHRcdGlmIChzY3JpcHQgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBwcm9qZWN0ID0gdGhpcy5maW5kUHJvamVjdChvcHRpb25zLmNvbmZpZ3VyYXRpb24sIGRlZmVycmVkLm5hbWUpO1xuXHRcdFx0dGhpcy5kZWZlcnJlZFNjcmlwdHMuc3RhcnQoe1xuXHRcdFx0XHRsYWJlbDogZGVmZXJyZWQucHJvamVjdERpcmVjdG9yeSxcblx0XHRcdFx0Y3dkOiBwcm9qZWN0LnByb2plY3RSb290LFxuXHRcdFx0XHRzY3JpcHQsXG5cdFx0XHRcdHdvcmtzcGFjZVJvb3QsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoY2xhc3NpZmllZC5mbHV4Lmxlbmd0aCA+IDApIHtcblx0XHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdFx0YnVpbGRDb25maWc6IG9wdGlvbnMuY29uZmlndXJhdGlvbixcblx0XHRcdFx0cHJvamVjdHM6IGNsYXNzaWZpZWQuZmx1eC5tYXAoKHApID0+IHAubmFtZSksXG5cdFx0XHRcdHJlYm9vdERlYm91bmNlTXM6IG9wdGlvbnMucmVib290RGVib3VuY2VNcyxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdG9TbGljZVZpZXdzKGNvbmZpZ3VyYXRpb246IHN0cmluZyk6IFByb21pc2U8U2xpY2VQcm9qZWN0Vmlld1tdPiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZS5nZXRQcm9qZWN0cyhjb25maWd1cmF0aW9uKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiB0aGlzLnRvU2xpY2VWaWV3KHByb2plY3QpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHRvU2xpY2VWaWV3KHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPFNsaWNlUHJvamVjdFZpZXc+IHtcblx0XHRjb25zdCBwa2cgPSBhd2FpdCBwcm9qZWN0LmdldFBhY2thZ2VKc29uKCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IHByb2plY3QubmFtZSxcblx0XHRcdHByb2plY3REaXJlY3Rvcnk6IHByb2plY3QucHJvamVjdERpcmVjdG9yeS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIiksXG5cdFx0XHRtYWluOiBwa2cubWFpbiA/PyBcInNyYy9pbmRleC50c1wiLFxuXHRcdFx0c2NyaXB0czogcGtnLnNjcmlwdHMgPz8ge30sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgZmluZFByb2plY3QoY29uZmlndXJhdGlvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9qZWN0IHtcblx0XHRjb25zdCBmb3VuZCA9IHRoaXMud29ya3NwYWNlLmdldFByb2plY3RzKGNvbmZpZ3VyYXRpb24pLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0fVxuXHRcdHJldHVybiBmb3VuZDtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJzY3JpYmUiLCJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsIkhvdFJlbG9hZFNlcnZlciIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0cyIsInJlc29sdmVEZWZlclNjcmlwdCIsIlNlcnZlQWN0aW9uIiwibG9nZ2VyIiwibmFtZSIsInNlcnZlciIsIndvcmtzcGFjZSIsImRlZmVycmVkU2NyaXB0cyIsInJ1biIsIm9wdGlvbnMiLCJzbGljZXMiLCJmaWx0ZXIiLCJzIiwibGVuZ3RoIiwicHJvamVjdCIsIkVycm9yIiwicnVuU2xpY2VzIiwic3RhcnQiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWJvb3REZWJvdW5jZU1zIiwiQmxvY2tpbmciLCJ2aWV3cyIsInRvU2xpY2VWaWV3cyIsImNsYXNzaWZpZWQiLCJsYWJlbCIsImpvaW4iLCJza2lwcGVkIiwic2tpcCIsImluZm8iLCJwcm9qZWN0RGlyZWN0b3J5IiwiZmx1eCIsImRlZmVyIiwid29ya3NwYWNlUm9vdCIsInJlc29sdmUiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsImRlZmVycmVkIiwic2NyaXB0Iiwic2NyaXB0cyIsImZpbmRQcm9qZWN0IiwicHJvamVjdFJvb3QiLCJwcm9qZWN0cyIsIm1hcCIsInAiLCJnZXRQcm9qZWN0cyIsIlByb21pc2UiLCJhbGwiLCJ0b1NsaWNlVmlldyIsInBrZyIsImdldFBhY2thZ2VKc29uIiwicmVwbGFjZUFsbCIsIm1haW4iLCJmb3VuZCIsImZpbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU9BLFVBQVUsWUFBWTtBQUM3QixTQUFTQyxVQUFVLFFBQVEsZ0NBQWdDO0FBQzNELDhDQUE4QztBQUM5QyxTQUF1QkMsU0FBUyxRQUFRLGlCQUFpQjtBQUN6RCxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUN2RCw4Q0FBOEM7QUFDOUMsU0FBU0Msb0JBQW9CLFFBQVEsOEJBQThCO0FBQ25FLDhDQUE4QztBQUM5QyxTQUFTQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3pELFNBQ0NDLHFCQUFxQixFQUNyQkMsa0JBQWtCLFFBRVosbUJBQW1CO0FBVzFCLE9BQU8sTUFBTUM7Ozs7SUFDS0MsU0FBaUJOLE9BQU9NLE1BQU0sQ0FBQ0QsWUFBWUUsSUFBSSxFQUFFO0lBRWxFLFlBQ0MsQUFBaUJDLE1BQXVCLEVBQ3hDLEFBQWlCQyxTQUFvQixFQUNyQyxBQUFpQkMsZUFBcUMsQ0FDckQ7YUFIZ0JGLFNBQUFBO2FBQ0FDLFlBQUFBO2FBQ0FDLGtCQUFBQTtJQUNmO0lBRUgsTUFBYUMsSUFBSUMsT0FBcUIsRUFBMkI7UUFDaEUsTUFBTUMsU0FBUyxBQUFDRCxDQUFBQSxRQUFRQyxNQUFNLElBQUksRUFBRSxBQUFELEVBQUdDLE1BQU0sQ0FBQyxDQUFDQyxJQUFNQSxNQUFNO1FBQzFELElBQUlGLE9BQU9HLE1BQU0sR0FBRyxLQUFLSixRQUFRSyxPQUFPLElBQUksTUFBTTtZQUNqRCxNQUFNLElBQUlDLE1BQU07UUFDakI7UUFFQSxJQUFJTCxPQUFPRyxNQUFNLEdBQUcsR0FBRztZQUN0QixPQUFPLElBQUksQ0FBQ0csU0FBUyxDQUFDUCxTQUFTQztRQUNoQztRQUVBLE1BQU0sSUFBSSxDQUFDTCxNQUFNLENBQUNZLEtBQUssQ0FBQztZQUN2QlgsV0FBVyxJQUFJLENBQUNBLFNBQVM7WUFDekJZLGFBQWFULFFBQVFVLGFBQWE7WUFDbENMLFNBQVNMLFFBQVFLLE9BQU87WUFDeEJNLGtCQUFrQlgsUUFBUVcsZ0JBQWdCO1FBQzNDO1FBQ0EsT0FBT3hCLGVBQWV5QixRQUFRLENBQUNuQixZQUFZRSxJQUFJO0lBQ2hEO0lBRUEsTUFBY1ksVUFBVVAsT0FBcUIsRUFBRUMsTUFBZ0IsRUFBMkI7UUFDekYsTUFBTVksUUFBUSxNQUFNLElBQUksQ0FBQ0MsWUFBWSxDQUFDZCxRQUFRVSxhQUFhO1FBQzNELE1BQU1LLGFBQWF4QixzQkFBc0JzQixPQUFPWjtRQUNoRCxNQUFNZSxRQUFRZixPQUFPZ0IsSUFBSSxDQUFDO1FBRTFCLEtBQUssTUFBTUMsV0FBV0gsV0FBV0ksSUFBSSxDQUFFO1lBQ3RDLElBQUksQ0FBQ3pCLE1BQU0sQ0FBQzBCLElBQUksQ0FDZixDQUFDLFFBQVEsRUFBRUYsUUFBUUcsZ0JBQWdCLENBQUMsb0NBQW9DLENBQUM7UUFFM0U7UUFFQSxJQUFJTixXQUFXTyxJQUFJLENBQUNsQixNQUFNLEtBQUssS0FBS1csV0FBV1EsS0FBSyxDQUFDbkIsTUFBTSxLQUFLLEdBQUc7WUFDbEUsTUFBTSxJQUFJRSxNQUNULENBQUMsa0NBQWtDLEVBQUVVLE1BQU0sMkRBQTJELENBQUM7UUFFekc7UUFFQSxNQUFNUSxnQkFBZ0J4QyxLQUFLeUMsT0FBTyxDQUFDLElBQUksQ0FBQzVCLFNBQVMsQ0FBQzZCLE9BQU8sSUFBSUMsUUFBUUMsR0FBRztRQUV4RSxLQUFLLE1BQU1DLFlBQVlkLFdBQVdRLEtBQUssQ0FBRTtZQUN4QyxNQUFNTyxTQUFTdEMsbUJBQW1CcUMsU0FBU0UsT0FBTztZQUNsRCxJQUFJRCxVQUFVLE1BQU07WUFDcEIsTUFBTXpCLFVBQVUsSUFBSSxDQUFDMkIsV0FBVyxDQUFDaEMsUUFBUVUsYUFBYSxFQUFFbUIsU0FBU2xDLElBQUk7WUFDckUsSUFBSSxDQUFDRyxlQUFlLENBQUNVLEtBQUssQ0FBQztnQkFDMUJRLE9BQU9hLFNBQVNSLGdCQUFnQjtnQkFDaENPLEtBQUt2QixRQUFRNEIsV0FBVztnQkFDeEJIO2dCQUNBTjtZQUNEO1FBQ0Q7UUFFQSxJQUFJVCxXQUFXTyxJQUFJLENBQUNsQixNQUFNLEdBQUcsR0FBRztZQUMvQixNQUFNLElBQUksQ0FBQ1IsTUFBTSxDQUFDWSxLQUFLLENBQUM7Z0JBQ3ZCWCxXQUFXLElBQUksQ0FBQ0EsU0FBUztnQkFDekJZLGFBQWFULFFBQVFVLGFBQWE7Z0JBQ2xDd0IsVUFBVW5CLFdBQVdPLElBQUksQ0FBQ2EsR0FBRyxDQUFDLENBQUNDLElBQU1BLEVBQUV6QyxJQUFJO2dCQUMzQ2dCLGtCQUFrQlgsUUFBUVcsZ0JBQWdCO1lBQzNDO1FBQ0Q7UUFFQSxPQUFPeEIsZUFBZXlCLFFBQVEsQ0FBQ25CLFlBQVlFLElBQUk7SUFDaEQ7SUFFQSxNQUFjbUIsYUFBYUosYUFBcUIsRUFBK0I7UUFDOUUsTUFBTXdCLFdBQVcsSUFBSSxDQUFDckMsU0FBUyxDQUFDd0MsV0FBVyxDQUFDM0I7UUFDNUMsT0FBTzRCLFFBQVFDLEdBQUcsQ0FBQ0wsU0FBU0MsR0FBRyxDQUFDLENBQUM5QixVQUFZLElBQUksQ0FBQ21DLFdBQVcsQ0FBQ25DO0lBQy9EO0lBRUEsTUFBY21DLFlBQVluQyxPQUFnQixFQUE2QjtRQUN0RSxNQUFNb0MsTUFBTSxNQUFNcEMsUUFBUXFDLGNBQWM7UUFDeEMsT0FBTztZQUNOL0MsTUFBTVUsUUFBUVYsSUFBSTtZQUNsQjBCLGtCQUFrQmhCLFFBQVFnQixnQkFBZ0IsQ0FBQ3NCLFVBQVUsQ0FBQyxNQUFNO1lBQzVEQyxNQUFNSCxJQUFJRyxJQUFJLElBQUk7WUFDbEJiLFNBQVNVLElBQUlWLE9BQU8sSUFBSSxDQUFDO1FBQzFCO0lBQ0Q7SUFFUUMsWUFBWXRCLGFBQXFCLEVBQUVmLElBQVksRUFBVztRQUNqRSxNQUFNa0QsUUFBUSxJQUFJLENBQUNoRCxTQUFTLENBQUN3QyxXQUFXLENBQUMzQixlQUFlb0MsSUFBSSxDQUFDLENBQUNWLElBQU1BLEVBQUV6QyxJQUFJLEtBQUtBO1FBQy9FLElBQUlrRCxTQUFTLE1BQU07WUFDbEIsTUFBTSxJQUFJdkMsTUFBTSxDQUFDLFNBQVMsRUFBRVgsS0FBSyx3QkFBd0IsQ0FBQztRQUMzRDtRQUNBLE9BQU9rRDtJQUNSO0FBQ0QifQ==
|
package/es6/src/serve.command.js
CHANGED
|
@@ -1,15 +1,47 @@
|
|
|
1
|
-
import { DecohereCommand } from "@decohere/nexus/cli";
|
|
2
|
-
import {
|
|
1
|
+
import { ConfigurationOption, DecohereCommand, ProjectOption } from "@decohere/nexus/cli";
|
|
2
|
+
import { DEFAULT_REBOOT_DEBOUNCE_MS, resolveRebootDebounceMs } from "./hot-reload-server.js";
|
|
3
|
+
import { ServeAction } from "./serve.action.js";
|
|
3
4
|
export class ServeCommand extends DecohereCommand {
|
|
4
5
|
get actions() {
|
|
5
6
|
return [
|
|
6
|
-
|
|
7
|
+
ServeAction
|
|
7
8
|
];
|
|
8
9
|
}
|
|
9
10
|
constructor(name){
|
|
10
11
|
super(name);
|
|
11
|
-
this.description("Serve
|
|
12
|
+
this.description("Serve a project or directory slices (Flux apps in-process; foreign packages via package scripts)");
|
|
13
|
+
this.argument("[slices...]", "Module directories to serve (e.g. funding shell secmaster, or projects/funding)");
|
|
14
|
+
this.addOption(new ConfigurationOption("debug"));
|
|
15
|
+
this.addOption(new ProjectOption());
|
|
16
|
+
this.option("--reboot-debounce-ms <ms>", "Quiet window in milliseconds after the last affecting save before a reboot", (value)=>resolveRebootDebounceMs(Number(value)), DEFAULT_REBOOT_DEBOUNCE_MS);
|
|
12
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Commander passes positional args before options when `[slices...]` is declared.
|
|
20
|
+
* The CLI host ModuleFactory expects `(opts, cmd)` — normalize here.
|
|
21
|
+
*/ action(fn) {
|
|
22
|
+
return super.action((...args)=>{
|
|
23
|
+
const cmd = args.at(-1);
|
|
24
|
+
const first = args[0];
|
|
25
|
+
const hasPositionalSlices = Array.isArray(first) || typeof first === "string" || first === undefined;
|
|
26
|
+
const opts = hasPositionalSlices ? args[1] : args[0];
|
|
27
|
+
const slices = normalizePositionalSlices(first);
|
|
28
|
+
if (slices.length > 0) {
|
|
29
|
+
cmd.setOptionValue("slices", slices);
|
|
30
|
+
}
|
|
31
|
+
return fn(opts, cmd);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function normalizePositionalSlices(first) {
|
|
36
|
+
if (Array.isArray(first)) {
|
|
37
|
+
return first.filter((s)=>typeof s === "string" && s !== "");
|
|
38
|
+
}
|
|
39
|
+
if (typeof first === "string" && first !== "") {
|
|
40
|
+
return [
|
|
41
|
+
first
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
return [];
|
|
13
45
|
}
|
|
14
46
|
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlndXJhdGlvbk9wdGlvbiwgRGVjb2hlcmVDb21tYW5kLCBQcm9qZWN0T3B0aW9uIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uVmFsdWVzIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIHJlc29sdmVSZWJvb3REZWJvdW5jZU1zIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IFNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZUNvbW1hbmQgZXh0ZW5kcyBEZWNvaGVyZUNvbW1hbmQge1xuXHRwdWJsaWMgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7XG5cdFx0cmV0dXJuIFtTZXJ2ZUFjdGlvbl07XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobmFtZSk7XG5cdFx0dGhpcy5kZXNjcmlwdGlvbihcblx0XHRcdFwiU2VydmUgYSBwcm9qZWN0IG9yIGRpcmVjdG9yeSBzbGljZXMgKEZsdXggYXBwcyBpbi1wcm9jZXNzOyBmb3JlaWduIHBhY2thZ2VzIHZpYSBwYWNrYWdlIHNjcmlwdHMpXCIsXG5cdFx0KTtcblx0XHR0aGlzLmFyZ3VtZW50KFxuXHRcdFx0XCJbc2xpY2VzLi4uXVwiLFxuXHRcdFx0XCJNb2R1bGUgZGlyZWN0b3JpZXMgdG8gc2VydmUgKGUuZy4gZnVuZGluZyBzaGVsbCBzZWNtYXN0ZXIsIG9yIHByb2plY3RzL2Z1bmRpbmcpXCIsXG5cdFx0KTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgQ29uZmlndXJhdGlvbk9wdGlvbihcImRlYnVnXCIpKTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgUHJvamVjdE9wdGlvbigpKTtcblx0XHR0aGlzLm9wdGlvbihcblx0XHRcdFwiLS1yZWJvb3QtZGVib3VuY2UtbXMgPG1zPlwiLFxuXHRcdFx0XCJRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdFwiLFxuXHRcdFx0KHZhbHVlOiBzdHJpbmcpID0+IHJlc29sdmVSZWJvb3REZWJvdW5jZU1zKE51bWJlcih2YWx1ZSkpLFxuXHRcdFx0REVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21tYW5kZXIgcGFzc2VzIHBvc2l0aW9uYWwgYXJncyBiZWZvcmUgb3B0aW9ucyB3aGVuIGBbc2xpY2VzLi4uXWAgaXMgZGVjbGFyZWQuXG5cdCAqIFRoZSBDTEkgaG9zdCBNb2R1bGVGYWN0b3J5IGV4cGVjdHMgYChvcHRzLCBjbWQpYCDigJQgbm9ybWFsaXplIGhlcmUuXG5cdCAqL1xuXHRwdWJsaWMgb3ZlcnJpZGUgYWN0aW9uKGZuOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KTogdGhpcyB7XG5cdFx0cmV0dXJuIHN1cGVyLmFjdGlvbigoLi4uYXJnczogYW55W10pID0+IHtcblx0XHRcdGNvbnN0IGNtZCA9IGFyZ3MuYXQoLTEpIGFzIERlY29oZXJlQ29tbWFuZDtcblx0XHRcdGNvbnN0IGZpcnN0ID0gYXJnc1swXTtcblx0XHRcdGNvbnN0IGhhc1Bvc2l0aW9uYWxTbGljZXMgPVxuXHRcdFx0XHRBcnJheS5pc0FycmF5KGZpcnN0KSB8fCB0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgfHwgZmlyc3QgPT09IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IG9wdHMgPSBoYXNQb3NpdGlvbmFsU2xpY2VzID8gKGFyZ3NbMV0gYXMgT3B0aW9uVmFsdWVzKSA6IChhcmdzWzBdIGFzIE9wdGlvblZhbHVlcyk7XG5cblx0XHRcdGNvbnN0IHNsaWNlcyA9IG5vcm1hbGl6ZVBvc2l0aW9uYWxTbGljZXMoZmlyc3QpO1xuXHRcdFx0aWYgKHNsaWNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNtZC5zZXRPcHRpb25WYWx1ZShcInNsaWNlc1wiLCBzbGljZXMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZuKG9wdHMsIGNtZCk7XG5cdFx0fSk7XG5cdH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvc2l0aW9uYWxTbGljZXMoZmlyc3Q6IHVua25vd24pOiBzdHJpbmdbXSB7XG5cdGlmIChBcnJheS5pc0FycmF5KGZpcnN0KSkge1xuXHRcdHJldHVybiBmaXJzdC5maWx0ZXIoKHMpOiBzIGlzIHN0cmluZyA9PiB0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiAmJiBzICE9PSBcIlwiKTtcblx0fVxuXHRpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIGZpcnN0ICE9PSBcIlwiKSB7XG5cdFx0cmV0dXJuIFtmaXJzdF07XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuIl0sIm5hbWVzIjpbIkNvbmZpZ3VyYXRpb25PcHRpb24iLCJEZWNvaGVyZUNvbW1hbmQiLCJQcm9qZWN0T3B0aW9uIiwiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJyZXNvbHZlUmVib290RGVib3VuY2VNcyIsIlNlcnZlQWN0aW9uIiwiU2VydmVDb21tYW5kIiwiYWN0aW9ucyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImFyZ3VtZW50IiwiYWRkT3B0aW9uIiwib3B0aW9uIiwidmFsdWUiLCJOdW1iZXIiLCJhY3Rpb24iLCJmbiIsImFyZ3MiLCJjbWQiLCJhdCIsImZpcnN0IiwiaGFzUG9zaXRpb25hbFNsaWNlcyIsIkFycmF5IiwiaXNBcnJheSIsInVuZGVmaW5lZCIsIm9wdHMiLCJzbGljZXMiLCJub3JtYWxpemVQb3NpdGlvbmFsU2xpY2VzIiwibGVuZ3RoIiwic2V0T3B0aW9uVmFsdWUiLCJmaWx0ZXIiLCJzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxtQkFBbUIsRUFBRUMsZUFBZSxFQUFFQyxhQUFhLFFBQVEsc0JBQXNCO0FBRTFGLFNBQVNDLDBCQUEwQixFQUFFQyx1QkFBdUIsUUFBUSx5QkFBeUI7QUFDN0YsU0FBU0MsV0FBVyxRQUFRLG9CQUFvQjtBQUVoRCxPQUFPLE1BQU1DLHFCQUFxQkw7SUFDakMsSUFBb0JNLFVBQVU7UUFDN0IsT0FBTztZQUFDRjtTQUFZO0lBQ3JCO0lBRUEsWUFBbUJHLElBQVksQ0FBRTtRQUNoQyxLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxXQUFXLENBQ2Y7UUFFRCxJQUFJLENBQUNDLFFBQVEsQ0FDWixlQUNBO1FBRUQsSUFBSSxDQUFDQyxTQUFTLENBQUMsSUFBSVgsb0JBQW9CO1FBQ3ZDLElBQUksQ0FBQ1csU0FBUyxDQUFDLElBQUlUO1FBQ25CLElBQUksQ0FBQ1UsTUFBTSxDQUNWLDZCQUNBLDhFQUNBLENBQUNDLFFBQWtCVCx3QkFBd0JVLE9BQU9ELFNBQ2xEVjtJQUVGO0lBRUE7OztFQUdDLEdBQ0QsQUFBZ0JZLE9BQU9DLEVBQTRDLEVBQVE7UUFDMUUsT0FBTyxLQUFLLENBQUNELE9BQU8sQ0FBQyxHQUFHRTtZQUN2QixNQUFNQyxNQUFNRCxLQUFLRSxFQUFFLENBQUMsQ0FBQztZQUNyQixNQUFNQyxRQUFRSCxJQUFJLENBQUMsRUFBRTtZQUNyQixNQUFNSSxzQkFDTEMsTUFBTUMsT0FBTyxDQUFDSCxVQUFVLE9BQU9BLFVBQVUsWUFBWUEsVUFBVUk7WUFDaEUsTUFBTUMsT0FBT0osc0JBQXVCSixJQUFJLENBQUMsRUFBRSxHQUFxQkEsSUFBSSxDQUFDLEVBQUU7WUFFdkUsTUFBTVMsU0FBU0MsMEJBQTBCUDtZQUN6QyxJQUFJTSxPQUFPRSxNQUFNLEdBQUcsR0FBRztnQkFDdEJWLElBQUlXLGNBQWMsQ0FBQyxVQUFVSDtZQUM5QjtZQUNBLE9BQU9WLEdBQUdTLE1BQU1QO1FBQ2pCO0lBQ0Q7QUFDRDtBQUNBLFNBQVNTLDBCQUEwQlAsS0FBYztJQUNoRCxJQUFJRSxNQUFNQyxPQUFPLENBQUNILFFBQVE7UUFDekIsT0FBT0EsTUFBTVUsTUFBTSxDQUFDLENBQUNDLElBQW1CLE9BQU9BLE1BQU0sWUFBWUEsTUFBTTtJQUN4RTtJQUNBLElBQUksT0FBT1gsVUFBVSxZQUFZQSxVQUFVLElBQUk7UUFDOUMsT0FBTztZQUFDQTtTQUFNO0lBQ2Y7SUFDQSxPQUFPLEVBQUU7QUFDViJ9
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory-slice helpers for `flux serve <dir>…` — classify Mesh packages as
|
|
3
|
+
* Flux apps, Nixpacks-style script deferrals, or libraries to skip.
|
|
4
|
+
*/ /** Preferred package scripts for foreign toolchains (Nixpacks-style). */ export const DEFER_SCRIPT_CANDIDATES = [
|
|
5
|
+
"dev",
|
|
6
|
+
"serve"
|
|
7
|
+
];
|
|
8
|
+
/**
|
|
9
|
+
* Normalize a CLI slice token to a `projects/…` prefix without a trailing slash.
|
|
10
|
+
* `funding` and `projects/funding` both become `projects/funding`.
|
|
11
|
+
*/ export function normalizeSlicePrefix(slice) {
|
|
12
|
+
const trimmed = slice.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
13
|
+
if (trimmed === "" || trimmed === ".") {
|
|
14
|
+
throw new Error("Slice directory must be a non-empty path");
|
|
15
|
+
}
|
|
16
|
+
if (trimmed === "projects" || trimmed.startsWith("projects/")) {
|
|
17
|
+
return trimmed;
|
|
18
|
+
}
|
|
19
|
+
return `projects/${trimmed}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* True when `projectDirectory` belongs to the slice token.
|
|
23
|
+
*
|
|
24
|
+
* Matches:
|
|
25
|
+
* - nested: `projects/funding`, `projects/funding/api`
|
|
26
|
+
* - flat dotted package dirs: `projects/funding.web` for token `funding`
|
|
27
|
+
*
|
|
28
|
+
* Does not match siblings that only share a string prefix (`funding` vs `funding-fee.api`).
|
|
29
|
+
*/ export function isUnderSlice(projectDirectory, slicePrefix) {
|
|
30
|
+
const dir = projectDirectory.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
31
|
+
const prefix = slicePrefix.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
32
|
+
if (dir === prefix || dir.startsWith(`${prefix}/`)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Flat monorepo packages: projects/<module>.<role>
|
|
36
|
+
return dir.startsWith(`${prefix}.`);
|
|
37
|
+
}
|
|
38
|
+
export function projectsInSlice(projects, slice) {
|
|
39
|
+
const prefix = normalizeSlicePrefix(slice);
|
|
40
|
+
return projects.filter((p)=>isUnderSlice(p.projectDirectory, prefix));
|
|
41
|
+
}
|
|
42
|
+
/** Union of packages under any of the slice tokens (deduped by package name). */ export function projectsInSlices(projects, slices) {
|
|
43
|
+
const byName = new Map();
|
|
44
|
+
for (const slice of slices){
|
|
45
|
+
for (const project of projectsInSlice(projects, slice)){
|
|
46
|
+
byName.set(project.name, project);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return [
|
|
50
|
+
...byName.values()
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
/** Script invokes Flux (in-process serve stays on Flux, not deferred). */ export function isFluxOwnedScript(script) {
|
|
54
|
+
return /\bflux\b/i.test(script);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* First Nixpacks-style serve script that is not Flux-owned.
|
|
58
|
+
* Prefers `dev`, then `serve`.
|
|
59
|
+
*/ export function resolveDeferScript(scripts) {
|
|
60
|
+
for (const name of DEFER_SCRIPT_CANDIDATES){
|
|
61
|
+
const body = scripts[name];
|
|
62
|
+
if (body != null && body !== "" && !isFluxOwnedScript(body)) {
|
|
63
|
+
return name;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
/** Convention: Flux Node apps use `main` ending in `main.ts` / `main.tsx`. */ export function isFluxAppMain(main) {
|
|
69
|
+
const normalized = main.replaceAll("\\", "/");
|
|
70
|
+
return /(^|\/)main\.tsx?$/.test(normalized);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Classify one package. Foreign serve scripts win over `main.ts` (Vite apps
|
|
74
|
+
* often have a main entry but must not be HMR-booted by Flux).
|
|
75
|
+
*/ export function classifySliceProject(project) {
|
|
76
|
+
if (resolveDeferScript(project.scripts) != null) {
|
|
77
|
+
return "defer";
|
|
78
|
+
}
|
|
79
|
+
if (isFluxAppMain(project.main)) {
|
|
80
|
+
return "flux";
|
|
81
|
+
}
|
|
82
|
+
return "skip";
|
|
83
|
+
}
|
|
84
|
+
export function classifySliceProjects(projects, slices) {
|
|
85
|
+
const tokens = typeof slices === "string" ? [
|
|
86
|
+
slices
|
|
87
|
+
] : [
|
|
88
|
+
...slices
|
|
89
|
+
];
|
|
90
|
+
const inSlice = projectsInSlices(projects, tokens);
|
|
91
|
+
const flux = [];
|
|
92
|
+
const defer = [];
|
|
93
|
+
const skip = [];
|
|
94
|
+
for (const project of inSlice){
|
|
95
|
+
const kind = classifySliceProject(project);
|
|
96
|
+
if (kind === "flux") flux.push(project);
|
|
97
|
+
else if (kind === "defer") defer.push(project);
|
|
98
|
+
else skip.push(project);
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
flux,
|
|
102
|
+
defer,
|
|
103
|
+
skip
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NsaWNlLXNlcnZlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGlyZWN0b3J5LXNsaWNlIGhlbHBlcnMgZm9yIGBmbHV4IHNlcnZlIDxkaXI+4oCmYCDigJQgY2xhc3NpZnkgTWVzaCBwYWNrYWdlcyBhc1xuICogRmx1eCBhcHBzLCBOaXhwYWNrcy1zdHlsZSBzY3JpcHQgZGVmZXJyYWxzLCBvciBsaWJyYXJpZXMgdG8gc2tpcC5cbiAqL1xuXG5leHBvcnQgdHlwZSBTbGljZVByb2plY3RWaWV3ID0ge1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBSZWxhdGl2ZSBwcm9qZWN0IGRpciBmcm9tIHdvcmtzcGFjZSByb290IChlLmcuIGBwcm9qZWN0cy9mdW5kaW5nL2FwaWApLiAqL1xuXHRyZWFkb25seSBwcm9qZWN0RGlyZWN0b3J5OiBzdHJpbmc7XG5cdHJlYWRvbmx5IG1haW46IHN0cmluZztcblx0cmVhZG9ubHkgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNsaWNlS2luZCA9IFwiZmx1eFwiIHwgXCJkZWZlclwiIHwgXCJza2lwXCI7XG5cbmV4cG9ydCB0eXBlIENsYXNzaWZpZWRTbGljZSA9IHtcblx0cmVhZG9ubHkgZmx1eDogU2xpY2VQcm9qZWN0Vmlld1tdO1xuXHRyZWFkb25seSBkZWZlcjogU2xpY2VQcm9qZWN0Vmlld1tdO1xuXHRyZWFkb25seSBza2lwOiBTbGljZVByb2plY3RWaWV3W107XG59O1xuXG4vKiogUHJlZmVycmVkIHBhY2thZ2Ugc2NyaXB0cyBmb3IgZm9yZWlnbiB0b29sY2hhaW5zIChOaXhwYWNrcy1zdHlsZSkuICovXG5leHBvcnQgY29uc3QgREVGRVJfU0NSSVBUX0NBTkRJREFURVMgPSBbXCJkZXZcIiwgXCJzZXJ2ZVwiXSBhcyBjb25zdDtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBDTEkgc2xpY2UgdG9rZW4gdG8gYSBgcHJvamVjdHMv4oCmYCBwcmVmaXggd2l0aG91dCBhIHRyYWlsaW5nIHNsYXNoLlxuICogYGZ1bmRpbmdgIGFuZCBgcHJvamVjdHMvZnVuZGluZ2AgYm90aCBiZWNvbWUgYHByb2plY3RzL2Z1bmRpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2xpY2VQcmVmaXgoc2xpY2U6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHRyaW1tZWQgPSBzbGljZS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblx0aWYgKHRyaW1tZWQgPT09IFwiXCIgfHwgdHJpbW1lZCA9PT0gXCIuXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTbGljZSBkaXJlY3RvcnkgbXVzdCBiZSBhIG5vbi1lbXB0eSBwYXRoXCIpO1xuXHR9XG5cdGlmICh0cmltbWVkID09PSBcInByb2plY3RzXCIgfHwgdHJpbW1lZC5zdGFydHNXaXRoKFwicHJvamVjdHMvXCIpKSB7XG5cdFx0cmV0dXJuIHRyaW1tZWQ7XG5cdH1cblx0cmV0dXJuIGBwcm9qZWN0cy8ke3RyaW1tZWR9YDtcbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4gYHByb2plY3REaXJlY3RvcnlgIGJlbG9uZ3MgdG8gdGhlIHNsaWNlIHRva2VuLlxuICpcbiAqIE1hdGNoZXM6XG4gKiAtIG5lc3RlZDogYHByb2plY3RzL2Z1bmRpbmdgLCBgcHJvamVjdHMvZnVuZGluZy9hcGlgXG4gKiAtIGZsYXQgZG90dGVkIHBhY2thZ2UgZGlyczogYHByb2plY3RzL2Z1bmRpbmcud2ViYCBmb3IgdG9rZW4gYGZ1bmRpbmdgXG4gKlxuICogRG9lcyBub3QgbWF0Y2ggc2libGluZ3MgdGhhdCBvbmx5IHNoYXJlIGEgc3RyaW5nIHByZWZpeCAoYGZ1bmRpbmdgIHZzIGBmdW5kaW5nLWZlZS5hcGlgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZXJTbGljZShwcm9qZWN0RGlyZWN0b3J5OiBzdHJpbmcsIHNsaWNlUHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcblx0Y29uc3QgZGlyID0gcHJvamVjdERpcmVjdG9yeS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblx0Y29uc3QgcHJlZml4ID0gc2xpY2VQcmVmaXgucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpLnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG5cdGlmIChkaXIgPT09IHByZWZpeCB8fCBkaXIuc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0Ly8gRmxhdCBtb25vcmVwbyBwYWNrYWdlczogcHJvamVjdHMvPG1vZHVsZT4uPHJvbGU+XG5cdHJldHVybiBkaXIuc3RhcnRzV2l0aChgJHtwcmVmaXh9LmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdHNJblNsaWNlKFxuXHRwcm9qZWN0czogcmVhZG9ubHkgU2xpY2VQcm9qZWN0Vmlld1tdLFxuXHRzbGljZTogc3RyaW5nLFxuKTogU2xpY2VQcm9qZWN0Vmlld1tdIHtcblx0Y29uc3QgcHJlZml4ID0gbm9ybWFsaXplU2xpY2VQcmVmaXgoc2xpY2UpO1xuXHRyZXR1cm4gcHJvamVjdHMuZmlsdGVyKChwKSA9PiBpc1VuZGVyU2xpY2UocC5wcm9qZWN0RGlyZWN0b3J5LCBwcmVmaXgpKTtcbn1cblxuLyoqIFVuaW9uIG9mIHBhY2thZ2VzIHVuZGVyIGFueSBvZiB0aGUgc2xpY2UgdG9rZW5zIChkZWR1cGVkIGJ5IHBhY2thZ2UgbmFtZSkuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdHNJblNsaWNlcyhcblx0cHJvamVjdHM6IHJlYWRvbmx5IFNsaWNlUHJvamVjdFZpZXdbXSxcblx0c2xpY2VzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFNsaWNlUHJvamVjdFZpZXdbXSB7XG5cdGNvbnN0IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBTbGljZVByb2plY3RWaWV3PigpO1xuXHRmb3IgKGNvbnN0IHNsaWNlIG9mIHNsaWNlcykge1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0c0luU2xpY2UocHJvamVjdHMsIHNsaWNlKSkge1xuXHRcdFx0YnlOYW1lLnNldChwcm9qZWN0Lm5hbWUsIHByb2plY3QpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gWy4uLmJ5TmFtZS52YWx1ZXMoKV07XG59XG5cbi8qKiBTY3JpcHQgaW52b2tlcyBGbHV4IChpbi1wcm9jZXNzIHNlcnZlIHN0YXlzIG9uIEZsdXgsIG5vdCBkZWZlcnJlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGbHV4T3duZWRTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcblx0cmV0dXJuIC9cXGJmbHV4XFxiL2kudGVzdChzY3JpcHQpO1xufVxuXG4vKipcbiAqIEZpcnN0IE5peHBhY2tzLXN0eWxlIHNlcnZlIHNjcmlwdCB0aGF0IGlzIG5vdCBGbHV4LW93bmVkLlxuICogUHJlZmVycyBgZGV2YCwgdGhlbiBgc2VydmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmVyU2NyaXB0KHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRmb3IgKGNvbnN0IG5hbWUgb2YgREVGRVJfU0NSSVBUX0NBTkRJREFURVMpIHtcblx0XHRjb25zdCBib2R5ID0gc2NyaXB0c1tuYW1lXTtcblx0XHRpZiAoYm9keSAhPSBudWxsICYmIGJvZHkgIT09IFwiXCIgJiYgIWlzRmx1eE93bmVkU2NyaXB0KGJvZHkpKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIENvbnZlbnRpb246IEZsdXggTm9kZSBhcHBzIHVzZSBgbWFpbmAgZW5kaW5nIGluIGBtYWluLnRzYCAvIGBtYWluLnRzeGAuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGbHV4QXBwTWFpbihtYWluOiBzdHJpbmcpOiBib29sZWFuIHtcblx0Y29uc3Qgbm9ybWFsaXplZCA9IG1haW4ucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuXHRyZXR1cm4gLyhefFxcLyltYWluXFwudHN4PyQvLnRlc3Qobm9ybWFsaXplZCk7XG59XG5cbi8qKlxuICogQ2xhc3NpZnkgb25lIHBhY2thZ2UuIEZvcmVpZ24gc2VydmUgc2NyaXB0cyB3aW4gb3ZlciBgbWFpbi50c2AgKFZpdGUgYXBwc1xuICogb2Z0ZW4gaGF2ZSBhIG1haW4gZW50cnkgYnV0IG11c3Qgbm90IGJlIEhNUi1ib290ZWQgYnkgRmx1eCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVNsaWNlUHJvamVjdChwcm9qZWN0OiBTbGljZVByb2plY3RWaWV3KTogU2xpY2VLaW5kIHtcblx0aWYgKHJlc29sdmVEZWZlclNjcmlwdChwcm9qZWN0LnNjcmlwdHMpICE9IG51bGwpIHtcblx0XHRyZXR1cm4gXCJkZWZlclwiO1xuXHR9XG5cdGlmIChpc0ZsdXhBcHBNYWluKHByb2plY3QubWFpbikpIHtcblx0XHRyZXR1cm4gXCJmbHV4XCI7XG5cdH1cblx0cmV0dXJuIFwic2tpcFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTbGljZVByb2plY3RzKFxuXHRwcm9qZWN0czogcmVhZG9ubHkgU2xpY2VQcm9qZWN0Vmlld1tdLFxuXHRzbGljZXM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogQ2xhc3NpZmllZFNsaWNlIHtcblx0Y29uc3QgdG9rZW5zID0gdHlwZW9mIHNsaWNlcyA9PT0gXCJzdHJpbmdcIiA/IFtzbGljZXNdIDogWy4uLnNsaWNlc107XG5cdGNvbnN0IGluU2xpY2UgPSBwcm9qZWN0c0luU2xpY2VzKHByb2plY3RzLCB0b2tlbnMpO1xuXHRjb25zdCBmbHV4OiBTbGljZVByb2plY3RWaWV3W10gPSBbXTtcblx0Y29uc3QgZGVmZXI6IFNsaWNlUHJvamVjdFZpZXdbXSA9IFtdO1xuXHRjb25zdCBza2lwOiBTbGljZVByb2plY3RWaWV3W10gPSBbXTtcblx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIGluU2xpY2UpIHtcblx0XHRjb25zdCBraW5kID0gY2xhc3NpZnlTbGljZVByb2plY3QocHJvamVjdCk7XG5cdFx0aWYgKGtpbmQgPT09IFwiZmx1eFwiKSBmbHV4LnB1c2gocHJvamVjdCk7XG5cdFx0ZWxzZSBpZiAoa2luZCA9PT0gXCJkZWZlclwiKSBkZWZlci5wdXNoKHByb2plY3QpO1xuXHRcdGVsc2Ugc2tpcC5wdXNoKHByb2plY3QpO1xuXHR9XG5cdHJldHVybiB7IGZsdXgsIGRlZmVyLCBza2lwIH07XG59XG4iXSwibmFtZXMiOlsiREVGRVJfU0NSSVBUX0NBTkRJREFURVMiLCJub3JtYWxpemVTbGljZVByZWZpeCIsInNsaWNlIiwidHJpbW1lZCIsInJlcGxhY2VBbGwiLCJyZXBsYWNlIiwiRXJyb3IiLCJzdGFydHNXaXRoIiwiaXNVbmRlclNsaWNlIiwicHJvamVjdERpcmVjdG9yeSIsInNsaWNlUHJlZml4IiwiZGlyIiwicHJlZml4IiwicHJvamVjdHNJblNsaWNlIiwicHJvamVjdHMiLCJmaWx0ZXIiLCJwIiwicHJvamVjdHNJblNsaWNlcyIsInNsaWNlcyIsImJ5TmFtZSIsIk1hcCIsInByb2plY3QiLCJzZXQiLCJuYW1lIiwidmFsdWVzIiwiaXNGbHV4T3duZWRTY3JpcHQiLCJzY3JpcHQiLCJ0ZXN0IiwicmVzb2x2ZURlZmVyU2NyaXB0Iiwic2NyaXB0cyIsImJvZHkiLCJ1bmRlZmluZWQiLCJpc0ZsdXhBcHBNYWluIiwibWFpbiIsIm5vcm1hbGl6ZWQiLCJjbGFzc2lmeVNsaWNlUHJvamVjdCIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0cyIsInRva2VucyIsImluU2xpY2UiLCJmbHV4IiwiZGVmZXIiLCJza2lwIiwia2luZCIsInB1c2giXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQWtCRCx1RUFBdUUsR0FDdkUsT0FBTyxNQUFNQSwwQkFBMEI7SUFBQztJ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
|