@decohere/flux 0.0.1-dev.69 → 0.0.1-dev.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commonjs/src/ember.command.js +27 -0
- package/commonjs/src/ember.module.js +37 -0
- package/commonjs/src/hot-module-hooks.js +47 -0
- package/commonjs/src/hot-reload-server.js +121 -316
- package/commonjs/src/index.js +35 -9
- package/commonjs/src/serve.action.js +11 -23
- package/commonjs/src/serve.command.js +4 -8
- package/commonjs/src/serve.js +36 -0
- package/commonjs/src/workspace-serve.action.js +59 -0
- package/es6/src/ember.command.js +17 -0
- package/es6/src/ember.module.js +19 -0
- package/es6/src/hot-module-hooks.js +26 -0
- package/es6/src/hot-reload-server.js +119 -303
- package/es6/src/index.js +7 -3
- package/es6/src/serve.action.js +11 -25
- package/es6/src/serve.command.js +5 -9
- package/es6/src/serve.js +32 -0
- package/es6/src/workspace-serve.action.js +45 -0
- package/package.json +12 -7
- package/types/src/{flux.command.d.ts → ember.command.d.ts} +1 -1
- package/types/src/ember.module.d.ts +22 -0
- package/types/src/hot-module-hooks.d.ts +5 -0
- package/types/src/hot-reload-server.d.ts +22 -61
- package/types/src/index.d.ts +8 -3
- package/types/src/serve.action.d.ts +2 -8
- package/types/src/serve.command.d.ts +2 -2
- package/types/src/serve.d.ts +1 -0
- package/types/src/workspace-serve.action.d.ts +11 -0
- package/commonjs/src/flux.command.js +0 -27
- package/commonjs/src/flux.module.js +0 -32
- package/commonjs/src/rewrite-serve-specifier.js +0 -46
- package/es6/src/flux.command.js +0 -17
- package/es6/src/flux.module.js +0 -22
- package/es6/src/rewrite-serve-specifier.js +0 -40
- package/types/src/flux.module.d.ts +0 -14
- package/types/src/rewrite-serve-specifier.d.ts +0 -13
|
@@ -1,321 +1,82 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import { registerHooks } from "node:module";
|
|
3
2
|
import path from "node:path";
|
|
4
|
-
import {
|
|
5
|
-
import { packageAliases, WorkspaceFactory } from "@decohere/mesh";
|
|
6
|
-
import { FileEx, io } from "@decohere/nexus/io";
|
|
3
|
+
import { io } from "@decohere/nexus/io";
|
|
7
4
|
import { debounce } from "@decohere/nexus/system";
|
|
8
|
-
import {
|
|
9
|
-
import { rewriteServeSpecifier } from "./rewrite-serve-specifier.js";
|
|
5
|
+
import { addResolverHook, initModuleHooks, removeResolverHook } from "./hot-module-hooks.js";
|
|
10
6
|
const currentFilePath = io.fileUrlToPath(import.meta.url);
|
|
11
|
-
const VERSION_URL_PARAM = "version";
|
|
12
|
-
/** Default quiet window before a file-change reboot. */ export const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
|
|
13
|
-
export function resolveRebootDebounceMs(value) {
|
|
14
|
-
const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
|
|
15
|
-
if (!Number.isFinite(delay) || delay < 0) {
|
|
16
|
-
throw new Error(`rebootDebounceMs must be a non-negative number, got ${String(value)}`);
|
|
17
|
-
}
|
|
18
|
-
return delay;
|
|
19
|
-
}
|
|
20
|
-
/** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
|
|
21
7
|
export class HotReloadServer extends EventEmitter {
|
|
22
|
-
|
|
23
|
-
logger = scribe.logger(HotReloadServer.name);
|
|
8
|
+
logger;
|
|
24
9
|
disposed = false;
|
|
25
|
-
hooksRegistered = false;
|
|
26
|
-
entryModulePath;
|
|
27
10
|
entryModule;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
watchSubscription;
|
|
31
|
-
/** Map from absolute .ts source file path to project info */ fileInfoMap = new Map();
|
|
11
|
+
entry;
|
|
12
|
+
sourceFiles = [];
|
|
32
13
|
moduleCache = new Map();
|
|
33
14
|
dependencies = new Map();
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
scheduleReboot = ()=>{};
|
|
44
|
-
// ── Public API ───────────────────────────────────────────────────────────
|
|
45
|
-
async start(options) {
|
|
46
|
-
this.disposed = false;
|
|
47
|
-
this.dependencies.clear();
|
|
48
|
-
this.moduleCache.clear();
|
|
49
|
-
this.transpileCache.clear();
|
|
50
|
-
this.rebootTail = Promise.resolve();
|
|
51
|
-
this.rebootInFlight = false;
|
|
52
|
-
this.rebootFollowUp = false;
|
|
53
|
-
this.rebootQueued = false;
|
|
54
|
-
this.bindScheduleReboot(resolveRebootDebounceMs(options.rebootDebounceMs));
|
|
55
|
-
const { buildConfig } = options;
|
|
56
|
-
this.buildConfig = buildConfig;
|
|
57
|
-
this.workspace = await this.resolveWorkspace(options);
|
|
58
|
-
const project = this.resolveProject(buildConfig, options.project);
|
|
59
|
-
this.entryModulePath = path.resolve(project.getSourceEntryPath());
|
|
60
|
-
this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
|
|
61
|
-
this.aliasPaths = await this.buildAliasPaths();
|
|
62
|
-
this.registerHooks();
|
|
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();
|
|
63
24
|
this.invalidateAllSourceFiles();
|
|
64
|
-
await this.
|
|
65
|
-
this.
|
|
66
|
-
this.logger.trace(
|
|
25
|
+
await this.watch(watchDirs);
|
|
26
|
+
this.logger.trace("Serving", entry);
|
|
27
|
+
this.logger.trace("Hot reload watching", watchDirs);
|
|
67
28
|
await this.bootEntry();
|
|
68
|
-
this.emit("start");
|
|
69
29
|
}
|
|
70
30
|
async dispose() {
|
|
71
31
|
if (this.disposed) return;
|
|
72
32
|
this.disposed = true;
|
|
73
|
-
this.
|
|
74
|
-
this.
|
|
75
|
-
|
|
76
|
-
await this.rebootTail;
|
|
77
|
-
await this.disposeEntry();
|
|
78
|
-
}
|
|
79
|
-
async [Symbol.asyncDispose]() {
|
|
80
|
-
await this.dispose();
|
|
81
|
-
}
|
|
82
|
-
// ── Lifecycle ────────────────────────────────────────────────────────────
|
|
83
|
-
async bootEntry() {
|
|
84
|
-
try {
|
|
85
|
-
const url = this.versionModule(io.pathToFileUrl(this.entryModulePath));
|
|
86
|
-
this.entryModule = (await import(url))?.default;
|
|
87
|
-
} catch (error) {
|
|
88
|
-
this.entryModule = undefined;
|
|
89
|
-
this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
|
|
33
|
+
removeResolverHook(this.onResolve);
|
|
34
|
+
for (const watcher of this.watchers){
|
|
35
|
+
watcher.close();
|
|
90
36
|
}
|
|
37
|
+
await this.disposeEntry();
|
|
91
38
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
this.scheduleReboot = debounce(async ()=>{
|
|
95
|
-
if (this.disposed || gen !== this.rebootDebounceGen) return;
|
|
96
|
-
this.requestReboot();
|
|
97
|
-
}, delayMs);
|
|
98
|
-
}
|
|
99
|
-
requestReboot() {
|
|
100
|
-
if (this.disposed) return;
|
|
101
|
-
if (this.rebootInFlight) {
|
|
102
|
-
this.rebootFollowUp = true;
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
if (this.rebootQueued) return;
|
|
106
|
-
this.rebootQueued = true;
|
|
107
|
-
this.rebootTail = this.rebootTail.then(()=>this.runReboot(), ()=>this.runReboot());
|
|
108
|
-
}
|
|
109
|
-
async runReboot() {
|
|
110
|
-
this.rebootQueued = false;
|
|
111
|
-
if (this.disposed) return;
|
|
112
|
-
this.rebootInFlight = true;
|
|
113
|
-
try {
|
|
114
|
-
do {
|
|
115
|
-
this.rebootFollowUp = false;
|
|
116
|
-
if (this.disposed) return;
|
|
117
|
-
this.logger.trace("Rebooting entry module");
|
|
118
|
-
await this.disposeEntry();
|
|
119
|
-
await this.bootEntry();
|
|
120
|
-
this.emit("reboot");
|
|
121
|
-
}while (this.rebootFollowUp && !this.disposed)
|
|
122
|
-
} finally{
|
|
123
|
-
const needsFollowUp = this.rebootFollowUp && !this.disposed;
|
|
124
|
-
this.rebootFollowUp = false;
|
|
125
|
-
this.rebootInFlight = false;
|
|
126
|
-
if (needsFollowUp) this.requestReboot();
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
async disposeEntry() {
|
|
130
|
-
const entry = this.entryModule;
|
|
131
|
-
this.entryModule = undefined;
|
|
132
|
-
try {
|
|
133
|
-
await entry?.[Symbol.asyncDispose]();
|
|
134
|
-
} catch (error) {
|
|
135
|
-
this.logger.error("Entry asyncDispose failed", error);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// ── Setup ────────────────────────────────────────────────────────────────
|
|
139
|
-
async resolveWorkspace(options) {
|
|
140
|
-
return options.workspace ?? WorkspaceFactory.create({
|
|
141
|
-
...WorkspaceDefaults,
|
|
142
|
-
rootDir: process.cwd()
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
resolveProject(buildConfig, name) {
|
|
146
|
-
const projects = this.workspace?.getProjects(buildConfig) ?? [];
|
|
147
|
-
const found = name == null ? projects.at(0) : projects.find((p)=>p.name === name);
|
|
148
|
-
if (found == null) {
|
|
149
|
-
throw new Error(name == null ? `No projects found for configuration: ${buildConfig}` : `Project "${name}" not found in workspace`);
|
|
150
|
-
}
|
|
151
|
-
return found;
|
|
152
|
-
}
|
|
153
|
-
async buildFileInfoMap(buildConfig) {
|
|
154
|
-
const projects = this.workspace?.getProjects(buildConfig) ?? [];
|
|
155
|
-
const entries = await Promise.all(projects.map(async (project)=>{
|
|
156
|
-
const files = await project.getAllFiles();
|
|
157
|
-
return files.map((file)=>[
|
|
158
|
-
file.fullPath,
|
|
159
|
-
{
|
|
160
|
-
project
|
|
161
|
-
}
|
|
162
|
-
]);
|
|
163
|
-
}));
|
|
164
|
-
return new Map(entries.flat());
|
|
39
|
+
removeSourceFiles(...sourceFiles) {
|
|
40
|
+
this.sourceFiles = this.sourceFiles.filter((sourceFile)=>!sourceFiles.includes(sourceFile));
|
|
165
41
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
resolve: (specifier, context, next)=>{
|
|
171
|
-
if (this.disposed) return next(specifier, context);
|
|
172
|
-
const parentUrl = context.parentURL ?? "";
|
|
173
|
-
const rewritten = rewriteServeSpecifier({
|
|
174
|
-
specifier,
|
|
175
|
-
parentUrl,
|
|
176
|
-
isWatchedTs: (filePath)=>this.fileInfoMap.has(filePath),
|
|
177
|
-
resolveBare: (bare)=>packageAliases.resolvePath(bare, this.aliasPaths, this.aliasBaseUrl),
|
|
178
|
-
versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl)
|
|
179
|
-
}) ?? specifier;
|
|
180
|
-
const result = next(rewritten, context);
|
|
181
|
-
this.onPostResolve(result, parentUrl);
|
|
182
|
-
return result;
|
|
183
|
-
},
|
|
184
|
-
load: (url, context, next)=>{
|
|
185
|
-
if (this.disposed) return next(url, context);
|
|
186
|
-
const result = this.loadTs(url);
|
|
187
|
-
if (result != null) return {
|
|
188
|
-
format: "module",
|
|
189
|
-
source: result.source,
|
|
190
|
-
shortCircuit: true
|
|
191
|
-
};
|
|
192
|
-
return next(url, context);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
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);
|
|
195
46
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (workspace == null) return {};
|
|
200
|
-
const packageAliases = workspace.getPackageAliases(this.buildConfig);
|
|
201
|
-
this.aliasBaseUrl = packageAliases.baseUrl;
|
|
202
|
-
return packageAliases.paths;
|
|
47
|
+
configureModuleHooks() {
|
|
48
|
+
initModuleHooks();
|
|
49
|
+
addResolverHook(this.onResolve);
|
|
203
50
|
}
|
|
204
|
-
|
|
205
|
-
* Post-next dependency tracker: records which source files import which
|
|
206
|
-
* other source files so that reloadIfAffected can traverse the graph.
|
|
207
|
-
*/ onPostResolve = (result, parentUrl)=>{
|
|
51
|
+
onResolve = (result, parentUrl)=>{
|
|
208
52
|
const { url } = result;
|
|
209
53
|
const parentUrlClean = parentUrl.split("?")[0];
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
try {
|
|
213
|
-
const urlObj = new URL(url);
|
|
214
|
-
urlObj.search = "";
|
|
215
|
-
filePath = io.fileUrlToPath(urlObj.toString());
|
|
216
|
-
} catch {
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
try {
|
|
220
|
-
parentPath = io.fileUrlToPath(parentUrlClean);
|
|
221
|
-
} catch {
|
|
222
|
-
parentPath = "";
|
|
223
|
-
}
|
|
224
|
-
const isSource = this.fileInfoMap.has(filePath);
|
|
225
|
-
const parentIsSource = this.fileInfoMap.has(parentPath);
|
|
54
|
+
const isSource = this.isSourceModule(url);
|
|
55
|
+
const parentIsSource = this.isSourceModule(parentUrlClean);
|
|
226
56
|
if (isSource || parentIsSource) {
|
|
227
|
-
this.trackDependency(
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
loadTs = (url)=>{
|
|
231
|
-
if (!url.startsWith("file:")) return null;
|
|
232
|
-
const cleanPath = new URL(url).pathname;
|
|
233
|
-
const fileInfo = this.fileInfoMap.get(cleanPath);
|
|
234
|
-
if (fileInfo == null) return null;
|
|
235
|
-
const cached = this.transpileCache.get(cleanPath);
|
|
236
|
-
if (cached != null) return {
|
|
237
|
-
source: cached
|
|
238
|
-
};
|
|
239
|
-
const { project } = fileInfo;
|
|
240
|
-
const tsConfig = project.getTsConfigSync();
|
|
241
|
-
const userConfig = project.getSwcConfigSync();
|
|
242
|
-
const file = new FileEx({
|
|
243
|
-
fullPath: cleanPath
|
|
244
|
-
});
|
|
245
|
-
const response = this.transpiler.transformFileSync(file, BuildTargets.es6, {
|
|
246
|
-
tsConfig,
|
|
247
|
-
aliasPaths: true,
|
|
248
|
-
userConfig,
|
|
249
|
-
workspace: this.workspace,
|
|
250
|
-
projects: this.workspace?.getProjects(this.buildConfig)
|
|
251
|
-
});
|
|
252
|
-
if (response.outcome !== "success") {
|
|
253
|
-
this.logger.error(`Failed to transpile ${cleanPath}`, response);
|
|
254
|
-
// Do not fall through to next(): Vitest/Node loaders can deadlock on a
|
|
255
|
-
// versioned .ts URL. Fail the import so bootEntry can catch and continue.
|
|
256
|
-
throw new Error(`Failed to transpile ${cleanPath}`);
|
|
257
|
-
}
|
|
258
|
-
this.transpileCache.set(cleanPath, response.code);
|
|
259
|
-
return {
|
|
260
|
-
source: response.code
|
|
261
|
-
};
|
|
262
|
-
};
|
|
263
|
-
// ── File watching ────────────────────────────────────────────────────────
|
|
264
|
-
onFileChange = (evt)=>{
|
|
265
|
-
const { file, eventName, project } = evt;
|
|
266
|
-
const fullPath = file.fullPath;
|
|
267
|
-
this.logger.trace(`File ${eventName}: ${fullPath}`);
|
|
268
|
-
if (eventName === io.WatchEvents.unlink) {
|
|
269
|
-
this.transpileCache.delete(fullPath);
|
|
270
|
-
this.moduleCache.set(fullPath, null);
|
|
271
|
-
return;
|
|
57
|
+
this.trackDependency(url, parentUrl);
|
|
272
58
|
}
|
|
273
|
-
if (
|
|
274
|
-
if (project.isSourceFile(file)) {
|
|
275
|
-
this.fileInfoMap.set(fullPath, {
|
|
276
|
-
project
|
|
277
|
-
});
|
|
278
|
-
this.moduleCache.set(fullPath, null);
|
|
279
|
-
this.reloadIfAffected(fullPath);
|
|
280
|
-
}
|
|
59
|
+
if (!isSource) {
|
|
281
60
|
return;
|
|
282
61
|
}
|
|
283
|
-
|
|
284
|
-
if (!project.isSourceFile(file)) return;
|
|
285
|
-
this.transpileCache.delete(fullPath);
|
|
286
|
-
this.transpiler.invalidateContentCache(new FileEx({
|
|
287
|
-
fullPath
|
|
288
|
-
}));
|
|
289
|
-
this.reloadIfAffected(fullPath);
|
|
62
|
+
result.url = this.getCachedOrNew(url);
|
|
290
63
|
};
|
|
291
|
-
|
|
292
|
-
const
|
|
293
|
-
|
|
294
|
-
...new Set([
|
|
295
|
-
...deps,
|
|
296
|
-
fullPath
|
|
297
|
-
])
|
|
298
|
-
];
|
|
299
|
-
if (!modules.includes(this.entryModulePath)) {
|
|
300
|
-
this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
|
|
301
|
-
return false;
|
|
302
|
-
}
|
|
303
|
-
this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
|
|
304
|
-
this.invalidateModule(...modules);
|
|
305
|
-
this.scheduleReboot();
|
|
306
|
-
return true;
|
|
64
|
+
isSourceModule(url) {
|
|
65
|
+
const path = io.fileUrlToPath(url);
|
|
66
|
+
return this.sourceFiles.includes(path);
|
|
307
67
|
}
|
|
308
|
-
// ── Dependency graph ─────────────────────────────────────────────────────
|
|
309
68
|
getDependencyGraph(moduleId, parentModules = []) {
|
|
310
|
-
if (this.isSelf(moduleId))
|
|
69
|
+
if (this.isSelf(moduleId)) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
311
72
|
const moduleDeps = this.dependencies.get(moduleId) ?? [];
|
|
312
73
|
if (parentModules.includes(moduleId)) {
|
|
313
74
|
this.logger.error(`Circular reference detected: ${moduleId}`);
|
|
314
75
|
return [];
|
|
315
76
|
}
|
|
316
|
-
let subDeps =
|
|
77
|
+
let subDeps = Array.of();
|
|
317
78
|
for (const dep of moduleDeps){
|
|
318
|
-
if (!this.
|
|
79
|
+
if (!this.sourceFiles.includes(dep)) continue;
|
|
319
80
|
const subs = this.getDependencyGraph(dep, [
|
|
320
81
|
moduleId,
|
|
321
82
|
...parentModules
|
|
@@ -332,8 +93,9 @@ export class HotReloadServer extends EventEmitter {
|
|
|
332
93
|
])
|
|
333
94
|
];
|
|
334
95
|
}
|
|
335
|
-
trackDependency(
|
|
336
|
-
|
|
96
|
+
trackDependency(url, parentUrl) {
|
|
97
|
+
const filePath = io.fileUrlToPath(url);
|
|
98
|
+
const parentPath = io.fileUrlToPath(parentUrl.split("?")[0]);
|
|
337
99
|
const deps = this.dependencies.get(filePath) ?? [];
|
|
338
100
|
const updatedDeps = new Set([
|
|
339
101
|
...deps,
|
|
@@ -343,7 +105,6 @@ export class HotReloadServer extends EventEmitter {
|
|
|
343
105
|
...updatedDeps
|
|
344
106
|
]);
|
|
345
107
|
}
|
|
346
|
-
// ── Module cache ─────────────────────────────────────────────────────────
|
|
347
108
|
getCachedOrNew(moduleUrl) {
|
|
348
109
|
const filePath = io.fileUrlToPath(moduleUrl);
|
|
349
110
|
const cached = this.moduleCache.get(filePath);
|
|
@@ -353,33 +114,88 @@ export class HotReloadServer extends EventEmitter {
|
|
|
353
114
|
}
|
|
354
115
|
versionModule(moduleUrl) {
|
|
355
116
|
const versionedUrl = new URL(moduleUrl);
|
|
356
|
-
versionedUrl.searchParams.set(
|
|
117
|
+
versionedUrl.searchParams.set("version", Date.now().toString());
|
|
357
118
|
return versionedUrl.toString();
|
|
358
119
|
}
|
|
359
|
-
|
|
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) {
|
|
360
164
|
for (const module of modules){
|
|
361
165
|
this.moduleCache.set(module, null);
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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);
|
|
371
175
|
}
|
|
372
176
|
}
|
|
373
177
|
}
|
|
374
178
|
invalidateAllSourceFiles() {
|
|
375
|
-
for (const
|
|
376
|
-
this.moduleCache.set(
|
|
179
|
+
for (const file of this.sourceFiles){
|
|
180
|
+
this.moduleCache.set(file, null);
|
|
377
181
|
}
|
|
378
182
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
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
|
+
}
|
|
382
198
|
}
|
|
383
199
|
}
|
|
384
200
|
|
|
385
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG4vKiogRGVmYXVsdCBxdWlldCB3aW5kb3cgYmVmb3JlIGEgZmlsZS1jaGFuZ2UgcmVib290LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIFByZS1idWlsdCBXb3Jrc3BhY2UgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2YgcnVubmluZyBXb3Jrc3BhY2VGYWN0b3J5LlxuXHQgKiBVc2VmdWwgaW4gdGVzdHMgdG8gYnlwYXNzIGZpbGVzeXN0ZW0tYmFzZWQgd29ya3NwYWNlIGRpc2NvdmVyeS5cblx0ICovXG5cdHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0LyoqXG5cdCAqIFF1aWV0IHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGxhc3QgYWZmZWN0aW5nIHNhdmUgYmVmb3JlIGEgcmVib290LlxuXHQgKiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVN9LiBSYWlzZSB0aGlzIGZvciBhZ2VudCBzYXZlIHRyYWlucy5cblx0ICovXG5cdHJlYm9vdERlYm91bmNlTXM/OiBudW1iZXI7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIGJ1aWxkQ29uZmlnID0gXCJkZWJ1Z1wiO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXHRwcml2YXRlIGFsaWFzUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXHRwcml2YXRlIGFsaWFzQmFzZVVybCA9IHBhdGgucmVzb2x2ZShcIi5cIik7XG5cdHByaXZhdGUgcmVib290VGFpbDogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRwcml2YXRlIHJlYm9vdERlYm91bmNlR2VuID0gMDtcblx0cHJpdmF0ZSByZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdHByaXZhdGUgcmVib290UXVldWVkID0gZmFsc2U7XG5cdHByaXZhdGUgc2NoZWR1bGVSZWJvb3Q6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuXHQvLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwdWJsaWMgYXN5bmMgc3RhcnQob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucykge1xuXHRcdHRoaXMuZGlzcG9zZWQgPSBmYWxzZTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuY2xlYXIoKTtcblx0XHR0aGlzLnRyYW5zcGlsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdHRoaXMuYmluZFNjaGVkdWxlUmVib290KHJlc29sdmVSZWJvb3REZWJvdW5jZU1zKG9wdGlvbnMucmVib290RGVib3VuY2VNcykpO1xuXG5cdFx0Y29uc3QgeyBidWlsZENvbmZpZyB9ID0gb3B0aW9ucztcblx0XHR0aGlzLmJ1aWxkQ29uZmlnID0gYnVpbGRDb25maWc7XG5cdFx0dGhpcy53b3Jrc3BhY2UgPSBhd2FpdCB0aGlzLnJlc29sdmVXb3Jrc3BhY2Uob3B0aW9ucyk7XG5cdFx0Y29uc3QgcHJvamVjdCA9IHRoaXMucmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWcsIG9wdGlvbnMucHJvamVjdCk7XG5cblx0XHR0aGlzLmVudHJ5TW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmdldFNvdXJjZUVudHJ5UGF0aCgpKTtcblx0XHR0aGlzLmZpbGVJbmZvTWFwID0gYXdhaXQgdGhpcy5idWlsZEZpbGVJbmZvTWFwKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLmFsaWFzUGF0aHMgPSBhd2FpdCB0aGlzLmJ1aWxkQWxpYXNQYXRocygpO1xuXG5cdFx0dGhpcy5yZWdpc3Rlckhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblxuXHRcdGF3YWl0IHRoaXMud29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy53b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFNlcnZpbmcgJHt0aGlzLmVudHJ5TW9kdWxlUGF0aH1gKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHR0aGlzLndvcmtzcGFjZT8uW1N5bWJvbC5kaXNwb3NlXSgpO1xuXHRcdGF3YWl0IHRoaXMucmVib290VGFpbDtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGVQYXRoKSk7XG5cdFx0XHR0aGlzLmVudHJ5TW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5lbnRyeU1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcIlRoZXJlIHdhcyBhbiBlcnJvciBib290aW5nIHRoZSBlbnRyeSBwb2ludC4gWW91ciBhcHBsaWNhdGlvbiBtYXkgbm90IGZ1bmN0aW9uIGFzIGV4cGVjdGVkXCIsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGJpbmRTY2hlZHVsZVJlYm9vdChkZWxheU1zOiBudW1iZXIpIHtcblx0XHRjb25zdCBnZW4gPSArK3RoaXMucmVib290RGVib3VuY2VHZW47XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkIHx8IGdlbiAhPT0gdGhpcy5yZWJvb3REZWJvdW5jZUdlbikgcmV0dXJuO1xuXHRcdFx0dGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fSwgZGVsYXlNcyk7XG5cdH1cblxuXHRwcml2YXRlIHJlcXVlc3RSZWJvb3QoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRpZiAodGhpcy5yZWJvb3RJbkZsaWdodCkge1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICh0aGlzLnJlYm9vdFF1ZXVlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSB0aGlzLnJlYm9vdFRhaWwudGhlbihcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1blJlYm9vdCgpIHtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IHRydWU7XG5cdFx0dHJ5IHtcblx0XHRcdGRvIHtcblx0XHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcIlJlYm9vdGluZyBlbnRyeSBtb2R1bGVcIik7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRcdH0gd2hpbGUgKHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRjb25zdCBuZWVkc0ZvbGxvd1VwID0gdGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZDtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHRcdGlmIChuZWVkc0ZvbGxvd1VwKSB0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeSgpIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZW50cnlNb2R1bGU7XG5cdFx0dGhpcy5lbnRyeU1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcIkVudHJ5IGFzeW5jRGlzcG9zZSBmYWlsZWRcIiwgZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBTZXR1cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVXb3Jrc3BhY2Uob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V29ya3NwYWNlPiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9wdGlvbnMud29ya3NwYWNlID8/XG5cdFx0XHRXb3Jrc3BhY2VGYWN0b3J5LmNyZWF0ZSh7IC4uLldvcmtzcGFjZURlZmF1bHRzLCByb290RGlyOiBwcm9jZXNzLmN3ZCgpIH0pXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWc6IHN0cmluZywgbmFtZT86IHN0cmluZyk6IFByb2plY3Qge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2U/LmdldFByb2plY3RzKGJ1aWxkQ29uZmlnKSA/PyBbXTtcblx0XHRjb25zdCBmb3VuZCA9IG5hbWUgPT0gbnVsbCA/IHByb2plY3RzLmF0KDApIDogcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRuYW1lID09IG51bGxcblx0XHRcdFx0XHQ/IGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gXG5cdFx0XHRcdFx0OiBgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBmb3VuZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlSW5mbz4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZXMubWFwKChmaWxlKTogW3N0cmluZywgRmlsZUluZm9dID0+IFtmaWxlLmZ1bGxQYXRoLCB7IHByb2plY3QgfV0pO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRyZXR1cm4gbmV3IE1hcChlbnRyaWVzLmZsYXQoKSk7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVySG9va3MoKSB7XG5cdFx0aWYgKHRoaXMuaG9va3NSZWdpc3RlcmVkKSByZXR1cm47XG5cdFx0dGhpcy5ob29rc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHJlZ2lzdGVySG9va3Moe1xuXHRcdFx0cmVzb2x2ZTogKFxuXHRcdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogUmVzb2x2ZUhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAoc3BlY2lmaWVyOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPFJlc29sdmVIb29rQ29udGV4dD4pID0+IFJlc29sdmVGbk91dHB1dCxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQoc3BlY2lmaWVyLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcGFyZW50VXJsID0gY29udGV4dC5wYXJlbnRVUkwgPz8gXCJcIjtcblx0XHRcdFx0Y29uc3QgcmV3cml0dGVuID1cblx0XHRcdFx0XHRyZXdyaXRlU2VydmVTcGVjaWZpZXIoe1xuXHRcdFx0XHRcdFx0c3BlY2lmaWVyLFxuXHRcdFx0XHRcdFx0cGFyZW50VXJsLFxuXHRcdFx0XHRcdFx0aXNXYXRjaGVkVHM6IChmaWxlUGF0aCkgPT4gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpLFxuXHRcdFx0XHRcdFx0cmVzb2x2ZUJhcmU6IChiYXJlKSA9PlxuXHRcdFx0XHRcdFx0XHRwYWNrYWdlQWxpYXNlcy5yZXNvbHZlUGF0aChiYXJlLCB0aGlzLmFsaWFzUGF0aHMsIHRoaXMuYWxpYXNCYXNlVXJsKSxcblx0XHRcdFx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdFx0XHR9KSA/PyBzcGVjaWZpZXI7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5leHQocmV3cml0dGVuLCBjb250ZXh0KSBhcyBSZXNvbHZlRm5PdXRwdXQ7XG5cdFx0XHRcdHRoaXMub25Qb3N0UmVzb2x2ZShyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIHsgZm9ybWF0OiBcIm1vZHVsZVwiLCBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsIHNob3J0Q2lyY3VpdDogdHJ1ZSB9O1xuXHRcdFx0XHRyZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIOKUgOKUgCBNb2R1bGUgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEFsaWFzUGF0aHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IHtcblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLndvcmtzcGFjZTtcblx0XHRpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybiB7fTtcblxuXHRcdGNvbnN0IHBhY2thZ2VBbGlhc2VzID0gd29ya3NwYWNlLmdldFBhY2thZ2VBbGlhc2VzKHRoaXMuYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNCYXNlVXJsID0gcGFja2FnZUFsaWFzZXMuYmFzZVVybDtcblx0XHRyZXR1cm4gcGFja2FnZUFsaWFzZXMucGF0aHM7XG5cdH1cblxuXHQvKipcblx0ICogUG9zdC1uZXh0IGRlcGVuZGVuY3kgdHJhY2tlcjogcmVjb3JkcyB3aGljaCBzb3VyY2UgZmlsZXMgaW1wb3J0IHdoaWNoXG5cdCAqIG90aGVyIHNvdXJjZSBmaWxlcyBzbyB0aGF0IHJlbG9hZElmQWZmZWN0ZWQgY2FuIHRyYXZlcnNlIHRoZSBncmFwaC5cblx0ICovXG5cdHByaXZhdGUgb25Qb3N0UmVzb2x2ZSA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IHVybCB9ID0gcmVzdWx0O1xuXHRcdGNvbnN0IHBhcmVudFVybENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGxldCBmaWxlUGF0aDogc3RyaW5nO1xuXHRcdGxldCBwYXJlbnRQYXRoOiBzdHJpbmc7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXHRcdFx0dXJsT2JqLnNlYXJjaCA9IFwiXCI7XG5cdFx0XHRmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsT2JqLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmxDbGVhbik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRwYXJlbnRQYXRoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBpc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgbG9hZFRzOiBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHtcblx0XHRpZiAoIXVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuXHRcdGNvbnN0IGZpbGVJbmZvID0gdGhpcy5maWxlSW5mb01hcC5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoZmlsZUluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zcGlsZUNhY2hlLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIHsgc291cmNlOiBjYWNoZWQgfTtcblxuXHRcdGNvbnN0IHsgcHJvamVjdCB9ID0gZmlsZUluZm87XG5cdFx0Y29uc3QgdHNDb25maWcgPSBwcm9qZWN0LmdldFRzQ29uZmlnU3luYygpO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBwcm9qZWN0LmdldFN3Y0NvbmZpZ1N5bmMoKTtcblxuXHRcdGNvbnN0IGZpbGUgPSBuZXcgRmlsZUV4KHsgZnVsbFBhdGg6IGNsZWFuUGF0aCB9KTtcblx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMudHJhbnNwaWxlci50cmFuc2Zvcm1GaWxlU3luYyhmaWxlLCBCdWlsZFRhcmdldHMuZXM2LCB7XG5cdFx0XHR0c0NvbmZpZyxcblx0XHRcdGFsaWFzUGF0aHM6IHRydWUsXG5cdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdHByb2plY3RzOiB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHModGhpcy5idWlsZENvbmZpZyksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWAsIHJlc3BvbnNlKTtcblx0XHRcdC8vIERvIG5vdCBmYWxsIHRocm91Z2ggdG8gbmV4dCgpOiBWaXRlc3QvTm9kZSBsb2FkZXJzIGNhbiBkZWFkbG9jayBvbiBhXG5cdFx0XHQvLyB2ZXJzaW9uZWQgLnRzIFVSTC4gRmFpbCB0aGUgaW1wb3J0IHNvIGJvb3RFbnRyeSBjYW4gY2F0Y2ggYW5kIGNvbnRpbnVlLlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWApO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuc2V0KGNsZWFuUGF0aCwgcmVzcG9uc2UuY29kZSk7XG5cdFx0cmV0dXJuIHsgc291cmNlOiByZXNwb25zZS5jb2RlIH07XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmZpbGVJbmZvTWFwLnNldChmdWxsUGF0aCwgeyBwcm9qZWN0IH0pO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnRyYW5zcGlsZXIuaW52YWxpZGF0ZUNvbnRlbnRDYWNoZShuZXcgRmlsZUV4KHsgZnVsbFBhdGggfSkpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cblx0XHRpZiAoIW1vZHVsZXMuaW5jbHVkZXModGhpcy5lbnRyeU1vZHVsZVBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGRvZXMgbm90IGFmZmVjdCBlbnRyeSDigJQgc2tpcHBpbmcgcmVsb2FkYCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXG5cdFx0XHRgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGFmZmVjdHMgJHttb2R1bGVzLmxlbmd0aH0gbW9kdWxlKHMpIOKAlCBzY2hlZHVsaW5nIHJlbG9hZGAsXG5cdFx0KTtcblx0XHR0aGlzLmludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlcyk7XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmZpbGVJbmZvTWFwLmhhcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwicmVnaXN0ZXJIb29rcyIsInBhdGgiLCJCdWlsZFRhcmdldHMiLCJTd2NUcmFuc3BpbGVyIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJwYWNrYWdlQWxpYXNlcyIsIldvcmtzcGFjZUZhY3RvcnkiLCJGaWxlRXgiLCJpbyIsImRlYm91bmNlIiwic2NyaWJlIiwicmV3cml0ZVNlcnZlU3BlY2lmaWVyIiwiY3VycmVudEZpbGVQYXRoIiwiZmlsZVVybFRvUGF0aCIsInVybCIsIlZFUlNJT05fVVJMX1BBUkFNIiwiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJyZXNvbHZlUmVib290RGVib3VuY2VNcyIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkhvdFJlbG9hZFNlcnZlciIsImxvZ2dlciIsIm5hbWUiLCJkaXNwb3NlZCIsImhvb2tzUmVnaXN0ZXJlZCIsImVudHJ5TW9kdWxlUGF0aCIsImVudHJ5TW9kdWxlIiwid29ya3NwYWNlIiwiYnVpbGRDb25maWciLCJ3YXRjaFN1YnNjcmlwdGlvbiIsImZpbGVJbmZvTWFwIiwiTWFwIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJ0cmFuc3BpbGVDYWNoZSIsInRyYW5zcGlsZXIiLCJhbGlhc1BhdGhzIiwiYWxpYXNCYXNlVXJsIiwicmVzb2x2ZSIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVib290RGVib3VuY2VHZW4iLCJyZWJvb3RJbkZsaWdodCIsInJlYm9vdEZvbGxvd1VwIiwicmVib290UXVldWVkIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJyZXNvbHZlV29ya3NwYWNlIiwicHJvamVjdCIsInJlc29sdmVQcm9qZWN0IiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsImJ1aWxkQWxpYXNQYXRocyIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsIlN5bWJvbCIsImRpc3Bvc2VFbnRyeSIsImFzeW5jRGlzcG9zZSIsInZlcnNpb25Nb2R1bGUiLCJwYXRoVG9GaWxlVXJsIiwiZGVmYXVsdCIsImVycm9yIiwidW5kZWZpbmVkIiwiZGVsYXlNcyIsImdlbiIsInJlcXVlc3RSZWJvb3QiLCJ0aGVuIiwicnVuUmVib290IiwibmVlZHNGb2xsb3dVcCIsImVudHJ5IiwiY3JlYXRlIiwicm9vdERpciIsInByb2Nlc3MiLCJjd2QiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwiZm91bmQiLCJhdCIsImZpbmQiLCJwIiwiZW50cmllcyIsImFsbCIsIm1hcCIsImZpbGVzIiwiZ2V0QWxsRmlsZXMiLCJmaWxlIiwiZnVsbFBhdGgiLCJmbGF0Iiwic3BlY2lmaWVyIiwiY29udGV4dCIsIm5leHQiLCJwYXJlbnRVcmwiLCJwYXJlbnRVUkwiLCJyZXdyaXR0ZW4iLCJpc1dhdGNoZWRUcyIsImZpbGVQYXRoIiwiaGFzIiwicmVzb2x2ZUJhcmUiLCJiYXJlIiwicmVzb2x2ZVBhdGgiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsInJlc3VsdCIsIm9uUG9zdFJlc29sdmUiLCJsb2FkIiwibG9hZFRzIiwiZm9ybWF0Iiwic291cmNlIiwic2hvcnRDaXJjdWl0IiwiZ2V0UGFja2FnZUFsaWFzZXMiLCJiYXNlVXJsIiwicGF0aHMiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJwYXJlbnRJc1NvdXJjZSIsInRyYWNrRGVwZW5kZW5jeSIsInN0YXJ0c1dpdGgiLCJjbGVhblBhdGgiLCJwYXRobmFtZSIsImZpbGVJbmZvIiwiZ2V0IiwiY2FjaGVkIiwidHNDb25maWciLCJnZXRUc0NvbmZpZ1N5bmMiLCJ1c2VyQ29uZmlnIiwiZ2V0U3djQ29uZmlnU3luYyIsInJlc3BvbnNlIiwidHJhbnNmb3JtRmlsZVN5bmMiLCJlczYiLCJvdXRjb21lIiwic2V0IiwiY29kZSIsImV2dCIsImV2ZW50TmFtZSIsIldhdGNoRXZlbnRzIiwidW5saW5rIiwiZGVsZXRlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsIlNldCIsImluY2x1ZGVzIiwibGVuZ3RoIiwiaW52YWxpZGF0ZU1vZHVsZSIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwidmVyc2lvbmVkIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLGNBQWM7QUFPM0MsU0FBU0MsYUFB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
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgRmlsZSwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBhZGRSZXNvbHZlckhvb2ssIGluaXRNb2R1bGVIb29rcywgcmVtb3ZlUmVzb2x2ZXJIb29rIH0gZnJvbSBcIi4vaG90LW1vZHVsZS1ob29rcy5qc1wiO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnk6IEFzeW5jRGlzcG9zYWJsZTtcblx0cHJpdmF0ZSBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblx0cHJpdmF0ZSB3YXRjaGVyczogUmV0dXJuVHlwZTx0eXBlb2YgaW8ud2F0Y2g+W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobG9nZ2VyOiBMb2dnZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KGVudHJ5OiBzdHJpbmcsIC4uLndhdGNoRGlyczogc3RyaW5nW10pIHtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gZW50cnk7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0U291cmNlRmlsZXMod2F0Y2hEaXJzKTtcblx0XHR0aGlzLmNvbmZpZ3VyZU1vZHVsZUhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblx0XHRhd2FpdCB0aGlzLndhdGNoKHdhdGNoRGlycyk7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJTZXJ2aW5nXCIsIGVudHJ5KTtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIkhvdCByZWxvYWQgd2F0Y2hpbmdcIiwgd2F0Y2hEaXJzKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHRyZW1vdmVSZXNvbHZlckhvb2sodGhpcy5vblJlc29sdmUpO1xuXHRcdGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSB7XG5cdFx0XHR3YXRjaGVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNvdXJjZUZpbGVzKC4uLnNvdXJjZUZpbGVzOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMuc291cmNlRmlsZXMgPSB0aGlzLnNvdXJjZUZpbGVzLmZpbHRlcihcblx0XHRcdChzb3VyY2VGaWxlKSA9PiAhc291cmNlRmlsZXMuaW5jbHVkZXMoc291cmNlRmlsZSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0U291cmNlRmlsZXMoZGlyczogc3RyaW5nW10pIHtcblx0XHRjb25zdCBwYXR0ZXJucyA9IGRpcnMubWFwKChkaXIpID0+IGAke2Rpcn0vKiovKi5qc2ApO1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgaW8uZmluZEZpbGVzKHBhdHRlcm5zKTtcblx0XHRyZXR1cm4gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uZmlndXJlTW9kdWxlSG9va3MoKSB7XG5cdFx0aW5pdE1vZHVsZUhvb2tzKCk7XG5cdFx0YWRkUmVzb2x2ZXJIb29rKHRoaXMub25SZXNvbHZlKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZSh1cmwpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZShwYXJlbnRVcmxDbGVhbik7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KHVybCwgcGFyZW50VXJsKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzU291cmNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVzdWx0LnVybCA9IHRoaXMuZ2V0Q2FjaGVkT3JOZXcodXJsKTtcblx0fTtcblxuXHRwcml2YXRlIGlzU291cmNlTW9kdWxlKHVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhwYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzID0gQXJyYXkub2Y8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeSh1cmw6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDYWNoZWRPck5ldyhtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChtb2R1bGVVcmwpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubW9kdWxlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRjb25zdCB2ZXJzaW9uZWQgPSBjYWNoZWQgPz8gdGhpcy52ZXJzaW9uTW9kdWxlKG1vZHVsZVVybCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIHZlcnNpb25lZCk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZDtcblx0fVxuXG5cdHByaXZhdGUgdmVyc2lvbk1vZHVsZShtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IHZlcnNpb25lZFVybCA9IG5ldyBVUkwobW9kdWxlVXJsKTtcblx0XHR2ZXJzaW9uZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHdhdGNoID0gYXN5bmMgKGRpcnM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuXHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGlvLndhdGNoKGRpciwgeyBpbmNsdWRlOiBbXCIqKi8qLmpzXCJdLCBpZ25vcmVJbml0aWFsOiB0cnVlIH0pO1xuXHRcdFx0d2F0Y2hlclxuXHRcdFx0XHQub24oXCJhZGRcIiwgdGhpcy5vbkZpbGVBZGRlZClcblx0XHRcdFx0Lm9uKFwiY2hhbmdlXCIsIHRoaXMub25Tb3VyY2VGaWxlQ2hhbmdlZClcblx0XHRcdFx0Lm9uKFwidW5saW5rXCIsIHRoaXMub25GaWxlRGVsZXRlZCk7XG5cdFx0XHR0aGlzLndhdGNoZXJzLnB1c2god2F0Y2hlcik7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlQWRkZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIG9uU291cmNlRmlsZUNoYW5nZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdFx0YCR7ZnVsbFBhdGh9IGlzIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kgZ3JhcGguIE5vdCByZWxvYWRpbmcgZW50cnkuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlRGVsZXRlZCA9IGFzeW5jICh7IGZ1bGxQYXRoIH06IEZpbGUpID0+IHtcblx0XHR0aGlzLnJlbW92ZVNvdXJjZUZpbGVzKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdHRoaXMuZGlzcG9zZUFuZEJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKHVybExpa2U6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShpby5maWxlVXJsVG9QYXRoKHVybExpa2UpKTtcblx0fVxuXG5cdHByaXZhdGUgaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHR9XG5cdFx0Ly8gUHJ1bmUgaW52YWxpZGF0ZWQgbW9kdWxlcyBmcm9tIGFsbCBwYXJlbnQgbGlzdHMgc28gc3RhbGUgcmVsYXRpb25zaGlwc1xuXHRcdC8vIGFyZSBjbGVhcmVkLiBUaGUgZnJlc2ggYm9vdCByZWJ1aWxkcyBvbmx5IHdoYXQgaXMgYWN0dWFsbHkgaW1wb3J0ZWQuXG5cdFx0Zm9yIChjb25zdCBbY2hpbGQsIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRjb25zdCBwcnVuZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gIW1vZHVsZXMuaW5jbHVkZXMocCkpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChjaGlsZCwgcHJ1bmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5zb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZSwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlQW5kQm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH0sIDI1MCk7XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGUpKTtcblx0XHRcdHRoaXMuZW50cnkgPSAoYXdhaXQgaW1wb3J0KHZlcnNpb24pKT8uZGVmYXVsdDtcblx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdGBUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZGAsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJwYXRoIiwiaW8iLCJkZWJvdW5jZSIsImFkZFJlc29sdmVySG9vayIsImluaXRNb2R1bGVIb29rcyIsInJlbW92ZVJlc29sdmVySG9vayIsImN1cnJlbnRGaWxlUGF0aCIsImZpbGVVcmxUb1BhdGgiLCJ1cmwiLCJIb3RSZWxvYWRTZXJ2ZXIiLCJsb2dnZXIiLCJkaXNwb3NlZCIsImVudHJ5TW9kdWxlIiwiZW50cnkiLCJzb3VyY2VGaWxlcyIsIm1vZHVsZUNhY2hlIiwiTWFwIiwiZGVwZW5kZW5jaWVzIiwid2F0Y2hlcnMiLCJzdGFydCIsIndhdGNoRGlycyIsImdldFNvdXJjZUZpbGVzIiwiY29uZmlndXJlTW9kdWxlSG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZGlzcG9zZSIsIm9uUmVzb2x2ZSIsIndhdGNoZXIiLCJjbG9zZSIsImRpc3Bvc2VFbnRyeSIsInJlbW92ZVNvdXJjZUZpbGVzIiwiZmlsdGVyIiwic291cmNlRmlsZSIsImluY2x1ZGVzIiwiZGlycyIsInBhdHRlcm5zIiwibWFwIiwiZGlyIiwiZmlsZXMiLCJmaW5kRmlsZXMiLCJmIiwiZnVsbFBhdGgiLCJyZXN1bHQiLCJwYXJlbnRVcmwiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwiaXNTb3VyY2UiLCJpc1NvdXJjZU1vZHVsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZ2V0Q2FjaGVkT3JOZXciLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVJZCIsInBhcmVudE1vZHVsZXMiLCJpc1NlbGYiLCJtb2R1bGVEZXBzIiwiZ2V0IiwiZXJyb3IiLCJzdWJEZXBzIiwiQXJyYXkiLCJvZiIsImRlcCIsInN1YnMiLCJTZXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJkZXBzIiwidXBkYXRlZERlcHMiLCJzZXQiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwiaW5jbHVkZSIsImlnbm9yZUluaXRpYWwiLCJvbiIsIm9uRmlsZUFkZGVkIiwib25Tb3VyY2VGaWxlQ2hhbmdlZCIsIm9uRmlsZURlbGV0ZWQiLCJwdXNoIiwicmVsb2FkSWZBZmZlY3RlZCIsIm1vZHVsZXMiLCJpbnZsaWRhdGVNb2R1bGUiLCJkaXNwb3NlQW5kQm9vdCIsInVybExpa2UiLCJyZXNvbHZlIiwibW9kdWxlIiwiY2hpbGQiLCJwYXJlbnRzIiwicHJ1bmVkIiwicCIsImxlbmd0aCIsImRlbGV0ZSIsImZpbGUiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJ2ZXJzaW9uIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlbWl0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxZQUFZLFFBQVEsY0FBYztBQUUzQyxPQUFPQyxVQUFVLFlBQVk7QUFDN0IsU0FBb0JDLEVBQUUsUUFBUSxxQkFBcUI7QUFDbkQsU0FBU0MsUUFBUSxRQUFRLHlCQUF5QjtBQUVsRCxTQUFTQyxlQUFlLEVBQUVDLGVBQWUsRUFBRUMsa0JBQWtCLFFBQVEsd0JBQXdCO0FBRTdGLE1BQU1DLGtCQUFrQkwsR0FBR00sYUFBYSxDQUFDLFlBQVlDLEdBQUc7QUFNeEQsT0FBTyxNQUFNQyx3QkFBd0JWO0lBQ25CVyxPQUFlO0lBQ3hCQyxXQUFXLE1BQU07SUFDakJDLFlBQW9CO0lBQ3BCQyxNQUF1QjtJQUN2QkMsY0FBd0IsRUFBRSxDQUFDO0lBQzNCQyxjQUFjLElBQUlDLE1BQTZCO0lBQy9DQyxlQUFlLElBQUlELE1BQXdCO0lBQzNDRSxXQUEwQyxFQUFFLENBQUM7SUFFckQsWUFBbUJSLE1BQWMsQ0FBRTtRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO0lBQ2Y7SUFFQSxNQUFhUyxNQUFNTixLQUFhLEVBQUUsR0FBR08sU0FBbUIsRUFBRTtRQUN6RCxJQUFJLENBQUNSLFdBQVcsR0FBR0M7UUFDbkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGNBQWMsQ0FBQ0Q7UUFDN0MsSUFBSSxDQUFDRSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDQyx3QkFBd0I7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
|
package/es6/src/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
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";
|
|
3
7
|
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEVtYmVyQ29tbWFuZCB9IGZyb20gXCIuL2VtYmVyLmNvbW1hbmQuanNcIjtcbmV4cG9ydCB0eXBlIHsgRW1iZXJNb2R1bGVDb250ZXh0LCBFbWJlck1vZHVsZVJlc3VsdCB9IGZyb20gXCIuL2VtYmVyLm1vZHVsZS5qc1wiO1xuZXhwb3J0IHsgRW1iZXJBY3Rpb25zLCBFbWJlck1vZHVsZSB9IGZyb20gXCIuL2VtYmVyLm1vZHVsZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHsgU2VydmVDb21tYW5kIH0gZnJvbSBcIi4vc2VydmUuY29tbWFuZC5qc1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VTZXJ2ZU9wdGlvbnMgfSBmcm9tIFwiLi93b3Jrc3BhY2Utc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQgeyBXb3Jrc3BhY2VTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3dvcmtzcGFjZS1zZXJ2ZS5hY3Rpb24uanNcIjtcbiJdLCJuYW1lcyI6WyJFbWJlckNvbW1hbmQiLCJFbWJlckFjdGlvbnMiLCJFbWJlck1vZHVsZSIsIlNlcnZlQWN0aW9uIiwiU2VydmVDb21tYW5kIiwiV29ya3NwYWNlU2VydmVBY3Rpb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxxQkFBcUI7QUFFbEQsU0FBU0MsWUFBWSxFQUFFQyxXQUFXLFFBQVEsb0JBQW9CO0FBQzlELGNBQWMseUJBQXlCO0FBRXZDLFNBQVNDLFdBQVcsUUFBUSxvQkFBb0I7QUFDaEQsU0FBU0MsWUFBWSxRQUFRLHFCQUFxQjtBQUVsRCxTQUFTQyxvQkFBb0IsUUFBUSw4QkFBOEIifQ==
|