@decohere/flux 0.0.1-dev.4 → 0.0.1-dev.41
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/flux.command.js +27 -0
- package/commonjs/src/flux.module.js +32 -0
- package/commonjs/src/hot-reload-server.js +379 -0
- package/commonjs/src/index.js +22 -0
- package/commonjs/src/serve.action.js +49 -0
- package/commonjs/src/serve.command.js +27 -0
- package/es6/src/flux.command.js +17 -0
- package/es6/src/flux.module.js +22 -0
- package/es6/src/hot-reload-server.js +323 -0
- package/es6/src/index.js +4 -0
- package/es6/src/serve.action.js +41 -0
- package/es6/src/serve.command.js +17 -0
- package/package.json +7 -12
- package/types/src/flux.command.d.ts +6 -0
- package/types/src/flux.module.d.ts +14 -0
- package/types/src/hot-reload-server.d.ts +64 -0
- package/types/src/index.d.ts +4 -0
- package/types/src/serve.action.d.ts +13 -0
- package/types/src/serve.command.d.ts +6 -0
- package/src/ember.command.js +0 -17
- package/src/ember.module.js +0 -19
- package/src/hot-module-hooks.js +0 -26
- package/src/hot-reload-server.js +0 -201
- package/src/index.js +0 -8
- package/src/serve.action.js +0 -28
- package/src/serve.command.js +0 -15
- package/src/serve.js +0 -32
- package/src/workspace-serve.action.js +0 -45
- package/tests/hmr.integration.spec.js +0 -134
package/src/ember.command.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { DecohereCommand } from "../../nexus/src/cli/index.js";
|
|
2
|
-
import { ServeCommand } from "./serve.command.js";
|
|
3
|
-
export class EmberCommand extends DecohereCommand {
|
|
4
|
-
constructor(commands, handler){
|
|
5
|
-
super(EmberCommand);
|
|
6
|
-
this.exitOverride();
|
|
7
|
-
this.registerSubcommand({
|
|
8
|
-
serve: ServeCommand,
|
|
9
|
-
...commands
|
|
10
|
-
}, handler);
|
|
11
|
-
}
|
|
12
|
-
run(_actions, _options) {
|
|
13
|
-
return this.help();
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2VtYmVyLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25zIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7XG5cdHR5cGUgQ29tbWFuZEhhbmRsZXIsXG5cdHR5cGUgQ29tbWFuZFJlc3BvbnNlLFxuXHR0eXBlIENvbW1hbmRUeXBlLFxuXHREZWNvaGVyZUNvbW1hbmQsXG59IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBTZXJ2ZUNvbW1hbmQgfSBmcm9tIFwiLi9zZXJ2ZS5jb21tYW5kLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbWJlckNvbW1hbmQgZXh0ZW5kcyBEZWNvaGVyZUNvbW1hbmQge1xuXHRwdWJsaWMgY29uc3RydWN0b3IoY29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIENvbW1hbmRUeXBlPiwgaGFuZGxlcjogQ29tbWFuZEhhbmRsZXIpIHtcblx0XHRzdXBlcihFbWJlckNvbW1hbmQpO1xuXHRcdHRoaXMuZXhpdE92ZXJyaWRlKCk7XG5cdFx0dGhpcy5yZWdpc3RlclN1YmNvbW1hbmQoeyBzZXJ2ZTogU2VydmVDb21tYW5kLCAuLi5jb21tYW5kcyB9LCBoYW5kbGVyKTtcblx0fVxuXG5cdHB1YmxpYyBydW4oX2FjdGlvbnM6IEFjdGlvbnMsIF9vcHRpb25zOiBuZXZlcik6IFByb21pc2U8Q29tbWFuZFJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaGVscCgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRGVjb2hlcmVDb21tYW5kIiwiU2VydmVDb21tYW5kIiwiRW1iZXJDb21tYW5kIiwiY29tbWFuZHMiLCJoYW5kbGVyIiwiZXhpdE92ZXJyaWRlIiwicmVnaXN0ZXJTdWJjb21tYW5kIiwic2VydmUiLCJydW4iLCJfYWN0aW9ucyIsIl9vcHRpb25zIiwiaGVscCJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FJQ0EsZUFBZSxRQUNULCtCQUFzQjtBQUM3QixTQUFTQyxZQUFZLFFBQVEscUJBQXFCO0FBRWxELE9BQU8sTUFBTUMscUJBQXFCRjtJQUNqQyxZQUFtQkcsUUFBcUMsRUFBRUMsT0FBdUIsQ0FBRTtRQUNsRixLQUFLLENBQUNGO1FBQ04sSUFBSSxDQUFDRyxZQUFZO1FBQ2pCLElBQUksQ0FBQ0Msa0JBQWtCLENBQUM7WUFBRUMsT0FBT047WUFBYyxHQUFHRSxRQUFRO1FBQUMsR0FBR0M7SUFDL0Q7SUFFT0ksSUFBSUMsUUFBaUIsRUFBRUMsUUFBZSxFQUE0QjtRQUN4RSxPQUFPLElBQUksQ0FBQ0MsSUFBSTtJQUNqQjtBQUNEIn0=
|
package/src/ember.module.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { WorkspaceFactory } from "../../mesh/src/index.js";
|
|
2
|
-
import { ModuleManifest } from "../../nexus/src/cli/index.js";
|
|
3
|
-
import { EmberCommand } from "./ember.command.js";
|
|
4
|
-
import { WorkspaceServeAction } from "./workspace-serve.action.js";
|
|
5
|
-
export const EmberActions = {};
|
|
6
|
-
export class EmberModule extends ModuleManifest {
|
|
7
|
-
id = "ember";
|
|
8
|
-
command = EmberCommand;
|
|
9
|
-
actions = {
|
|
10
|
-
serve: WorkspaceServeAction
|
|
11
|
-
};
|
|
12
|
-
createWorkspace(options) {
|
|
13
|
-
return WorkspaceFactory.create({
|
|
14
|
-
configFile: options.configFile
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2VtYmVyLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFdvcmtzcGFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VGYWN0b3J5T3B0aW9ucyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBNb2R1bGVNYW5pZmVzdCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhaW5lckJ1aWxkZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NvbXBvc2l0aW9uXCI7XG5pbXBvcnQgeyBFbWJlckNvbW1hbmQgfSBmcm9tIFwiLi9lbWJlci5jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBXb3Jrc3BhY2VTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3dvcmtzcGFjZS1zZXJ2ZS5hY3Rpb24uanNcIjtcblxuZXhwb3J0IHR5cGUgRW1iZXJNb2R1bGVDb250ZXh0ID0ge1xuXHRidWlsZGVyOiBDb250YWluZXJCdWlsZGVyO1xuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZTtcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVyTW9kdWxlUmVzdWx0ID0ge1xuXHRhY3Rpb25zOiB0eXBlb2YgRW1iZXJBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IEVtYmVyQWN0aW9ucyA9IHt9O1xuXG5leHBvcnQgY2xhc3MgRW1iZXJNb2R1bGUgZXh0ZW5kcyBNb2R1bGVNYW5pZmVzdCB7XG5cdHB1YmxpYyByZWFkb25seSBpZCA9IFwiZW1iZXJcIjtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmQgPSBFbWJlckNvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdHNlcnZlOiBXb3Jrc3BhY2VTZXJ2ZUFjdGlvbixcblx0fTtcblxuXHRwdWJsaWMgb3ZlcnJpZGUgY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IFdvcmtzcGFjZUZhY3RvcnlPcHRpb25zKSB7XG5cdFx0cmV0dXJuIFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgY29uZmlnRmlsZTogb3B0aW9ucy5jb25maWdGaWxlIH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiV29ya3NwYWNlRmFjdG9yeSIsIk1vZHVsZU1hbmlmZXN0IiwiRW1iZXJDb21tYW5kIiwiV29ya3NwYWNlU2VydmVBY3Rpb24iLCJFbWJlckFjdGlvbnMiLCJFbWJlck1vZHVsZSIsImlkIiwiY29tbWFuZCIsImFjdGlvbnMiLCJzZXJ2ZSIsImNyZWF0ZVdvcmtzcGFjZSIsIm9wdGlvbnMiLCJjcmVhdGUiLCJjb25maWdGaWxlIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxnQkFBZ0IsUUFBUSwwQkFBaUI7QUFFbEQsU0FBU0MsY0FBYyxRQUFRLCtCQUFzQjtBQUVyRCxTQUFTQyxZQUFZLFFBQVEscUJBQXFCO0FBQ2xELFNBQVNDLG9CQUFvQixRQUFRLDhCQUE4QjtBQVduRSxPQUFPLE1BQU1DLGVBQWUsQ0FBQyxFQUFFO0FBRS9CLE9BQU8sTUFBTUMsb0JBQW9CSjtJQUNoQkssS0FBSyxRQUFRO0lBQ2JDLFVBQVVMLGFBQWE7SUFDdkJNLFVBQVU7UUFDekJDLE9BQU9OO0lBQ1IsRUFBRTtJQUVjTyxnQkFBZ0JDLE9BQWdDLEVBQUU7UUFDakUsT0FBT1gsaUJBQWlCWSxNQUFNLENBQUM7WUFBRUMsWUFBWUYsUUFBUUUsVUFBVTtRQUFDO0lBQ2pFO0FBQ0QifQ==
|
package/src/hot-module-hooks.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { registerHooks } from "node:module";
|
|
2
|
-
const resolvers = new Set();
|
|
3
|
-
let initialized = false;
|
|
4
|
-
export function initModuleHooks() {
|
|
5
|
-
if (initialized) {
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
|
-
initialized = true;
|
|
9
|
-
registerHooks({
|
|
10
|
-
resolve: (specifier, context, next)=>{
|
|
11
|
-
const result = next(specifier, context);
|
|
12
|
-
for (const handler of resolvers){
|
|
13
|
-
handler(result, context.parentURL ?? "");
|
|
14
|
-
}
|
|
15
|
-
return result;
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
export function addResolverHook(fn) {
|
|
20
|
-
resolvers.add(fn);
|
|
21
|
-
}
|
|
22
|
-
export function removeResolverHook(fn) {
|
|
23
|
-
resolvers.delete(fn);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1tb2R1bGUtaG9va3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQsIFJlc29sdmVIb29rQ29udGV4dCB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlSGFuZGxlciA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmNvbnN0IHJlc29sdmVycyA9IG5ldyBTZXQ8UmVzb2x2ZUhhbmRsZXI+KCk7XG5sZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRNb2R1bGVIb29rcygpOiB2b2lkIHtcblx0aWYgKGluaXRpYWxpemVkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGluaXRpYWxpemVkID0gdHJ1ZTtcblxuXHRyZWdpc3Rlckhvb2tzKHtcblx0XHRyZXNvbHZlOiAoXG5cdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdGNvbnRleHQ6IFJlc29sdmVIb29rQ29udGV4dCxcblx0XHRcdG5leHQ6IChzcGVjaWZpZXI6IHN0cmluZywgY29udGV4dD86IFBhcnRpYWw8UmVzb2x2ZUhvb2tDb250ZXh0PikgPT4gUmVzb2x2ZUZuT3V0cHV0LFxuXHRcdCkgPT4ge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gbmV4dChzcGVjaWZpZXIsIGNvbnRleHQpIGFzIFJlc29sdmVGbk91dHB1dDtcblx0XHRcdGZvciAoY29uc3QgaGFuZGxlciBvZiByZXNvbHZlcnMpIHtcblx0XHRcdFx0aGFuZGxlcihyZXN1bHQsIGNvbnRleHQucGFyZW50VVJMID8/IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LFxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlc29sdmVySG9vayhmbjogUmVzb2x2ZUhhbmRsZXIpOiB2b2lkIHtcblx0cmVzb2x2ZXJzLmFkZChmbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVSZXNvbHZlckhvb2soZm46IFJlc29sdmVIYW5kbGVyKTogdm9pZCB7XG5cdHJlc29sdmVycy5kZWxldGUoZm4pO1xufVxuIl0sIm5hbWVzIjpbInJlZ2lzdGVySG9va3MiLCJyZXNvbHZlcnMiLCJTZXQiLCJpbml0aWFsaXplZCIsImluaXRNb2R1bGVIb29rcyIsInJlc29sdmUiLCJzcGVjaWZpZXIiLCJjb250ZXh0IiwibmV4dCIsInJlc3VsdCIsImhhbmRsZXIiLCJwYXJlbnRVUkwiLCJhZGRSZXNvbHZlckhvb2siLCJmbiIsImFkZCIsInJlbW92ZVJlc29sdmVySG9vayIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsYUFBYSxRQUFRLGNBQWM7QUFJNUMsTUFBTUMsWUFBWSxJQUFJQztBQUN0QixJQUFJQyxjQUFjO0FBRWxCLE9BQU8sU0FBU0M7SUFDZixJQUFJRCxhQUFhO1FBQ2hCO0lBQ0Q7SUFDQUEsY0FBYztJQUVkSCxjQUFjO1FBQ2JLLFNBQVMsQ0FDUkMsV0FDQUMsU0FDQUM7WUFFQSxNQUFNQyxTQUFTRCxLQUFLRixXQUFXQztZQUMvQixLQUFLLE1BQU1HLFdBQVdULFVBQVc7Z0JBQ2hDUyxRQUFRRCxRQUFRRixRQUFRSSxTQUFTLElBQUk7WUFDdEM7WUFDQSxPQUFPRjtRQUNSO0lBQ0Q7QUFDRDtBQUVBLE9BQU8sU0FBU0csZ0JBQWdCQyxFQUFrQjtJQUNqRFosVUFBVWEsR0FBRyxDQUFDRDtBQUNmO0FBRUEsT0FBTyxTQUFTRSxtQkFBbUJGLEVBQWtCO0lBQ3BEWixVQUFVZSxNQUFNLENBQUNIO0FBQ2xCIn0=
|
package/src/hot-reload-server.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from "node:events";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { io } from "../../nexus/src/io/index.js";
|
|
4
|
-
import { debounce } from "../../nexus/src/system/index.js";
|
|
5
|
-
import { addResolverHook, initModuleHooks, removeResolverHook } from "./hot-module-hooks.js";
|
|
6
|
-
const currentFilePath = io.fileUrlToPath(import.meta.url);
|
|
7
|
-
export class HotReloadServer extends EventEmitter {
|
|
8
|
-
logger;
|
|
9
|
-
disposed = false;
|
|
10
|
-
entryModule;
|
|
11
|
-
entry;
|
|
12
|
-
sourceFiles = [];
|
|
13
|
-
moduleCache = new Map();
|
|
14
|
-
dependencies = new Map();
|
|
15
|
-
watchers = [];
|
|
16
|
-
constructor(logger){
|
|
17
|
-
super();
|
|
18
|
-
this.logger = logger;
|
|
19
|
-
}
|
|
20
|
-
async start(entry, ...watchDirs) {
|
|
21
|
-
this.entryModule = entry;
|
|
22
|
-
this.sourceFiles = await this.getSourceFiles(watchDirs);
|
|
23
|
-
this.configureModuleHooks();
|
|
24
|
-
this.invalidateAllSourceFiles();
|
|
25
|
-
await this.watch(watchDirs);
|
|
26
|
-
this.logger.trace("Serving", entry);
|
|
27
|
-
this.logger.trace("Hot reload watching", watchDirs);
|
|
28
|
-
await this.bootEntry();
|
|
29
|
-
}
|
|
30
|
-
async dispose() {
|
|
31
|
-
if (this.disposed) return;
|
|
32
|
-
this.disposed = true;
|
|
33
|
-
removeResolverHook(this.onResolve);
|
|
34
|
-
for (const watcher of this.watchers){
|
|
35
|
-
watcher.close();
|
|
36
|
-
}
|
|
37
|
-
await this.disposeEntry();
|
|
38
|
-
}
|
|
39
|
-
removeSourceFiles(...sourceFiles) {
|
|
40
|
-
this.sourceFiles = this.sourceFiles.filter((sourceFile)=>!sourceFiles.includes(sourceFile));
|
|
41
|
-
}
|
|
42
|
-
async getSourceFiles(dirs) {
|
|
43
|
-
const patterns = dirs.map((dir)=>`${dir}/**/*.js`);
|
|
44
|
-
const files = await io.findFiles(patterns);
|
|
45
|
-
return files.map((f)=>f.fullPath);
|
|
46
|
-
}
|
|
47
|
-
configureModuleHooks() {
|
|
48
|
-
initModuleHooks();
|
|
49
|
-
addResolverHook(this.onResolve);
|
|
50
|
-
}
|
|
51
|
-
onResolve = (result, parentUrl)=>{
|
|
52
|
-
const { url } = result;
|
|
53
|
-
const parentUrlClean = parentUrl.split("?")[0];
|
|
54
|
-
const isSource = this.isSourceModule(url);
|
|
55
|
-
const parentIsSource = this.isSourceModule(parentUrlClean);
|
|
56
|
-
if (isSource || parentIsSource) {
|
|
57
|
-
this.trackDependency(url, parentUrl);
|
|
58
|
-
}
|
|
59
|
-
if (!isSource) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
result.url = this.getCachedOrNew(url);
|
|
63
|
-
};
|
|
64
|
-
isSourceModule(url) {
|
|
65
|
-
const path = io.fileUrlToPath(url);
|
|
66
|
-
return this.sourceFiles.includes(path);
|
|
67
|
-
}
|
|
68
|
-
getDependencyGraph(moduleId, parentModules = []) {
|
|
69
|
-
if (this.isSelf(moduleId)) {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
const moduleDeps = this.dependencies.get(moduleId) ?? [];
|
|
73
|
-
if (parentModules.includes(moduleId)) {
|
|
74
|
-
this.logger.error(`Circular reference detected: ${moduleId}`);
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
let subDeps = Array.of();
|
|
78
|
-
for (const dep of moduleDeps){
|
|
79
|
-
if (!this.sourceFiles.includes(dep)) continue;
|
|
80
|
-
const subs = this.getDependencyGraph(dep, [
|
|
81
|
-
moduleId,
|
|
82
|
-
...parentModules
|
|
83
|
-
]);
|
|
84
|
-
subDeps = [
|
|
85
|
-
...subDeps,
|
|
86
|
-
...subs
|
|
87
|
-
];
|
|
88
|
-
}
|
|
89
|
-
return [
|
|
90
|
-
...new Set([
|
|
91
|
-
...moduleDeps,
|
|
92
|
-
...subDeps
|
|
93
|
-
])
|
|
94
|
-
];
|
|
95
|
-
}
|
|
96
|
-
trackDependency(url, parentUrl) {
|
|
97
|
-
const filePath = io.fileUrlToPath(url);
|
|
98
|
-
const parentPath = io.fileUrlToPath(parentUrl.split("?")[0]);
|
|
99
|
-
const deps = this.dependencies.get(filePath) ?? [];
|
|
100
|
-
const updatedDeps = new Set([
|
|
101
|
-
...deps,
|
|
102
|
-
parentPath
|
|
103
|
-
]);
|
|
104
|
-
this.dependencies.set(filePath, [
|
|
105
|
-
...updatedDeps
|
|
106
|
-
]);
|
|
107
|
-
}
|
|
108
|
-
getCachedOrNew(moduleUrl) {
|
|
109
|
-
const filePath = io.fileUrlToPath(moduleUrl);
|
|
110
|
-
const cached = this.moduleCache.get(filePath);
|
|
111
|
-
const versioned = cached ?? this.versionModule(moduleUrl);
|
|
112
|
-
this.moduleCache.set(filePath, versioned);
|
|
113
|
-
return versioned;
|
|
114
|
-
}
|
|
115
|
-
versionModule(moduleUrl) {
|
|
116
|
-
const versionedUrl = new URL(moduleUrl);
|
|
117
|
-
versionedUrl.searchParams.set("version", Date.now().toString());
|
|
118
|
-
return versionedUrl.toString();
|
|
119
|
-
}
|
|
120
|
-
watch = async (dirs)=>{
|
|
121
|
-
for (const dir of dirs){
|
|
122
|
-
const watcher = io.watch(dir, {
|
|
123
|
-
include: [
|
|
124
|
-
"**/*.js"
|
|
125
|
-
],
|
|
126
|
-
ignoreInitial: true
|
|
127
|
-
});
|
|
128
|
-
watcher.on("add", this.onFileAdded).on("change", this.onSourceFileChanged).on("unlink", this.onFileDeleted);
|
|
129
|
-
this.watchers.push(watcher);
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
onFileAdded = async ({ fullPath })=>{
|
|
133
|
-
this.sourceFiles.push(fullPath);
|
|
134
|
-
this.moduleCache.set(fullPath, null);
|
|
135
|
-
this.reloadIfAffected(fullPath);
|
|
136
|
-
};
|
|
137
|
-
onSourceFileChanged = async ({ fullPath })=>{
|
|
138
|
-
if (!this.reloadIfAffected(fullPath)) {
|
|
139
|
-
this.logger.trace(`${fullPath} is not part of the current dependency graph. Not reloading entry.`);
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
onFileDeleted = async ({ fullPath })=>{
|
|
143
|
-
this.removeSourceFiles(fullPath);
|
|
144
|
-
};
|
|
145
|
-
reloadIfAffected(fullPath) {
|
|
146
|
-
const deps = this.getDependencyGraph(fullPath);
|
|
147
|
-
const modules = [
|
|
148
|
-
...new Set([
|
|
149
|
-
...deps,
|
|
150
|
-
fullPath
|
|
151
|
-
])
|
|
152
|
-
];
|
|
153
|
-
if (!modules.includes(this.entryModule)) {
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
this.invlidateModule(...modules);
|
|
157
|
-
this.disposeAndBoot();
|
|
158
|
-
return true;
|
|
159
|
-
}
|
|
160
|
-
isSelf(urlLike) {
|
|
161
|
-
return currentFilePath === path.resolve(io.fileUrlToPath(urlLike));
|
|
162
|
-
}
|
|
163
|
-
invlidateModule(...modules) {
|
|
164
|
-
for (const module of modules){
|
|
165
|
-
this.moduleCache.set(module, null);
|
|
166
|
-
}
|
|
167
|
-
// Prune invalidated modules from all parent lists so stale relationships
|
|
168
|
-
// are cleared. The fresh boot rebuilds only what is actually imported.
|
|
169
|
-
for (const [child, parents] of this.dependencies){
|
|
170
|
-
const pruned = parents.filter((p)=>!modules.includes(p));
|
|
171
|
-
if (pruned.length === 0) {
|
|
172
|
-
this.dependencies.delete(child);
|
|
173
|
-
} else {
|
|
174
|
-
this.dependencies.set(child, pruned);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
invalidateAllSourceFiles() {
|
|
179
|
-
for (const file of this.sourceFiles){
|
|
180
|
-
this.moduleCache.set(file, null);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
disposeAndBoot = debounce(async ()=>{
|
|
184
|
-
await this.disposeEntry();
|
|
185
|
-
await this.bootEntry();
|
|
186
|
-
}, 250);
|
|
187
|
-
async disposeEntry() {
|
|
188
|
-
await this.entry?.[Symbol.asyncDispose]();
|
|
189
|
-
}
|
|
190
|
-
async bootEntry() {
|
|
191
|
-
try {
|
|
192
|
-
const version = this.versionModule(io.pathToFileUrl(this.entryModule));
|
|
193
|
-
this.entry = (await import(version))?.default;
|
|
194
|
-
this.emit("reboot");
|
|
195
|
-
} catch (error) {
|
|
196
|
-
this.logger.error(`There was an error booting the entry point. Your application may not function as expected`, error);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgRmlsZSwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBhZGRSZXNvbHZlckhvb2ssIGluaXRNb2R1bGVIb29rcywgcmVtb3ZlUmVzb2x2ZXJIb29rIH0gZnJvbSBcIi4vaG90LW1vZHVsZS1ob29rcy5qc1wiO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnk6IEFzeW5jRGlzcG9zYWJsZTtcblx0cHJpdmF0ZSBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblx0cHJpdmF0ZSB3YXRjaGVyczogUmV0dXJuVHlwZTx0eXBlb2YgaW8ud2F0Y2g+W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobG9nZ2VyOiBMb2dnZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KGVudHJ5OiBzdHJpbmcsIC4uLndhdGNoRGlyczogc3RyaW5nW10pIHtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gZW50cnk7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0U291cmNlRmlsZXMod2F0Y2hEaXJzKTtcblx0XHR0aGlzLmNvbmZpZ3VyZU1vZHVsZUhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblx0XHRhd2FpdCB0aGlzLndhdGNoKHdhdGNoRGlycyk7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJTZXJ2aW5nXCIsIGVudHJ5KTtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIkhvdCByZWxvYWQgd2F0Y2hpbmdcIiwgd2F0Y2hEaXJzKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHRyZW1vdmVSZXNvbHZlckhvb2sodGhpcy5vblJlc29sdmUpO1xuXHRcdGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSB7XG5cdFx0XHR3YXRjaGVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNvdXJjZUZpbGVzKC4uLnNvdXJjZUZpbGVzOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMuc291cmNlRmlsZXMgPSB0aGlzLnNvdXJjZUZpbGVzLmZpbHRlcihcblx0XHRcdChzb3VyY2VGaWxlKSA9PiAhc291cmNlRmlsZXMuaW5jbHVkZXMoc291cmNlRmlsZSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0U291cmNlRmlsZXMoZGlyczogc3RyaW5nW10pIHtcblx0XHRjb25zdCBwYXR0ZXJucyA9IGRpcnMubWFwKChkaXIpID0+IGAke2Rpcn0vKiovKi5qc2ApO1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgaW8uZmluZEZpbGVzKHBhdHRlcm5zKTtcblx0XHRyZXR1cm4gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uZmlndXJlTW9kdWxlSG9va3MoKSB7XG5cdFx0aW5pdE1vZHVsZUhvb2tzKCk7XG5cdFx0YWRkUmVzb2x2ZXJIb29rKHRoaXMub25SZXNvbHZlKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZSh1cmwpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZShwYXJlbnRVcmxDbGVhbik7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KHVybCwgcGFyZW50VXJsKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzU291cmNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVzdWx0LnVybCA9IHRoaXMuZ2V0Q2FjaGVkT3JOZXcodXJsKTtcblx0fTtcblxuXHRwcml2YXRlIGlzU291cmNlTW9kdWxlKHVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhwYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzID0gQXJyYXkub2Y8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeSh1cmw6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDYWNoZWRPck5ldyhtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChtb2R1bGVVcmwpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubW9kdWxlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRjb25zdCB2ZXJzaW9uZWQgPSBjYWNoZWQgPz8gdGhpcy52ZXJzaW9uTW9kdWxlKG1vZHVsZVVybCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIHZlcnNpb25lZCk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZDtcblx0fVxuXG5cdHByaXZhdGUgdmVyc2lvbk1vZHVsZShtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IHZlcnNpb25lZFVybCA9IG5ldyBVUkwobW9kdWxlVXJsKTtcblx0XHR2ZXJzaW9uZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHdhdGNoID0gYXN5bmMgKGRpcnM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuXHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGlvLndhdGNoKGRpciwgeyBpbmNsdWRlOiBbXCIqKi8qLmpzXCJdLCBpZ25vcmVJbml0aWFsOiB0cnVlIH0pO1xuXHRcdFx0d2F0Y2hlclxuXHRcdFx0XHQub24oXCJhZGRcIiwgdGhpcy5vbkZpbGVBZGRlZClcblx0XHRcdFx0Lm9uKFwiY2hhbmdlXCIsIHRoaXMub25Tb3VyY2VGaWxlQ2hhbmdlZClcblx0XHRcdFx0Lm9uKFwidW5saW5rXCIsIHRoaXMub25GaWxlRGVsZXRlZCk7XG5cdFx0XHR0aGlzLndhdGNoZXJzLnB1c2god2F0Y2hlcik7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlQWRkZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIG9uU291cmNlRmlsZUNoYW5nZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdFx0YCR7ZnVsbFBhdGh9IGlzIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kgZ3JhcGguIE5vdCByZWxvYWRpbmcgZW50cnkuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlRGVsZXRlZCA9IGFzeW5jICh7IGZ1bGxQYXRoIH06IEZpbGUpID0+IHtcblx0XHR0aGlzLnJlbW92ZVNvdXJjZUZpbGVzKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdHRoaXMuZGlzcG9zZUFuZEJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKHVybExpa2U6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShpby5maWxlVXJsVG9QYXRoKHVybExpa2UpKTtcblx0fVxuXG5cdHByaXZhdGUgaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHR9XG5cdFx0Ly8gUHJ1bmUgaW52YWxpZGF0ZWQgbW9kdWxlcyBmcm9tIGFsbCBwYXJlbnQgbGlzdHMgc28gc3RhbGUgcmVsYXRpb25zaGlwc1xuXHRcdC8vIGFyZSBjbGVhcmVkLiBUaGUgZnJlc2ggYm9vdCByZWJ1aWxkcyBvbmx5IHdoYXQgaXMgYWN0dWFsbHkgaW1wb3J0ZWQuXG5cdFx0Zm9yIChjb25zdCBbY2hpbGQsIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRjb25zdCBwcnVuZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gIW1vZHVsZXMuaW5jbHVkZXMocCkpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChjaGlsZCwgcHJ1bmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5zb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZSwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlQW5kQm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH0sIDI1MCk7XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGUpKTtcblx0XHRcdHRoaXMuZW50cnkgPSAoYXdhaXQgaW1wb3J0KHZlcnNpb24pKT8uZGVmYXVsdDtcblx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdGBUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZGAsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJwYXRoIiwiaW8iLCJkZWJvdW5jZSIsImFkZFJlc29sdmVySG9vayIsImluaXRNb2R1bGVIb29rcyIsInJlbW92ZVJlc29sdmVySG9vayIsImN1cnJlbnRGaWxlUGF0aCIsImZpbGVVcmxUb1BhdGgiLCJ1cmwiLCJIb3RSZWxvYWRTZXJ2ZXIiLCJsb2dnZXIiLCJkaXNwb3NlZCIsImVudHJ5TW9kdWxlIiwiZW50cnkiLCJzb3VyY2VGaWxlcyIsIm1vZHVsZUNhY2hlIiwiTWFwIiwiZGVwZW5kZW5jaWVzIiwid2F0Y2hlcnMiLCJzdGFydCIsIndhdGNoRGlycyIsImdldFNvdXJjZUZpbGVzIiwiY29uZmlndXJlTW9kdWxlSG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZGlzcG9zZSIsIm9uUmVzb2x2ZSIsIndhdGNoZXIiLCJjbG9zZSIsImRpc3Bvc2VFbnRyeSIsInJlbW92ZVNvdXJjZUZpbGVzIiwiZmlsdGVyIiwic291cmNlRmlsZSIsImluY2x1ZGVzIiwiZGlycyIsInBhdHRlcm5zIiwibWFwIiwiZGlyIiwiZmlsZXMiLCJmaW5kRmlsZXMiLCJmIiwiZnVsbFBhdGgiLCJyZXN1bHQiLCJwYXJlbnRVcmwiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwiaXNTb3VyY2UiLCJpc1NvdXJjZU1vZHVsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZ2V0Q2FjaGVkT3JOZXciLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVJZCIsInBhcmVudE1vZHVsZXMiLCJpc1NlbGYiLCJtb2R1bGVEZXBzIiwiZ2V0IiwiZXJyb3IiLCJzdWJEZXBzIiwiQXJyYXkiLCJvZiIsImRlcCIsInN1YnMiLCJTZXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJkZXBzIiwidXBkYXRlZERlcHMiLCJzZXQiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwiaW5jbHVkZSIsImlnbm9yZUluaXRpYWwiLCJvbiIsIm9uRmlsZUFkZGVkIiwib25Tb3VyY2VGaWxlQ2hhbmdlZCIsIm9uRmlsZURlbGV0ZWQiLCJwdXNoIiwicmVsb2FkSWZBZmZlY3RlZCIsIm1vZHVsZXMiLCJpbnZsaWRhdGVNb2R1bGUiLCJkaXNwb3NlQW5kQm9vdCIsInVybExpa2UiLCJyZXNvbHZlIiwibW9kdWxlIiwiY2hpbGQiLCJwYXJlbnRzIiwicHJ1bmVkIiwicCIsImxlbmd0aCIsImRlbGV0ZSIsImZpbGUiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJ2ZXJzaW9uIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlbWl0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxZQUFZLFFBQVEsY0FBYztBQUUzQyxPQUFPQyxVQUFVLFlBQVk7QUFDN0IsU0FBb0JDLEVBQUUsUUFBUSw4QkFBcUI7QUFDbkQsU0FBU0MsUUFBUSxRQUFRLGtDQUF5QjtBQUVsRCxTQUFTQyxlQUFlLEVBQUVDLGVBQWUsRUFBRUMsa0JBQWtCLFFBQVEsd0JBQXdCO0FBRTdGLE1BQU1DLGtCQUFrQkwsR0FBR00sYUFBYSxDQUFDLFlBQVlDLEdBQUc7QUFNeEQsT0FBTyxNQUFNQyx3QkFBd0JWO0lBQ25CVyxPQUFlO0lBQ3hCQyxXQUFXLE1BQU07SUFDakJDLFlBQW9CO0lBQ3BCQyxNQUF1QjtJQUN2QkMsY0FBd0IsRUFBRSxDQUFDO0lBQzNCQyxjQUFjLElBQUlDLE1BQTZCO0lBQy9DQyxlQUFlLElBQUlELE1BQXdCO0lBQzNDRSxXQUEwQyxFQUFFLENBQUM7SUFFckQsWUFBbUJSLE1BQWMsQ0FBRTtRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO0lBQ2Y7SUFFQSxNQUFhUyxNQUFNTixLQUFhLEVBQUUsR0FBR08sU0FBbUIsRUFBRTtRQUN6RCxJQUFJLENBQUNSLFdBQVcsR0FBR0M7UUFDbkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGNBQWMsQ0FBQ0Q7UUFDN0MsSUFBSSxDQUFDRSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDQyx3QkFBd0I7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
|
package/src/index.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { EmberCommand } from "./ember.command.js";
|
|
2
|
-
export { EmberActions, EmberModule } from "./ember.module.js";
|
|
3
|
-
export * from "./hot-reload-server.js";
|
|
4
|
-
export { ServeAction } from "./serve.action.js";
|
|
5
|
-
export { ServeCommand } from "./serve.command.js";
|
|
6
|
-
export { WorkspaceServeAction } from "./workspace-serve.action.js";
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEVtYmVyQ29tbWFuZCB9IGZyb20gXCIuL2VtYmVyLmNvbW1hbmQuanNcIjtcbmV4cG9ydCB0eXBlIHsgRW1iZXJNb2R1bGVDb250ZXh0LCBFbWJlck1vZHVsZVJlc3VsdCB9IGZyb20gXCIuL2VtYmVyLm1vZHVsZS5qc1wiO1xuZXhwb3J0IHsgRW1iZXJBY3Rpb25zLCBFbWJlck1vZHVsZSB9IGZyb20gXCIuL2VtYmVyLm1vZHVsZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHsgU2VydmVDb21tYW5kIH0gZnJvbSBcIi4vc2VydmUuY29tbWFuZC5qc1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VTZXJ2ZU9wdGlvbnMgfSBmcm9tIFwiLi93b3Jrc3BhY2Utc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQgeyBXb3Jrc3BhY2VTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3dvcmtzcGFjZS1zZXJ2ZS5hY3Rpb24uanNcIjtcbiJdLCJuYW1lcyI6WyJFbWJlckNvbW1hbmQiLCJFbWJlckFjdGlvbnMiLCJFbWJlck1vZHVsZSIsIlNlcnZlQWN0aW9uIiwiU2VydmVDb21tYW5kIiwiV29ya3NwYWNlU2VydmVBY3Rpb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxxQkFBcUI7QUFFbEQsU0FBU0MsWUFBWSxFQUFFQyxXQUFXLFFBQVEsb0JBQW9CO0FBQzlELGNBQWMseUJBQXlCO0FBRXZDLFNBQVNDLFdBQVcsUUFBUSxvQkFBb0I7QUFDaEQsU0FBU0MsWUFBWSxRQUFRLHFCQUFxQjtBQUVsRCxTQUFTQyxvQkFBb0IsUUFBUSw4QkFBOEIifQ==
|
package/src/serve.action.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
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
|
-
import { injectable } from "../../crucible/src/decorators/index.js";
|
|
8
|
-
import { ActionResponse } from "../../nexus/src/cli/index.js";
|
|
9
|
-
import { scribe } from "../../scribe/scribe/src/index.js";
|
|
10
|
-
import { HotReloadServer } from "./hot-reload-server.js";
|
|
11
|
-
export class ServeAction {
|
|
12
|
-
async run(options) {
|
|
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);
|
|
19
|
-
});
|
|
20
|
-
await server.start(entry, watchDir);
|
|
21
|
-
return ActionResponse.Success(ServeAction.name);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
ServeAction = _ts_decorate([
|
|
25
|
-
injectable()
|
|
26
|
-
], ServeAction);
|
|
27
|
-
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNlcnZlT3B0aW9ucyA9IHtcblx0ZW50cnk6IHN0cmluZztcblx0d2F0Y2hEaXI6IHN0cmluZztcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBTZXJ2ZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBlbnRyeSwgd2F0Y2hEaXIgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcIlNlcnZlQWN0aW9uXCIpO1xuXHRcdGNvbnN0IHNlcnZlciA9IG5ldyBIb3RSZWxvYWRTZXJ2ZXIobG9nZ2VyKTtcblxuXHRcdHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgc2VydmVyLmRpc3Bvc2UoKTtcblx0XHRcdHByb2Nlc3MuZXhpdCgwKTtcblx0XHR9KTtcblxuXHRcdGF3YWl0IHNlcnZlci5zdGFydChlbnRyeSwgd2F0Y2hEaXIpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFNlcnZlQWN0aW9uLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIkFjdGlvblJlc3BvbnNlIiwic2NyaWJlIiwiSG90UmVsb2FkU2VydmVyIiwiU2VydmVBY3Rpb24iLCJydW4iLCJvcHRpb25zIiwiZW50cnkiLCJ3YXRjaERpciIsImxvZ2dlciIsInNlcnZlciIsInByb2Nlc3MiLCJvbiIsImRpc3Bvc2UiLCJleGl0Iiwic3RhcnQiLCJTdWNjZXNzIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLHlDQUFnQztBQUMzRCxTQUFzQkMsY0FBYyxRQUFRLCtCQUFzQjtBQUNsRSxTQUFTQyxNQUFNLFFBQVEsbUNBQW1CO0FBQzFDLFNBQVNDLGVBQWUsUUFBUSx5QkFBeUI7QUFRekQsT0FBTyxNQUFNQztJQUNaLE1BQWFDLElBQUlDLE9BQXFCLEVBQTJCO1FBQ2hFLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0Y7UUFDNUIsTUFBTUcsU0FBU1AsT0FBT08sTUFBTSxDQUFDO1FBQzdCLE1BQU1DLFNBQVMsSUFBSVAsZ0JBQWdCTTtRQUVuQ0UsUUFBUUMsRUFBRSxDQUFDLFVBQVU7WUFDcEIsTUFBTUYsT0FBT0csT0FBTztZQUNwQkYsUUFBUUcsSUFBSSxDQUFDO1FBQ2Q7UUFFQSxNQUFNSixPQUFPSyxLQUFLLENBQUNSLE9BQU9DO1FBQzFCLE9BQU9QLGVBQWVlLE9BQU8sQ0FBQ1osWUFBWWEsSUFBSTtJQUMvQztBQUNEIn0=
|
package/src/serve.command.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { DecohereCommand } from "../../nexus/src/cli/index.js";
|
|
2
|
-
import { WorkspaceServeAction } from "./workspace-serve.action.js";
|
|
3
|
-
export class ServeCommand extends DecohereCommand {
|
|
4
|
-
get actions() {
|
|
5
|
-
return [
|
|
6
|
-
WorkspaceServeAction
|
|
7
|
-
];
|
|
8
|
-
}
|
|
9
|
-
constructor(name){
|
|
10
|
-
super(name);
|
|
11
|
-
this.description("Serve the first project in a workspace configuration");
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjb2hlcmVDb21tYW5kIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IFdvcmtzcGFjZVNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vd29ya3NwYWNlLXNlcnZlLmFjdGlvbi5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2VydmVDb21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kIHtcblx0cHVibGljIG92ZXJyaWRlIGdldCBhY3Rpb25zKCkge1xuXHRcdHJldHVybiBbV29ya3NwYWNlU2VydmVBY3Rpb25dO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24oXCJTZXJ2ZSB0aGUgZmlyc3QgcHJvamVjdCBpbiBhIHdvcmtzcGFjZSBjb25maWd1cmF0aW9uXCIpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRGVjb2hlcmVDb21tYW5kIiwiV29ya3NwYWNlU2VydmVBY3Rpb24iLCJTZXJ2ZUNvbW1hbmQiLCJhY3Rpb25zIiwibmFtZSIsImRlc2NyaXB0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxlQUFlLFFBQVEsK0JBQXNCO0FBQ3RELFNBQVNDLG9CQUFvQixRQUFRLDhCQUE4QjtBQUVuRSxPQUFPLE1BQU1DLHFCQUFxQkY7SUFDakMsSUFBb0JHLFVBQVU7UUFDN0IsT0FBTztZQUFDRjtTQUFxQjtJQUM5QjtJQUVBLFlBQW1CRyxJQUFZLENBQUU7UUFDaEMsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsV0FBVyxDQUFDO0lBQ2xCO0FBQ0QifQ==
|
package/src/serve.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { parseArgs } from "node:util";
|
|
2
|
-
import { scribe } from "../../scribe/scribe/src/index.js";
|
|
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+Li4uXVwiKTtcblx0cHJvY2Vzcy5leGl0KDEpO1xufVxuXG5jb25zdCBobXIgPSBuZXcgSG90UmVsb2FkU2VydmVyKHNjcmliZS5sb2dnZXIoXCJIb3RSZWxvYWRTZXJ2ZXJcIikpO1xuYXdhaXQgaG1yLnN0YXJ0KGVudHJ5LCAuLi53YXRjaERpcnMpO1xuIl0sIm5hbWVzIjpbInBhcnNlQXJncyIsInNjcmliZSIsIkhvdFJlbG9hZFNlcnZlciIsInZhbHVlcyIsImFyZ3MiLCJwcm9jZXNzIiwiYXJndiIsInNsaWNlIiwib3B0aW9ucyIsImVudHJ5IiwidHlwZSIsInNob3J0Iiwid2F0Y2hEaXIiLCJtdWx0aXBsZSIsImFsbG93UG9zaXRpb25hbHMiLCJ3YXRjaERpcnMiLCJjb25zb2xlIiwiZXJyb3IiLCJleGl0IiwibGVuZ3RoIiwiaG1yIiwibG9nZ2VyIiwic3RhcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLFNBQVNDLE1BQU0sUUFBUSxtQ0FBbUI7QUFDMUMsU0FBU0MsZUFBZSxRQUFRLHlCQUF5QjtBQUV6RCxNQUFNLEVBQUVDLE1BQU0sRUFBRSxHQUFHSCxVQUFVO0lBQzVCSSxNQUFNQyxRQUFRQyxJQUFJLENBQUNDLEtBQUssQ0FBQztJQUN6QkMsU0FBUztRQUNSQyxPQUFPO1lBQUVDLE1BQU07WUFBVUMsT0FBTztRQUFJO1FBQ3BDQyxVQUFVO1lBQUVGLE1BQU07WUFBVUcsVUFBVTtZQUFNRixPQUFPO1FBQUk7SUFDeEQ7SUFDQUcsa0JBQWtCO0FBQ25CO0FBRUEsTUFBTUwsUUFBUU4sT0FBT00sS0FBSztBQUMxQixNQUFNTSxZQUFZWixPQUFPUyxRQUFRLElBQUksRUFBRTtBQUV2QyxJQUFJLENBQUNILE9BQU87SUFDWE8sUUFBUUMsS0FBSyxDQUFDO0lBQ2RaLFFBQVFhLElBQUksQ0FBQztBQUNkO0FBRUEsSUFBSUgsVUFBVUksTUFBTSxLQUFLLEdBQUc7SUFDM0JILFFBQVFDLEtBQUssQ0FBQztJQUNkWixRQUFRYSxJQUFJLENBQUM7QUFDZDtBQUVBLE1BQU1FLE1BQU0sSUFBSWxCLGdCQUFnQkQsT0FBT29CLE1BQU0sQ0FBQztBQUM5QyxNQUFNRCxJQUFJRSxLQUFLLENBQUNiLFVBQVVNIn0=
|
|
@@ -1,45 +0,0 @@
|
|
|
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 "../../crucible/src/decorators/index.js";
|
|
12
|
-
// biome-ignore lint/style/useImportType: <DI>
|
|
13
|
-
import { Workspace } from "../../mesh/src/index.js";
|
|
14
|
-
import { ActionResponse } from "../../nexus/src/cli/index.js";
|
|
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+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlOiBXb3Jrc3BhY2UpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBXb3Jrc3BhY2VTZXJ2ZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBjb25maWd1cmF0aW9uIH0gPSBvcHRpb25zO1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2UuZ2V0UHJvamVjdHMoY29uZmlndXJhdGlvbik7XG5cdFx0Y29uc3QgcHJvamVjdCA9IHByb2plY3RzLmF0KDApO1xuXG5cdFx0aWYgKHByb2plY3QgPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLkVycm9yKFxuXHRcdFx0XHRXb3Jrc3BhY2VTZXJ2ZUFjdGlvbi5uYW1lLFxuXHRcdFx0XHRgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7Y29uZmlndXJhdGlvbn1gLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBvdXREaXIgPSBwcm9qZWN0LmdldE91dERpcigpO1xuXHRcdGNvbnN0IGVudHJ5ID0gcGF0aC5qb2luKG91dERpciwgXCJzcmNcIiwgXCJpbmRleC5qc1wiKTtcblx0XHRjb25zdCBzZXJ2ZUFjdGlvbiA9IG5ldyBTZXJ2ZUFjdGlvbigpO1xuXHRcdHJldHVybiBzZXJ2ZUFjdGlvbi5ydW4oeyBlbnRyeSwgd2F0Y2hEaXI6IG91dERpciB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJTZXJ2ZUFjdGlvbiIsIldvcmtzcGFjZVNlcnZlQWN0aW9uIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsImNvbmZpZ3VyYXRpb24iLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwicHJvamVjdCIsImF0IiwiRXJyb3IiLCJuYW1lIiwib3V0RGlyIiwiZ2V0T3V0RGlyIiwiZW50cnkiLCJqb2luIiwic2VydmVBY3Rpb24iLCJ3YXRjaERpciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLFVBQVUsUUFBUSx5Q0FBZ0M7QUFDM0QsOENBQThDO0FBQzlDLFNBQVNDLFNBQVMsUUFBUSwwQkFBaUI7QUFFM0MsU0FBU0MsY0FBYyxRQUFRLCtCQUFzQjtBQUNyRCxTQUFTQyxXQUFXLFFBQVEsb0JBQW9CO0FBT2hELE9BQU8sTUFBTUM7O0lBQ1osWUFBbUIsQUFBaUJDLFNBQW9CLENBQUU7YUFBdEJBLFlBQUFBO0lBQXVCO0lBRTNELE1BQWFDLElBQUlDLE9BQThCLEVBQTJCO1FBQ3pFLE1BQU0sRUFBRUMsYUFBYSxFQUFFLEdBQUdEO1FBQzFCLE1BQU1FLFdBQVcsSUFBSSxDQUFDSixTQUFTLENBQUNLLFdBQVcsQ0FBQ0Y7UUFDNUMsTUFBTUcsVUFBVUYsU0FBU0csRUFBRSxDQUFDO1FBRTVCLElBQUlELFdBQVcsTUFBTTtZQUNwQixPQUFPVCxlQUFlVyxLQUFLLENBQzFCVCxxQkFBcUJVLElBQUksRUFDekIsQ0FBQyxxQ0FBcUMsRUFBRU4sZUFBZTtRQUV6RDtRQUVBLE1BQU1PLFNBQVNKLFFBQVFLLFNBQVM7UUFDaEMsTUFBTUMsUUFBUWxCLEtBQUttQixJQUFJLENBQUNILFFBQVEsT0FBTztRQUN2QyxNQUFNSSxjQUFjLElBQUloQjtRQUN4QixPQUFPZ0IsWUFBWWIsR0FBRyxDQUFDO1lBQUVXO1lBQU9HLFVBQVVMO1FBQU87SUFDbEQ7QUFDRCJ9
|
|
@@ -1,134 +0,0 @@
|
|
|
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+IHtcblx0XHRjb25zdCByZWJvb3QgPSBuZXh0UmVib290KHNlcnZlcik7XG5cdFx0dm9sLndyaXRlRmlsZVN5bmMoZGVwQlBhdGgsIGBleHBvcnQgY29uc3QgdmFsdWUgPSA5OTtgKTtcblx0XHRhd2FpdCByZWJvb3Q7XG5cdFx0Y29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KGRlcEJQYXRoKTtcblx0XHRleHBlY3QobW9kLnZhbHVlKS50b0JlKDk5KTtcblx0fSk7XG59KTtcbiJdLCJuYW1lcyI6WyJzY3JpYmUiLCJ2b2wiLCJhZnRlckVhY2giLCJiZWZvcmVFYWNoIiwiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwibW9jayIsIkhvdFJlbG9hZFNlcnZlciIsImZpeHR1cmVzRGlyIiwiVVJMIiwidXJsIiwicGF0aG5hbWUiLCJtYWluUGF0aCIsImRlcEFQYXRoIiwiZGVwQlBhdGgiLCJzZWVkRnJvbURpc2siLCJyZWFsRnMiLCJpbXBvcnRBY3R1YWwiLCJmcm9tSlNPTiIsInJlYWRGaWxlU3luYyIsIm5leHRSZWJvb3QiLCJzZXJ2ZXIiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidGltZXIiLCJzZXRUaW1lb3V0IiwiRXJyb3IiLCJvbmNlIiwiY2xlYXJUaW1lb3V0IiwibG9nZ2VyIiwic3RhcnQiLCJkaXNwb3NlIiwicmVzZXQiLCJyZWJvb3QxIiwid3JpdGVGaWxlU3luYyIsInJlYm9vdGVkIiwidG9CZSIsImRlcHMiLCJkZXBlbmRlbmNpZXMiLCJzZXQiLCJnZXQiLCJyZWJvb3QiLCJ1bmxpbmtTeW5jIiwicmVib290MiIsInJlYm9vdDMiLCJzeW5jIiwiZXhpc3RzU3luYyIsIm1vZCIsInRhZyIsInZhbHVlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FFRCxTQUFTQSxNQUFNLFFBQVEsbUNBQW1CO0FBQzFDLFNBQVNDLEdBQUcsUUFBUSxRQUFRO0FBQzVCLFNBQVNDLFNBQVMsRUFBRUMsVUFBVSxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsRUFBRSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQUV6RUEsR0FBR0MsSUFBSSxDQUFDO0FBQ1JELEdBQUdDLElBQUksQ0FBQztBQUVSLFNBQVNDLGVBQWUsUUFBUSw4QkFBOEI7QUFFOUQsTUFBTUMsY0FBYyxJQUFJQyxJQUFJLHNCQUFzQixZQUFZQyxHQUFHLEVBQUVDLFFBQVE7QUFDM0UsTUFBTUMsV0FBVyxHQUFHSixZQUFZLFFBQVEsQ0FBQztBQUN6QyxNQUFNSyxXQUFXLEdBQUdMLFlBQVksU0FBUyxDQUFDO0FBQzFDLE1BQU1NLFdBQVcsR0FBR04sWUFBWSxTQUFTLENBQUM7QUFFMUMsZUFBZU87SUFDZCxNQUFNQyxTQUFTLE1BQU1YLEdBQUdZLFlBQVksQ0FBMkI7SUFDL0RsQixJQUFJbUIsUUFBUSxDQUFDO1FBQ1osQ0FBQ04sU0FBUyxFQUFFSSxPQUFPRyxZQUFZLENBQUNQLFVBQVU7UUFDMUMsQ0FBQ0MsU0FBUyxFQUFFRyxPQUFPRyxZQUFZLENBQUNOLFVBQVU7UUFDMUMsQ0FBQ0MsU0FBUyxFQUFFRSxPQUFP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
|