@decohere/flux 0.0.1-dev.78 → 0.0.1-dev.8
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/ember.command.js +27 -0
- package/commonjs/src/ember.module.js +37 -0
- package/commonjs/src/hot-module-hooks.js +47 -0
- package/commonjs/src/hot-reload-server.js +160 -293
- package/commonjs/src/index.js +32 -33
- package/commonjs/src/serve.action.js +10 -94
- package/commonjs/src/serve.command.js +4 -36
- package/commonjs/src/serve.js +36 -0
- package/commonjs/src/workspace-serve.action.js +59 -0
- package/es6/src/ember.command.js +17 -0
- package/es6/src/ember.module.js +19 -0
- package/es6/src/hot-module-hooks.js +26 -0
- package/es6/src/hot-reload-server.js +117 -280
- package/es6/src/index.js +7 -6
- package/es6/src/serve.action.js +10 -92
- package/es6/src/serve.command.js +5 -37
- package/es6/src/serve.js +32 -0
- package/es6/src/workspace-serve.action.js +45 -0
- package/package.json +12 -8
- package/types/src/{flux.command.d.ts → ember.command.d.ts} +1 -1
- package/types/src/ember.module.d.ts +22 -0
- package/types/src/hot-module-hooks.d.ts +5 -0
- package/types/src/hot-reload-server.d.ts +22 -62
- package/types/src/index.d.ts +8 -8
- package/types/src/serve.action.d.ts +2 -17
- package/types/src/serve.command.d.ts +2 -7
- package/types/src/serve.d.ts +1 -0
- package/types/src/workspace-serve.action.d.ts +11 -0
- package/commonjs/src/deferred-script-runner.js +0 -58
- package/commonjs/src/flux.command.js +0 -29
- package/commonjs/src/flux.module.js +0 -38
- package/commonjs/src/rewrite-serve-specifier.js +0 -46
- package/commonjs/src/run.action.js +0 -71
- package/commonjs/src/run.command.js +0 -67
- package/commonjs/src/slice-serve.js +0 -132
- package/commonjs/src/source-module-loader.js +0 -216
- package/es6/src/deferred-script-runner.js +0 -48
- package/es6/src/flux.command.js +0 -19
- package/es6/src/flux.module.js +0 -28
- package/es6/src/rewrite-serve-specifier.js +0 -40
- package/es6/src/run.action.js +0 -58
- package/es6/src/run.command.js +0 -57
- package/es6/src/slice-serve.js +0 -107
- package/es6/src/source-module-loader.js +0 -160
- package/types/src/deferred-script-runner.d.ts +0 -18
- package/types/src/flux.module.d.ts +0 -16
- package/types/src/rewrite-serve-specifier.d.ts +0 -13
- package/types/src/run.action.d.ts +0 -17
- package/types/src/run.command.d.ts +0 -11
- package/types/src/slice-serve.d.ts +0 -52
- package/types/src/source-module-loader.d.ts +0 -49
package/es6/src/serve.action.js
CHANGED
|
@@ -4,107 +4,25 @@ 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";
|
|
11
7
|
import { injectable } from "@decohere/crucible/decorators";
|
|
12
|
-
// biome-ignore lint/style/useImportType: <DI>
|
|
13
|
-
import { Workspace } from "@decohere/mesh";
|
|
14
8
|
import { ActionResponse } from "@decohere/nexus/cli";
|
|
15
9
|
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>
|
|
19
10
|
import { HotReloadServer } from "./hot-reload-server.js";
|
|
20
|
-
import { classifySliceProjects, resolveDeferScript } from "./slice-serve.js";
|
|
21
11
|
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
|
-
}
|
|
31
12
|
async run(options) {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
await this.server.start({
|
|
40
|
-
workspace: this.workspace,
|
|
41
|
-
buildConfig: options.configuration,
|
|
42
|
-
project: options.project,
|
|
43
|
-
rebootDebounceMs: options.rebootDebounceMs
|
|
13
|
+
const { entry, watchDir } = options;
|
|
14
|
+
const logger = scribe.logger("ServeAction");
|
|
15
|
+
const server = new HotReloadServer(logger);
|
|
16
|
+
process.on("SIGINT", async ()=>{
|
|
17
|
+
await server.dispose();
|
|
18
|
+
process.exit(0);
|
|
44
19
|
});
|
|
45
|
-
|
|
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;
|
|
20
|
+
await server.start(entry, watchDir);
|
|
21
|
+
return ActionResponse.Success(ServeAction.name);
|
|
98
22
|
}
|
|
99
23
|
}
|
|
100
24
|
ServeAction = _ts_decorate([
|
|
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
|
-
])
|
|
25
|
+
injectable()
|
|
108
26
|
], ServeAction);
|
|
109
27
|
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyB0eXBlIFByb2plY3QsIFdvcmtzcGFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgdHlwZSBBY3Rpb24sIEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuaW1wb3J0IHtcblx0Y2xhc3NpZnlTbGljZVByb2plY3RzLFxuXHRyZXNvbHZlRGVmZXJTY3JpcHQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcblxuZXhwb3J0IHR5cGUgU2VydmVPcHRpb25zID0ge1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKiBPbmUgb3IgbW9yZSBtb2R1bGUgZGlyZWN0b3J5IHRva2VucyAoYGZ1bmRpbmdgLCBgc2hlbGxgLCBgcHJvamVjdHMvZnVuZGluZ2ApLiAqL1xuXHRzbGljZXM/OiBzdHJpbmdbXTtcblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoU2VydmVBY3Rpb24ubmFtZSk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBIb3RSZWxvYWRTZXJ2ZXIsXG5cdFx0cHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcblx0XHRwcml2YXRlIHJlYWRvbmx5IGRlZmVycmVkU2NyaXB0czogRGVmZXJyZWRTY3JpcHRSdW5uZXIsXG5cdCkge31cblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFNlcnZlT3B0aW9ucyk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0XHRjb25zdCBzbGljZXMgPSAob3B0aW9ucy5zbGljZXMgPz8gW10pLmZpbHRlcigocykgPT4gcyAhPT0gXCJcIik7XG5cdFx0aWYgKHNsaWNlcy5sZW5ndGggPiAwICYmIG9wdGlvbnMucHJvamVjdCAhPSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVc2UgZWl0aGVyIGRpcmVjdG9yeSBzbGljZXMgb3IgLS1wcm9qZWN0LCBub3QgYm90aFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc2xpY2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnJ1blNsaWNlcyhvcHRpb25zLCBzbGljZXMpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdHdvcmtzcGFjZTogdGhpcy53b3Jrc3BhY2UsXG5cdFx0XHRidWlsZENvbmZpZzogb3B0aW9ucy5jb25maWd1cmF0aW9uLFxuXHRcdFx0cHJvamVjdDogb3B0aW9ucy5wcm9qZWN0LFxuXHRcdFx0cmVib290RGVib3VuY2VNczogb3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zLFxuXHRcdH0pO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuU2xpY2VzKG9wdGlvbnM6IFNlcnZlT3B0aW9ucywgc2xpY2VzOiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0XHRjb25zdCB2aWV3cyA9IGF3YWl0IHRoaXMudG9TbGljZVZpZXdzKG9wdGlvbnMuY29uZmlndXJhdGlvbik7XG5cdFx0Y29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5U2xpY2VQcm9qZWN0cyh2aWV3cywgc2xpY2VzKTtcblx0XHRjb25zdCBsYWJlbCA9IHNsaWNlcy5qb2luKFwiIFwiKTtcblxuXHRcdGZvciAoY29uc3Qgc2tpcHBlZCBvZiBjbGFzc2lmaWVkLnNraXApIHtcblx0XHRcdHRoaXMubG9nZ2VyLmluZm8oXG5cdFx0XHRcdGBza2lwcGVkICR7c2tpcHBlZC5wcm9qZWN0RGlyZWN0b3J5fSDigJQgbGlicmFyeSAobm8gRmx1eCBlbnRyeSAvIHNjcmlwdHMpYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNsYXNzaWZpZWQuZmx1eC5sZW5ndGggPT09IDAgJiYgY2xhc3NpZmllZC5kZWZlci5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YE5vIHJ1bm5hYmxlIHByb2plY3RzIGluIHNsaWNlKHMpIFwiJHtsYWJlbH1cIiAobmVlZCBGbHV4IG1haW4udHMgYXBwcyBhbmQvb3IgcGFja2FnZSBzY3JpcHRzLmRldi9zZXJ2ZSlgLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCB3b3Jrc3BhY2VSb290ID0gcGF0aC5yZXNvbHZlKHRoaXMud29ya3NwYWNlLnJvb3REaXIgPz8gcHJvY2Vzcy5jd2QoKSk7XG5cblx0XHRmb3IgKGNvbnN0IGRlZmVycmVkIG9mIGNsYXNzaWZpZWQuZGVmZXIpIHtcblx0XHRcdGNvbnN0IHNjcmlwdCA9IHJlc29sdmVEZWZlclNjcmlwdChkZWZlcnJlZC5zY3JpcHRzKTtcblx0XHRcdGlmIChzY3JpcHQgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBwcm9qZWN0ID0gdGhpcy5maW5kUHJvamVjdChvcHRpb25zLmNvbmZpZ3VyYXRpb24sIGRlZmVycmVkLm5hbWUpO1xuXHRcdFx0dGhpcy5kZWZlcnJlZFNjcmlwdHMuc3RhcnQoe1xuXHRcdFx0XHRsYWJlbDogZGVmZXJyZWQucHJvamVjdERpcmVjdG9yeSxcblx0XHRcdFx0Y3dkOiBwcm9qZWN0LnByb2plY3RSb290LFxuXHRcdFx0XHRzY3JpcHQsXG5cdFx0XHRcdHdvcmtzcGFjZVJvb3QsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoY2xhc3NpZmllZC5mbHV4Lmxlbmd0aCA+IDApIHtcblx0XHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdFx0YnVpbGRDb25maWc6IG9wdGlvbnMuY29uZmlndXJhdGlvbixcblx0XHRcdFx0cHJvamVjdHM6IGNsYXNzaWZpZWQuZmx1eC5tYXAoKHApID0+IHAubmFtZSksXG5cdFx0XHRcdHJlYm9vdERlYm91bmNlTXM6IG9wdGlvbnMucmVib290RGVib3VuY2VNcyxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdG9TbGljZVZpZXdzKGNvbmZpZ3VyYXRpb246IHN0cmluZyk6IFByb21pc2U8U2xpY2VQcm9qZWN0Vmlld1tdPiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZS5nZXRQcm9qZWN0cyhjb25maWd1cmF0aW9uKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiB0aGlzLnRvU2xpY2VWaWV3KHByb2plY3QpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHRvU2xpY2VWaWV3KHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPFNsaWNlUHJvamVjdFZpZXc+IHtcblx0XHRjb25zdCBwa2cgPSBhd2FpdCBwcm9qZWN0LmdldFBhY2thZ2VKc29uKCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IHByb2plY3QubmFtZSxcblx0XHRcdHByb2plY3REaXJlY3Rvcnk6IHByb2plY3QucHJvamVjdERpcmVjdG9yeS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIiksXG5cdFx0XHRtYWluOiBwa2cubWFpbiA/PyBcInNyYy9pbmRleC50c1wiLFxuXHRcdFx0c2NyaXB0czogcGtnLnNjcmlwdHMgPz8ge30sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgZmluZFByb2plY3QoY29uZmlndXJhdGlvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9qZWN0IHtcblx0XHRjb25zdCBmb3VuZCA9IHRoaXMud29ya3NwYWNlLmdldFByb2plY3RzKGNvbmZpZ3VyYXRpb24pLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0fVxuXHRcdHJldHVybiBmb3VuZDtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJzY3JpYmUiLCJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsIkhvdFJlbG9hZFNlcnZlciIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0cyIsInJlc29sdmVEZWZlclNjcmlwdCIsIlNlcnZlQWN0aW9uIiwibG9nZ2VyIiwibmFtZSIsInNlcnZlciIsIndvcmtzcGFjZSIsImRlZmVycmVkU2NyaXB0cyIsInJ1biIsIm9wdGlvbnMiLCJzbGljZXMiLCJmaWx0ZXIiLCJzIiwibGVuZ3RoIiwicHJvamVjdCIsIkVycm9yIiwicnVuU2xpY2VzIiwic3RhcnQiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWJvb3REZWJvdW5jZU1zIiwiQmxvY2tpbmciLCJ2aWV3cyIsInRvU2xpY2VWaWV3cyIsImNsYXNzaWZpZWQiLCJsYWJlbCIsImpvaW4iLCJza2lwcGVkIiwic2tpcCIsImluZm8iLCJwcm9qZWN0RGlyZWN0b3J5IiwiZmx1eCIsImRlZmVyIiwid29ya3NwYWNlUm9vdCIsInJlc29sdmUiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsImRlZmVycmVkIiwic2NyaXB0Iiwic2NyaXB0cyIsImZpbmRQcm9qZWN0IiwicHJvamVjdFJvb3QiLCJwcm9qZWN0cyIsIm1hcCIsInAiLCJnZXRQcm9qZWN0cyIsIlByb21pc2UiLCJhbGwiLCJ0b1NsaWNlVmlldyIsInBrZyIsImdldFBhY2thZ2VKc29uIiwicmVwbGFjZUFsbCIsIm1haW4iLCJmb3VuZCIsImZpbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU9BLFVBQVUsWUFBWTtBQUM3QixTQUFTQyxVQUFVLFFBQVEsZ0NBQWdDO0FBQzNELDhDQUE4QztBQUM5QyxTQUF1QkMsU0FBUyxRQUFRLGlCQUFpQjtBQUN6RCxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUN2RCw4Q0FBOEM7QUFDOUMsU0FBU0Msb0JBQW9CLFFBQVEsOEJBQThCO0FBQ25FLDhDQUE4QztBQUM5QyxTQUFTQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3pELFNBQ0NDLHFCQUFxQixFQUNyQkMsa0JBQWtCLFFBRVosbUJBQW1CO0FBVzFCLE9BQU8sTUFBTUM7Ozs7SUFDS0MsU0FBaUJO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
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNlcnZlT3B0aW9ucyA9IHtcblx0ZW50cnk6IHN0cmluZztcblx0d2F0Y2hEaXI6IHN0cmluZztcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBTZXJ2ZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBlbnRyeSwgd2F0Y2hEaXIgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcIlNlcnZlQWN0aW9uXCIpO1xuXHRcdGNvbnN0IHNlcnZlciA9IG5ldyBIb3RSZWxvYWRTZXJ2ZXIobG9nZ2VyKTtcblxuXHRcdHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgc2VydmVyLmRpc3Bvc2UoKTtcblx0XHRcdHByb2Nlc3MuZXhpdCgwKTtcblx0XHR9KTtcblxuXHRcdGF3YWl0IHNlcnZlci5zdGFydChlbnRyeSwgd2F0Y2hEaXIpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFNlcnZlQWN0aW9uLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIkFjdGlvblJlc3BvbnNlIiwic2NyaWJlIiwiSG90UmVsb2FkU2VydmVyIiwiU2VydmVBY3Rpb24iLCJydW4iLCJvcHRpb25zIiwiZW50cnkiLCJ3YXRjaERpciIsImxvZ2dlciIsInNlcnZlciIsInByb2Nlc3MiLCJvbiIsImRpc3Bvc2UiLCJleGl0Iiwic3RhcnQiLCJTdWNjZXNzIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLGVBQWUsUUFBUSx5QkFBeUI7QUFRekQsT0FBTyxNQUFNQztJQUNaLE1BQWFDLElBQUlDLE9BQXFCLEVBQTJCO1FBQ2hFLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0Y7UUFDNUIsTUFBTUcsU0FBU1AsT0FBT08sTUFBTSxDQUFDO1FBQzdCLE1BQU1DLFNBQVMsSUFBSVAsZ0JBQWdCTTtRQUVuQ0UsUUFBUUMsRUFBRSxDQUFDLFVBQVU7WUFDcEIsTUFBTUYsT0FBT0csT0FBTztZQUNwQkYsUUFBUUcsSUFBSSxDQUFDO1FBQ2Q7UUFFQSxNQUFNSixPQUFPSyxLQUFLLENBQUNSLE9BQU9DO1FBQzFCLE9BQU9QLGVBQWVlLE9BQU8sQ0FBQ1osWUFBWWEsSUFBSTtJQUMvQztBQUNEIn0=
|
package/es6/src/serve.command.js
CHANGED
|
@@ -1,47 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { ServeAction } from "./serve.action.js";
|
|
1
|
+
import { DecohereCommand } from "@decohere/nexus/cli";
|
|
2
|
+
import { WorkspaceServeAction } from "./workspace-serve.action.js";
|
|
4
3
|
export class ServeCommand extends DecohereCommand {
|
|
5
4
|
get actions() {
|
|
6
5
|
return [
|
|
7
|
-
|
|
6
|
+
WorkspaceServeAction
|
|
8
7
|
];
|
|
9
8
|
}
|
|
10
9
|
constructor(name){
|
|
11
10
|
super(name);
|
|
12
|
-
this.description("Serve
|
|
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);
|
|
11
|
+
this.description("Serve the first project in a workspace configuration");
|
|
17
12
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Commander passes positional args before options when `[slices...]` is declared.
|
|
20
|
-
* Terminal's 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 [];
|
|
45
13
|
}
|
|
46
14
|
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjb2hlcmVDb21tYW5kIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IFdvcmtzcGFjZVNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vd29ya3NwYWNlLXNlcnZlLmFjdGlvbi5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2VydmVDb21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kIHtcblx0cHVibGljIG92ZXJyaWRlIGdldCBhY3Rpb25zKCkge1xuXHRcdHJldHVybiBbV29ya3NwYWNlU2VydmVBY3Rpb25dO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24oXCJTZXJ2ZSB0aGUgZmlyc3QgcHJvamVjdCBpbiBhIHdvcmtzcGFjZSBjb25maWd1cmF0aW9uXCIpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRGVjb2hlcmVDb21tYW5kIiwiV29ya3NwYWNlU2VydmVBY3Rpb24iLCJTZXJ2ZUNvbW1hbmQiLCJhY3Rpb25zIiwibmFtZSIsImRlc2NyaXB0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxlQUFlLFFBQVEsc0JBQXNCO0FBQ3RELFNBQVNDLG9CQUFvQixRQUFRLDhCQUE4QjtBQUVuRSxPQUFPLE1BQU1DLHFCQUFxQkY7SUFDakMsSUFBb0JHLFVBQVU7UUFDN0IsT0FBTztZQUFDRjtTQUFxQjtJQUM5QjtJQUVBLFlBQW1CRyxJQUFZLENBQUU7UUFDaEMsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsV0FBVyxDQUFDO0lBQ2xCO0FBQ0QifQ==
|
package/es6/src/serve.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import { scribe } from "@decohere/scribe";
|
|
3
|
+
import { HotReloadServer } from "./hot-reload-server.js";
|
|
4
|
+
const { values } = parseArgs({
|
|
5
|
+
args: process.argv.slice(2),
|
|
6
|
+
options: {
|
|
7
|
+
entry: {
|
|
8
|
+
type: "string",
|
|
9
|
+
short: "e"
|
|
10
|
+
},
|
|
11
|
+
watchDir: {
|
|
12
|
+
type: "string",
|
|
13
|
+
multiple: true,
|
|
14
|
+
short: "w"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
allowPositionals: false
|
|
18
|
+
});
|
|
19
|
+
const entry = values.entry;
|
|
20
|
+
const watchDirs = values.watchDir ?? [];
|
|
21
|
+
if (!entry) {
|
|
22
|
+
console.error("Usage: forge-hmr --entry <path> --watchDir <dir> [--watchDir <dir>...]");
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
if (watchDirs.length === 0) {
|
|
26
|
+
console.error("Usage: forge-hmr --entry <path> --watchDir <dir> [--watchDir <dir>...]");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const hmr = new HotReloadServer(scribe.logger("HotReloadServer"));
|
|
30
|
+
await hmr.start(entry, ...watchDirs);
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7IHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuXG5jb25zdCB7IHZhbHVlcyB9ID0gcGFyc2VBcmdzKHtcblx0YXJnczogcHJvY2Vzcy5hcmd2LnNsaWNlKDIpLFxuXHRvcHRpb25zOiB7XG5cdFx0ZW50cnk6IHsgdHlwZTogXCJzdHJpbmdcIiwgc2hvcnQ6IFwiZVwiIH0sXG5cdFx0d2F0Y2hEaXI6IHsgdHlwZTogXCJzdHJpbmdcIiwgbXVsdGlwbGU6IHRydWUsIHNob3J0OiBcIndcIiB9LFxuXHR9LFxuXHRhbGxvd1Bvc2l0aW9uYWxzOiBmYWxzZSxcbn0pO1xuXG5jb25zdCBlbnRyeSA9IHZhbHVlcy5lbnRyeTtcbmNvbnN0IHdhdGNoRGlycyA9IHZhbHVlcy53YXRjaERpciA/PyBbXTtcblxuaWYgKCFlbnRyeSkge1xuXHRjb25zb2xlLmVycm9yKFwiVXNhZ2U6IGZvcmdlLWhtciAtLWVudHJ5IDxwYXRoPiAtLXdhdGNoRGlyIDxkaXI+IFstLXdhdGNoRGlyIDxkaXI+Li4uXVwiKTtcblx0cHJvY2Vzcy5leGl0KDEpO1xufVxuXG5pZiAod2F0Y2hEaXJzLmxlbmd0aCA9PT0gMCkge1xuXHRjb25zb2xlLmVycm9yKFwiVXNhZ2U6IGZvcmdlLWhtciAtLWVudHJ5IDxwYXRoPiAtLXdhdGNoRGlyIDxkaXI+IFstLXdhdGNoRGlyIDxkaXI+Li4uXVwiKTtcblx0cHJvY2Vzcy5leGl0KDEpO1xufVxuXG5jb25zdCBobXIgPSBuZXcgSG90UmVsb2FkU2VydmVyKHNjcmliZS5sb2dnZXIoXCJIb3RSZWxvYWRTZXJ2ZXJcIikpO1xuYXdhaXQgaG1yLnN0YXJ0KGVudHJ5LCAuLi53YXRjaERpcnMpO1xuIl0sIm5hbWVzIjpbInBhcnNlQXJncyIsInNjcmliZSIsIkhvdFJlbG9hZFNlcnZlciIsInZhbHVlcyIsImFyZ3MiLCJwcm9jZXNzIiwiYXJndiIsInNsaWNlIiwib3B0aW9ucyIsImVudHJ5IiwidHlwZSIsInNob3J0Iiwid2F0Y2hEaXIiLCJtdWx0aXBsZSIsImFsbG93UG9zaXRpb25hbHMiLCJ3YXRjaERpcnMiLCJjb25zb2xlIiwiZXJyb3IiLCJleGl0IiwibGVuZ3RoIiwiaG1yIiwibG9nZ2VyIiwic3RhcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLFNBQVNDLE1BQU0sUUFBUSxtQkFBbUI7QUFDMUMsU0FBU0MsZUFBZSxRQUFRLHlCQUF5QjtBQUV6RCxNQUFNLEVBQUVDLE1BQU0sRUFBRSxHQUFHSCxVQUFVO0lBQzVCSSxNQUFNQyxRQUFRQyxJQUFJLENBQUNDLEtBQUssQ0FBQztJQUN6QkMsU0FBUztRQUNSQyxPQUFPO1lBQUVDLE1BQU07WUFBVUMsT0FBTztRQUFJO1FBQ3BDQyxVQUFVO1lBQUVGLE1BQU07WUFBVUcsVUFBVTtZQUFNRixPQUFPO1FBQUk7SUFDeEQ7SUFDQUcsa0JBQWtCO0FBQ25CO0FBRUEsTUFBTUwsUUFBUU4sT0FBT00sS0FBSztBQUMxQixNQUFNTSxZQUFZWixPQUFPUyxRQUFRLElBQUksRUFBRTtBQUV2QyxJQUFJLENBQUNILE9BQU87SUFDWE8sUUFBUUMsS0FBSyxDQUFDO0lBQ2RaLFFBQVFhLElBQUksQ0FBQztBQUNkO0FBRUEsSUFBSUgsVUFBVUksTUFBTSxLQUFLLEdBQUc7SUFDM0JILFFBQVFDLEtBQUssQ0FBQztJQUNkWixRQUFRYSxJQUFJLENBQUM7QUFDZDtBQUVBLE1BQU1FLE1BQU0sSUFBSWxCLGdCQUFnQkQsT0FBT29CLE1BQU0sQ0FBQztBQUM5QyxNQUFNRCxJQUFJRSxLQUFLLENBQUNiLFVBQVVNIn0=
|
|
@@ -0,0 +1,45 @@
|
|
|
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 { ServeAction } from "./serve.action.js";
|
|
16
|
+
export class WorkspaceServeAction {
|
|
17
|
+
workspace;
|
|
18
|
+
constructor(workspace){
|
|
19
|
+
this.workspace = workspace;
|
|
20
|
+
}
|
|
21
|
+
async run(options) {
|
|
22
|
+
const { configuration } = options;
|
|
23
|
+
const projects = this.workspace.getProjects(configuration);
|
|
24
|
+
const project = projects.at(0);
|
|
25
|
+
if (project == null) {
|
|
26
|
+
return ActionResponse.Error(WorkspaceServeAction.name, `No projects found for configuration: ${configuration}`);
|
|
27
|
+
}
|
|
28
|
+
const outDir = project.getOutDir();
|
|
29
|
+
const entry = path.join(outDir, "src", "index.js");
|
|
30
|
+
const serveAction = new ServeAction();
|
|
31
|
+
return serveAction.run({
|
|
32
|
+
entry,
|
|
33
|
+
watchDir: outDir
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
WorkspaceServeAction = _ts_decorate([
|
|
38
|
+
injectable(),
|
|
39
|
+
_ts_metadata("design:type", Function),
|
|
40
|
+
_ts_metadata("design:paramtypes", [
|
|
41
|
+
typeof Workspace === "undefined" ? Object : Workspace
|
|
42
|
+
])
|
|
43
|
+
], WorkspaceServeAction);
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3dvcmtzcGFjZS1zZXJ2ZS5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VTZXJ2ZU9wdGlvbnMgPSB7XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxXb3Jrc3BhY2VTZXJ2ZU9wdGlvbnM+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlOiBXb3Jrc3BhY2UpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBXb3Jrc3BhY2VTZXJ2ZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBjb25maWd1cmF0aW9uIH0gPSBvcHRpb25zO1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2UuZ2V0UHJvamVjdHMoY29uZmlndXJhdGlvbik7XG5cdFx0Y29uc3QgcHJvamVjdCA9IHByb2plY3RzLmF0KDApO1xuXG5cdFx0aWYgKHByb2plY3QgPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLkVycm9yKFxuXHRcdFx0XHRXb3Jrc3BhY2VTZXJ2ZUFjdGlvbi5uYW1lLFxuXHRcdFx0XHRgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7Y29uZmlndXJhdGlvbn1gLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBvdXREaXIgPSBwcm9qZWN0LmdldE91dERpcigpO1xuXHRcdGNvbnN0IGVudHJ5ID0gcGF0aC5qb2luKG91dERpciwgXCJzcmNcIiwgXCJpbmRleC5qc1wiKTtcblx0XHRjb25zdCBzZXJ2ZUFjdGlvbiA9IG5ldyBTZXJ2ZUFjdGlvbigpO1xuXHRcdHJldHVybiBzZXJ2ZUFjdGlvbi5ydW4oeyBlbnRyeSwgd2F0Y2hEaXI6IG91dERpciB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJTZXJ2ZUFjdGlvbiIsIldvcmtzcGFjZVNlcnZlQWN0aW9uIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsImNvbmZpZ3VyYXRpb24iLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwicHJvamVjdCIsImF0IiwiRXJyb3IiLCJuYW1lIiwib3V0RGlyIiwiZ2V0T3V0RGlyIiwiZW50cnkiLCJqb2luIiwic2VydmVBY3Rpb24iLCJ3YXRjaERpciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLFVBQVUsUUFBUSxnQ0FBZ0M7QUFDM0QsOENBQThDO0FBQzlDLFNBQVNDLFNBQVMsUUFBUSxpQkFBaUI7QUFFM0MsU0FBU0MsY0FBYyxRQUFRLHNCQUFzQjtBQUNyRCxTQUFTQyxXQUFXLFFBQVEsb0JBQW9CO0FBT2hELE9BQU8sTUFBTUM7O0lBQ1osWUFBbUIsQUFBaUJDLFNBQW9CLENBQUU7YUFBdEJBLFlBQUFBO0lBQXVCO0lBRTNELE1BQWFDLElBQUlDLE9BQThCLEVBQTJCO1FBQ3pFLE1BQU0sRUFBRUMsYUFBYSxFQUFFLEdBQUdEO1FBQzFCLE1BQU1FLFdBQVcsSUFBSSxDQUFDSixTQUFTLENBQUNLLFdBQVcsQ0FBQ0Y7UUFDNUMsTUFBTUcsVUFBVUYsU0FBU0csRUFBRSxDQUFDO1FBRTVCLElBQUlELFdBQVcsTUFBTTtZQUNwQixPQUFPVCxlQUFlVyxLQUFLLENBQzFCVCxxQkFBcUJVLElBQUksRUFDekIsQ0FBQyxxQ0FBcUMsRUFBRU4sZUFBZTtRQUV6RDtRQUVBLE1BQU1PLFNBQVNKLFFBQVFLLFNBQVM7UUFDaEMsTUFBTUMsUUFBUWxCLEtBQUttQixJQUFJLENBQUNILFFBQVEsT0FBTztRQUN2QyxNQUFNSSxjQUFjLElBQUloQjtRQUN4QixPQUFPZ0IsWUFBWWIsR0FBRyxDQUFDO1lBQUVXO1lBQU9HLFVBQVVMO1FBQU87SUFDbEQ7QUFDRCJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decohere/flux",
|
|
3
|
-
"version": "0.0.1-dev.
|
|
3
|
+
"version": "0.0.1-dev.8",
|
|
4
4
|
"description": "Hot module reload server for Node.js ESM applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -19,19 +19,23 @@
|
|
|
19
19
|
"types": "./types/src/index.d.ts",
|
|
20
20
|
"import": "./es6/src/index.js",
|
|
21
21
|
"require": "./commonjs/src/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./serve": {
|
|
24
|
+
"types": "./types/src/serve.d.ts",
|
|
25
|
+
"import": "./es6/src/serve.js"
|
|
22
26
|
}
|
|
23
27
|
},
|
|
28
|
+
"bin": {
|
|
29
|
+
"ember": "./es6/src/serve.js"
|
|
30
|
+
},
|
|
24
31
|
"scripts": {
|
|
25
32
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
26
33
|
},
|
|
27
34
|
"dependencies": {
|
|
28
|
-
"@decohere/crucible": "0.0.1-dev.
|
|
29
|
-
"@decohere/
|
|
30
|
-
"@decohere/
|
|
31
|
-
"@decohere/
|
|
32
|
-
"@decohere/scribe": "0.0.1-dev.78",
|
|
33
|
-
"commander": "^13.1.0",
|
|
34
|
-
"rxjs": "^7.8.2"
|
|
35
|
+
"@decohere/crucible": "0.0.1-dev.8",
|
|
36
|
+
"@decohere/mesh": "0.0.1-dev.8",
|
|
37
|
+
"@decohere/nexus": "0.0.1-dev.8",
|
|
38
|
+
"@decohere/scribe": "0.0.1-dev.8"
|
|
35
39
|
},
|
|
36
40
|
"devDependencies": {}
|
|
37
41
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Actions } from "@decohere/nexus/cli";
|
|
2
2
|
import { type CommandHandler, type CommandResponse, type CommandType, DecohereCommand } from "@decohere/nexus/cli";
|
|
3
|
-
export declare class
|
|
3
|
+
export declare class EmberCommand extends DecohereCommand {
|
|
4
4
|
constructor(commands: Record<string, CommandType>, handler: CommandHandler);
|
|
5
5
|
run(_actions: Actions, _options: never): Promise<CommandResponse>;
|
|
6
6
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Workspace } from "@decohere/mesh";
|
|
2
|
+
import type { WorkspaceFactoryOptions } from "@decohere/nexus/cli";
|
|
3
|
+
import { ModuleManifest } from "@decohere/nexus/cli";
|
|
4
|
+
import type { ContainerBuilder } from "@decohere/nexus/composition";
|
|
5
|
+
import { EmberCommand } from "./ember.command.js";
|
|
6
|
+
import { WorkspaceServeAction } from "./workspace-serve.action.js";
|
|
7
|
+
export type EmberModuleContext = {
|
|
8
|
+
builder: ContainerBuilder;
|
|
9
|
+
workspace: Workspace;
|
|
10
|
+
};
|
|
11
|
+
export type EmberModuleResult = {
|
|
12
|
+
actions: typeof EmberActions;
|
|
13
|
+
};
|
|
14
|
+
export declare const EmberActions: {};
|
|
15
|
+
export declare class EmberModule extends ModuleManifest {
|
|
16
|
+
readonly id = "ember";
|
|
17
|
+
readonly command: typeof EmberCommand;
|
|
18
|
+
readonly actions: {
|
|
19
|
+
serve: typeof WorkspaceServeAction;
|
|
20
|
+
};
|
|
21
|
+
createWorkspace(options: WorkspaceFactoryOptions): Promise<Workspace>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ResolveFnOutput } from "node:module";
|
|
2
|
+
export type ResolveHandler = (result: ResolveFnOutput, parentUrl: string) => void;
|
|
3
|
+
export declare function initModuleHooks(): void;
|
|
4
|
+
export declare function addResolverHook(fn: ResolveHandler): void;
|
|
5
|
+
export declare function removeResolverHook(fn: ResolveHandler): void;
|
|
@@ -1,78 +1,38 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import type {
|
|
3
|
-
/** Default quiet window before a file-change reboot. */
|
|
4
|
-
export declare const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
|
|
5
|
-
export declare function resolveRebootDebounceMs(value: number | undefined): number;
|
|
2
|
+
import type { Logger } from "@decohere/scribe";
|
|
6
3
|
export interface HotReloadServerEvents {
|
|
7
|
-
start: [];
|
|
8
4
|
reboot: [];
|
|
9
5
|
}
|
|
10
|
-
export interface HotReloadServerOptions {
|
|
11
|
-
/** Build configuration name. */
|
|
12
|
-
buildConfig: string;
|
|
13
|
-
/** Name of the project to serve. Defaults to the first project in the workspace. */
|
|
14
|
-
project?: string;
|
|
15
|
-
/**
|
|
16
|
-
* Multiple Flux app package names to boot in one process (directory slice).
|
|
17
|
-
* When set, takes precedence over {@link project}.
|
|
18
|
-
*/
|
|
19
|
-
projects?: readonly string[];
|
|
20
|
-
/**
|
|
21
|
-
* Pre-built Workspace instance to use instead of running WorkspaceFactory.
|
|
22
|
-
* Useful in tests to bypass filesystem-based workspace discovery.
|
|
23
|
-
*/
|
|
24
|
-
workspace?: Workspace;
|
|
25
|
-
/**
|
|
26
|
-
* Quiet window in milliseconds after the last affecting save before a reboot.
|
|
27
|
-
* Defaults to {@link DEFAULT_REBOOT_DEBOUNCE_MS}. Raise this for agent save trains.
|
|
28
|
-
*/
|
|
29
|
-
rebootDebounceMs?: number;
|
|
30
|
-
}
|
|
31
6
|
export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents> {
|
|
32
7
|
private readonly logger;
|
|
33
|
-
private readonly loader;
|
|
34
8
|
private disposed;
|
|
35
|
-
|
|
36
|
-
private
|
|
37
|
-
private
|
|
38
|
-
private watchSubscription?;
|
|
9
|
+
private entryModule;
|
|
10
|
+
private entry;
|
|
11
|
+
private sourceFiles;
|
|
39
12
|
private moduleCache;
|
|
40
13
|
private dependencies;
|
|
41
|
-
private
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
private rebootFollowUp;
|
|
45
|
-
private rebootQueued;
|
|
46
|
-
/** Modules whose reverse-graph edges are pruned at reboot, not on schedule. */
|
|
47
|
-
private pendingGraphPrune;
|
|
48
|
-
private scheduleReboot;
|
|
49
|
-
start(options: HotReloadServerOptions): Promise<void>;
|
|
14
|
+
private watchers;
|
|
15
|
+
constructor(logger: Logger);
|
|
16
|
+
start(entry: string, ...watchDirs: string[]): Promise<void>;
|
|
50
17
|
dispose(): Promise<void>;
|
|
51
|
-
|
|
52
|
-
private
|
|
53
|
-
private
|
|
54
|
-
private
|
|
55
|
-
private
|
|
56
|
-
private runReboot;
|
|
57
|
-
private disposeEntries;
|
|
58
|
-
private disposeEntry;
|
|
59
|
-
private requireWorkspace;
|
|
60
|
-
private resolveProjects;
|
|
61
|
-
/**
|
|
62
|
-
* Post-next dependency tracker: records which source files import which
|
|
63
|
-
* other source files so that reloadIfAffected can traverse the graph.
|
|
64
|
-
*/
|
|
65
|
-
private onPostResolve;
|
|
66
|
-
private onFileChange;
|
|
67
|
-
private reloadIfAffected;
|
|
18
|
+
private removeSourceFiles;
|
|
19
|
+
private getSourceFiles;
|
|
20
|
+
private configureModuleHooks;
|
|
21
|
+
private onResolve;
|
|
22
|
+
private isSourceModule;
|
|
68
23
|
private getDependencyGraph;
|
|
69
24
|
private trackDependency;
|
|
70
25
|
private getCachedOrNew;
|
|
71
26
|
private versionModule;
|
|
72
|
-
private
|
|
73
|
-
private
|
|
74
|
-
|
|
75
|
-
private
|
|
76
|
-
private
|
|
27
|
+
private watch;
|
|
28
|
+
private onFileAdded;
|
|
29
|
+
private onSourceFileChanged;
|
|
30
|
+
private onFileDeleted;
|
|
31
|
+
private reloadIfAffected;
|
|
77
32
|
private isSelf;
|
|
33
|
+
private invlidateModule;
|
|
34
|
+
private invalidateAllSourceFiles;
|
|
35
|
+
private disposeAndBoot;
|
|
36
|
+
private disposeEntry;
|
|
37
|
+
private bootEntry;
|
|
78
38
|
}
|
package/types/src/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export type { RunOptions } from "./run.action.js";
|
|
1
|
+
export { EmberCommand } from "./ember.command.js";
|
|
2
|
+
export type { EmberModuleContext, EmberModuleResult } from "./ember.module.js";
|
|
3
|
+
export { EmberActions, EmberModule } from "./ember.module.js";
|
|
4
|
+
export * from "./hot-reload-server.js";
|
|
6
5
|
export type { ServeOptions } from "./serve.action.js";
|
|
7
|
-
export {
|
|
8
|
-
export
|
|
9
|
-
export {
|
|
6
|
+
export { ServeAction } from "./serve.action.js";
|
|
7
|
+
export { ServeCommand } from "./serve.command.js";
|
|
8
|
+
export type { WorkspaceServeOptions } from "./workspace-serve.action.js";
|
|
9
|
+
export { WorkspaceServeAction } from "./workspace-serve.action.js";
|
|
@@ -1,23 +1,8 @@
|
|
|
1
|
-
import { Workspace } from "@decohere/mesh";
|
|
2
1
|
import { type Action, ActionResponse } from "@decohere/nexus/cli";
|
|
3
|
-
import { DeferredScriptRunner } from "./deferred-script-runner.js";
|
|
4
|
-
import { HotReloadServer } from "./hot-reload-server.js";
|
|
5
2
|
export type ServeOptions = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
/** One or more module directory tokens (`funding`, `shell`, `projects/funding`). */
|
|
9
|
-
slices?: string[];
|
|
10
|
-
rebootDebounceMs?: number;
|
|
3
|
+
entry: string;
|
|
4
|
+
watchDir: string;
|
|
11
5
|
};
|
|
12
6
|
export declare class ServeAction implements Action<ServeOptions> {
|
|
13
|
-
private readonly server;
|
|
14
|
-
private readonly workspace;
|
|
15
|
-
private readonly deferredScripts;
|
|
16
|
-
private readonly logger;
|
|
17
|
-
constructor(server: HotReloadServer, workspace: Workspace, deferredScripts: DeferredScriptRunner);
|
|
18
7
|
run(options: ServeOptions): Promise<ActionResponse>;
|
|
19
|
-
private runSlices;
|
|
20
|
-
private toSliceViews;
|
|
21
|
-
private toSliceView;
|
|
22
|
-
private findProject;
|
|
23
8
|
}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { DecohereCommand } from "@decohere/nexus/cli";
|
|
2
|
-
import {
|
|
2
|
+
import { WorkspaceServeAction } from "./workspace-serve.action.js";
|
|
3
3
|
export declare class ServeCommand extends DecohereCommand {
|
|
4
|
-
get actions(): (typeof
|
|
4
|
+
get actions(): (typeof WorkspaceServeAction)[];
|
|
5
5
|
constructor(name: string);
|
|
6
|
-
/**
|
|
7
|
-
* Commander passes positional args before options when `[slices...]` is declared.
|
|
8
|
-
* Terminal's ModuleFactory expects `(opts, cmd)` — normalize here.
|
|
9
|
-
*/
|
|
10
|
-
action(fn: (...args: any[]) => void | Promise<void>): this;
|
|
11
6
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Workspace } from "@decohere/mesh";
|
|
2
|
+
import type { Action } from "@decohere/nexus/cli";
|
|
3
|
+
import { ActionResponse } from "@decohere/nexus/cli";
|
|
4
|
+
export type WorkspaceServeOptions = {
|
|
5
|
+
configuration: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class WorkspaceServeAction implements Action<WorkspaceServeOptions> {
|
|
8
|
+
private readonly workspace;
|
|
9
|
+
constructor(workspace: Workspace);
|
|
10
|
+
run(options: WorkspaceServeOptions): Promise<ActionResponse>;
|
|
11
|
+
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "DeferredScriptRunner", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return DeferredScriptRunner;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _nodechild_process = require("node:child_process");
|
|
12
|
-
const _decorators = require("@decohere/crucible/decorators");
|
|
13
|
-
const _interop = require("@decohere/nexus/interop");
|
|
14
|
-
const _scribe = require("@decohere/scribe");
|
|
15
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
16
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
17
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
18
|
-
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;
|
|
19
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
20
|
-
}
|
|
21
|
-
class DeferredScriptRunner {
|
|
22
|
-
logger = _scribe.scribe.logger(DeferredScriptRunner.name);
|
|
23
|
-
children = [];
|
|
24
|
-
start(options) {
|
|
25
|
-
const pm = (0, _interop.detectPackageManager)(options.workspaceRoot) ?? (0, _interop.packageManagerFromString)("pnpm");
|
|
26
|
-
this.logger.info(`deferred ${options.label} — running ${pm.name} run ${options.script} in ${options.cwd}`);
|
|
27
|
-
const child = (0, _nodechild_process.spawn)(pm.name, [
|
|
28
|
-
"run",
|
|
29
|
-
options.script
|
|
30
|
-
], {
|
|
31
|
-
cwd: options.cwd,
|
|
32
|
-
stdio: "inherit",
|
|
33
|
-
env: process.env,
|
|
34
|
-
shell: false
|
|
35
|
-
});
|
|
36
|
-
child.on("exit", (code, signal)=>{
|
|
37
|
-
if (signal) return;
|
|
38
|
-
if (code != null && code !== 0) {
|
|
39
|
-
this.logger.warn(`deferred ${options.label} exited with ${code}`);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
this.children.push(child);
|
|
43
|
-
return child;
|
|
44
|
-
}
|
|
45
|
-
async [Symbol.asyncDispose]() {
|
|
46
|
-
for (const child of this.children){
|
|
47
|
-
if (!child.killed) {
|
|
48
|
-
child.kill("SIGTERM");
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
this.children.length = 0;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
DeferredScriptRunner = _ts_decorate([
|
|
55
|
-
(0, _decorators.injectable)()
|
|
56
|
-
], DeferredScriptRunner);
|
|
57
|
-
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2RlZmVycmVkLXNjcmlwdC1ydW5uZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDaGlsZFByb2Nlc3MsIHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZGV0ZWN0UGFja2FnZU1hbmFnZXIsIHBhY2thZ2VNYW5hZ2VyRnJvbVN0cmluZyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW50ZXJvcFwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5cbmV4cG9ydCB0eXBlIERlZmVycmVkU2NyaXB0U3RhcnQgPSB7XG5cdHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXHRyZWFkb25seSBzY3JpcHQ6IHN0cmluZztcblx0LyoqIFdvcmtzcGFjZSByb290IHVzZWQgdG8gZGV0ZWN0IHBucG0vbnBtL3lhcm4uICovXG5cdHJlYWRvbmx5IHdvcmtzcGFjZVJvb3Q6IHN0cmluZztcbn07XG5cbi8qKlxuICogTml4cGFja3Mtc3R5bGUgY2hpbGQgcHJvY2Vzc2VzIGZvciBmb3JlaWduIHBhY2thZ2VzIGluIGEgZmx1eCBzZXJ2ZSBzbGljZS5cbiAqIEtpbGxlZCB3aGVuIHRoZSBGbHV4IGNvbnRhaW5lciBkaXNwb3NlcyAoU0lHSU5UIOKGkiBSb290TW9kdWxlIHRlYXJkb3duKS5cbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlZmVycmVkU2NyaXB0UnVubmVyIGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlIHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoRGVmZXJyZWRTY3JpcHRSdW5uZXIubmFtZSk7XG5cdHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IENoaWxkUHJvY2Vzc1tdID0gW107XG5cblx0cHVibGljIHN0YXJ0KG9wdGlvbnM6IERlZmVycmVkU2NyaXB0U3RhcnQpOiBDaGlsZFByb2Nlc3Mge1xuXHRcdGNvbnN0IHBtID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIob3B0aW9ucy53b3Jrc3BhY2VSb290KSA/PyBwYWNrYWdlTWFuYWdlckZyb21TdHJpbmcoXCJwbnBtXCIpO1xuXHRcdHRoaXMubG9nZ2VyLmluZm8oXG5cdFx0XHRgZGVmZXJyZWQgJHtvcHRpb25zLmxhYmVsfSDigJQgcnVubmluZyAke3BtLm5hbWV9IHJ1biAke29wdGlvbnMuc2NyaXB0fSBpbiAke29wdGlvbnMuY3dkfWAsXG5cdFx0KTtcblx0XHRjb25zdCBjaGlsZCA9IHNwYXduKHBtLm5hbWUsIFtcInJ1blwiLCBvcHRpb25zLnNjcmlwdF0sIHtcblx0XHRcdGN3ZDogb3B0aW9ucy5jd2QsXG5cdFx0XHRzdGRpbzogXCJpbmhlcml0XCIsXG5cdFx0XHRlbnY6IHByb2Nlc3MuZW52LFxuXHRcdFx0c2hlbGw6IGZhbHNlLFxuXHRcdH0pO1xuXHRcdGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG5cdFx0XHRpZiAoc2lnbmFsKSByZXR1cm47XG5cdFx0XHRpZiAoY29kZSAhPSBudWxsICYmIGNvZGUgIT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIud2FybihgZGVmZXJyZWQgJHtvcHRpb25zLmxhYmVsfSBleGl0ZWQgd2l0aCAke2NvZGV9YCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcblx0XHRyZXR1cm4gY2hpbGQ7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0aWYgKCFjaGlsZC5raWxsZWQpIHtcblx0XHRcdFx0Y2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gMDtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRlZmVycmVkU2NyaXB0UnVubmVyIiwibG9nZ2VyIiwic2NyaWJlIiwibmFtZSIsImNoaWxkcmVuIiwic3RhcnQiLCJvcHRpb25zIiwicG0iLCJkZXRlY3RQYWNrYWdlTWFuYWdlciIsIndvcmtzcGFjZVJvb3QiLCJwYWNrYWdlTWFuYWdlckZyb21TdHJpbmciLCJpbmZvIiwibGFiZWwiLCJzY3JpcHQiLCJjd2QiLCJjaGlsZCIsInNwYXduIiwic3RkaW8iLCJlbnYiLCJwcm9jZXNzIiwic2hlbGwiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJ3YXJuIiwicHVzaCIsIlN5bWJvbCIsImFzeW5jRGlzcG9zZSIsImtpbGxlZCIsImtpbGwiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7K0JBa0JhQTs7O2VBQUFBOzs7bUNBbEI0Qjs0QkFDZDt5QkFDb0M7d0JBQzNCOzs7Ozs7O0FBZTdCLE1BQU1BO0lBQ0tDLFNBQWlCQyxjQUFNLENBQUNELE1BQU0sQ0FBQ0QscUJBQXFCRyxJQUFJLEVBQUU7SUFDMURDLFdBQTJCLEVBQUUsQ0FBQztJQUV4Q0MsTUFBTUMsT0FBNEIsRUFBZ0I7UUFDeEQsTUFBTUMsS0FBS0MsSUFBQUEsNkJBQW9CLEVBQUNGLFFBQVFHLGFBQWEsS0FBS0MsSUFBQUEsaUNBQXdCLEVBQUM7UUFDbkYsSUFBSSxDQUFDVCxNQUFNLENBQUNVLElBQUksQ0FDZixDQUFDLFNBQVMsRUFBRUwsUUFBUU0sS0FBSyxDQUFDLFdBQVcsRUFBRUwsR0FBR0osSUFBSSxDQUFDLEtBQUssRUFBRUcsUUFBUU8sTUFBTSxDQUFDLElBQUksRUFBRVAsUUFBUVEsR0FBRyxFQUFFO1FBRXpGLE1BQU1DLFFBQVFDLElBQUFBLHdCQUFLLEVBQUNULEdBQUdKLElBQUksRUFBRTtZQUFDO1lBQU9HLFFBQVFPLE1BQU07U0FBQyxFQUFFO1lBQ3JEQyxLQUFLUixRQUFRUSxHQUFHO1lBQ2hCRyxPQUFPO1lBQ1BDLEtBQUtDLFFBQVFELEdBQUc7WUFDaEJFLE9BQU87UUFDUjtRQUNBTCxNQUFNTSxFQUFFLENBQUMsUUFBUSxDQUFDQyxNQUFNQztZQUN2QixJQUFJQSxRQUFRO1lBQ1osSUFBSUQsUUFBUSxRQUFRQSxTQUFTLEdBQUc7Z0JBQy9CLElBQUksQ0FBQ3JCLE1BQU0sQ0FBQ3VCLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRWxCLFFBQVFNLEtBQUssQ0FBQyxhQUFhLEVBQUVVLE1BQU07WUFDakU7UUFDRDtRQUNBLElBQUksQ0FBQ2xCLFFBQVEsQ0FBQ3FCLElBQUksQ0FBQ1Y7UUFDbkIsT0FBT0E7SUFDUjtJQUVBLE1BQWEsQ0FBQ1csT0FBT0MsWUFBWSxDQUFDLEdBQUc7UUFDcEMsS0FBSyxNQUFNWixTQUFTLElBQUksQ0FBQ1gsUUFBUSxDQUFFO1lBQ2xDLElBQUksQ0FBQ1csTUFBTWEsTUFBTSxFQUFFO2dCQUNsQmIsTUFBTWMsSUFBSSxDQUFDO1lBQ1o7UUFDRDtRQUNBLElBQUksQ0FBQ3pCLFFBQVEsQ0FBQzBCLE1BQU0sR0FBRztJQUN4QjtBQUNEIn0=
|