@dbx-tools/core 0.9.21 → 0.9.28
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/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -2
- package/lib/src/bin.d.ts +2 -0
- package/lib/src/bin.js +16 -19
- package/lib/src/config-utils.js +3 -4
- package/lib/src/exec.js +10 -3
- package/lib/src/file-lock.d.ts +13 -0
- package/lib/src/file-lock.js +52 -2
- package/package.json +2 -3
- package/src/bin.ts +15 -16
- package/src/config-utils.ts +2 -7
- package/src/exec.ts +9 -2
- package/src/file-lock.ts +64 -1
- package/._LICENSE +0 -0
- package/._README.md +0 -0
- package/._index.ts +0 -0
- package/._package.json +0 -0
- package/lib/._index.d.ts +0 -0
- package/lib/._index.js +0 -0
- package/lib/._tsconfig.tsbuildinfo +0 -0
- package/lib/src/._bin.d.ts +0 -0
- package/lib/src/._bin.js +0 -0
- package/lib/src/._brand-files.d.ts +0 -0
- package/lib/src/._brand-files.js +0 -0
- package/lib/src/._bundle.d.ts +0 -0
- package/lib/src/._bundle.js +0 -0
- package/lib/src/._config-utils.d.ts +0 -0
- package/lib/src/._config-utils.js +0 -0
- package/lib/src/._dependency-resolver.d.ts +0 -0
- package/lib/src/._dependency-resolver.js +0 -0
- package/lib/src/._exec.d.ts +0 -0
- package/lib/src/._exec.js +0 -0
- package/lib/src/._file-lock.d.ts +0 -0
- package/lib/src/._file-lock.js +0 -0
- package/lib/src/._file.d.ts +0 -0
- package/lib/src/._file.js +0 -0
- package/lib/src/._npm-resolver.d.ts +0 -0
- package/lib/src/._npm-resolver.js +0 -0
- package/lib/src/._process-lock.d.ts +0 -0
- package/lib/src/._process-lock.js +0 -0
- package/lib/src/._project-utils.d.ts +0 -0
- package/lib/src/._project-utils.js +0 -0
- package/lib/src/npm-resolver.d.ts +0 -44
- package/lib/src/npm-resolver.js +0 -367
- package/src/._bin.ts +0 -0
- package/src/._brand-files.ts +0 -0
- package/src/._bundle.ts +0 -0
- package/src/._config-utils.ts +0 -0
- package/src/._dependency-resolver.ts +0 -0
- package/src/._exec.ts +0 -0
- package/src/._file-lock.ts +0 -0
- package/src/._file.ts +0 -0
- package/src/._process-lock.ts +0 -0
- package/src/._project-utils.ts +0 -0
package/src/file-lock.ts
CHANGED
|
@@ -26,7 +26,12 @@ import { mkdir, open } from "node:fs/promises";
|
|
|
26
26
|
import { tmpdir } from "node:os";
|
|
27
27
|
import { dirname, join } from "node:path";
|
|
28
28
|
|
|
29
|
-
import
|
|
29
|
+
import * as asyncUtils from "@dbx-tools/shared-core/async-utils";
|
|
30
|
+
import * as errorUtils from "@dbx-tools/shared-core/error-utils";
|
|
31
|
+
import * as functionUtils from "@dbx-tools/shared-core/function-utils";
|
|
32
|
+
import * as hash from "@dbx-tools/shared-core/hash";
|
|
33
|
+
import * as log from "@dbx-tools/shared-core/log";
|
|
34
|
+
import * as object from "@dbx-tools/shared-core/object";
|
|
30
35
|
import lockfile from "proper-lockfile";
|
|
31
36
|
|
|
32
37
|
const logger = log.logger("core:file-lock");
|
|
@@ -77,6 +82,12 @@ export interface FileLockOptions {
|
|
|
77
82
|
onWait?: (acquisition: FileLockAcquisition) => void;
|
|
78
83
|
}
|
|
79
84
|
|
|
85
|
+
/** Explicit cross-process lease returned by {@link acquireFileLock}. */
|
|
86
|
+
export interface FileLockLease extends FileLockAcquisition {
|
|
87
|
+
/** Release the held lock. Repeated calls are safe. */
|
|
88
|
+
release(): Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
|
|
80
91
|
type FlockFn = (fd: number, operation: number) => number;
|
|
81
92
|
|
|
82
93
|
interface BunFfiModule {
|
|
@@ -142,6 +153,58 @@ export async function withFileLock<T>(
|
|
|
142
153
|
throw new Error("withFileLock: no lock backend available");
|
|
143
154
|
}
|
|
144
155
|
|
|
156
|
+
/**
|
|
157
|
+
* Acquire a cross-process lock and return an explicit lease.
|
|
158
|
+
*
|
|
159
|
+
* Prefer {@link withFileLock} for ordinary JavaScript callers. This lower-level
|
|
160
|
+
* shape exists for storage adapters and cross-language bridges that cannot
|
|
161
|
+
* conveniently pass an async callback through their FFI boundary.
|
|
162
|
+
*/
|
|
163
|
+
export async function acquireFileLock(
|
|
164
|
+
key: unknown,
|
|
165
|
+
options: FileLockOptions = {},
|
|
166
|
+
): Promise<FileLockLease> {
|
|
167
|
+
let acquisition: FileLockAcquisition | undefined;
|
|
168
|
+
let resolveAcquired!: () => void;
|
|
169
|
+
let rejectAcquired!: (error: unknown) => void;
|
|
170
|
+
let resolveRelease!: () => void;
|
|
171
|
+
const acquired = new Promise<void>((resolve, reject) => {
|
|
172
|
+
resolveAcquired = resolve;
|
|
173
|
+
rejectAcquired = reject;
|
|
174
|
+
});
|
|
175
|
+
const released = new Promise<void>((resolve) => {
|
|
176
|
+
resolveRelease = resolve;
|
|
177
|
+
});
|
|
178
|
+
const run = withFileLock(
|
|
179
|
+
key,
|
|
180
|
+
async () => {
|
|
181
|
+
resolveAcquired();
|
|
182
|
+
await released;
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
...options,
|
|
186
|
+
onAcquire: (value) => {
|
|
187
|
+
acquisition = value;
|
|
188
|
+
options.onAcquire?.(value);
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
);
|
|
192
|
+
void run.catch(rejectAcquired);
|
|
193
|
+
await acquired;
|
|
194
|
+
if (!acquisition) throw new Error("File-lock backend was not recorded");
|
|
195
|
+
|
|
196
|
+
let active = true;
|
|
197
|
+
return {
|
|
198
|
+
...acquisition,
|
|
199
|
+
async release() {
|
|
200
|
+
if (!active) return;
|
|
201
|
+
active = false;
|
|
202
|
+
resolveRelease();
|
|
203
|
+
await run;
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
145
208
|
/** Canonical filesystem-safe id for a lock key. */
|
|
146
209
|
function lockId(key: unknown): string {
|
|
147
210
|
const stable = object
|
package/._LICENSE
DELETED
|
Binary file
|
package/._README.md
DELETED
|
Binary file
|
package/._index.ts
DELETED
|
Binary file
|
package/._package.json
DELETED
|
Binary file
|
package/lib/._index.d.ts
DELETED
|
Binary file
|
package/lib/._index.js
DELETED
|
Binary file
|
|
Binary file
|
package/lib/src/._bin.d.ts
DELETED
|
Binary file
|
package/lib/src/._bin.js
DELETED
|
Binary file
|
|
Binary file
|
package/lib/src/._brand-files.js
DELETED
|
Binary file
|
package/lib/src/._bundle.d.ts
DELETED
|
Binary file
|
package/lib/src/._bundle.js
DELETED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/src/._exec.d.ts
DELETED
|
Binary file
|
package/lib/src/._exec.js
DELETED
|
Binary file
|
package/lib/src/._file-lock.d.ts
DELETED
|
Binary file
|
package/lib/src/._file-lock.js
DELETED
|
Binary file
|
package/lib/src/._file.d.ts
DELETED
|
Binary file
|
package/lib/src/._file.js
DELETED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve npm dependency specifiers against the configured registry.
|
|
3
|
-
*
|
|
4
|
-
* Callers pass an already-parsed `package.json`. The function never writes that
|
|
5
|
-
* project: it copies the manifest into a temporary directory, proves that this
|
|
6
|
-
* Bun version's missing-package errors are parseable, then pins unavailable
|
|
7
|
-
* packages (or their parents) until `bun install` succeeds. The returned maps
|
|
8
|
-
* are the resolvable registry specifiers.
|
|
9
|
-
*
|
|
10
|
-
* @module
|
|
11
|
-
*/
|
|
12
|
-
type InstallResult = {
|
|
13
|
-
ok: boolean;
|
|
14
|
-
stdout: string;
|
|
15
|
-
stderr: string;
|
|
16
|
-
missing: string[];
|
|
17
|
-
};
|
|
18
|
-
type PackageInfo = {
|
|
19
|
-
name: string;
|
|
20
|
-
versions: string[];
|
|
21
|
-
latest?: string;
|
|
22
|
-
dependencies: Record<string, Record<string, string>>;
|
|
23
|
-
};
|
|
24
|
-
type ResolveDependenciesOptions = {
|
|
25
|
-
verify?: () => Promise<void>;
|
|
26
|
-
install?: (manifest: Record<string, unknown>) => Promise<InstallResult>;
|
|
27
|
-
packageInfo?: (name: string) => Promise<PackageInfo | undefined>;
|
|
28
|
-
};
|
|
29
|
-
/** Registry dependency maps that `bun install` can resolve. */
|
|
30
|
-
export type ResolvedNpmDependencies = {
|
|
31
|
-
dependencies: Record<string, string>;
|
|
32
|
-
devDependencies: Record<string, string>;
|
|
33
|
-
optionalDependencies: Record<string, string>;
|
|
34
|
-
peerDependencies: Record<string, string>;
|
|
35
|
-
overrides: Record<string, string>;
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Return resolvable dependency specifiers for an in-memory `package.json`.
|
|
39
|
-
*
|
|
40
|
-
* The input object is not mutated. Bun missing-package parsing is self-tested
|
|
41
|
-
* once per process before any install attempt.
|
|
42
|
-
*/
|
|
43
|
-
export declare function resolveDependencies(manifest: Record<string, unknown>, options?: ResolveDependenciesOptions): Promise<ResolvedNpmDependencies>;
|
|
44
|
-
export {};
|
package/lib/src/npm-resolver.js
DELETED
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve npm dependency specifiers against the configured registry.
|
|
3
|
-
*
|
|
4
|
-
* Callers pass an already-parsed `package.json`. The function never writes that
|
|
5
|
-
* project: it copies the manifest into a temporary directory, proves that this
|
|
6
|
-
* Bun version's missing-package errors are parseable, then pins unavailable
|
|
7
|
-
* packages (or their parents) until `bun install` succeeds. The returned maps
|
|
8
|
-
* are the resolvable registry specifiers.
|
|
9
|
-
*
|
|
10
|
-
* @module
|
|
11
|
-
*/
|
|
12
|
-
import { randomUUID } from "node:crypto";
|
|
13
|
-
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
14
|
-
import { tmpdir } from "node:os";
|
|
15
|
-
import { delimiter, dirname, join } from "node:path";
|
|
16
|
-
import { functionUtils, json, object } from "@dbx-tools/shared-core";
|
|
17
|
-
import { spawn } from "./exec.js";
|
|
18
|
-
import { npmRegistry } from "./project-utils.js";
|
|
19
|
-
const DEPENDENCY_FIELDS = [
|
|
20
|
-
"dependencies",
|
|
21
|
-
"devDependencies",
|
|
22
|
-
"optionalDependencies",
|
|
23
|
-
"peerDependencies",
|
|
24
|
-
];
|
|
25
|
-
const INSTALL_ARGS = ["install", "--ignore-scripts", "--no-cache"];
|
|
26
|
-
const MAX_ITERATIONS = 100;
|
|
27
|
-
/**
|
|
28
|
-
* Return resolvable dependency specifiers for an in-memory `package.json`.
|
|
29
|
-
*
|
|
30
|
-
* The input object is not mutated. Bun missing-package parsing is self-tested
|
|
31
|
-
* once per process before any install attempt.
|
|
32
|
-
*/
|
|
33
|
-
export async function resolveDependencies(manifest, options = {}) {
|
|
34
|
-
const working = structuredClone(manifest);
|
|
35
|
-
await (options.verify ?? verifyBunErrorParsing)();
|
|
36
|
-
const install = options.install ?? installManifest;
|
|
37
|
-
const packageInfo = options.packageInfo ?? createPackageInfoLookup();
|
|
38
|
-
const attempted = new Set();
|
|
39
|
-
for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration += 1) {
|
|
40
|
-
const result = await install(working);
|
|
41
|
-
if (result.ok)
|
|
42
|
-
return snapshot(working);
|
|
43
|
-
if (result.missing.length === 0) {
|
|
44
|
-
throw new Error([
|
|
45
|
-
"bun install failed without a parseable missing package.",
|
|
46
|
-
"",
|
|
47
|
-
"Raw Bun output:",
|
|
48
|
-
`${result.stdout}\n${result.stderr}`,
|
|
49
|
-
].join("\n"));
|
|
50
|
-
}
|
|
51
|
-
let changed = false;
|
|
52
|
-
for (const missing of result.missing) {
|
|
53
|
-
const pin = await pinForMissing(missing, working, packageInfo, attempted);
|
|
54
|
-
if (pin)
|
|
55
|
-
changed = pinPackage(working, pin.name, pin.version) || changed;
|
|
56
|
-
}
|
|
57
|
-
if (!changed) {
|
|
58
|
-
throw new Error(`No remaining registry pin for: ${result.missing.join(", ")}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
throw new Error(`Reached ${MAX_ITERATIONS} install attempts without a successful bun install.`);
|
|
62
|
-
}
|
|
63
|
-
const verifyBunErrorParsing = functionUtils.memoize(async () => {
|
|
64
|
-
const impossible = `__npm_resolver_missing_${randomUUID()}__`;
|
|
65
|
-
const result = await installManifest({
|
|
66
|
-
private: true,
|
|
67
|
-
dependencies: { [impossible]: "1.0.0" },
|
|
68
|
-
});
|
|
69
|
-
if (result.ok) {
|
|
70
|
-
throw new Error(`Bun self-test unexpectedly succeeded for ${impossible}`);
|
|
71
|
-
}
|
|
72
|
-
if (!result.missing.includes(impossible)) {
|
|
73
|
-
throw new Error([
|
|
74
|
-
"Bun's missing-package output is not parseable.",
|
|
75
|
-
"",
|
|
76
|
-
`Expected: ${impossible}`,
|
|
77
|
-
`Parsed: ${JSON.stringify(result.missing)}`,
|
|
78
|
-
"",
|
|
79
|
-
"Raw Bun output:",
|
|
80
|
-
`${result.stdout}\n${result.stderr}`,
|
|
81
|
-
].join("\n"));
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
async function installManifest(manifest) {
|
|
85
|
-
const dir = await mkdtemp(join(tmpdir(), "npm-resolver-"));
|
|
86
|
-
try {
|
|
87
|
-
await writeFile(join(dir, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
88
|
-
const [command, ...prefix] = bunArgv();
|
|
89
|
-
const url = registryUrl();
|
|
90
|
-
const registryArgs = url ? ["--registry", url] : [];
|
|
91
|
-
const result = await spawn(command, [...prefix, ...INSTALL_ARGS, ...registryArgs], {
|
|
92
|
-
cwd: dir,
|
|
93
|
-
stdin: "ignore",
|
|
94
|
-
stdout: "capture",
|
|
95
|
-
stderr: "capture",
|
|
96
|
-
env: registryEnv(),
|
|
97
|
-
});
|
|
98
|
-
const stdout = result.stdout;
|
|
99
|
-
const stderr = result.stderr;
|
|
100
|
-
return {
|
|
101
|
-
ok: result.exitCode === 0,
|
|
102
|
-
stdout,
|
|
103
|
-
stderr,
|
|
104
|
-
missing: parseMissingPackages(`${stdout}\n${stderr}`),
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
await rm(dir, { recursive: true, force: true });
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
function parseMissingPackages(output) {
|
|
112
|
-
const packages = new Set();
|
|
113
|
-
const url404 = /(?:GET|HEAD)\s+https?:\/\/[^/\s]+\/((?:@[^/\s]+(?:%2[fF]|\/)[^/?\s]+)|(?:[^/?\s]+))[^\s]*\s+-\s+404/g;
|
|
114
|
-
for (const match of output.matchAll(url404)) {
|
|
115
|
-
packages.add(decodePackageName(match[1] ?? ""));
|
|
116
|
-
}
|
|
117
|
-
const packageNotFound = /package\s+["']([^"']+)["']\s+(?:was\s+)?not\s+found/gi;
|
|
118
|
-
for (const match of output.matchAll(packageNotFound)) {
|
|
119
|
-
packages.add(match[1] ?? "");
|
|
120
|
-
}
|
|
121
|
-
const failedResolve = /failed\s+to\s+resolve\s+["']([^"']+)["']/gi;
|
|
122
|
-
for (const match of output.matchAll(failedResolve)) {
|
|
123
|
-
packages.add(stripVersion(match[1] ?? ""));
|
|
124
|
-
}
|
|
125
|
-
const failedAt = /((?:@[^/\s]+\/)?[^@\s]+)@[^\s]+\s+failed to resolve/gi;
|
|
126
|
-
for (const match of output.matchAll(failedAt)) {
|
|
127
|
-
packages.add(match[1] ?? "");
|
|
128
|
-
}
|
|
129
|
-
packages.delete("");
|
|
130
|
-
return [...packages];
|
|
131
|
-
}
|
|
132
|
-
function decodePackageName(value) {
|
|
133
|
-
let name = value;
|
|
134
|
-
try {
|
|
135
|
-
name = decodeURIComponent(name);
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
// Leave it encoded when the segment is not a valid URI component.
|
|
139
|
-
}
|
|
140
|
-
return name.replace(/%2f/gi, "/");
|
|
141
|
-
}
|
|
142
|
-
function stripVersion(value) {
|
|
143
|
-
if (value.startsWith("@")) {
|
|
144
|
-
const slash = value.indexOf("/");
|
|
145
|
-
const at = value.indexOf("@", slash + 1);
|
|
146
|
-
return at === -1 ? value : value.slice(0, at);
|
|
147
|
-
}
|
|
148
|
-
const at = value.indexOf("@");
|
|
149
|
-
return at === -1 ? value : value.slice(0, at);
|
|
150
|
-
}
|
|
151
|
-
function registryUrl() {
|
|
152
|
-
return npmRegistry(null, { overrideOnly: true, envVars: true })?.toString();
|
|
153
|
-
}
|
|
154
|
-
function registryEnv() {
|
|
155
|
-
const env = { ...process.env };
|
|
156
|
-
const runtimeBin = dirname(process.execPath);
|
|
157
|
-
const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
158
|
-
if (!pathEntries.includes(runtimeBin)) {
|
|
159
|
-
env.PATH = [runtimeBin, ...pathEntries].join(delimiter);
|
|
160
|
-
}
|
|
161
|
-
const url = registryUrl();
|
|
162
|
-
if (url) {
|
|
163
|
-
env.npm_config_registry = url;
|
|
164
|
-
env.NPM_CONFIG_REGISTRY = url;
|
|
165
|
-
env.BUN_CONFIG_REGISTRY = url;
|
|
166
|
-
}
|
|
167
|
-
return env;
|
|
168
|
-
}
|
|
169
|
-
function bunArgv() {
|
|
170
|
-
return /\bbun\b/i.test(process.execPath) ? [process.execPath] : ["bun"];
|
|
171
|
-
}
|
|
172
|
-
function snapshot(manifest) {
|
|
173
|
-
return {
|
|
174
|
-
dependencies: dependencyMap(manifest, "dependencies"),
|
|
175
|
-
devDependencies: dependencyMap(manifest, "devDependencies"),
|
|
176
|
-
optionalDependencies: dependencyMap(manifest, "optionalDependencies"),
|
|
177
|
-
peerDependencies: dependencyMap(manifest, "peerDependencies"),
|
|
178
|
-
overrides: overrideMap(manifest),
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
function dependencyMap(manifest, field) {
|
|
182
|
-
const value = manifest[field];
|
|
183
|
-
if (!object.isRecord(value))
|
|
184
|
-
return {};
|
|
185
|
-
const out = {};
|
|
186
|
-
for (const [name, spec] of Object.entries(value)) {
|
|
187
|
-
if (typeof spec === "string")
|
|
188
|
-
out[name] = spec;
|
|
189
|
-
}
|
|
190
|
-
return out;
|
|
191
|
-
}
|
|
192
|
-
function declaredDependencies(manifest) {
|
|
193
|
-
const out = {};
|
|
194
|
-
for (const field of DEPENDENCY_FIELDS)
|
|
195
|
-
Object.assign(out, dependencyMap(manifest, field));
|
|
196
|
-
return out;
|
|
197
|
-
}
|
|
198
|
-
function isRegistrySpecifier(spec) {
|
|
199
|
-
return !/^(workspace:|catalog:|file:|link:|git\+|github:|https?:|npm:)/i.test(spec);
|
|
200
|
-
}
|
|
201
|
-
function overrideMap(manifest) {
|
|
202
|
-
const value = manifest.overrides;
|
|
203
|
-
if (!object.isRecord(value))
|
|
204
|
-
return {};
|
|
205
|
-
const out = {};
|
|
206
|
-
for (const [name, spec] of Object.entries(value)) {
|
|
207
|
-
if (typeof spec === "string")
|
|
208
|
-
out[name] = spec;
|
|
209
|
-
}
|
|
210
|
-
return out;
|
|
211
|
-
}
|
|
212
|
-
function pinPackage(manifest, name, version) {
|
|
213
|
-
let changed = false;
|
|
214
|
-
const overrides = overrideMap(manifest);
|
|
215
|
-
if (overrides[name] !== version) {
|
|
216
|
-
overrides[name] = version;
|
|
217
|
-
manifest.overrides = overrides;
|
|
218
|
-
changed = true;
|
|
219
|
-
}
|
|
220
|
-
for (const field of DEPENDENCY_FIELDS) {
|
|
221
|
-
const deps = dependencyMap(manifest, field);
|
|
222
|
-
if (name in deps && deps[name] !== version && isRegistrySpecifier(deps[name] ?? "")) {
|
|
223
|
-
deps[name] = version;
|
|
224
|
-
manifest[field] = deps;
|
|
225
|
-
changed = true;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return changed;
|
|
229
|
-
}
|
|
230
|
-
function newestFirst(versions) {
|
|
231
|
-
return [...versions].sort((left, right) => right.localeCompare(left, undefined, { numeric: true, sensitivity: "base" }));
|
|
232
|
-
}
|
|
233
|
-
async function pinForMissing(missing, manifest, packageInfo, attempted) {
|
|
234
|
-
const available = await packageInfo(missing);
|
|
235
|
-
if (available) {
|
|
236
|
-
const version = nextUnusedVersion(missing, available, attempted);
|
|
237
|
-
if (version) {
|
|
238
|
-
attempted.add(`${missing}@${version}`);
|
|
239
|
-
return { name: missing, version };
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
for (const parent of await parentPackages(missing, manifest, packageInfo)) {
|
|
243
|
-
const info = await packageInfo(parent);
|
|
244
|
-
if (!info)
|
|
245
|
-
continue;
|
|
246
|
-
const version = compatibleParentVersion(missing, info, attempted);
|
|
247
|
-
if (!version)
|
|
248
|
-
continue;
|
|
249
|
-
attempted.add(`${parent}@${version}`);
|
|
250
|
-
return { name: parent, version };
|
|
251
|
-
}
|
|
252
|
-
return undefined;
|
|
253
|
-
}
|
|
254
|
-
function nextUnusedVersion(name, info, attempted) {
|
|
255
|
-
const preferred = info.latest
|
|
256
|
-
? [info.latest, ...newestFirst(info.versions)]
|
|
257
|
-
: newestFirst(info.versions);
|
|
258
|
-
for (const version of preferred) {
|
|
259
|
-
if (!attempted.has(`${name}@${version}`))
|
|
260
|
-
return version;
|
|
261
|
-
}
|
|
262
|
-
return undefined;
|
|
263
|
-
}
|
|
264
|
-
function compatibleParentVersion(missing, info, attempted) {
|
|
265
|
-
for (const version of newestFirst(info.versions)) {
|
|
266
|
-
if (attempted.has(`${info.name}@${version}`))
|
|
267
|
-
continue;
|
|
268
|
-
if (!(missing in (info.dependencies[version] ?? {})))
|
|
269
|
-
return version;
|
|
270
|
-
}
|
|
271
|
-
return undefined;
|
|
272
|
-
}
|
|
273
|
-
async function parentPackages(missing, manifest, packageInfo) {
|
|
274
|
-
const declared = declaredDependencies(manifest);
|
|
275
|
-
if (missing in declared && isRegistrySpecifier(declared[missing] ?? ""))
|
|
276
|
-
return [];
|
|
277
|
-
const parents = [];
|
|
278
|
-
for (const name of Object.keys(declared)) {
|
|
279
|
-
if (name === missing || !isRegistrySpecifier(declared[name] ?? ""))
|
|
280
|
-
continue;
|
|
281
|
-
const info = await packageInfo(name);
|
|
282
|
-
if (!info)
|
|
283
|
-
continue;
|
|
284
|
-
if (Object.values(info.dependencies).some((map) => missing in map))
|
|
285
|
-
parents.push(name);
|
|
286
|
-
}
|
|
287
|
-
return parents;
|
|
288
|
-
}
|
|
289
|
-
function createPackageInfoLookup() {
|
|
290
|
-
const cache = new Map();
|
|
291
|
-
return (name) => {
|
|
292
|
-
const cached = cache.get(name);
|
|
293
|
-
if (cached)
|
|
294
|
-
return cached;
|
|
295
|
-
const pending = loadPackageInfo(name);
|
|
296
|
-
cache.set(name, pending);
|
|
297
|
-
void pending.then(undefined, () => {
|
|
298
|
-
cache.delete(name);
|
|
299
|
-
});
|
|
300
|
-
return pending;
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
async function loadPackageInfo(name) {
|
|
304
|
-
const result = await spawn("npm", ["view", name, "--json"], {
|
|
305
|
-
stdin: "ignore",
|
|
306
|
-
stdout: "capture",
|
|
307
|
-
stderr: "capture",
|
|
308
|
-
env: registryEnv(),
|
|
309
|
-
});
|
|
310
|
-
if (result.exitCode !== 0)
|
|
311
|
-
return undefined;
|
|
312
|
-
const packument = json.parse(result.stdout);
|
|
313
|
-
if (!object.isRecord(packument))
|
|
314
|
-
return undefined;
|
|
315
|
-
const versions = publishedVersions(packument);
|
|
316
|
-
if (versions.length === 0)
|
|
317
|
-
return undefined;
|
|
318
|
-
return {
|
|
319
|
-
name,
|
|
320
|
-
versions,
|
|
321
|
-
latest: latestTag(packument) ?? versions.at(-1),
|
|
322
|
-
dependencies: versionDependencies(packument),
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
function publishedVersions(packument) {
|
|
326
|
-
if (typeof packument.version === "string" && !packument.versions) {
|
|
327
|
-
return [packument.version];
|
|
328
|
-
}
|
|
329
|
-
const versions = packument.versions;
|
|
330
|
-
if (Array.isArray(versions)) {
|
|
331
|
-
return versions.filter((value) => typeof value === "string");
|
|
332
|
-
}
|
|
333
|
-
if (object.isRecord(versions))
|
|
334
|
-
return Object.keys(versions);
|
|
335
|
-
return [];
|
|
336
|
-
}
|
|
337
|
-
function latestTag(packument) {
|
|
338
|
-
const tags = packument["dist-tags"];
|
|
339
|
-
if (!object.isRecord(tags) || typeof tags.latest !== "string")
|
|
340
|
-
return undefined;
|
|
341
|
-
return tags.latest;
|
|
342
|
-
}
|
|
343
|
-
function versionDependencies(packument) {
|
|
344
|
-
const versions = packument.versions;
|
|
345
|
-
if (!object.isRecord(versions)) {
|
|
346
|
-
return typeof packument.version === "string"
|
|
347
|
-
? { [packument.version]: stringMap(packument.dependencies) }
|
|
348
|
-
: {};
|
|
349
|
-
}
|
|
350
|
-
const out = {};
|
|
351
|
-
for (const [version, value] of Object.entries(versions)) {
|
|
352
|
-
if (object.isRecord(value))
|
|
353
|
-
out[version] = stringMap(value.dependencies);
|
|
354
|
-
}
|
|
355
|
-
return out;
|
|
356
|
-
}
|
|
357
|
-
function stringMap(value) {
|
|
358
|
-
if (!object.isRecord(value))
|
|
359
|
-
return {};
|
|
360
|
-
const out = {};
|
|
361
|
-
for (const [name, spec] of Object.entries(value)) {
|
|
362
|
-
if (typeof spec === "string")
|
|
363
|
-
out[name] = spec;
|
|
364
|
-
}
|
|
365
|
-
return out;
|
|
366
|
-
}
|
|
367
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25wbS1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtDQUNWLENBQUM7QUFFWCxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLENBQVUsQ0FBQztBQUM1RSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFpQzNCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsUUFBaUMsRUFDakMsVUFBc0MsRUFBRTtJQUV4QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDO0lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO0lBQ25E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QU8sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFjO0lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc29sdmUgbnBtIGRlcGVuZGVuY3kgc3BlY2lmaWVycyBhZ2FpbnN0IHRoZSBjb25maWd1cmVkIHJlZ2lzdHJ5LlxuICpcbiAqIENhbGxlcnMgcGFzcyBhbiBhbHJlYWR5LXBhcnNlZCBgcGFja2FnZS5qc29uYC4gVGhlIGZ1bmN0aW9uIG5ldmVyIHdyaXRlcyB0aGF0XG4gKiBwcm9qZWN0OiBpdCBjb3BpZXMgdGhlIG1hbmlmZXN0IGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBwcm92ZXMgdGhhdCB0aGlzXG4gKiBCdW4gdmVyc2lvbidzIG1pc3NpbmctcGFja2FnZSBlcnJvcnMgYXJlIHBhcnNlYWJsZSwgdGhlbiBwaW5zIHVuYXZhaWxhYmxlXG4gKiBwYWNrYWdlcyAob3IgdGhlaXIgcGFyZW50cykgdW50aWwgYGJ1biBpbnN0YWxsYCBzdWNjZWVkcy4gVGhlIHJldHVybmVkIG1hcHNcbiAqIGFyZSB0aGUgcmVzb2x2YWJsZSByZWdpc3RyeSBzcGVjaWZpZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBta2R0ZW1wLCBybSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGZ1bmN0aW9uVXRpbHMsIGpzb24sIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIi4vZXhlYy50c1wiO1xuaW1wb3J0IHsgbnBtUmVnaXN0cnkgfSBmcm9tIFwiLi9wcm9qZWN0LXV0aWxzLnRzXCI7XG5cbmNvbnN0IERFUEVOREVOQ1lfRklFTERTID0gW1xuICBcImRlcGVuZGVuY2llc1wiLFxuICBcImRldkRlcGVuZGVuY2llc1wiLFxuICBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCIsXG4gIFwicGVlckRlcGVuZGVuY2llc1wiLFxuXSBhcyBjb25zdDtcblxuY29uc3QgSU5TVEFMTF9BUkdTID0gW1wiaW5zdGFsbFwiLCBcIi0taWdub3JlLXNjcmlwdHNcIiwgXCItLW5vLWNhY2hlXCJdIGFzIGNvbnN0O1xuY29uc3QgTUFYX0lURVJBVElPTlMgPSAxMDA7XG5cbnR5cGUgRGVwZW5kZW5jeUZpZWxkID0gKHR5cGVvZiBERVBFTkRFTkNZX0ZJRUxEUylbbnVtYmVyXTtcblxudHlwZSBJbnN0YWxsUmVzdWx0ID0ge1xuICBvazogYm9vbGVhbjtcbiAgc3Rkb3V0OiBzdHJpbmc7XG4gIHN0ZGVycjogc3RyaW5nO1xuICBtaXNzaW5nOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgUGFja2FnZUluZm8gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbnM6IHN0cmluZ1tdO1xuICBsYXRlc3Q/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59O1xuXG50eXBlIFJlc29sdmVEZXBlbmRlbmNpZXNPcHRpb25zID0ge1xuICB2ZXJpZnk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBpbnN0YWxsPzogKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUHJvbWlzZTxJbnN0YWxsUmVzdWx0PjtcbiAgcGFja2FnZUluZm8/OiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPjtcbn07XG5cbi8qKiBSZWdpc3RyeSBkZXBlbmRlbmN5IG1hcHMgdGhhdCBgYnVuIGluc3RhbGxgIGNhbiByZXNvbHZlLiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWROcG1EZXBlbmRlbmNpZXMgPSB7XG4gIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBvcHRpb25hbERlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGVlckRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gcmVzb2x2YWJsZSBkZXBlbmRlbmN5IHNwZWNpZmllcnMgZm9yIGFuIGluLW1lbW9yeSBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBUaGUgaW5wdXQgb2JqZWN0IGlzIG5vdCBtdXRhdGVkLiBCdW4gbWlzc2luZy1wYWNrYWdlIHBhcnNpbmcgaXMgc2VsZi10ZXN0ZWRcbiAqIG9uY2UgcGVyIHByb2Nlc3MgYmVmb3JlIGFueSBpbnN0YWxsIGF0dGVtcHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlRGVwZW5kZW5jaWVzKFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IFJlc29sdmVEZXBlbmRlbmNpZXNPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzPiB7XG4gIGNvbnN0IHdvcmtpbmcgPSBzdHJ1Y3R1cmVkQ2xvbmUobWFuaWZlc3QpO1xuICBhd2FpdCAob3B0aW9ucy52ZXJpZnkgPz8gdmVyaWZ5QnVuRXJyb3JQYXJzaW5nKSgpO1xuICBjb25zdCBpbnN0YWxsID0gb3B0aW9ucy5pbnN0YWxsID8/IGluc3RhbGxNYW5pZmVzdDtcbiAgY29uc3QgcGFja2FnZUluZm8gPSBvcHRpb25zLnBhY2thZ2VJbmZvID8/IGNyZWF0ZVBhY2thZ2VJbmZvTG9va3VwKCk7XG4gIGNvbnN0IGF0dGVtcHRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAobGV0IGl0ZXJhdGlvbiA9IDE7IGl0ZXJhdGlvbiA8PSBNQVhfSVRFUkFUSU9OUzsgaXRlcmF0aW9uICs9IDEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnN0YWxsKHdvcmtpbmcpO1xuICAgIGlmIChyZXN1bHQub2spIHJldHVybiBzbmFwc2hvdCh3b3JraW5nKTtcbiAgICBpZiAocmVzdWx0Lm1pc3NpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICBcImJ1biBpbnN0YWxsIGZhaWxlZCB3aXRob3V0IGEgcGFyc2VhYmxlIG1pc3NpbmcgcGFja2FnZS5cIixcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIFwiUmF3IEJ1biBvdXRwdXQ6XCIsXG4gICAgICAgICAgYCR7cmVzdWx0LnN0ZG91dH1cXG4ke3Jlc3VsdC5zdGRlcnJ9YCxcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbWlzc2luZyBvZiByZXN1bHQubWlzc2luZykge1xuICAgICAgY29uc3QgcGluID0gYXdhaXQgcGluRm9yTWlzc2luZyhtaXNzaW5nLCB3b3JraW5nLCBwYWNrYWdlSW5mbywgYXR0ZW1wdGVkKTtcbiAgICAgIGlmIChwaW4pIGNoYW5nZWQgPSBwaW5QYWNrYWdlKHdvcmtpbmcsIHBpbi5uYW1lLCBwaW4udmVyc2lvbikgfHwgY2hhbmdlZDtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbWFpbmluZyByZWdpc3RyeSBwaW4gZm9yOiAke3Jlc3VsdC5taXNzaW5nLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFJlYWNoZWQgJHtNQVhfSVRFUkFUSU9OU30gaW5zdGFsbCBhdHRlbXB0cyB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBidW4gaW5zdGFsbC5gKTtcbn1cblxuY29uc3QgdmVyaWZ5QnVuRXJyb3JQYXJzaW5nID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgaW1wb3NzaWJsZSA9IGBfX25wbV9yZXNvbHZlcl9taXNzaW5nXyR7cmFuZG9tVVVJRCgpfV9fYDtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5zdGFsbE1hbmlmZXN0KHtcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIGRlcGVuZGVuY2llczogeyBbaW1wb3NzaWJsZV06IFwiMS4wLjBcIiB9LFxuICB9KTtcbiAgaWYgKHJlc3VsdC5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQnVuIHNlbGYtdGVzdCB1bmV4cGVjdGVkbHkgc3VjY2VlZGVkIGZvciAke2ltcG9zc2libGV9YCk7XG4gIH1cbiAgaWYgKCFyZXN1bHQubWlzc2luZy5pbmNsdWRlcyhpbXBvc3NpYmxlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFtcbiAgICAgICAgXCJCdW4ncyBtaXNzaW5nLXBhY2thZ2Ugb3V0cHV0IGlzIG5vdCBwYXJzZWFibGUuXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBFeHBlY3RlZDogJHtpbXBvc3NpYmxlfWAsXG4gICAgICAgIGBQYXJzZWQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0Lm1pc3NpbmcpfWAsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiUmF3IEJ1biBvdXRwdXQ6XCIsXG4gICAgICAgIGAke3Jlc3VsdC5zdGRvdXR9XFxuJHtyZXN1bHQuc3RkZXJyfWAsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgfVxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxNYW5pZmVzdChtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPEluc3RhbGxSZXN1bHQ+IHtcbiAgY29uc3QgZGlyID0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCBcIm5wbS1yZXNvbHZlci1cIikpO1xuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKGRpciwgXCJwYWNrYWdlLmpzb25cIiksIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gKTtcbiAgICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IGJ1bkFyZ3YoKTtcbiAgICBjb25zdCB1cmwgPSByZWdpc3RyeVVybCgpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5QXJncyA9IHVybCA/IFtcIi0tcmVnaXN0cnlcIiwgdXJsXSA6IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduKGNvbW1hbmQsIFsuLi5wcmVmaXgsIC4uLklOU1RBTExfQVJHUywgLi4ucmVnaXN0cnlBcmdzXSwge1xuICAgICAgY3dkOiBkaXIsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgICAgZW52OiByZWdpc3RyeUVudigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHN0ZG91dCA9IHJlc3VsdC5zdGRvdXQ7XG4gICAgY29uc3Qgc3RkZXJyID0gcmVzdWx0LnN0ZGVycjtcbiAgICByZXR1cm4ge1xuICAgICAgb2s6IHJlc3VsdC5leGl0Q29kZSA9PT0gMCxcbiAgICAgIHN0ZG91dCxcbiAgICAgIHN0ZGVycixcbiAgICAgIG1pc3Npbmc6IHBhcnNlTWlzc2luZ1BhY2thZ2VzKGAke3N0ZG91dH1cXG4ke3N0ZGVycn1gKSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJtKGRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWlzc2luZ1BhY2thZ2VzKG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYWNrYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1cmw0MDQgPVxuICAgIC8oPzpHRVR8SEVBRClcXHMraHR0cHM/OlxcL1xcL1teL1xcc10rXFwvKCg/OkBbXi9cXHNdKyg/OiUyW2ZGXXxcXC8pW14vP1xcc10rKXwoPzpbXi8/XFxzXSspKVteXFxzXSpcXHMrLVxccys0MDQvZztcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwodXJsNDA0KSkge1xuICAgIHBhY2thZ2VzLmFkZChkZWNvZGVQYWNrYWdlTmFtZShtYXRjaFsxXSA/PyBcIlwiKSk7XG4gIH1cbiAgY29uc3QgcGFja2FnZU5vdEZvdW5kID0gL3BhY2thZ2VcXHMrW1wiJ10oW15cIiddKylbXCInXVxccysoPzp3YXNcXHMrKT9ub3RcXHMrZm91bmQvZ2k7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygb3V0cHV0Lm1hdGNoQWxsKHBhY2thZ2VOb3RGb3VuZCkpIHtcbiAgICBwYWNrYWdlcy5hZGQobWF0Y2hbMV0gPz8gXCJcIik7XG4gIH1cbiAgY29uc3QgZmFpbGVkUmVzb2x2ZSA9IC9mYWlsZWRcXHMrdG9cXHMrcmVzb2x2ZVxccytbXCInXShbXlwiJ10rKVtcIiddL2dpO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbChmYWlsZWRSZXNvbHZlKSkge1xuICAgIHBhY2thZ2VzLmFkZChzdHJpcFZlcnNpb24obWF0Y2hbMV0gPz8gXCJcIikpO1xuICB9XG4gIGNvbnN0IGZhaWxlZEF0ID0gLygoPzpAW14vXFxzXStcXC8pP1teQFxcc10rKUBbXlxcc10rXFxzK2ZhaWxlZCB0byByZXNvbHZlL2dpO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbChmYWlsZWRBdCkpIHtcbiAgICBwYWNrYWdlcy5hZGQobWF0Y2hbMV0gPz8gXCJcIik7XG4gIH1cbiAgcGFja2FnZXMuZGVsZXRlKFwiXCIpO1xuICByZXR1cm4gWy4uLnBhY2thZ2VzXTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUGFja2FnZU5hbWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBuYW1lID0gdmFsdWU7XG4gIHRyeSB7XG4gICAgbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTGVhdmUgaXQgZW5jb2RlZCB3aGVuIHRoZSBzZWdtZW50IGlzIG5vdCBhIHZhbGlkIFVSSSBjb21wb25lbnQuXG4gIH1cbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvJTJmL2dpLCBcIi9cIik7XG59XG5cbmZ1bmN0aW9uIHN0cmlwVmVyc2lvbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgY29uc3Qgc2xhc2ggPSB2YWx1ZS5pbmRleE9mKFwiL1wiKTtcbiAgICBjb25zdCBhdCA9IHZhbHVlLmluZGV4T2YoXCJAXCIsIHNsYXNoICsgMSk7XG4gICAgcmV0dXJuIGF0ID09PSAtMSA/IHZhbHVlIDogdmFsdWUuc2xpY2UoMCwgYXQpO1xuICB9XG4gIGNvbnN0IGF0ID0gdmFsdWUuaW5kZXhPZihcIkBcIik7XG4gIHJldHVybiBhdCA9PT0gLTEgPyB2YWx1ZSA6IHZhbHVlLnNsaWNlKDAsIGF0KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0cnlVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG5wbVJlZ2lzdHJ5KG51bGwsIHsgb3ZlcnJpZGVPbmx5OiB0cnVlLCBlbnZWYXJzOiB0cnVlIH0pPy50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RyeUVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGNvbnN0IHJ1bnRpbWVCaW4gPSBkaXJuYW1lKHByb2Nlc3MuZXhlY1BhdGgpO1xuICBjb25zdCBwYXRoRW50cmllcyA9IChlbnYuUEFUSCA/PyBcIlwiKS5zcGxpdChkZWxpbWl0ZXIpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKCFwYXRoRW50cmllcy5pbmNsdWRlcyhydW50aW1lQmluKSkge1xuICAgIGVudi5QQVRIID0gW3J1bnRpbWVCaW4sIC4uLnBhdGhFbnRyaWVzXS5qb2luKGRlbGltaXRlcik7XG4gIH1cbiAgY29uc3QgdXJsID0gcmVnaXN0cnlVcmwoKTtcbiAgaWYgKHVybCkge1xuICAgIGVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5ID0gdXJsO1xuICAgIGVudi5OUE1fQ09ORklHX1JFR0lTVFJZID0gdXJsO1xuICAgIGVudi5CVU5fQ09ORklHX1JFR0lTVFJZID0gdXJsO1xuICB9XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIGJ1bkFyZ3YoKTogc3RyaW5nW10ge1xuICByZXR1cm4gL1xcYmJ1blxcYi9pLnRlc3QocHJvY2Vzcy5leGVjUGF0aCkgPyBbcHJvY2Vzcy5leGVjUGF0aF0gOiBbXCJidW5cIl07XG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90KG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzIHtcbiAgcmV0dXJuIHtcbiAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIFwiZGVwZW5kZW5jaWVzXCIpLFxuICAgIGRldkRlcGVuZGVuY2llczogZGVwZW5kZW5jeU1hcChtYW5pZmVzdCwgXCJkZXZEZXBlbmRlbmNpZXNcIiksXG4gICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIFwib3B0aW9uYWxEZXBlbmRlbmNpZXNcIiksXG4gICAgcGVlckRlcGVuZGVuY2llczogZGVwZW5kZW5jeU1hcChtYW5pZmVzdCwgXCJwZWVyRGVwZW5kZW5jaWVzXCIpLFxuICAgIG92ZXJyaWRlczogb3ZlcnJpZGVNYXAobWFuaWZlc3QpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXBlbmRlbmN5TWFwKFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGZpZWxkOiBEZXBlbmRlbmN5RmllbGQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgdmFsdWUgPSBtYW5pZmVzdFtmaWVsZF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSBvdXRbbmFtZV0gPSBzcGVjO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVkRGVwZW5kZW5jaWVzKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBERVBFTkRFTkNZX0ZJRUxEUykgT2JqZWN0LmFzc2lnbihvdXQsIGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIGZpZWxkKSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnaXN0cnlTcGVjaWZpZXIoc3BlYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhL14od29ya3NwYWNlOnxjYXRhbG9nOnxmaWxlOnxsaW5rOnxnaXRcXCt8Z2l0aHViOnxodHRwcz86fG5wbTopL2kudGVzdChzcGVjKTtcbn1cblxuZnVuY3Rpb24gb3ZlcnJpZGVNYXAobWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHZhbHVlID0gbWFuaWZlc3Qub3ZlcnJpZGVzO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiB7fTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikgb3V0W25hbWVdID0gc3BlYztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwaW5QYWNrYWdlKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gb3ZlcnJpZGVNYXAobWFuaWZlc3QpO1xuICBpZiAob3ZlcnJpZGVzW25hbWVdICE9PSB2ZXJzaW9uKSB7XG4gICAgb3ZlcnJpZGVzW25hbWVdID0gdmVyc2lvbjtcbiAgICBtYW5pZmVzdC5vdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gIH1cbiAgZm9yIChjb25zdCBmaWVsZCBvZiBERVBFTkRFTkNZX0ZJRUxEUykge1xuICAgIGNvbnN0IGRlcHMgPSBkZXBlbmRlbmN5TWFwKG1hbmlmZXN0LCBmaWVsZCk7XG4gICAgaWYgKG5hbWUgaW4gZGVwcyAmJiBkZXBzW25hbWVdICE9PSB2ZXJzaW9uICYmIGlzUmVnaXN0cnlTcGVjaWZpZXIoZGVwc1tuYW1lXSA/PyBcIlwiKSkge1xuICAgICAgZGVwc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBtYW5pZmVzdFtmaWVsZF0gPSBkZXBzO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG5mdW5jdGlvbiBuZXdlc3RGaXJzdCh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4udmVyc2lvbnNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PlxuICAgIHJpZ2h0LmxvY2FsZUNvbXBhcmUobGVmdCwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiBcImJhc2VcIiB9KSxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGluRm9yTWlzc2luZyhcbiAgbWlzc2luZzogc3RyaW5nLFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhY2thZ2VJbmZvOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPixcbiAgYXR0ZW1wdGVkOiBTZXQ8c3RyaW5nPixcbik6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHBhY2thZ2VJbmZvKG1pc3NpbmcpO1xuICBpZiAoYXZhaWxhYmxlKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IG5leHRVbnVzZWRWZXJzaW9uKG1pc3NpbmcsIGF2YWlsYWJsZSwgYXR0ZW1wdGVkKTtcbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgYXR0ZW1wdGVkLmFkZChgJHttaXNzaW5nfUAke3ZlcnNpb259YCk7XG4gICAgICByZXR1cm4geyBuYW1lOiBtaXNzaW5nLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwYXJlbnQgb2YgYXdhaXQgcGFyZW50UGFja2FnZXMobWlzc2luZywgbWFuaWZlc3QsIHBhY2thZ2VJbmZvKSkge1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBwYWNrYWdlSW5mbyhwYXJlbnQpO1xuICAgIGlmICghaW5mbykgY29udGludWU7XG4gICAgY29uc3QgdmVyc2lvbiA9IGNvbXBhdGlibGVQYXJlbnRWZXJzaW9uKG1pc3NpbmcsIGluZm8sIGF0dGVtcHRlZCk7XG4gICAgaWYgKCF2ZXJzaW9uKSBjb250aW51ZTtcbiAgICBhdHRlbXB0ZWQuYWRkKGAke3BhcmVudH1AJHt2ZXJzaW9ufWApO1xuICAgIHJldHVybiB7IG5hbWU6IHBhcmVudCwgdmVyc2lvbiB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5leHRVbnVzZWRWZXJzaW9uKFxuICBuYW1lOiBzdHJpbmcsXG4gIGluZm86IFBhY2thZ2VJbmZvLFxuICBhdHRlbXB0ZWQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJlZmVycmVkID0gaW5mby5sYXRlc3RcbiAgICA/IFtpbmZvLmxhdGVzdCwgLi4ubmV3ZXN0Rmlyc3QoaW5mby52ZXJzaW9ucyldXG4gICAgOiBuZXdlc3RGaXJzdChpbmZvLnZlcnNpb25zKTtcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHByZWZlcnJlZCkge1xuICAgIGlmICghYXR0ZW1wdGVkLmhhcyhgJHtuYW1lfUAke3ZlcnNpb259YCkpIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBhdGlibGVQYXJlbnRWZXJzaW9uKFxuICBtaXNzaW5nOiBzdHJpbmcsXG4gIGluZm86IFBhY2thZ2VJbmZvLFxuICBhdHRlbXB0ZWQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIG5ld2VzdEZpcnN0KGluZm8udmVyc2lvbnMpKSB7XG4gICAgaWYgKGF0dGVtcHRlZC5oYXMoYCR7aW5mby5uYW1lfUAke3ZlcnNpb259YCkpIGNvbnRpbnVlO1xuICAgIGlmICghKG1pc3NpbmcgaW4gKGluZm8uZGVwZW5kZW5jaWVzW3ZlcnNpb25dID8/IHt9KSkpIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcmVudFBhY2thZ2VzKFxuICBtaXNzaW5nOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGFja2FnZUluZm86IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+LFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkZWNsYXJlZCA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzKG1hbmlmZXN0KTtcbiAgaWYgKG1pc3NpbmcgaW4gZGVjbGFyZWQgJiYgaXNSZWdpc3RyeVNwZWNpZmllcihkZWNsYXJlZFttaXNzaW5nXSA/PyBcIlwiKSkgcmV0dXJuIFtdO1xuICBjb25zdCBwYXJlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGVjbGFyZWQpKSB7XG4gICAgaWYgKG5hbWUgPT09IG1pc3NpbmcgfHwgIWlzUmVnaXN0cnlTcGVjaWZpZXIoZGVjbGFyZWRbbmFtZV0gPz8gXCJcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBwYWNrYWdlSW5mbyhuYW1lKTtcbiAgICBpZiAoIWluZm8pIGNvbnRpbnVlO1xuICAgIGlmIChPYmplY3QudmFsdWVzKGluZm8uZGVwZW5kZW5jaWVzKS5zb21lKChtYXApID0+IG1pc3NpbmcgaW4gbWFwKSkgcGFyZW50cy5wdXNoKG5hbWUpO1xuICB9XG4gIHJldHVybiBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQYWNrYWdlSW5mb0xvb2t1cCgpOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+PigpO1xuICByZXR1cm4gKG5hbWUpID0+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBjb25zdCBwZW5kaW5nID0gbG9hZFBhY2thZ2VJbmZvKG5hbWUpO1xuICAgIGNhY2hlLnNldChuYW1lLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbih1bmRlZmluZWQsICgpID0+IHtcbiAgICAgIGNhY2hlLmRlbGV0ZShuYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhY2thZ2VJbmZvKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd24oXCJucG1cIiwgW1widmlld1wiLCBuYW1lLCBcIi0tanNvblwiXSwge1xuICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICBlbnY6IHJlZ2lzdHJ5RW52KCksXG4gIH0pO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYWNrdW1lbnQgPSBqc29uLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChwYWNrdW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB2ZXJzaW9ucyA9IHB1Ymxpc2hlZFZlcnNpb25zKHBhY2t1bWVudCk7XG4gIGlmICh2ZXJzaW9ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB2ZXJzaW9ucyxcbiAgICBsYXRlc3Q6IGxhdGVzdFRhZyhwYWNrdW1lbnQpID8/IHZlcnNpb25zLmF0KC0xKSxcbiAgICBkZXBlbmRlbmNpZXM6IHZlcnNpb25EZXBlbmRlbmNpZXMocGFja3VtZW50KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHVibGlzaGVkVmVyc2lvbnMocGFja3VtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBwYWNrdW1lbnQudmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiAhcGFja3VtZW50LnZlcnNpb25zKSB7XG4gICAgcmV0dXJuIFtwYWNrdW1lbnQudmVyc2lvbl07XG4gIH1cbiAgY29uc3QgdmVyc2lvbnMgPSBwYWNrdW1lbnQudmVyc2lvbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KHZlcnNpb25zKSkge1xuICAgIHJldHVybiB2ZXJzaW9ucy5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgaWYgKG9iamVjdC5pc1JlY29yZCh2ZXJzaW9ucykpIHJldHVybiBPYmplY3Qua2V5cyh2ZXJzaW9ucyk7XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gbGF0ZXN0VGFnKHBhY2t1bWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdzID0gcGFja3VtZW50W1wiZGlzdC10YWdzXCJdO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh0YWdzKSB8fCB0eXBlb2YgdGFncy5sYXRlc3QgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YWdzLmxhdGVzdDtcbn1cblxuZnVuY3Rpb24gdmVyc2lvbkRlcGVuZGVuY2llcyhcbiAgcGFja3VtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdmVyc2lvbnMgPSBwYWNrdW1lbnQudmVyc2lvbnM7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZlcnNpb25zKSkge1xuICAgIHJldHVybiB0eXBlb2YgcGFja3VtZW50LnZlcnNpb24gPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBbcGFja3VtZW50LnZlcnNpb25dOiBzdHJpbmdNYXAocGFja3VtZW50LmRlcGVuZGVuY2llcykgfVxuICAgICAgOiB7fTtcbiAgfVxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge307XG4gIGZvciAoY29uc3QgW3ZlcnNpb24sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2ZXJzaW9ucykpIHtcbiAgICBpZiAob2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgb3V0W3ZlcnNpb25dID0gc3RyaW5nTWFwKHZhbHVlLmRlcGVuZGVuY2llcyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTWFwKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSBvdXRbbmFtZV0gPSBzcGVjO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
package/src/._bin.ts
DELETED
|
Binary file
|
package/src/._brand-files.ts
DELETED
|
Binary file
|
package/src/._bundle.ts
DELETED
|
Binary file
|
package/src/._config-utils.ts
DELETED
|
Binary file
|
|
Binary file
|
package/src/._exec.ts
DELETED
|
Binary file
|