@dbx-tools/core 0.3.43 → 0.4.0
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/lib/index.d.ts +11 -0
- package/lib/index.js +12 -0
- package/lib/src/brand.d.ts +105 -0
- package/lib/src/brand.js +66 -0
- package/lib/src/exec.d.ts +149 -0
- package/lib/src/exec.js +483 -0
- package/lib/src/file.d.ts +12 -0
- package/lib/src/file.js +21 -0
- package/lib/src/project.d.ts +54 -0
- package/lib/src/project.js +274 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +10 -6
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
4
|
+
import { hash, json, net, string } from "@dbx-tools/shared-core";
|
|
5
|
+
import { statSync as stat } from "./file.js";
|
|
6
|
+
const ROOT_MARKERS = [
|
|
7
|
+
".projenrc.ts",
|
|
8
|
+
".projenrc.js",
|
|
9
|
+
".projenrc.mjs",
|
|
10
|
+
".projenrc.cjs",
|
|
11
|
+
"package.json",
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* because this is crucial do not use exec.spawnSync
|
|
15
|
+
*
|
|
16
|
+
* Run `command args` in `cwd` and classify its stdout: `path` + `pathStats` when
|
|
17
|
+
* the output names something on disk, `url` (a {@link net.UrlBuilder}) when it
|
|
18
|
+
* parses as a real network URL. Empty {@link ProjectContext} on a non-zero exit
|
|
19
|
+
* or empty output.
|
|
20
|
+
*/
|
|
21
|
+
function projectContextCommandOutput(command, args, cwd) {
|
|
22
|
+
const result = spawnSync(command, args, { cwd, stdio: ["ignore", "pipe", "ignore"] });
|
|
23
|
+
const output = result.stdout.toString().trim();
|
|
24
|
+
if (result.status === 0 && output) {
|
|
25
|
+
const pathStats = stat(output);
|
|
26
|
+
// Only an EXPLICIT `scheme://...` counts as a URL. `urlBuilder` otherwise
|
|
27
|
+
// synthesizes one (a bare `example.com` -> `https://…`, an absolute path ->
|
|
28
|
+
// `http://localhost/…`), which would mislabel directory outputs and bare
|
|
29
|
+
// tokens - so gate on the raw output already carrying a scheme + authority.
|
|
30
|
+
const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(output) ? net.urlBuilder(output) : undefined;
|
|
31
|
+
return { cwd, output, path: pathStats ? output : undefined, pathStats, url };
|
|
32
|
+
}
|
|
33
|
+
return { cwd, output };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* `parseCommand`, memoized per `(command, args, cwd)` - stores the whole
|
|
37
|
+
* {@link ProjectContext}. The cache key is a stable {@link hash.fnvHash} of that
|
|
38
|
+
* tuple (order-sensitive over `args`), so `cwd` is part of the key and a lookup
|
|
39
|
+
* in another directory can't collide with the default-cwd entry.
|
|
40
|
+
*/
|
|
41
|
+
const parsedCommandCache = new Map();
|
|
42
|
+
function projectContextCommand(command, args, cwd) {
|
|
43
|
+
const processCwd = resolve(process.cwd());
|
|
44
|
+
let cacheEnabled;
|
|
45
|
+
if (!cwd) {
|
|
46
|
+
cwd = processCwd;
|
|
47
|
+
cacheEnabled = true;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
cwd = resolve(cwd);
|
|
51
|
+
if (cwd == processCwd) {
|
|
52
|
+
cacheEnabled = true;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
cacheEnabled = false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const cacheKey = cacheEnabled ? hash.fnvHash(command, args) : undefined;
|
|
59
|
+
const cacheHit = cacheKey ? parsedCommandCache.get(cacheKey) : undefined;
|
|
60
|
+
if (cacheHit?.cwd === cwd) {
|
|
61
|
+
return cacheHit;
|
|
62
|
+
}
|
|
63
|
+
const result = projectContextCommandOutput(command, args, cwd);
|
|
64
|
+
if (cacheKey) {
|
|
65
|
+
parsedCommandCache.set(cacheKey, result);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
function npmRoot(cwd) {
|
|
70
|
+
const parsed = projectContextCommand("npm", ["prefix"], cwd);
|
|
71
|
+
return parsed.pathStats?.isDirectory() ? parsed.path : undefined;
|
|
72
|
+
}
|
|
73
|
+
function gitRoot(cwd) {
|
|
74
|
+
const parsed = projectContextCommand("git", ["rev-parse", "--show-toplevel"], cwd);
|
|
75
|
+
return parsed.pathStats?.isDirectory() ? parsed.path : undefined;
|
|
76
|
+
}
|
|
77
|
+
export function root(cwd = process.cwd()) {
|
|
78
|
+
let current = resolve(cwd);
|
|
79
|
+
if (!stat(current)?.isDirectory()) {
|
|
80
|
+
current = dirname(current);
|
|
81
|
+
}
|
|
82
|
+
const boundaries = new Set([npmRoot(cwd), gitRoot(cwd)]
|
|
83
|
+
.filter((path) => path !== undefined)
|
|
84
|
+
.map((path) => resolve(path)));
|
|
85
|
+
const hasBoundary = boundaries.size > 0;
|
|
86
|
+
let best;
|
|
87
|
+
while (true) {
|
|
88
|
+
for (const [priority, marker] of ROOT_MARKERS.entries()) {
|
|
89
|
+
if (stat(join(current, marker))?.isFile()) {
|
|
90
|
+
if (best === undefined ||
|
|
91
|
+
priority < best.priority ||
|
|
92
|
+
(priority === best.priority && current.length < best.dir.length)) {
|
|
93
|
+
best = { dir: current, priority };
|
|
94
|
+
}
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (!hasBoundary && best) {
|
|
99
|
+
return best.dir;
|
|
100
|
+
}
|
|
101
|
+
if (boundaries.has(current)) {
|
|
102
|
+
return best?.dir;
|
|
103
|
+
}
|
|
104
|
+
const parent = dirname(current);
|
|
105
|
+
if (parent === current) {
|
|
106
|
+
return best?.dir;
|
|
107
|
+
}
|
|
108
|
+
current = parent;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Parse a git remote URL (`https://...`, `git@host:owner/repo.git`, etc.) and
|
|
113
|
+
* return the repo segment, stripping any `.git` suffix. Returns `undefined` for
|
|
114
|
+
* empty or unparsable input.
|
|
115
|
+
*/
|
|
116
|
+
export function parseGitRemote(url) {
|
|
117
|
+
const trimmed = url.trim();
|
|
118
|
+
if (!trimmed)
|
|
119
|
+
return undefined;
|
|
120
|
+
const scp = /^[^@]+@[^:]+:(.+)$/i.exec(trimmed);
|
|
121
|
+
if (scp)
|
|
122
|
+
return lastPathSegment(scp[1] ?? "");
|
|
123
|
+
try {
|
|
124
|
+
const normalized = trimmed.replace(/\.git$/i, "");
|
|
125
|
+
const pathname = new URL(normalized).pathname;
|
|
126
|
+
const segment = pathname.split("/").filter(Boolean).at(-1);
|
|
127
|
+
return segment ? lastPathSegment(segment) : undefined;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function lastPathSegment(path) {
|
|
134
|
+
const segment = path.split("/").filter(Boolean).at(-1) ?? path;
|
|
135
|
+
return segment.replace(/\.git$/i, "");
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Yield candidate project-root directories for `cwd`, in priority order: the
|
|
139
|
+
* `npm prefix`, the git top-level, then `cwd` itself. Duplicates are skipped;
|
|
140
|
+
* only existing directories are yielded (except the final `cwd` fallback).
|
|
141
|
+
*/
|
|
142
|
+
export function* resolveProjectRoots(cwd = process.cwd()) {
|
|
143
|
+
const base = resolve(cwd);
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
for (const candidate of [npmRoot(base), gitRoot(base)]) {
|
|
146
|
+
if (!candidate)
|
|
147
|
+
continue;
|
|
148
|
+
const dir = resolve(candidate);
|
|
149
|
+
if (seen.has(dir))
|
|
150
|
+
continue;
|
|
151
|
+
seen.add(dir);
|
|
152
|
+
if (stat(dir)?.isDirectory())
|
|
153
|
+
yield dir;
|
|
154
|
+
}
|
|
155
|
+
if (!seen.has(base))
|
|
156
|
+
yield base;
|
|
157
|
+
}
|
|
158
|
+
/** The nearest ancestor of `cwd` (from {@link resolveProjectRoots}) with a `package.json`. */
|
|
159
|
+
function workspaceRoot(cwd = process.cwd()) {
|
|
160
|
+
let last;
|
|
161
|
+
for (const dir of resolveProjectRoots(cwd)) {
|
|
162
|
+
if (stat(resolve(dir, "package.json"))?.isFile())
|
|
163
|
+
return dir;
|
|
164
|
+
last = dir;
|
|
165
|
+
}
|
|
166
|
+
return last ?? resolve(cwd);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Resolve a human-friendly project name for the repo rooted at `cwd`:
|
|
170
|
+
* `package.json` `name`, then the git remote's repo name, then the root
|
|
171
|
+
* directory's basename.
|
|
172
|
+
*/
|
|
173
|
+
export function name(cwd = process.cwd()) {
|
|
174
|
+
const rootDir = workspaceRoot(cwd);
|
|
175
|
+
const fromPackage = readPackageName(resolve(rootDir, "package.json"));
|
|
176
|
+
if (fromPackage)
|
|
177
|
+
return fromPackage;
|
|
178
|
+
const remote = projectContextCommand("git", ["-C", rootDir, "remote", "get-url", "origin"], rootDir).output;
|
|
179
|
+
const fromGit = remote ? parseGitRemote(remote) : undefined;
|
|
180
|
+
if (fromGit)
|
|
181
|
+
return fromGit;
|
|
182
|
+
return basename(rootDir);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The GitHub CLI's canonical repo URL - the easy path. `gh` already resolves the
|
|
186
|
+
* true host (no ssh-alias parsing) and prints a clean `https://host/owner/repo`.
|
|
187
|
+
* `undefined` when `gh` is absent, unauthenticated, or the dir isn't a GH repo.
|
|
188
|
+
*/
|
|
189
|
+
function repositoryUrlFromGh(cwd) {
|
|
190
|
+
const out = projectContextCommand("gh", ["repo", "view", "--json", "url"], cwd).output;
|
|
191
|
+
return string.trimToNull(json.parseRecord(out)?.url) ?? undefined;
|
|
192
|
+
}
|
|
193
|
+
/** Resolve an ssh host alias (`~/.ssh/config`) to its effective `hostname` via `ssh -G`. */
|
|
194
|
+
function resolveSshHostName(host, cwd) {
|
|
195
|
+
const line = projectContextCommand("ssh", ["-G", host], cwd)
|
|
196
|
+
.output?.split("\n")
|
|
197
|
+
.find((l) => /^hostname\s/i.test(l.trim()));
|
|
198
|
+
const name = line?.trim().split(/\s+/)[1];
|
|
199
|
+
return name && name !== host ? name : undefined;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Fallback: normalize `git remote get-url origin` to a plain
|
|
203
|
+
* `https://host/owner/repo` URL. scp-like / `ssh://` / `git://` /
|
|
204
|
+
* embedded-credential forms are rewritten to https, and an ssh host alias is
|
|
205
|
+
* followed to its real hostname.
|
|
206
|
+
*/
|
|
207
|
+
function repositoryUrlFromGit(cwd) {
|
|
208
|
+
const raw = projectContextCommand("git", ["remote", "get-url", "origin"], cwd).output;
|
|
209
|
+
if (!raw)
|
|
210
|
+
return undefined;
|
|
211
|
+
// Normalize the scheme to https at the string level first: the WHATWG `URL`
|
|
212
|
+
// parser can't convert a non-special scheme (`ssh`/`git`) to `https` (the
|
|
213
|
+
// `protocol` setter no-ops), and scp-like `git@host:owner/repo` isn't a URL at
|
|
214
|
+
// all. Rewrite both into an `https://` string, then let {@link net.urlBuilder}
|
|
215
|
+
// own the structured edits (strip credentials, swap the host).
|
|
216
|
+
let https = raw.replace(/^git\+/, "");
|
|
217
|
+
const scp = /^[^@]+@([^:]+):(.+)$/.exec(https);
|
|
218
|
+
if (scp)
|
|
219
|
+
https = `https://${scp[1]}/${scp[2]}`;
|
|
220
|
+
https = https.replace(/^(ssh|git):\/\//, "https://");
|
|
221
|
+
let builder = net.urlBuilder(https);
|
|
222
|
+
if (!builder)
|
|
223
|
+
return undefined;
|
|
224
|
+
// Drop any embedded `user[:pass]@` credentials.
|
|
225
|
+
if (builder.username || builder.password) {
|
|
226
|
+
builder = builder.with("username", "").with("password", "");
|
|
227
|
+
}
|
|
228
|
+
// Follow an ssh host alias to the true host (so `github-reggie-db` -> `github.com`).
|
|
229
|
+
const realHost = resolveSshHostName(builder.hostname, cwd);
|
|
230
|
+
if (realHost)
|
|
231
|
+
builder = builder.with("hostname", realHost);
|
|
232
|
+
return `${builder.origin}${builder.pathname.replace(/\.git$/, "")}`;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The repo's canonical remote URL, or `undefined` when there is no git remote.
|
|
236
|
+
* Tries `gh repo view` first (host-accurate, no parsing), then normalizes
|
|
237
|
+
* `git remote get-url origin`. Both underlying commands are cached per `cwd` via
|
|
238
|
+
* {@link projectContextCommand}.
|
|
239
|
+
*
|
|
240
|
+
* @param cwd - directory to resolve from (defaults to `process.cwd()`).
|
|
241
|
+
* @param format - `"https"` (default) yields `https://host/owner/repo`;
|
|
242
|
+
* `"npm"` yields npm's `git+https://host/owner/repo.git` form (for a
|
|
243
|
+
* `package.json` `repository.url` that passes npm provenance).
|
|
244
|
+
*/
|
|
245
|
+
export function repositoryUrl(cwd = process.cwd(), format = "https") {
|
|
246
|
+
const https = repositoryUrlFromGh(cwd) ?? repositoryUrlFromGit(cwd);
|
|
247
|
+
if (!https)
|
|
248
|
+
return undefined;
|
|
249
|
+
return format === "npm" ? `git+${https.replace(/\.git$/, "")}.git` : https;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* The active npm registry (`npm config get registry`) as a chainable
|
|
253
|
+
* {@link net.UrlBuilder}, or `undefined` when npm is absent or prints no URL.
|
|
254
|
+
* Cached per `cwd` via {@link projectContextCommand}.
|
|
255
|
+
*/
|
|
256
|
+
export function npmRegistry(cwd) {
|
|
257
|
+
const out = projectContextCommand("npm", ["config", "get", "registry"], cwd).output;
|
|
258
|
+
const trimmed = out?.trim();
|
|
259
|
+
return trimmed && trimmed !== "undefined" ? (net.urlBuilder(trimmed) ?? undefined) : undefined;
|
|
260
|
+
}
|
|
261
|
+
function readPackageName(pkgPath) {
|
|
262
|
+
if (!stat(pkgPath)?.isFile())
|
|
263
|
+
return undefined;
|
|
264
|
+
return string.trimToNull(json.parseRecord(readFileSync(pkgPath, "utf8"))?.name) ?? undefined;
|
|
265
|
+
}
|
|
266
|
+
if (import.meta.main) {
|
|
267
|
+
console.log("npm root:", npmRoot());
|
|
268
|
+
console.log("repo root:", gitRoot());
|
|
269
|
+
console.log("package root:", root());
|
|
270
|
+
console.log("project name:", name());
|
|
271
|
+
console.log("repository url:", repositoryUrl());
|
|
272
|
+
console.log("repository url (npm):", repositoryUrl(process.cwd(), "npm"));
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQVMsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTFDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLGNBQWM7SUFDZCxjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0NBQ04sQ0FBQztBQWtCWDs7Ozs7OztHQU9HO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxPQUFlLEVBQUUsSUFBYyxFQUFFLEdBQVc7SUFDL0UsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQiwwRUFBMEU7UUFDMUUsNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSw0RUFBNEU7UUFDNUUsTUFBTSxHQUFHLEdB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QUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgU3RhdHMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGhhc2gsIGpzb24sIG5ldCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHN0YXRTeW5jIGFzIHN0YXQgfSBmcm9tIFwiLi9maWxlXCI7XG5cbmNvbnN0IFJPT1RfTUFSS0VSUyA9IFtcbiAgXCIucHJvamVucmMudHNcIixcbiAgXCIucHJvamVucmMuanNcIixcbiAgXCIucHJvamVucmMubWpzXCIsXG4gIFwiLnByb2plbnJjLmNqc1wiLFxuICBcInBhY2thZ2UuanNvblwiLFxuXSBhcyBjb25zdDtcblxuLyoqIEEgY29tbWFuZCdzIHN0ZG91dCwgY2xhc3NpZmllZCBhcyBhIGZpbGVzeXN0ZW0gcGF0aCBhbmQvb3IgYSBVUkwuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RDb250ZXh0IHtcbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xuICAvKiogYG91dHB1dGAgd2hlbiBpdCBuYW1lcyBzb21ldGhpbmcgb24gZGlzay4gKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgLyoqIGBmcy5zdGF0YCBvZiB7QGxpbmsgcGF0aH0sIHdoZW4gaXQgZXhpc3RzLiAqL1xuICByZWFkb25seSBwYXRoU3RhdHM/OiBTdGF0cztcbiAgLyoqXG4gICAqIGBvdXRwdXRgIHBhcnNlZCBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBuZXQuVXJsQnVpbGRlcn0sIHdoZW4gaXQgaXMgYSByZWFsXG4gICAqIG5ldHdvcmsgVVJMIC0gYSBub24tYmxhbmsgc2NoZW1lIChub3QgYGZpbGU6YCkgQU5EIGEgbm9uLWJsYW5rIGhvc3RuYW1lLlxuICAgKiBCYXJlIHBhdGhzLCBzY3AtbGlrZSBgZ2l0QGhvc3Q6Li4uYCByZW1vdGVzLCBhbmQgYGZpbGU6YCBVUkxzIHN0YXkgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBuZXQuVXJsQnVpbGRlcjtcbn1cblxuLyoqXG4gKiBiZWNhdXNlIHRoaXMgaXMgY3J1Y2lhbCBkbyBub3QgdXNlIGV4ZWMuc3Bhd25TeW5jXG4gKlxuICogUnVuIGBjb21tYW5kIGFyZ3NgIGluIGBjd2RgIGFuZCBjbGFzc2lmeSBpdHMgc3Rkb3V0OiBgcGF0aGAgKyBgcGF0aFN0YXRzYCB3aGVuXG4gKiB0aGUgb3V0cHV0IG5hbWVzIHNvbWV0aGluZyBvbiBkaXNrLCBgdXJsYCAoYSB7QGxpbmsgbmV0LlVybEJ1aWxkZXJ9KSB3aGVuIGl0XG4gKiBwYXJzZXMgYXMgYSByZWFsIG5ldHdvcmsgVVJMLiBFbXB0eSB7QGxpbmsgUHJvamVjdENvbnRleHR9IG9uIGEgbm9uLXplcm8gZXhpdFxuICogb3IgZW1wdHkgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBQcm9qZWN0Q29udGV4dCB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhjb21tYW5kLCBhcmdzLCB7IGN3ZCwgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpZ25vcmVcIl0gfSk7XG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSAwICYmIG91dHB1dCkge1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IHN0YXQob3V0cHV0KTtcbiAgICAvLyBPbmx5IGFuIEVYUExJQ0lUIGBzY2hlbWU6Ly8uLi5gIGNvdW50cyBhcyBhIFVSTC4gYHVybEJ1aWxkZXJgIG90aGVyd2lzZVxuICAgIC8vIHN5bnRoZXNpemVzIG9uZSAoYSBiYXJlIGBleGFtcGxlLmNvbWAgLT4gYGh0dHBzOi8v4oCmYCwgYW4gYWJzb2x1dGUgcGF0aCAtPlxuICAgIC8vIGBodHRwOi8vbG9jYWxob3N0L+KApmApLCB3aGljaCB3b3VsZCBtaXNsYWJlbCBkaXJlY3Rvcnkgb3V0cHV0cyBhbmQgYmFyZVxuICAgIC8vIHRva2VucyAtIHNvIGdhdGUgb24gdGhlIHJhdyBvdXRwdXQgYWxyZWFkeSBjYXJyeWluZyBhIHNjaGVtZSArIGF1dGhvcml0eS5cbiAgICBjb25zdCB1cmwgPSAvXlthLXpdW2EtejAtOSsuLV0qOlxcL1xcLy9pLnRlc3Qob3V0cHV0KSA/IG5ldC51cmxCdWlsZGVyKG91dHB1dCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgY3dkLCBvdXRwdXQsIHBhdGg6IHBhdGhTdGF0cyA/IG91dHB1dCA6IHVuZGVmaW5lZCwgcGF0aFN0YXRzLCB1cmwgfTtcbiAgfVxuICByZXR1cm4geyBjd2QsIG91dHB1dCB9O1xufVxuXG4vKipcbiAqIGBwYXJzZUNvbW1hbmRgLCBtZW1vaXplZCBwZXIgYChjb21tYW5kLCBhcmdzLCBjd2QpYCAtIHN0b3JlcyB0aGUgd2hvbGVcbiAqIHtAbGluayBQcm9qZWN0Q29udGV4dH0uIFRoZSBjYWNoZSBrZXkgaXMgYSBzdGFibGUge0BsaW5rIGhhc2guZm52SGFzaH0gb2YgdGhhdFxuICogdHVwbGUgKG9yZGVyLXNlbnNpdGl2ZSBvdmVyIGBhcmdzYCksIHNvIGBjd2RgIGlzIHBhcnQgb2YgdGhlIGtleSBhbmQgYSBsb29rdXBcbiAqIGluIGFub3RoZXIgZGlyZWN0b3J5IGNhbid0IGNvbGxpZGUgd2l0aCB0aGUgZGVmYXVsdC1jd2QgZW50cnkuXG4gKi9cbmNvbnN0IHBhcnNlZENvbW1hbmRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9qZWN0Q29udGV4dD4oKTtcblxuZnVuY3Rpb24gcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZD86IHN0cmluZyk6IFByb2plY3RDb250ZXh0IHtcbiAgY29uc3QgcHJvY2Vzc0N3ZCA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIGxldCBjYWNoZUVuYWJsZWQ6IGJvb2xlYW47XG4gIGlmICghY3dkKSB7XG4gICAgY3dkID0gcHJvY2Vzc0N3ZDtcbiAgICBjYWNoZUVuYWJsZWQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGN3ZCA9IHJlc29sdmUoY3dkKTtcbiAgICBpZiAoY3dkID09IHByb2Nlc3NDd2QpIHtcbiAgICAgIGNhY2hlRW5hYmxlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlRW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBjb25zdCBjYWNoZUtleSA9IGNhY2hlRW5hYmxlZCA/IGhhc2guZm52SGFzaChjb21tYW5kLCBhcmdzKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2FjaGVIaXQgPSBjYWNoZUtleSA/IHBhcnNlZENvbW1hbmRDYWNoZS5nZXQoY2FjaGVLZXkpIDogdW5kZWZpbmVkO1xuICBpZiAoY2FjaGVIaXQ/LmN3ZCA9PT0gY3dkKSB7XG4gICAgcmV0dXJuIGNhY2hlSGl0O1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHByb2plY3RDb250ZXh0Q29tbWFuZE91dHB1dChjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBpZiAoY2FjaGVLZXkpIHtcbiAgICBwYXJzZWRDb21tYW5kQ2FjaGUuc2V0KGNhY2hlS2V5LCByZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5wbVJvb3QoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJvamVjdENvbnRleHRDb21tYW5kKFwibnBtXCIsIFtcInByZWZpeFwiXSwgY3dkKTtcbiAgcmV0dXJuIHBhcnNlZC5wYXRoU3RhdHM/LmlzRGlyZWN0b3J5KCkgPyBwYXJzZWQucGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2l0Um9vdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCBjd2QpO1xuICByZXR1cm4gcGFyc2VkLnBhdGhTdGF0cz8uaXNEaXJlY3RvcnkoKSA/IHBhcnNlZC5wYXRoIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9vdChjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudCA9IHJlc29sdmUoY3dkKTtcblxuICBpZiAoIXN0YXQoY3VycmVudCk/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjdXJyZW50ID0gZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICBjb25zdCBib3VuZGFyaWVzID0gbmV3IFNldChcbiAgICBbbnBtUm9vdChjd2QpLCBnaXRSb290KGN3ZCldXG4gICAgICAuZmlsdGVyKChwYXRoKTogcGF0aCBpcyBzdHJpbmcgPT4gcGF0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgocGF0aCkgPT4gcmVzb2x2ZShwYXRoKSksXG4gICk7XG4gIGNvbnN0IGhhc0JvdW5kYXJ5ID0gYm91bmRhcmllcy5zaXplID4gMDtcbiAgbGV0IGJlc3Q6IHsgZGlyOiBzdHJpbmc7IHByaW9yaXR5OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcmlvcml0eSwgbWFya2VyXSBvZiBST09UX01BUktFUlMuZW50cmllcygpKSB7XG4gICAgICBpZiAoc3RhdChqb2luKGN1cnJlbnQsIG1hcmtlcikpPy5pc0ZpbGUoKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYmVzdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgcHJpb3JpdHkgPCBiZXN0LnByaW9yaXR5IHx8XG4gICAgICAgICAgKHByaW9yaXR5ID09PSBiZXN0LnByaW9yaXR5ICYmIGN1cnJlbnQubGVuZ3RoIDwgYmVzdC5kaXIubGVuZ3RoKVxuICAgICAgICApIHtcbiAgICAgICAgICBiZXN0ID0geyBkaXI6IGN1cnJlbnQsIHByaW9yaXR5IH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzQm91bmRhcnkgJiYgYmVzdCkge1xuICAgICAgcmV0dXJuIGJlc3QuZGlyO1xuICAgIH1cbiAgICBpZiAoYm91bmRhcmllcy5oYXMoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBiZXN0Py5kaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG4gICAgaWYgKHBhcmVudCA9PT0gY3VycmVudCkge1xuICAgICAgcmV0dXJuIGJlc3Q/LmRpcjtcbiAgICB9XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGEgZ2l0IHJlbW90ZSBVUkwgKGBodHRwczovLy4uLmAsIGBnaXRAaG9zdDpvd25lci9yZXBvLmdpdGAsIGV0Yy4pIGFuZFxuICogcmV0dXJuIHRoZSByZXBvIHNlZ21lbnQsIHN0cmlwcGluZyBhbnkgYC5naXRgIHN1ZmZpeC4gUmV0dXJucyBgdW5kZWZpbmVkYCBmb3JcbiAqIGVtcHR5IG9yIHVucGFyc2FibGUgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdpdFJlbW90ZSh1cmw6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaW1tZWQgPSB1cmwudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc2NwID0gL15bXkBdK0BbXjpdKzooLispJC9pLmV4ZWModHJpbW1lZCk7XG4gIGlmIChzY3ApIHJldHVybiBsYXN0UGF0aFNlZ21lbnQoc2NwWzFdID8/IFwiXCIpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRyaW1tZWQucmVwbGFjZSgvXFwuZ2l0JC9pLCBcIlwiKTtcbiAgICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwobm9ybWFsaXplZCkucGF0aG5hbWU7XG4gICAgY29uc3Qgc2VnbWVudCA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikuYXQoLTEpO1xuICAgIHJldHVybiBzZWdtZW50ID8gbGFzdFBhdGhTZWdtZW50KHNlZ21lbnQpIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhc3RQYXRoU2VnbWVudChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZWdtZW50ID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmF0KC0xKSA/PyBwYXRoO1xuICByZXR1cm4gc2VnbWVudC5yZXBsYWNlKC9cXC5naXQkL2ksIFwiXCIpO1xufVxuXG4vKipcbiAqIFlpZWxkIGNhbmRpZGF0ZSBwcm9qZWN0LXJvb3QgZGlyZWN0b3JpZXMgZm9yIGBjd2RgLCBpbiBwcmlvcml0eSBvcmRlcjogdGhlXG4gKiBgbnBtIHByZWZpeGAsIHRoZSBnaXQgdG9wLWxldmVsLCB0aGVuIGBjd2RgIGl0c2VsZi4gRHVwbGljYXRlcyBhcmUgc2tpcHBlZDtcbiAqIG9ubHkgZXhpc3RpbmcgZGlyZWN0b3JpZXMgYXJlIHlpZWxkZWQgKGV4Y2VwdCB0aGUgZmluYWwgYGN3ZGAgZmFsbGJhY2spLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIHJlc29sdmVQcm9qZWN0Um9vdHMoY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBjb25zdCBiYXNlID0gcmVzb2x2ZShjd2QpO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIFtucG1Sb290KGJhc2UpLCBnaXRSb290KGJhc2UpXSkge1xuICAgIGlmICghY2FuZGlkYXRlKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSByZXNvbHZlKGNhbmRpZGF0ZSk7XG4gICAgaWYgKHNlZW4uaGFzKGRpcikpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGRpcik7XG4gICAgaWYgKHN0YXQoZGlyKT8uaXNEaXJlY3RvcnkoKSkgeWllbGQgZGlyO1xuICB9XG4gIGlmICghc2Vlbi5oYXMoYmFzZSkpIHlpZWxkIGJhc2U7XG59XG5cbi8qKiBUaGUgbmVhcmVzdCBhbmNlc3RvciBvZiBgY3dkYCAoZnJvbSB7QGxpbmsgcmVzb2x2ZVByb2plY3RSb290c30pIHdpdGggYSBgcGFja2FnZS5qc29uYC4gKi9cbmZ1bmN0aW9uIHdvcmtzcGFjZVJvb3QoY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKTogc3RyaW5nIHtcbiAgbGV0IGxhc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBkaXIgb2YgcmVzb2x2ZVByb2plY3RSb290cyhjd2QpKSB7XG4gICAgaWYgKHN0YXQocmVzb2x2ZShkaXIsIFwicGFja2FnZS5qc29uXCIpKT8uaXNGaWxlKCkpIHJldHVybiBkaXI7XG4gICAgbGFzdCA9IGRpcjtcbiAgfVxuICByZXR1cm4gbGFzdCA/PyByZXNvbHZlKGN3ZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGh1bWFuLWZyaWVuZGx5IHByb2plY3QgbmFtZSBmb3IgdGhlIHJlcG8gcm9vdGVkIGF0IGBjd2RgOlxuICogYHBhY2thZ2UuanNvbmAgYG5hbWVgLCB0aGVuIHRoZSBnaXQgcmVtb3RlJ3MgcmVwbyBuYW1lLCB0aGVuIHRoZSByb290XG4gKiBkaXJlY3RvcnkncyBiYXNlbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hbWUoY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdERpciA9IHdvcmtzcGFjZVJvb3QoY3dkKTtcblxuICBjb25zdCBmcm9tUGFja2FnZSA9IHJlYWRQYWNrYWdlTmFtZShyZXNvbHZlKHJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpKTtcbiAgaWYgKGZyb21QYWNrYWdlKSByZXR1cm4gZnJvbVBhY2thZ2U7XG5cbiAgY29uc3QgcmVtb3RlID0gcHJvamVjdENvbnRleHRDb21tYW5kKFxuICAgIFwiZ2l0XCIsXG4gICAgW1wiLUNcIiwgcm9vdERpciwgXCJyZW1vdGVcIiwgXCJnZXQtdXJsXCIsIFwib3JpZ2luXCJdLFxuICAgIHJvb3REaXIsXG4gICkub3V0cHV0O1xuICBjb25zdCBmcm9tR2l0ID0gcmVtb3RlID8gcGFyc2VHaXRSZW1vdGUocmVtb3RlKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21HaXQpIHJldHVybiBmcm9tR2l0O1xuXG4gIHJldHVybiBiYXNlbmFtZShyb290RGlyKTtcbn1cblxuLyoqXG4gKiBUaGUgR2l0SHViIENMSSdzIGNhbm9uaWNhbCByZXBvIFVSTCAtIHRoZSBlYXN5IHBhdGguIGBnaGAgYWxyZWFkeSByZXNvbHZlcyB0aGVcbiAqIHRydWUgaG9zdCAobm8gc3NoLWFsaWFzIHBhcnNpbmcpIGFuZCBwcmludHMgYSBjbGVhbiBgaHR0cHM6Ly9ob3N0L293bmVyL3JlcG9gLlxuICogYHVuZGVmaW5lZGAgd2hlbiBgZ2hgIGlzIGFic2VudCwgdW5hdXRoZW50aWNhdGVkLCBvciB0aGUgZGlyIGlzbid0IGEgR0ggcmVwby5cbiAqL1xuZnVuY3Rpb24gcmVwb3NpdG9yeVVybEZyb21HaChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXQgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJnaFwiLCBbXCJyZXBvXCIsIFwidmlld1wiLCBcIi0tanNvblwiLCBcInVybFwiXSwgY3dkKS5vdXRwdXQ7XG4gIHJldHVybiBzdHJpbmcudHJpbVRvTnVsbChqc29uLnBhcnNlUmVjb3JkKG91dCk/LnVybCkgPz8gdW5kZWZpbmVkO1xufVxuXG4vKiogUmVzb2x2ZSBhbiBzc2ggaG9zdCBhbGlhcyAoYH4vLnNzaC9jb25maWdgKSB0byBpdHMgZWZmZWN0aXZlIGBob3N0bmFtZWAgdmlhIGBzc2ggLUdgLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNzaEhvc3ROYW1lKGhvc3Q6IHN0cmluZywgY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGluZSA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcInNzaFwiLCBbXCItR1wiLCBob3N0XSwgY3dkKVxuICAgIC5vdXRwdXQ/LnNwbGl0KFwiXFxuXCIpXG4gICAgLmZpbmQoKGwpID0+IC9eaG9zdG5hbWVcXHMvaS50ZXN0KGwudHJpbSgpKSk7XG4gIGNvbnN0IG5hbWUgPSBsaW5lPy50cmltKCkuc3BsaXQoL1xccysvKVsxXTtcbiAgcmV0dXJuIG5hbWUgJiYgbmFtZSAhPT0gaG9zdCA/IG5hbWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmFsbGJhY2s6IG5vcm1hbGl6ZSBgZ2l0IHJlbW90ZSBnZXQtdXJsIG9yaWdpbmAgdG8gYSBwbGFpblxuICogYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYCBVUkwuIHNjcC1saWtlIC8gYHNzaDovL2AgLyBgZ2l0Oi8vYCAvXG4gKiBlbWJlZGRlZC1jcmVkZW50aWFsIGZvcm1zIGFyZSByZXdyaXR0ZW4gdG8gaHR0cHMsIGFuZCBhbiBzc2ggaG9zdCBhbGlhcyBpc1xuICogZm9sbG93ZWQgdG8gaXRzIHJlYWwgaG9zdG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHJlcG9zaXRvcnlVcmxGcm9tR2l0KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcImdpdFwiLCBbXCJyZW1vdGVcIiwgXCJnZXQtdXJsXCIsIFwib3JpZ2luXCJdLCBjd2QpLm91dHB1dDtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBzY2hlbWUgdG8gaHR0cHMgYXQgdGhlIHN0cmluZyBsZXZlbCBmaXJzdDogdGhlIFdIQVRXRyBgVVJMYFxuICAvLyBwYXJzZXIgY2FuJ3QgY29udmVydCBhIG5vbi1zcGVjaWFsIHNjaGVtZSAoYHNzaGAvYGdpdGApIHRvIGBodHRwc2AgKHRoZVxuICAvLyBgcHJvdG9jb2xgIHNldHRlciBuby1vcHMpLCBhbmQgc2NwLWxpa2UgYGdpdEBob3N0Om93bmVyL3JlcG9gIGlzbid0IGEgVVJMIGF0XG4gIC8vIGFsbC4gUmV3cml0ZSBib3RoIGludG8gYW4gYGh0dHBzOi8vYCBzdHJpbmcsIHRoZW4gbGV0IHtAbGluayBuZXQudXJsQnVpbGRlcn1cbiAgLy8gb3duIHRoZSBzdHJ1Y3R1cmVkIGVkaXRzIChzdHJpcCBjcmVkZW50aWFscywgc3dhcCB0aGUgaG9zdCkuXG4gIGxldCBodHRwcyA9IHJhdy5yZXBsYWNlKC9eZ2l0XFwrLywgXCJcIik7XG4gIGNvbnN0IHNjcCA9IC9eW15AXStAKFteOl0rKTooLispJC8uZXhlYyhodHRwcyk7XG4gIGlmIChzY3ApIGh0dHBzID0gYGh0dHBzOi8vJHtzY3BbMV19LyR7c2NwWzJdfWA7XG4gIGh0dHBzID0gaHR0cHMucmVwbGFjZSgvXihzc2h8Z2l0KTpcXC9cXC8vLCBcImh0dHBzOi8vXCIpO1xuXG4gIGxldCBidWlsZGVyID0gbmV0LnVybEJ1aWxkZXIoaHR0cHMpO1xuICBpZiAoIWJ1aWxkZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIERyb3AgYW55IGVtYmVkZGVkIGB1c2VyWzpwYXNzXUBgIGNyZWRlbnRpYWxzLlxuICBpZiAoYnVpbGRlci51c2VybmFtZSB8fCBidWlsZGVyLnBhc3N3b3JkKSB7XG4gICAgYnVpbGRlciA9IGJ1aWxkZXIud2l0aChcInVzZXJuYW1lXCIsIFwiXCIpLndpdGgoXCJwYXNzd29yZFwiLCBcIlwiKTtcbiAgfVxuICAvLyBGb2xsb3cgYW4gc3NoIGhvc3QgYWxpYXMgdG8gdGhlIHRydWUgaG9zdCAoc28gYGdpdGh1Yi1yZWdnaWUtZGJgIC0+IGBnaXRodWIuY29tYCkuXG4gIGNvbnN0IHJlYWxIb3N0ID0gcmVzb2x2ZVNzaEhvc3ROYW1lKGJ1aWxkZXIuaG9zdG5hbWUsIGN3ZCk7XG4gIGlmIChyZWFsSG9zdCkgYnVpbGRlciA9IGJ1aWxkZXIud2l0aChcImhvc3RuYW1lXCIsIHJlYWxIb3N0KTtcblxuICByZXR1cm4gYCR7YnVpbGRlci5vcmlnaW59JHtidWlsZGVyLnBhdGhuYW1lLnJlcGxhY2UoL1xcLmdpdCQvLCBcIlwiKX1gO1xufVxuXG4vKipcbiAqIFRoZSByZXBvJ3MgY2Fub25pY2FsIHJlbW90ZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gZ2l0IHJlbW90ZS5cbiAqIFRyaWVzIGBnaCByZXBvIHZpZXdgIGZpcnN0IChob3N0LWFjY3VyYXRlLCBubyBwYXJzaW5nKSwgdGhlbiBub3JtYWxpemVzXG4gKiBgZ2l0IHJlbW90ZSBnZXQtdXJsIG9yaWdpbmAuIEJvdGggdW5kZXJseWluZyBjb21tYW5kcyBhcmUgY2FjaGVkIHBlciBgY3dkYCB2aWFcbiAqIHtAbGluayBwcm9qZWN0Q29udGV4dENvbW1hbmR9LlxuICpcbiAqIEBwYXJhbSBjd2QgLSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBmcm9tIChkZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWApLlxuICogQHBhcmFtIGZvcm1hdCAtIGBcImh0dHBzXCJgIChkZWZhdWx0KSB5aWVsZHMgYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYDtcbiAqICAgYFwibnBtXCJgIHlpZWxkcyBucG0ncyBgZ2l0K2h0dHBzOi8vaG9zdC9vd25lci9yZXBvLmdpdGAgZm9ybSAoZm9yIGFcbiAqICAgYHBhY2thZ2UuanNvbmAgYHJlcG9zaXRvcnkudXJsYCB0aGF0IHBhc3NlcyBucG0gcHJvdmVuYW5jZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5VXJsKFxuICBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGZvcm1hdDogXCJodHRwc1wiIHwgXCJucG1cIiA9IFwiaHR0cHNcIixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGh0dHBzID0gcmVwb3NpdG9yeVVybEZyb21HaChjd2QpID8/IHJlcG9zaXRvcnlVcmxGcm9tR2l0KGN3ZCk7XG4gIGlmICghaHR0cHMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBmb3JtYXQgPT09IFwibnBtXCIgPyBgZ2l0KyR7aHR0cHMucmVwbGFjZSgvXFwuZ2l0JC8sIFwiXCIpfS5naXRgIDogaHR0cHM7XG59XG5cbi8qKlxuICogVGhlIGFjdGl2ZSBucG0gcmVnaXN0cnkgKGBucG0gY29uZmlnIGdldCByZWdpc3RyeWApIGFzIGEgY2hhaW5hYmxlXG4gKiB7QGxpbmsgbmV0LlVybEJ1aWxkZXJ9LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5wbSBpcyBhYnNlbnQgb3IgcHJpbnRzIG5vIFVSTC5cbiAqIENhY2hlZCBwZXIgYGN3ZGAgdmlhIHtAbGluayBwcm9qZWN0Q29udGV4dENvbW1hbmR9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnBtUmVnaXN0cnkoY3dkPzogc3RyaW5nKTogbmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXQgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJucG1cIiwgW1wiY29uZmlnXCIsIFwiZ2V0XCIsIFwicmVnaXN0cnlcIl0sIGN3ZCkub3V0cHV0O1xuICBjb25zdCB0cmltbWVkID0gb3V0Py50cmltKCk7XG4gIHJldHVybiB0cmltbWVkICYmIHRyaW1tZWQgIT09IFwidW5kZWZpbmVkXCIgPyAobmV0LnVybEJ1aWxkZXIodHJpbW1lZCkgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VOYW1lKHBrZ1BhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc3RhdChwa2dQYXRoKT8uaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBzdHJpbmcudHJpbVRvTnVsbChqc29uLnBhcnNlUmVjb3JkKHJlYWRGaWxlU3luYyhwa2dQYXRoLCBcInV0ZjhcIikpPy5uYW1lKSA/PyB1bmRlZmluZWQ7XG59XG5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnNvbGUubG9nKFwibnBtIHJvb3Q6XCIsIG5wbVJvb3QoKSk7XG4gIGNvbnNvbGUubG9nKFwicmVwbyByb290OlwiLCBnaXRSb290KCkpO1xuICBjb25zb2xlLmxvZyhcInBhY2thZ2Ugcm9vdDpcIiwgcm9vdCgpKTtcbiAgY29uc29sZS5sb2coXCJwcm9qZWN0IG5hbWU6XCIsIG5hbWUoKSk7XG4gIGNvbnNvbGUubG9nKFwicmVwb3NpdG9yeSB1cmw6XCIsIHJlcG9zaXRvcnlVcmwoKSk7XG4gIGNvbnNvbGUubG9nKFwicmVwb3NpdG9yeSB1cmwgKG5wbSk6XCIsIHJlcG9zaXRvcnlVcmwocHJvY2Vzcy5jd2QoKSwgXCJucG1cIikpO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/brand.ts","../src/exec.ts","../src/file.ts","../src/project.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -12,23 +12,27 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"yaml": "^2.9.0",
|
|
15
|
-
"@dbx-tools/shared-core": "0.
|
|
15
|
+
"@dbx-tools/shared-core": "0.4.0"
|
|
16
16
|
},
|
|
17
|
-
"main": "index.
|
|
17
|
+
"main": "./lib/index.js",
|
|
18
18
|
"license": "UNLICENSED",
|
|
19
19
|
"publishConfig": {
|
|
20
20
|
"access": "public"
|
|
21
21
|
},
|
|
22
|
-
"version": "0.
|
|
23
|
-
"types": "index.ts",
|
|
22
|
+
"version": "0.4.0",
|
|
23
|
+
"types": "./lib/index.d.ts",
|
|
24
24
|
"type": "module",
|
|
25
25
|
"exports": {
|
|
26
|
-
".":
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./lib/index.d.ts",
|
|
28
|
+
"default": "./lib/index.js"
|
|
29
|
+
},
|
|
27
30
|
"./package.json": "./package.json"
|
|
28
31
|
},
|
|
29
32
|
"files": [
|
|
30
33
|
"index.ts",
|
|
31
|
-
"src"
|
|
34
|
+
"src",
|
|
35
|
+
"lib"
|
|
32
36
|
],
|
|
33
37
|
"dbxToolsConfig": {
|
|
34
38
|
"tags": [
|