@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.
@@ -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.3.43"
15
+ "@dbx-tools/shared-core": "0.4.0"
16
16
  },
17
- "main": "index.ts",
17
+ "main": "./lib/index.js",
18
18
  "license": "UNLICENSED",
19
19
  "publishConfig": {
20
20
  "access": "public"
21
21
  },
22
- "version": "0.3.43",
23
- "types": "index.ts",
22
+ "version": "0.4.0",
23
+ "types": "./lib/index.d.ts",
24
24
  "type": "module",
25
25
  "exports": {
26
- ".": "./index.ts",
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": [