@decohere/flux 0.0.1-dev.38 → 0.0.1-dev.4
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/package.json +12 -7
- package/src/ember.command.js +17 -0
- package/src/ember.module.js +19 -0
- package/src/hot-module-hooks.js +26 -0
- package/src/hot-reload-server.js +201 -0
- package/src/index.js +8 -0
- package/src/serve.action.js +28 -0
- package/src/serve.command.js +15 -0
- package/src/serve.js +32 -0
- package/src/workspace-serve.action.js +45 -0
- package/tests/hmr.integration.spec.js +134 -0
- package/commonjs/src/flux.command.js +0 -27
- package/commonjs/src/flux.module.js +0 -32
- package/commonjs/src/hot-reload-server.js +0 -379
- package/commonjs/src/index.js +0 -22
- package/commonjs/src/serve.action.js +0 -49
- package/commonjs/src/serve.command.js +0 -27
- package/es6/src/flux.command.js +0 -17
- package/es6/src/flux.module.js +0 -22
- package/es6/src/hot-reload-server.js +0 -323
- package/es6/src/index.js +0 -4
- package/es6/src/serve.action.js +0 -41
- package/es6/src/serve.command.js +0 -17
- package/types/src/flux.command.d.ts +0 -6
- package/types/src/flux.module.d.ts +0 -14
- package/types/src/hot-reload-server.d.ts +0 -64
- package/types/src/index.d.ts +0 -4
- package/types/src/serve.action.d.ts +0 -13
- package/types/src/serve.command.d.ts +0 -6
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration: HotReloadServer full reload cycle with real Node hooks + memfs.
|
|
3
|
+
*
|
|
4
|
+
* How it works:
|
|
5
|
+
* - Fixtures exist on disk so vite-node can resolve and externalize them
|
|
6
|
+
* - vi.mock("fs") / vi.mock("node:fs") redirects all fs calls to memfs
|
|
7
|
+
* - The load hook in hmr.external-module.setup.ts intercepts externalized
|
|
8
|
+
* module loads and serves content from vol when present
|
|
9
|
+
* - onResolve rewrites URLs to versioned copies after a file is invalidated,
|
|
10
|
+
* which forces Node to bypass its module cache on next import
|
|
11
|
+
*
|
|
12
|
+
* Fixture tree: main.js → dep-a.js → dep-b.js
|
|
13
|
+
*/ import { scribe } from "../../scribe/scribe/src/index.js";
|
|
14
|
+
import { vol } from "memfs";
|
|
15
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
16
|
+
vi.mock("fs");
|
|
17
|
+
vi.mock("node:fs");
|
|
18
|
+
import { HotReloadServer } from "../src/hot-reload-server.js";
|
|
19
|
+
const fixturesDir = new URL("./__fixtures__/hmr", import.meta.url).pathname;
|
|
20
|
+
const mainPath = `${fixturesDir}/main.js`;
|
|
21
|
+
const depAPath = `${fixturesDir}/dep-a.js`;
|
|
22
|
+
const depBPath = `${fixturesDir}/dep-b.js`;
|
|
23
|
+
async function seedFromDisk() {
|
|
24
|
+
const realFs = await vi.importActual("node:fs");
|
|
25
|
+
vol.fromJSON({
|
|
26
|
+
[mainPath]: realFs.readFileSync(mainPath, "utf8"),
|
|
27
|
+
[depAPath]: realFs.readFileSync(depAPath, "utf8"),
|
|
28
|
+
[depBPath]: realFs.readFileSync(depBPath, "utf8")
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function nextReboot(server, ms = 2000) {
|
|
32
|
+
return new Promise((resolve, reject)=>{
|
|
33
|
+
const timer = setTimeout(()=>reject(new Error("reboot did not fire")), ms);
|
|
34
|
+
server.once("reboot", ()=>{
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
describe("HotReloadServer real hook integration", ()=>{
|
|
41
|
+
let server;
|
|
42
|
+
beforeEach(async ()=>{
|
|
43
|
+
server = new HotReloadServer(scribe.logger("HotReloadServerTest"));
|
|
44
|
+
await seedFromDisk();
|
|
45
|
+
await server.start(mainPath, fixturesDir);
|
|
46
|
+
});
|
|
47
|
+
afterEach(async ()=>{
|
|
48
|
+
await server.dispose();
|
|
49
|
+
vol.reset();
|
|
50
|
+
});
|
|
51
|
+
it("should not ghost-reboot when a module is removed from the dependency graph after a reload", async ()=>{
|
|
52
|
+
// Remove dep-b from dep-a's imports — triggers reboot
|
|
53
|
+
const reboot1 = nextReboot(server);
|
|
54
|
+
vol.writeFileSync(depAPath, `export const value = 0;`);
|
|
55
|
+
await reboot1;
|
|
56
|
+
// dep-b is no longer imported — changing it must not reboot
|
|
57
|
+
let rebooted = false;
|
|
58
|
+
server.once("reboot", ()=>{
|
|
59
|
+
rebooted = true;
|
|
60
|
+
});
|
|
61
|
+
vol.writeFileSync(depBPath, `export const value = 42;`);
|
|
62
|
+
await new Promise((resolve)=>setTimeout(resolve, 500));
|
|
63
|
+
expect(rebooted).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
it("should not infinitely recurse and should still reboot when a circular dependency is detected", async ()=>{
|
|
66
|
+
// Inject a back-edge: dep-b → dep-a, creating dep-a ↔ dep-b cycle
|
|
67
|
+
const deps = server.dependencies;
|
|
68
|
+
deps.set(depBPath, [
|
|
69
|
+
...deps.get(depBPath) ?? [],
|
|
70
|
+
depAPath
|
|
71
|
+
]);
|
|
72
|
+
const reboot = nextReboot(server);
|
|
73
|
+
vol.writeFileSync(depBPath, `export const value = 99;`);
|
|
74
|
+
await reboot;
|
|
75
|
+
});
|
|
76
|
+
it("should reboot when dep-b is re-added after being removed and re-referenced out of order", async ()=>{
|
|
77
|
+
// Step 1: delete dep-b — graph preserved
|
|
78
|
+
vol.unlinkSync(depBPath);
|
|
79
|
+
// Step 2: update dep-a to remove dep-b reference — triggers reboot
|
|
80
|
+
const reboot1 = nextReboot(server);
|
|
81
|
+
vol.writeFileSync(depAPath, `export const value = 0;`);
|
|
82
|
+
await reboot1;
|
|
83
|
+
// Step 3: update dep-a to re-add dep-b reference — triggers reboot
|
|
84
|
+
const reboot2 = nextReboot(server);
|
|
85
|
+
vol.writeFileSync(depAPath, `export { value } from "./dep-b.js";`);
|
|
86
|
+
await reboot2;
|
|
87
|
+
// Step 4: add dep-b back — graph still has dep-b → dep-a → main, reboot expected
|
|
88
|
+
const reboot3 = nextReboot(server);
|
|
89
|
+
vol.writeFileSync(depBPath, `export const value = 99;`);
|
|
90
|
+
await reboot3;
|
|
91
|
+
});
|
|
92
|
+
it("should reboot when a deleted file is re-added with new content", async ()=>{
|
|
93
|
+
vol.unlinkSync(depBPath);
|
|
94
|
+
vol.writeFileSync(depBPath, `export const value = 99;`);
|
|
95
|
+
const reboot = nextReboot(server);
|
|
96
|
+
await reboot;
|
|
97
|
+
});
|
|
98
|
+
it("should not reboot when a deleted dependency is no longer in the graph", async ()=>{
|
|
99
|
+
// Delete dep-a, then touch main to get a deterministic sync point —
|
|
100
|
+
// once main's reboot fires we know the watcher has processed the delete.
|
|
101
|
+
vol.unlinkSync(depAPath);
|
|
102
|
+
const sync = nextReboot(server);
|
|
103
|
+
vol.writeFileSync(mainPath, vol.readFileSync(mainPath, "utf8"));
|
|
104
|
+
await sync;
|
|
105
|
+
// Now dep-b has no path to main — changing it must not reboot.
|
|
106
|
+
let rebooted = false;
|
|
107
|
+
server.once("reboot", ()=>{
|
|
108
|
+
rebooted = true;
|
|
109
|
+
});
|
|
110
|
+
vol.writeFileSync(depBPath, `export const value = 42;`);
|
|
111
|
+
await new Promise((resolve)=>setTimeout(resolve, 500));
|
|
112
|
+
expect(rebooted).toBe(false);
|
|
113
|
+
});
|
|
114
|
+
it("should call asyncDispose on the entry when the server is disposed", async ()=>{
|
|
115
|
+
await server.dispose();
|
|
116
|
+
expect(vol.existsSync("/disposed.txt")).toBe(true);
|
|
117
|
+
});
|
|
118
|
+
it("should reload a direct dependency and serve updated content", async ()=>{
|
|
119
|
+
const reboot = nextReboot(server);
|
|
120
|
+
vol.writeFileSync(depAPath, `export { value } from "./dep-b.js"; export const tag = "v2";`);
|
|
121
|
+
await reboot;
|
|
122
|
+
const mod = await import(depAPath);
|
|
123
|
+
expect(mod.tag).toBe("v2");
|
|
124
|
+
});
|
|
125
|
+
it("should reload a grandchild dependency and propagate the change to its parent", async ()=>{
|
|
126
|
+
const reboot = nextReboot(server);
|
|
127
|
+
vol.writeFileSync(depBPath, `export const value = 99;`);
|
|
128
|
+
await reboot;
|
|
129
|
+
const mod = await import(depBPath);
|
|
130
|
+
expect(mod.value).toBe(99);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvdGVzdHMvaG1yLmludGVncmF0aW9uLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnRlZ3JhdGlvbjogSG90UmVsb2FkU2VydmVyIGZ1bGwgcmVsb2FkIGN5Y2xlIHdpdGggcmVhbCBOb2RlIGhvb2tzICsgbWVtZnMuXG4gKlxuICogSG93IGl0IHdvcmtzOlxuICogLSBGaXh0dXJlcyBleGlzdCBvbiBkaXNrIHNvIHZpdGUtbm9kZSBjYW4gcmVzb2x2ZSBhbmQgZXh0ZXJuYWxpemUgdGhlbVxuICogLSB2aS5tb2NrKFwiZnNcIikgLyB2aS5tb2NrKFwibm9kZTpmc1wiKSByZWRpcmVjdHMgYWxsIGZzIGNhbGxzIHRvIG1lbWZzXG4gKiAtIFRoZSBsb2FkIGhvb2sgaW4gaG1yLmV4dGVybmFsLW1vZHVsZS5zZXR1cC50cyBpbnRlcmNlcHRzIGV4dGVybmFsaXplZFxuICogICBtb2R1bGUgbG9hZHMgYW5kIHNlcnZlcyBjb250ZW50IGZyb20gdm9sIHdoZW4gcHJlc2VudFxuICogLSBvblJlc29sdmUgcmV3cml0ZXMgVVJMcyB0byB2ZXJzaW9uZWQgY29waWVzIGFmdGVyIGEgZmlsZSBpcyBpbnZhbGlkYXRlZCxcbiAqICAgd2hpY2ggZm9yY2VzIE5vZGUgdG8gYnlwYXNzIGl0cyBtb2R1bGUgY2FjaGUgb24gbmV4dCBpbXBvcnRcbiAqXG4gKiBGaXh0dXJlIHRyZWU6ICBtYWluLmpzIOKGkiBkZXAtYS5qcyDihpIgZGVwLWIuanNcbiAqL1xuXG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgdm9sIH0gZnJvbSBcIm1lbWZzXCI7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gXCJ2aXRlc3RcIjtcblxudmkubW9jayhcImZzXCIpO1xudmkubW9jayhcIm5vZGU6ZnNcIik7XG5cbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuLi9zcmMvaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcblxuY29uc3QgZml4dHVyZXNEaXIgPSBuZXcgVVJMKFwiLi9fX2ZpeHR1cmVzX18vaG1yXCIsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWU7XG5jb25zdCBtYWluUGF0aCA9IGAke2ZpeHR1cmVzRGlyfS9tYWluLmpzYDtcbmNvbnN0IGRlcEFQYXRoID0gYCR7Zml4dHVyZXNEaXJ9L2RlcC1hLmpzYDtcbmNvbnN0IGRlcEJQYXRoID0gYCR7Zml4dHVyZXNEaXJ9L2RlcC1iLmpzYDtcblxuYXN5bmMgZnVuY3Rpb24gc2VlZEZyb21EaXNrKCkge1xuXHRjb25zdCByZWFsRnMgPSBhd2FpdCB2aS5pbXBvcnRBY3R1YWw8dHlwZW9mIGltcG9ydChcIm5vZGU6ZnNcIik+KFwibm9kZTpmc1wiKTtcblx0dm9sLmZyb21KU09OKHtcblx0XHRbbWFpblBhdGhdOiByZWFsRnMucmVhZEZpbGVTeW5jKG1haW5QYXRoLCBcInV0ZjhcIikgYXMgc3RyaW5nLFxuXHRcdFtkZXBBUGF0aF06IHJlYWxGcy5yZWFkRmlsZVN5bmMoZGVwQVBhdGgsIFwidXRmOFwiKSBhcyBzdHJpbmcsXG5cdFx0W2RlcEJQYXRoXTogcmVhbEZzLnJlYWRGaWxlU3luYyhkZXBCUGF0aCwgXCJ1dGY4XCIpIGFzIHN0cmluZyxcblx0fSk7XG59XG5cbmZ1bmN0aW9uIG5leHRSZWJvb3Qoc2VydmVyOiBIb3RSZWxvYWRTZXJ2ZXIsIG1zID0gMjAwMCk6IFByb21pc2U8dm9pZD4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKFwicmVib290IGRpZCBub3QgZmlyZVwiKSksIG1zKTtcblx0XHRzZXJ2ZXIub25jZShcInJlYm9vdFwiLCAoKSA9PiB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXHR9KTtcbn1cblxuZGVzY3JpYmUoXCJIb3RSZWxvYWRTZXJ2ZXIgcmVhbCBob29rIGludGVncmF0aW9uXCIsICgpID0+IHtcblx0bGV0IHNlcnZlcjogSG90UmVsb2FkU2VydmVyO1xuXG5cdGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuXHRcdHNlcnZlciA9IG5ldyBIb3RSZWxvYWRTZXJ2ZXIoc2NyaWJlLmxvZ2dlcihcIkhvdFJlbG9hZFNlcnZlclRlc3RcIikpO1xuXHRcdGF3YWl0IHNlZWRGcm9tRGlzaygpO1xuXHRcdGF3YWl0IHNlcnZlci5zdGFydChtYWluUGF0aCwgZml4dHVyZXNEaXIpO1xuXHR9KTtcblxuXHRhZnRlckVhY2goYXN5bmMgKCkgPT4ge1xuXHRcdGF3YWl0IHNlcnZlci5kaXNwb3NlKCk7XG5cdFx0dm9sLnJlc2V0KCk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIG5vdCBnaG9zdC1yZWJvb3Qgd2hlbiBhIG1vZHVsZSBpcyByZW1vdmVkIGZyb20gdGhlIGRlcGVuZGVuY3kgZ3JhcGggYWZ0ZXIgYSByZWxvYWRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdC8vIFJlbW92ZSBkZXAtYiBmcm9tIGRlcC1hJ3MgaW1wb3J0cyDigJQgdHJpZ2dlcnMgcmVib290XG5cdFx0Y29uc3QgcmVib290MSA9IG5leHRSZWJvb3Qoc2VydmVyKTtcblx0XHR2b2wud3JpdGVGaWxlU3luYyhkZXBBUGF0aCwgYGV4cG9ydCBjb25zdCB2YWx1ZSA9IDA7YCk7XG5cdFx0YXdhaXQgcmVib290MTtcblxuXHRcdC8vIGRlcC1iIGlzIG5vIGxvbmdlciBpbXBvcnRlZCDigJQgY2hhbmdpbmcgaXQgbXVzdCBub3QgcmVib290XG5cdFx0bGV0IHJlYm9vdGVkID0gZmFsc2U7XG5cdFx0c2VydmVyLm9uY2UoXCJyZWJvb3RcIiwgKCkgPT4ge1xuXHRcdFx0cmVib290ZWQgPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHZvbC53cml0ZUZpbGVTeW5jKGRlcEJQYXRoLCBgZXhwb3J0IGNvbnN0IHZhbHVlID0gNDI7YCk7XG5cdFx0YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG5cdFx0ZXhwZWN0KHJlYm9vdGVkKS50b0JlKGZhbHNlKTtcblx0fSk7XG5cblx0aXQoXCJzaG91bGQgbm90IGluZmluaXRlbHkgcmVjdXJzZSBhbmQgc2hvdWxkIHN0aWxsIHJlYm9vdCB3aGVuIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0Ly8gSW5qZWN0IGEgYmFjay1lZGdlOiBkZXAtYiDihpIgZGVwLWEsIGNyZWF0aW5nIGRlcC1hIOKGlCBkZXAtYiBjeWNsZVxuXHRcdGNvbnN0IGRlcHMgPSAoc2VydmVyIGFzIHVua25vd24gYXMgeyBkZXBlbmRlbmNpZXM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB9KS5kZXBlbmRlbmNpZXM7XG5cdFx0ZGVwcy5zZXQoZGVwQlBhdGgsIFsuLi4oZGVwcy5nZXQoZGVwQlBhdGgpID8/IFtdKSwgZGVwQVBhdGhdKTtcblxuXHRcdGNvbnN0IHJlYm9vdCA9IG5leHRSZWJvb3Qoc2VydmVyKTtcblx0XHR2b2wud3JpdGVGaWxlU3luYyhkZXBCUGF0aCwgYGV4cG9ydCBjb25zdCB2YWx1ZSA9IDk5O2ApO1xuXHRcdGF3YWl0IHJlYm9vdDtcblx0fSk7XG5cblx0aXQoXCJzaG91bGQgcmVib290IHdoZW4gZGVwLWIgaXMgcmUtYWRkZWQgYWZ0ZXIgYmVpbmcgcmVtb3ZlZCBhbmQgcmUtcmVmZXJlbmNlZCBvdXQgb2Ygb3JkZXJcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdC8vIFN0ZXAgMTogZGVsZXRlIGRlcC1iIOKAlCBncmFwaCBwcmVzZXJ2ZWRcblx0XHR2b2wudW5saW5rU3luYyhkZXBCUGF0aCk7XG5cblx0XHQvLyBTdGVwIDI6IHVwZGF0ZSBkZXAtYSB0byByZW1vdmUgZGVwLWIgcmVmZXJlbmNlIOKAlCB0cmlnZ2VycyByZWJvb3Rcblx0XHRjb25zdCByZWJvb3QxID0gbmV4dFJlYm9vdChzZXJ2ZXIpO1xuXHRcdHZvbC53cml0ZUZpbGVTeW5jKGRlcEFQYXRoLCBgZXhwb3J0IGNvbnN0IHZhbHVlID0gMDtgKTtcblx0XHRhd2FpdCByZWJvb3QxO1xuXG5cdFx0Ly8gU3RlcCAzOiB1cGRhdGUgZGVwLWEgdG8gcmUtYWRkIGRlcC1iIHJlZmVyZW5jZSDigJQgdHJpZ2dlcnMgcmVib290XG5cdFx0Y29uc3QgcmVib290MiA9IG5leHRSZWJvb3Qoc2VydmVyKTtcblx0XHR2b2wud3JpdGVGaWxlU3luYyhkZXBBUGF0aCwgYGV4cG9ydCB7IHZhbHVlIH0gZnJvbSBcIi4vZGVwLWIuanNcIjtgKTtcblx0XHRhd2FpdCByZWJvb3QyO1xuXG5cdFx0Ly8gU3RlcCA0OiBhZGQgZGVwLWIgYmFjayDigJQgZ3JhcGggc3RpbGwgaGFzIGRlcC1iIOKGkiBkZXAtYSDihpIgbWFpbiwgcmVib290IGV4cGVjdGVkXG5cdFx0Y29uc3QgcmVib290MyA9IG5leHRSZWJvb3Qoc2VydmVyKTtcblx0XHR2b2wud3JpdGVGaWxlU3luYyhkZXBCUGF0aCwgYGV4cG9ydCBjb25zdCB2YWx1ZSA9IDk5O2ApO1xuXHRcdGF3YWl0IHJlYm9vdDM7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHJlYm9vdCB3aGVuIGEgZGVsZXRlZCBmaWxlIGlzIHJlLWFkZGVkIHdpdGggbmV3IGNvbnRlbnRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdHZvbC51bmxpbmtTeW5jKGRlcEJQYXRoKTtcblx0XHR2b2wud3JpdGVGaWxlU3luYyhkZXBCUGF0aCwgYGV4cG9ydCBjb25zdCB2YWx1ZSA9IDk5O2ApO1xuXHRcdGNvbnN0IHJlYm9vdCA9IG5leHRSZWJvb3Qoc2VydmVyKTtcblx0XHRhd2FpdCByZWJvb3Q7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIG5vdCByZWJvb3Qgd2hlbiBhIGRlbGV0ZWQgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgaW4gdGhlIGdyYXBoXCIsIGFzeW5jICgpID0+IHtcblx0XHQvLyBEZWxldGUgZGVwLWEsIHRoZW4gdG91Y2ggbWFpbiB0byBnZXQgYSBkZXRlcm1pbmlzdGljIHN5bmMgcG9pbnQg4oCUXG5cdFx0Ly8gb25jZSBtYWluJ3MgcmVib290IGZpcmVzIHdlIGtub3cgdGhlIHdhdGNoZXIgaGFzIHByb2Nlc3NlZCB0aGUgZGVsZXRlLlxuXHRcdHZvbC51bmxpbmtTeW5jKGRlcEFQYXRoKTtcblx0XHRjb25zdCBzeW5jID0gbmV4dFJlYm9vdChzZXJ2ZXIpO1xuXHRcdHZvbC53cml0ZUZpbGVTeW5jKG1haW5QYXRoLCB2b2wucmVhZEZpbGVTeW5jKG1haW5QYXRoLCBcInV0ZjhcIikgYXMgc3RyaW5nKTtcblx0XHRhd2FpdCBzeW5jO1xuXG5cdFx0Ly8gTm93IGRlcC1iIGhhcyBubyBwYXRoIHRvIG1haW4g4oCUIGNoYW5naW5nIGl0IG11c3Qgbm90IHJlYm9vdC5cblx0XHRsZXQgcmVib290ZWQgPSBmYWxzZTtcblx0XHRzZXJ2ZXIub25jZShcInJlYm9vdFwiLCAoKSA9PiB7XG5cdFx0XHRyZWJvb3RlZCA9IHRydWU7XG5cdFx0fSk7XG5cdFx0dm9sLndyaXRlRmlsZVN5bmMoZGVwQlBhdGgsIGBleHBvcnQgY29uc3QgdmFsdWUgPSA0MjtgKTtcblx0XHRhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTtcblx0XHRleHBlY3QocmVib290ZWQpLnRvQmUoZmFsc2UpO1xuXHR9KTtcblxuXHRpdChcInNob3VsZCBjYWxsIGFzeW5jRGlzcG9zZSBvbiB0aGUgZW50cnkgd2hlbiB0aGUgc2VydmVyIGlzIGRpc3Bvc2VkXCIsIGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCBzZXJ2ZXIuZGlzcG9zZSgpO1xuXHRcdGV4cGVjdCh2b2wuZXhpc3RzU3luYyhcIi9kaXNwb3NlZC50eHRcIikpLnRvQmUodHJ1ZSk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHJlbG9hZCBhIGRpcmVjdCBkZXBlbmRlbmN5IGFuZCBzZXJ2ZSB1cGRhdGVkIGNvbnRlbnRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IHJlYm9vdCA9IG5leHRSZWJvb3Qoc2VydmVyKTtcblx0XHR2b2wud3JpdGVGaWxlU3luYyhcblx0XHRcdGRlcEFQYXRoLFxuXHRcdFx0YGV4cG9ydCB7IHZhbHVlIH0gZnJvbSBcIi4vZGVwLWIuanNcIjsgZXhwb3J0IGNvbnN0IHRhZyA9IFwidjJcIjtgLFxuXHRcdCk7XG5cdFx0YXdhaXQgcmVib290O1xuXHRcdGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChkZXBBUGF0aCk7XG5cdFx0ZXhwZWN0KG1vZC50YWcpLnRvQmUoXCJ2MlwiKTtcblx0fSk7XG5cblx0aXQoXCJzaG91bGQgcmVsb2FkIGEgZ3JhbmRjaGlsZCBkZXBlbmRlbmN5IGFuZCBwcm9wYWdhdGUgdGhlIGNoYW5nZSB0byBpdHMgcGFyZW50XCIsIGFzeW5jICgpID0+IHtcblx0XHRjb25zdCByZWJvb3QgPSBuZXh0UmVib290KHNlcnZlcik7XG5cdFx0dm9sLndyaXRlRmlsZVN5bmMoZGVwQlBhdGgsIGBleHBvcnQgY29uc3QgdmFsdWUgPSA5OTtgKTtcblx0XHRhd2FpdCByZWJvb3Q7XG5cdFx0Y29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KGRlcEJQYXRoKTtcblx0XHRleHBlY3QobW9kLnZhbHVlKS50b0JlKDk5KTtcblx0fSk7XG59KTtcbiJdLCJuYW1lcyI6WyJzY3JpYmUiLCJ2b2wiLCJhZnRlckVhY2giLCJiZWZvcmVFYWNoIiwiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwibW9jayIsIkhvdFJlbG9hZFNlcnZlciIsImZpeHR1cmVzRGlyIiwiVVJMIiwidXJsIiwicGF0aG5hbWUiLCJtYWluUGF0aCIsImRlcEFQYXRoIiwiZGVwQlBhdGgiLCJzZWVkRnJvbURpc2siLCJyZWFsRnMiLCJpbXBvcnRBY3R1YWwiLCJmcm9tSlNPTiIsInJlYWRGaWxlU3luYyIsIm5leHRSZWJvb3QiLCJzZXJ2ZXIiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidGltZXIiLCJzZXRUaW1lb3V0IiwiRXJyb3IiLCJvbmNlIiwiY2xlYXJUaW1lb3V0IiwibG9nZ2VyIiwic3RhcnQiLCJkaXNwb3NlIiwicmVzZXQiLCJyZWJvb3QxIiwid3JpdGVGaWxlU3luYyIsInJlYm9vdGVkIiwidG9CZSIsImRlcHMiLCJkZXBlbmRlbmNpZXMiLCJzZXQiLCJnZXQiLCJyZWJvb3QiLCJ1bmxpbmtTeW5jIiwicmVib290MiIsInJlYm9vdDMiLCJzeW5jIiwiZXhpc3RzU3luYyIsIm1vZCIsInRhZyIsInZhbHVlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FFRCxTQUFTQSxNQUFNLFFBQVEsbUNBQW1CO0FBQzFDLFNBQVNDLEdBQUcsUUFBUSxRQUFRO0FBQzVCLFNBQVNDLFNBQVMsRUFBRUMsVUFBVSxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsRUFBRSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQUV6RUEsR0FBR0MsSUFBSSxDQUFDO0FBQ1JELEdBQUdDLElBQUksQ0FBQztBQUVSLFNBQVNDLGVBQWUsUUFBUSw4QkFBOEI7QUFFOUQsTUFBTUMsY0FBYyxJQUFJQyxJQUFJLHNCQUFzQixZQUFZQyxHQUFHLEVBQUVDLFFBQVE7QUFDM0UsTUFBTUMsV0FBVyxHQUFHSixZQUFZLFFBQVEsQ0FBQztBQUN6QyxNQUFNSyxXQUFXLEdBQUdMLFlBQVksU0FBUyxDQUFDO0FBQzFDLE1BQU1NLFdBQVcsR0FBR04sWUFBWSxTQUFTLENBQUM7QUFFMUMsZUFBZU87SUFDZCxNQUFNQyxTQUFTLE1BQU1YLEdBQUdZLFlBQVksQ0FBMkI7SUFDL0RsQixJQUFJbUIsUUFBUSxDQUFDO1FBQ1osQ0FBQ04sU0FBUyxFQUFFSSxPQUFPRyxZQUFZLENBQUNQLFVBQVU7UUFDMUMsQ0FBQ0MsU0FBUyxFQUFFRyxPQUFPRyxZQUFZLENBQUNOLFVBQVU7UUFDMUMsQ0FBQ0MsU0FBUyxFQUFFRSxPQUFPRyxZQUFZLENBQUNMLFVBQVU7SUFDM0M7QUFDRDtBQUVBLFNBQVNNLFdBQVdDLE1BQXVCLEVBQUVDLEtBQUssSUFBSTtJQUNyRCxPQUFPLElBQUlDLFFBQVEsQ0FBQ0MsU0FBU0M7UUFDNUIsTUFBTUMsUUFBUUMsV0FBVyxJQUFNRixPQUFPLElBQUlHLE1BQU0seUJBQXlCTjtRQUN6RUQsT0FBT1EsSUFBSSxDQUFDLFVBQVU7WUFDckJDLGFBQWFKO1lBQ2JGO1FBQ0Q7SUFDRDtBQUNEO0FBRUF0QixTQUFTLHlDQUF5QztJQUNqRCxJQUFJbUI7SUFFSnBCLFdBQVc7UUFDVm9CLFNBQVMsSUFBSWQsZ0JBQWdCVCxPQUFPaUMsTUFBTSxDQUFDO1FBQzNDLE1BQU1oQjtRQUNOLE1BQU1NLE9BQU9XLEtBQUssQ0FBQ3BCLFVBQVVKO0lBQzlCO0lBRUFSLFVBQVU7UUFDVCxNQUFNcUIsT0FBT1ksT0FBTztRQUNwQmxDLElBQUltQyxLQUFLO0lBQ1Y7SUFFQTlCLEdBQUcsNkZBQTZGO1FBQy9GLHNEQUFzRDtRQUN0RCxNQUFNK0IsVUFBVWYsV0FBV0M7UUFDM0J0QixJQUFJcUMsYUFBYSxDQUFDdkIsVUFBVSxDQUFDLHVCQUF1QixDQUFDO1FBQ3JELE1BQU1zQjtRQUVOLDREQUE0RDtRQUM1RCxJQUFJRSxXQUFXO1FBQ2ZoQixPQUFPUSxJQUFJLENBQUMsVUFBVTtZQUNyQlEsV0FBVztRQUNaO1FBQ0F0QyxJQUFJcUMsYUFBYSxDQUFDdEIsVUFBVSxDQUFDLHdCQUF3QixDQUFDO1FBQ3RELE1BQU0sSUFBSVMsUUFBUSxDQUFDQyxVQUFZRyxXQUFXSCxTQUFTO1FBQ25EckIsT0FBT2tDLFVBQVVDLElBQUksQ0FBQztJQUN2QjtJQUVBbEMsR0FBRyxnR0FBZ0c7UUFDbEcsa0VBQWtFO1FBQ2xFLE1BQU1tQyxPQUFPLEFBQUNsQixPQUE4RG1CLFlBQVk7UUFDeEZELEtBQUtFLEdBQUcsQ0FBQzNCLFVBQVU7ZUFBS3lCLEtBQUtHLEdBQUcsQ0FBQzVCLGFBQWEsRUFBRTtZQUFHRDtTQUFTO1FBRTVELE1BQU04QixTQUFTdkIsV0FBV0M7UUFDMUJ0QixJQUFJcUMsYUFBYSxDQUFDdEIsVUFBVSxDQUFDLHdCQUF3QixDQUFDO1FBQ3RELE1BQU02QjtJQUNQO0lBRUF2QyxHQUFHLDJGQUEyRjtRQUM3Rix5Q0FBeUM7UUFDekNMLElBQUk2QyxVQUFVLENBQUM5QjtRQUVmLG1FQUFtRTtRQUNuRSxNQUFNcUIsVUFBVWYsV0FBV0M7UUFDM0J0QixJQUFJcUMsYUFBYSxDQUFDdkIsVUFBVSxDQUFDLHVCQUF1QixDQUFDO1FBQ3JELE1BQU1zQjtRQUVOLG1FQUFtRTtRQUNuRSxNQUFNVSxVQUFVekIsV0FBV0M7UUFDM0J0QixJQUFJcUMsYUFBYSxDQUFDdkIsVUFBVSxDQUFDLG1DQUFtQyxDQUFDO1FBQ2pFLE1BQU1nQztRQUVOLGlGQUFpRjtRQUNqRixNQUFNQyxVQUFVMUIsV0FBV0M7UUFDM0J0QixJQUFJcUMsYUFBYSxDQUFDdEIsVUFBVSxDQUFDLHdCQUF3QixDQUFDO1FBQ3RELE1BQU1nQztJQUNQO0lBRUExQyxHQUFHLGtFQUFrRTtRQUNwRUwsSUFBSTZDLFVBQVUsQ0FBQzlCO1FBQ2ZmLElBQUlxQyxhQUFhLENBQUN0QixVQUFVLENBQUMsd0JBQXdCLENBQUM7UUFDdEQsTUFBTTZCLFNBQVN2QixXQUFXQztRQUMxQixNQUFNc0I7SUFDUDtJQUVBdkMsR0FBRyx5RUFBeUU7UUFDM0Usb0VBQW9FO1FBQ3BFLHlFQUF5RTtRQUN6RUwsSUFBSTZDLFVBQVUsQ0FBQy9CO1FBQ2YsTUFBTWtDLE9BQU8zQixXQUFXQztRQUN4QnRCLElBQUlxQyxhQUFhLENBQUN4QixVQUFVYixJQUFJb0IsWUFBWSxDQUFDUCxVQUFVO1FBQ3ZELE1BQU1tQztRQUVOLCtEQUErRDtRQUMvRCxJQUFJVixXQUFXO1FBQ2ZoQixPQUFPUSxJQUFJLENBQUMsVUFBVTtZQUNyQlEsV0FBVztRQUNaO1FBQ0F0QyxJQUFJcUMsYUFBYSxDQUFDdEIsVUFBVSxDQUFDLHdCQUF3QixDQUFDO1FBQ3RELE1BQU0sSUFBSVMsUUFBUSxDQUFDQyxVQUFZRyxXQUFXSCxTQUFTO1FBQ25EckIsT0FBT2tDLFVBQVVDLElBQUksQ0FBQztJQUN2QjtJQUVBbEMsR0FBRyxxRUFBcUU7UUFDdkUsTUFBTWlCLE9BQU9ZLE9BQU87UUFDcEI5QixPQUFPSixJQUFJaUQsVUFBVSxDQUFDLGtCQUFrQlYsSUFBSSxDQUFDO0lBQzlDO0lBRUFsQyxHQUFHLCtEQUErRDtRQUNqRSxNQUFNdUMsU0FBU3ZCLFdBQVdDO1FBQzFCdEIsSUFBSXFDLGFBQWEsQ0FDaEJ2QixVQUNBLENBQUMsNERBQTRELENBQUM7UUFFL0QsTUFBTThCO1FBQ04sTUFBTU0sTUFBTSxNQUFNLE1BQU0sQ0FBQ3BDO1FBQ3pCVixPQUFPOEMsSUFBSUMsR0FBRyxFQUFFWixJQUFJLENBQUM7SUFDdEI7SUFFQWxDLEdBQUcsZ0ZBQWdGO1FBQ2xGLE1BQU11QyxTQUFTdkIsV0FBV0M7UUFDMUJ0QixJQUFJcUMsYUFBYSxDQUFDdEIsVUFBVSxDQUFDLHdCQUF3QixDQUFDO1FBQ3RELE1BQU02QjtRQUNOLE1BQU1NLE1BQU0sTUFBTSxNQUFNLENBQUNuQztRQUN6QlgsT0FBTzhDLElBQUlFLEtBQUssRUFBRWIsSUFBSSxDQUFDO0lBQ3hCO0FBQ0QifQ==
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "FluxCommand", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return FluxCommand;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _cli = require("@decohere/nexus/cli");
|
|
12
|
-
const _servecommand = require("./serve.command.js");
|
|
13
|
-
class FluxCommand extends _cli.DecohereCommand {
|
|
14
|
-
constructor(commands, handler){
|
|
15
|
-
super(FluxCommand);
|
|
16
|
-
this.exitOverride();
|
|
17
|
-
this.registerSubcommand({
|
|
18
|
-
serve: _servecommand.ServeCommand,
|
|
19
|
-
...commands
|
|
20
|
-
}, handler);
|
|
21
|
-
}
|
|
22
|
-
run(_actions, _options) {
|
|
23
|
-
return this.help();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXguY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHtcblx0dHlwZSBDb21tYW5kSGFuZGxlcixcblx0dHlwZSBDb21tYW5kUmVzcG9uc2UsXG5cdHR5cGUgQ29tbWFuZFR5cGUsXG5cdERlY29oZXJlQ29tbWFuZCxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IFNlcnZlQ29tbWFuZCB9IGZyb20gXCIuL3NlcnZlLmNvbW1hbmQuanNcIjtcblxuZXhwb3J0IGNsYXNzIEZsdXhDb21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKGNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kVHlwZT4sIGhhbmRsZXI6IENvbW1hbmRIYW5kbGVyKSB7XG5cdFx0c3VwZXIoRmx1eENvbW1hbmQpO1xuXHRcdHRoaXMuZXhpdE92ZXJyaWRlKCk7XG5cdFx0dGhpcy5yZWdpc3RlclN1YmNvbW1hbmQoeyBzZXJ2ZTogU2VydmVDb21tYW5kLCAuLi5jb21tYW5kcyB9LCBoYW5kbGVyKTtcblx0fVxuXG5cdHB1YmxpYyBydW4oX2FjdGlvbnM6IEFjdGlvbnMsIF9vcHRpb25zOiBuZXZlcik6IFByb21pc2U8Q29tbWFuZFJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaGVscCgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRmx1eENvbW1hbmQiLCJEZWNvaGVyZUNvbW1hbmQiLCJjb21tYW5kcyIsImhhbmRsZXIiLCJleGl0T3ZlcnJpZGUiLCJyZWdpc3RlclN1YmNvbW1hbmQiLCJzZXJ2ZSIsIlNlcnZlQ29tbWFuZCIsInJ1biIsIl9hY3Rpb25zIiwiX29wdGlvbnMiLCJoZWxwIl0sIm1hcHBpbmdzIjoiOzs7OytCQVNhQTs7O2VBQUFBOzs7cUJBSE47OEJBQ3NCO0FBRXRCLE1BQU1BLG9CQUFvQkMsb0JBQWU7SUFDL0MsWUFBbUJDLFFBQXFDLEVBQUVDLE9BQXVCLENBQUU7UUFDbEYsS0FBSyxDQUFDSDtRQUNOLElBQUksQ0FBQ0ksWUFBWTtRQUNqQixJQUFJLENBQUNDLGtCQUFrQixDQUFDO1lBQUVDLE9BQU9DLDBCQUFZO1lBQUUsR0FBR0wsUUFBUTtRQUFDLEdBQUdDO0lBQy9EO0lBRU9LLElBQUlDLFFBQWlCLEVBQUVDLFFBQWUsRUFBNEI7UUFDeEUsT0FBTyxJQUFJLENBQUNDLElBQUk7SUFDakI7QUFDRCJ9
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "FluxModule", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return FluxModule;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _mesh = require("@decohere/mesh");
|
|
12
|
-
const _cli = require("@decohere/nexus/cli");
|
|
13
|
-
const _fluxcommand = require("./flux.command.js");
|
|
14
|
-
const _hotreloadserver = require("./hot-reload-server.js");
|
|
15
|
-
const _serveaction = require("./serve.action.js");
|
|
16
|
-
class FluxModule extends _cli.ModuleManifest {
|
|
17
|
-
id = "flux";
|
|
18
|
-
command = _fluxcommand.FluxCommand;
|
|
19
|
-
actions = {
|
|
20
|
-
serve: _serveaction.ServeAction
|
|
21
|
-
};
|
|
22
|
-
registerServices(builder) {
|
|
23
|
-
builder.registerSingleton(_hotreloadserver.HotReloadServer);
|
|
24
|
-
}
|
|
25
|
-
createWorkspace(options) {
|
|
26
|
-
return _mesh.WorkspaceFactory.create({
|
|
27
|
-
configFile: options.configFile
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRmx1eENvbW1hbmQgfSBmcm9tIFwiLi9mbHV4LmNvbW1hbmQuanNcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRmx1eE1vZHVsZSBleHRlbmRzIE1vZHVsZU1hbmlmZXN0IHtcblx0cHVibGljIHJlYWRvbmx5IGlkID0gXCJmbHV4XCI7XG5cdHB1YmxpYyByZWFkb25seSBjb21tYW5kID0gRmx1eENvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdHNlcnZlOiBTZXJ2ZUFjdGlvbixcblx0fTtcblxuXHRwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlcyhidWlsZGVyOiBDb250YWluZXJCdWlsZGVyKSB7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihIb3RSZWxvYWRTZXJ2ZXIpO1xuXHR9XG5cblx0cHVibGljIG92ZXJyaWRlIGNyZWF0ZVdvcmtzcGFjZShvcHRpb25zOiBXb3Jrc3BhY2VGYWN0b3J5T3B0aW9ucykge1xuXHRcdHJldHVybiBXb3Jrc3BhY2VGYWN0b3J5LmNyZWF0ZSh7IGNvbmZpZ0ZpbGU6IG9wdGlvbnMuY29uZmlnRmlsZSB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkZsdXhNb2R1bGUiLCJNb2R1bGVNYW5pZmVzdCIsImlkIiwiY29tbWFuZCIsIkZsdXhDb21tYW5kIiwiYWN0aW9ucyIsInNlcnZlIiwiU2VydmVBY3Rpb24iLCJyZWdpc3RlclNlcnZpY2VzIiwiYnVpbGRlciIsInJlZ2lzdGVyU2luZ2xldG9uIiwiSG90UmVsb2FkU2VydmVyIiwiY3JlYXRlV29ya3NwYWNlIiwib3B0aW9ucyIsIldvcmtzcGFjZUZhY3RvcnkiLCJjcmVhdGUiLCJjb25maWdGaWxlIl0sIm1hcHBpbmdzIjoiOzs7OytCQVFhQTs7O2VBQUFBOzs7c0JBUm9CO3FCQUVGOzZCQUVIO2lDQUNJOzZCQUNKO0FBRXJCLE1BQU1BLG1CQUFtQkMsbUJBQWM7SUFDN0JDLEtBQUssT0FBTztJQUNaQyxVQUFVQyx3QkFBVyxDQUFDO0lBQ3RCQyxVQUFVO1FBQ3pCQyxPQUFPQyx3QkFBVztJQUNuQixFQUFFO0lBRUtDLGlCQUFpQkMsT0FBeUIsRUFBRTtRQUNsREEsUUFBUUMsaUJBQWlCLENBQUNDLGdDQUFlO0lBQzFDO0lBRWdCQyxnQkFBZ0JDLE9BQWdDLEVBQUU7UUFDakUsT0FBT0Msc0JBQWdCLENBQUNDLE1BQU0sQ0FBQztZQUFFQyxZQUFZSCxRQUFRRyxVQUFVO1FBQUM7SUFDakU7QUFDRCJ9
|