@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.
@@ -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=
@@ -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==
@@ -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=
@@ -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==
@@ -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=
@@ -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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