@dbx-tools/cli 0.6.15 → 0.6.34
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/src/bootstrap.js +62 -8
- package/lib/src/pnpm.d.ts +16 -1
- package/lib/src/pnpm.js +117 -8
- package/package.json +3 -3
- package/src/bootstrap.ts +66 -7
- package/src/pnpm.ts +123 -7
package/lib/src/bootstrap.js
CHANGED
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { createRequire } from "node:module";
|
|
7
8
|
import { join } from "node:path";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
9
|
import { intro, outro } from "@clack/prompts";
|
|
10
|
-
import { exec } from "@dbx-tools/core";
|
|
11
|
-
import { json } from "@dbx-tools/shared-core";
|
|
12
|
-
import { resolvePnpmArgv, runPnpm } from "./pnpm.js";
|
|
10
|
+
import { exec, project } from "@dbx-tools/core";
|
|
11
|
+
import { json, log } from "@dbx-tools/shared-core";
|
|
12
|
+
import { childEnv, resolvePnpmArgv, runPnpm } from "./pnpm.js";
|
|
13
13
|
import { rootLabel } from "./root.js";
|
|
14
|
+
const logger = log.logger("dbx-tools:bootstrap");
|
|
15
|
+
/** Published package name used for Node's self-reference manifest resolution. */
|
|
16
|
+
const CLI_PACKAGE = "@dbx-tools/cli";
|
|
14
17
|
/** Fallback when this CLI's own version isn't a real release (an in-repo `0.0.0`). */
|
|
15
18
|
const FALLBACK_PROJEN_SPECIFIER = "@dbx-tools/projen@latest";
|
|
16
19
|
/**
|
|
@@ -35,7 +38,12 @@ function defaultProjenSpecifier() {
|
|
|
35
38
|
/** This CLI's own released version, or `undefined` for an in-repo `0.0.0` build. */
|
|
36
39
|
function ownVersion() {
|
|
37
40
|
try {
|
|
38
|
-
|
|
41
|
+
// Resolve through the package's exported `./package.json`, which works from
|
|
42
|
+
// both source (`src/bootstrap.ts`) and published output
|
|
43
|
+
// (`lib/src/bootstrap.js`). A relative URL is one level from the manifest
|
|
44
|
+
// in source but two levels away after compilation and silently fell back to
|
|
45
|
+
// `@latest` in every installed CLI.
|
|
46
|
+
const manifestPath = createRequire(import.meta.url).resolve(`${CLI_PACKAGE}/package.json`);
|
|
39
47
|
const version = json.parseRecord(readFileSync(manifestPath, "utf8"))?.version;
|
|
40
48
|
return typeof version === "string" && version !== "0.0.0" ? version : undefined;
|
|
41
49
|
}
|
|
@@ -139,7 +147,50 @@ export function seedToolchain(root, projenSpecifier = defaultProjenSpecifier())
|
|
|
139
147
|
if (!existsSync(workspaceFile)) {
|
|
140
148
|
writeFileSync(workspaceFile, WORKSPACE_SEED);
|
|
141
149
|
}
|
|
142
|
-
|
|
150
|
+
seedRegistry(root);
|
|
151
|
+
const kernelArch = exec.spawnSync("uname", ["-m"], {
|
|
152
|
+
stdin: "ignore",
|
|
153
|
+
stdout: "capture",
|
|
154
|
+
stderr: "ignore",
|
|
155
|
+
}).stdout;
|
|
156
|
+
logger.info("seeding toolchain", {
|
|
157
|
+
node: process.version,
|
|
158
|
+
platform: process.platform,
|
|
159
|
+
arch: process.arch,
|
|
160
|
+
kernelArch: kernelArch || "unknown",
|
|
161
|
+
engine: projenSpecifier,
|
|
162
|
+
});
|
|
163
|
+
runPnpm([
|
|
164
|
+
"add",
|
|
165
|
+
"--reporter=append-only",
|
|
166
|
+
"-D",
|
|
167
|
+
"projen",
|
|
168
|
+
"typescript@^5.9.3",
|
|
169
|
+
"tsx@^4.23.0",
|
|
170
|
+
projenSpecifier,
|
|
171
|
+
], root);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Pin a non-default registry into the new root's `.npmrc`.
|
|
175
|
+
*
|
|
176
|
+
* The CLI already forces `--registry` onto the pnpm invocations it makes itself,
|
|
177
|
+
* but a bootstrapped workspace outlives this process: every later `pnpm install`
|
|
178
|
+
* the developer (or projen's post-synth step) runs is on its own. pnpm ignores
|
|
179
|
+
* `npm_config_registry` from the environment, so without a file on disk those
|
|
180
|
+
* runs revert to `https://registry.npmjs.org/` - which is a hard failure where
|
|
181
|
+
* the custom registry was the only reachable one.
|
|
182
|
+
*
|
|
183
|
+
* Only writes for an actual override, never creates a file just to name npmjs,
|
|
184
|
+
* and never overwrites an existing `.npmrc` (the developer's own wins).
|
|
185
|
+
*/
|
|
186
|
+
function seedRegistry(root) {
|
|
187
|
+
const registry = project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString();
|
|
188
|
+
if (!registry)
|
|
189
|
+
return;
|
|
190
|
+
const npmrc = join(root, ".npmrc");
|
|
191
|
+
if (existsSync(npmrc))
|
|
192
|
+
return;
|
|
193
|
+
writeFileSync(npmrc, `registry=${registry}\n`);
|
|
143
194
|
}
|
|
144
195
|
/**
|
|
145
196
|
* Make what `pnpm init` produced safe to synth against. Two corrections, both
|
|
@@ -177,10 +228,13 @@ function normalizeSeedManifest(manifestPath) {
|
|
|
177
228
|
*/
|
|
178
229
|
export function runInitialSynth(root) {
|
|
179
230
|
const [command, ...prefix] = resolvePnpmArgv();
|
|
231
|
+
// No `--registry` here: this is `pnpm exec`, whose trailing arguments belong to
|
|
232
|
+
// tsx. The registry reaches anything nested through `childEnv` and the seeded
|
|
233
|
+
// `.npmrc` instead.
|
|
180
234
|
exec.spawnSync(command, [...prefix, "exec", "tsx", ".projenrc.ts"], {
|
|
181
235
|
cwd: root,
|
|
182
|
-
env: {
|
|
236
|
+
env: childEnv({ PROJEN_DISABLE_POST: "true" }),
|
|
183
237
|
check: true,
|
|
184
238
|
});
|
|
185
239
|
}
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxzRkFBc0Y7QUFDdEYsTUFBTSx5QkFBeUIsR0FBRywwQkFBMEIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQzdCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO0FBQy9FLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsU0FBUyxVQUFVO0lBQ2pCLElBQUksQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQzlFLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGVBQWUsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMzQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsbUVBQW1FO0FBQ25FLFNBQVMsc0JBQXNCLENBQUMsSUFBWTtJQUMxQyxJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUMxRSxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDM0QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBQVk7SUFDOUMsTUFBTSxRQUFRLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDOUIsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPO0lBQ3RCLE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLElBQUksU0FBUyxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU87SUFDbkUsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxpRkFBaUY7QUFDakYsMEVBQTBFO0FBQzFFLDREQUE0RDtBQUM1RCxNQUFNLGlCQUFpQixHQUFHOzs7O0NBSXpCLENBQUM7QUFFRixnR0FBZ0c7QUFDaEcsTUFBTSxjQUFjLEdBQUc7OztDQUd0QixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLElBQVksRUFDWixrQkFBMEIsc0JBQXNCLEVBQUU7SUFFbEQsS0FBSyxDQUFDLHdDQUF3QyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWpFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUIsYUFBYSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEIsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlELEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixJQUFZLEVBQ1osa0JBQTBCLHNCQUFzQixFQUFFO0lBRWxELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hCLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDeEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQy9CLGFBQWEsQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFlBQW9CO0lBQ2pELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDekIsYUFBYSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUU7UUFDbEUsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFO1FBQ3BELEtBQUssRUFBRSxJQUFJO0tBQ1osQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQm9vdHN0cmFwIGEgYnJhbmQtbmV3IGZvbGRlciBpbnRvIGEgd29ya2luZyBkYngtdG9vbHMgd29ya3NwYWNlIGJlZm9yZSBwcm9qZW4gcnVucy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHsgaW50cm8sIG91dHJvIH0gZnJvbSBcIkBjbGFjay9wcm9tcHRzXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsganNvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyByZXNvbHZlUG5wbUFyZ3YsIHJ1blBucG0gfSBmcm9tIFwiLi9wbnBtLnRzXCI7XG5pbXBvcnQgeyByb290TGFiZWwgfSBmcm9tIFwiLi9yb290LnRzXCI7XG5cbi8qKiBGYWxsYmFjayB3aGVuIHRoaXMgQ0xJJ3Mgb3duIHZlcnNpb24gaXNuJ3QgYSByZWFsIHJlbGVhc2UgKGFuIGluLXJlcG8gYDAuMC4wYCkuICovXG5jb25zdCBGQUxMQkFDS19QUk9KRU5fU1BFQ0lGSUVSID0gXCJAZGJ4LXRvb2xzL3Byb2plbkBsYXRlc3RcIjtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBlbmdpbmUgYXQgVEhJUyBDTEkncyBvd24gdmVyc2lvbi4gVGhlIHR3byBhcmUgcmVsZWFzZWQgdG9nZXRoZXIgYnlcbiAqIHRoZSByb290IGBidW1wYCwgc28gdGhlIG1hdGNoaW5nIGVuZ2luZSBhbHdheXMgZXhpc3RzIG9uIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBOb3QgYEBsYXRlc3RgLCBhbmQgbm90IGEgYmFyZSBgQGRieC10b29scy9wcm9qZW5gLiBBIGJhcmUgc3BlY2lmaWVyIGNhbiBsYW5kIG9uXG4gKiBhIHN0cmF5IGAwLjAuMGAsIHdob3NlIGBeMC4wLjBgIGNhcmV0IHRoZW4gcmVhY2hlcyBubyByZWFsIHJlbGVhc2UuIGBAbGF0ZXN0YFxuICogaGFzIGEgc3VidGxlciBmYWlsdXJlOiBwbnBtIDExIGFwcGxpZXMgYSBgbWluaW11bVJlbGVhc2VBZ2VgIGRlbGF5LCBzbyBmb3IgdGhlXG4gKiBmaXJzdCBkYXkgYWZ0ZXIgYSByZWxlYXNlIGl0IGRlbGliZXJhdGVseSByZXNvbHZlcyBhIGRpc3QtdGFnIHRvIHRoZSBuZXdlc3RcbiAqIHZlcnNpb24gT0xERVIgdGhhbiB0aGUgdGhyZXNob2xkIGFuZCBtZXJlbHkgbm90ZXMgdGhlIG5ld2VyIG9uZVxuICogKGArIEBkYngtdG9vbHMvcHJvamVuIDAuMS4yNCAoMC4zLjQyIGlzIGF2YWlsYWJsZSlgKS4gQSBib290c3RyYXAgcnVuIHJpZ2h0XG4gKiBhZnRlciBhIHJlbGVhc2UgdGhlcmVmb3JlIGluc3RhbGxlZCBhIG1vbnRocy1vbGQgZW5naW5lIGFnYWluc3QgYSBjdXJyZW50IENMSSxcbiAqIHdoaWNoIGlzIGhvdyBgc3luYyAtLXdhdGNoYCBkaWVkIG9uIGFuIGVuZ2luZSBwcmVkYXRpbmcgaXRzIGBjb25jdXJyZW50bHlgXG4gKiBkZXBlbmRlbmN5LiBBbiBleHBsaWNpdCByYW5nZSBhZG1pdHMgb25seSB0aGUgdmVyc2lvbiB3ZSB3YW50LCBzbyB0aGUgYWdlXG4gKiBoZXVyaXN0aWMgaGFzIG5vdGhpbmcgb2xkZXIgdG8gZmFsbCBiYWNrIHRvLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb24gPSBvd25WZXJzaW9uKCk7XG4gIHJldHVybiB2ZXJzaW9uID8gYEBkYngtdG9vbHMvcHJvamVuQF4ke3ZlcnNpb259YCA6IEZBTExCQUNLX1BST0pFTl9TUEVDSUZJRVI7XG59XG5cbi8qKiBUaGlzIENMSSdzIG93biByZWxlYXNlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gaW4tcmVwbyBgMC4wLjBgIGJ1aWxkLiAqL1xuZnVuY3Rpb24gb3duVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGZpbGVVUkxUb1BhdGgobmV3IFVSTChcIi4uL3BhY2thZ2UuanNvblwiLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0ZjhcIikpPy52ZXJzaW9uO1xuICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiB2ZXJzaW9uICE9PSBcIjAuMC4wXCIgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDb21wYXJlIGB4LnkuemAgdHJpcGxlczsgcmV0dXJucyA8MCwgMCwgb3IgPjAuIE1pc3NpbmcgcGFydHMgY291bnQgYXMgMC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhcnRzID0gKHY6IHN0cmluZykgPT4gdi5zcGxpdChcIi5cIikubWFwKChwKSA9PiBOdW1iZXIucGFyc2VJbnQocCwgMTApIHx8IDApO1xuICBjb25zdCBbeCwgeV0gPSBbcGFydHMoYSksIHBhcnRzKGIpXTtcbiAgcmV0dXJuIHhbMF0gLSB5WzBdIHx8IHhbMV0gLSB5WzFdIHx8IHhbMl0gLSB5WzJdO1xufVxuXG4vKiogVmVyc2lvbiBvZiB0aGUgZW5naW5lIGN1cnJlbnRseSBpbnN0YWxsZWQgYXQgYHJvb3RgLCBpZiBhbnkuICovXG5mdW5jdGlvbiBpbnN0YWxsZWRFbmdpbmVWZXJzaW9uKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGRieC10b29sc1wiLCBcInByb2plblwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3QsIFwidXRmOFwiKSk/LnZlcnNpb247XG4gICAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSBcInN0cmluZ1wiID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFVwZ3JhZGUgYW4gZXN0YWJsaXNoZWQgd29ya3NwYWNlIHdob3NlIGluc3RhbGxlZCBlbmdpbmUgcHJlZGF0ZXMgdGhpcyBDTEkuXG4gKlxuICogQm9vdHN0cmFwcGluZyBwaW5zIHRoZSBlbmdpbmUgb25jZSwgYW5kIG5vdGhpbmcgYWZ0ZXJ3YXJkcyByZXZpc2l0cyBpdCAtIHNvIGFcbiAqIHdvcmtzcGFjZSBjcmVhdGVkIG1vbnRocyBhZ28ga2VwdCByZXNvbHZpbmcgaXRzIG9yaWdpbmFsIGVuZ2luZSBubyBtYXR0ZXIgaG93XG4gKiBjdXJyZW50IHRoZSBDTEkgaW52b2tpbmcgaXQgd2FzLCBhbmQgZmFpbGVkIGluc2lkZSB0aGUgT0xEIGVuZ2luZSdzIGNvZGVcbiAqIChgc3luYyAtLXdhdGNoYCBkeWluZyBvbiBhIGBjb25jdXJyZW50bHlgIHRoYXQgZW5naW5lIG5ldmVyIGRlY2xhcmVkKS4gVGhlIHR3b1xuICogYXJlIHJlbGVhc2VkIGluIGxvY2tzdGVwLCBzbyB0aGlzIENMSSdzIHZlcnNpb24gaXMgZXhhY3RseSB0aGUgZW5naW5lIGl0XG4gKiBleHBlY3RzLlxuICpcbiAqIE9ubHkgZXZlciBtb3ZlcyBGT1JXQVJEOiBhbiBlbmdpbmUgYXQgb3IgYWhlYWQgb2YgdGhpcyBDTEkgaXMgbGVmdCBhbG9uZSwgc29cbiAqIGFuIG9sZGVyIENMSSBjYW5ub3QgZG93bmdyYWRlIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5naW5lQ3VycmVudChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWQgPSBvd25WZXJzaW9uKCk7XG4gIGlmICghZXhwZWN0ZWQpIHJldHVybjtcbiAgY29uc3QgaW5zdGFsbGVkID0gaW5zdGFsbGVkRW5naW5lVmVyc2lvbihyb290KTtcbiAgaWYgKGluc3RhbGxlZCAmJiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkLCBleHBlY3RlZCkgPj0gMCkgcmV0dXJuO1xuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIGRlZmF1bHRQcm9qZW5TcGVjaWZpZXIoKV0sIHJvb3QpO1xufVxuXG4vLyBSZWFjaCB0aGUgY2xhc3MgdGhyb3VnaCBpdHMgbW9kdWxlIE5BTUVTUEFDRS4gQ3VycmVudCBlbmdpbmVzIGFsc28gaG9pc3QgaXRcbi8vIGZsYXQsIGJ1dCBldmVyeSBlbmdpbmUgZXZlciBwdWJsaXNoZWQgZXhwb3J0cyB0aGUgbmFtZXNwYWNlLCBhbmQgdGhpcyB0ZW1wbGF0ZVxuLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCBgQGxhdGVzdGAgLSBhIGZsYXQgaW1wb3J0IGRpZXMgb24gYW4gb2xkZXIgb25lIHdpdGhcbi8vIFwiZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJ0RCWFRvb2xzTm9kZVByb2plY3QnXCIuXG5jb25zdCBQUk9KRU5SQ19URU1QTEFURSA9IGBpbXBvcnQgeyBwcm9qZWN0IGFzIHByb2plY3RBcGkgfSBmcm9tIFwiQGRieC10b29scy9wcm9qZW5cIjtcblxuY29uc3QgcHJvamVjdCA9IG5ldyBwcm9qZWN0QXBpLkRCWFRvb2xzTm9kZVByb2plY3QoKTtcbnByb2plY3Quc3ludGgoKTtcbmA7XG5cbi8qKiBTZWVkIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBzbyB0aGUgZmlyc3QgXFxgcG5wbSBhZGRcXGAgY2FuIGFsbG93IGVzYnVpbGQgbm9uLWludGVyYWN0aXZlbHkuICovXG5jb25zdCBXT1JLU1BBQ0VfU0VFRCA9IGBwYWNrYWdlczogW11cbmFsbG93QnVpbGRzOlxuICBlc2J1aWxkOiB0cnVlXG5gO1xuXG4vKipcbiAqIFR1cm4gYSBmb2xkZXIgaW50byBhIGZ1bmN0aW9uaW5nIGRieC10b29scyB3b3Jrc3BhY2U6IGBwbnBtIGluaXRgLCBzZWVkXG4gKiBgcG5wbS13b3Jrc3BhY2UueWFtbGAsIGFkZCBgcHJvamVuYC9gdHlwZXNjcmlwdGAvYHRzeGAgKyB0aGUgZW5naW5lIHBhY2thZ2UsXG4gKiB3cml0ZSBhIG1pbmltYWwgYC5wcm9qZW5yYy50c2AsIHN5bnRoIG9uY2UgKHdpdGggYFBST0pFTl9ESVNBQkxFX1BPU1RgKSwgdGhlblxuICogaW5zdGFsbC4gRG9lcyBub3QgcnVuIGJhcnJlbHMgLSBydW4gYHBucG0gcnVuIGJhcnJlbHNgIG9yIGEgZnVsbCBwcm9qZW4gc3ludGhcbiAqIHBvc3QtaW5zdGFsbCB0byBnZW5lcmF0ZSBwYWNrYWdlIGJhcnJlbHMuXG4gKlxuICogRXZlcnkgc3RlcCBpcyBpZGVtcG90ZW50IGFuZCBzZWxmLWd1YXJkZWQsIHNvIHRoaXMgaXMgc2FmZSB0byBydW4gYWdhaW5zdCBhXG4gKiBmb2xkZXIgdGhhdCBBTFJFQURZIGhhcyBhIGhhbmQtYXV0aG9yZWQgYC5wcm9qZW5yYy50c2AgKGFuZCBldmVuIGEgY29tbWl0dGVkXG4gKiBgcGFja2FnZS5qc29uYCkgYnV0IGlzIG1pc3NpbmcgdGhlIGluc3RhbGxlZCB0b29sY2hhaW4gLSBlLmcuIGEgZnJlc2hseSBjb3BpZWRcbiAqIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzIChpbmNsdWRpbmcgbWFuaWZlc3RzKSBhcmUgZ2l0aWdub3JlZC4gSW4gdGhhdFxuICogY2FzZSBgcG5wbSBpbml0YCBhbmQgdGhlIGAucHJvamVucmMudHNgIHNjYWZmb2xkIGFyZSBza2lwcGVkLCBidXQgdGhlIGVuZ2luZSArXG4gKiBwcm9qZW4gKyB0c3ggYXJlIChyZSlpbnN0YWxsZWQgc28gdGhlIHN1YnNlcXVlbnQgc3ludGggY2FuIHJlZ2VuZXJhdGVcbiAqIGV2ZXJ5dGhpbmcuIFNlZSB7QGxpbmsgc2VlZFRvb2xjaGFpbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBXb3Jrc3BhY2UoXG4gIHJvb3Q6IHN0cmluZyxcbiAgcHJvamVuU3BlY2lmaWVyOiBzdHJpbmcgPSBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCksXG4pOiB2b2lkIHtcbiAgaW50cm8oYEJvb3RzdHJhcHBpbmcgZGJ4LXRvb2xzIHdvcmtzcGFjZSBpbiAke3Jvb3RMYWJlbChyb290KX1gKTtcblxuICBzZWVkVG9vbGNoYWluKHJvb3QsIHByb2plblNwZWNpZmllcik7XG5cbiAgY29uc3QgcHJvamVucmMgPSBqb2luKHJvb3QsIFwiLnByb2plbnJjLnRzXCIpO1xuICBpZiAoIWV4aXN0c1N5bmMocHJvamVucmMpKSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9qZW5yYywgUFJPSkVOUkNfVEVNUExBVEUpO1xuICB9XG5cbiAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuXG4gIHJ1blBucG0oW1wiaW5zdGFsbFwiLCBcIi0tbm8tZnJvemVuLWxvY2tmaWxlXCIsIFwiLS1mb3JjZVwiXSwgcm9vdCk7XG4gIG91dHJvKFwiV29ya3NwYWNlIHJlYWR5IC0gcmUtcnVuIGRieC10b29scyBvciBhZGQgcGFja2FnZXMgdW5kZXIgcGFja2FnZXMvXCIpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIHRvb2xjaGFpbiBhIHN5bnRoIG5lZWRzIChgcHJvamVuYCwgYHR5cGVzY3JpcHRgLCBgdHN4YCwgYW5kIHRoZVxuICogZGJ4LXRvb2xzIGVuZ2luZSksIHNlZWRpbmcgYSBgcGFja2FnZS5qc29uYCBhbmQgYHBucG0td29ya3NwYWNlLnlhbWxgIGZpcnN0XG4gKiB3aGVuIGFic2VudC4gSWRlbXBvdGVudDogcnVuIGl0IHdoZW5ldmVyIHRoZSBlbmdpbmUgaXMgbWlzc2luZywgc28gYSBjb3BpZWRcbiAqIHByb2plY3Qgd2l0aCBhIGAucHJvamVucmMudHNgIGJ1dCBubyBgbm9kZV9tb2R1bGVzYC9tYW5pZmVzdHMgY2FuIGJlIGJyb3VnaHRcbiAqIHVwIHRvIGEgc3ludGgtcmVhZHkgc3RhdGUgd2l0aG91dCBmdWxsIGJvb3RzdHJhcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkVG9vbGNoYWluKFxuICByb290OiBzdHJpbmcsXG4gIHByb2plblNwZWNpZmllcjogc3RyaW5nID0gZGVmYXVsdFByb2plblNwZWNpZmllcigpLFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcnVuUG5wbShbXCJpbml0XCJdLCByb290KTtcbiAgICBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZUZpbGUgPSBqb2luKHJvb3QsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKHdvcmtzcGFjZUZpbGUpKSB7XG4gICAgd3JpdGVGaWxlU3luYyh3b3Jrc3BhY2VGaWxlLCBXT1JLU1BBQ0VfU0VFRCk7XG4gIH1cblxuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIFwicHJvamVuXCIsIFwidHlwZXNjcmlwdEBeNS45LjNcIiwgXCJ0c3hAXjQuMjMuMFwiLCBwcm9qZW5TcGVjaWZpZXJdLCByb290KTtcbn1cblxuLyoqXG4gKiBNYWtlIHdoYXQgYHBucG0gaW5pdGAgcHJvZHVjZWQgc2FmZSB0byBzeW50aCBhZ2FpbnN0LiBUd28gY29ycmVjdGlvbnMsIGJvdGhcbiAqIGJlY2F1c2UgdGhhdCBvdXRwdXQgdmFyaWVzIGJ5IHBucG0gdmVyc2lvbjpcbiAqXG4gKiAgIC0gZHJvcCBgZGV2RW5naW5lc2AsIHdoaWNoIHBucG0gMTEgc2VlZHMgYXMgYHBhY2thZ2VNYW5hZ2VyOiB7IG5hbWU6IFwicG5wbVwiLFxuICogICAgIG9uRmFpbDogXCJkb3dubG9hZFwiIH1gLiBBbnkgbnBtLWJhc2VkIHRvb2wgbGF0ZXIgaW4gdGhlIGNoYWluIChhblxuICogICAgIGBucHhgL2RseCBmYWxsYmFjaykgdGhlbiByZWZ1c2VzIHdpdGggRUJBRERFVkVOR0lORVMsIGl0cyBydW5uZXIgYmVpbmcgbnBtO1xuICogICAtIGZvcmNlIGB0eXBlOiBcIm1vZHVsZVwiYCwgd2hpY2ggcG5wbSAxMSB3cml0ZXMgYW5kIHBucG0gMTAgZG9lcyBub3QuIHRzeFxuICogICAgIHBpY2tzIHRoZSBlbnRyeSdzIGZvcm1hdCBmcm9tIHRoZSBuZWFyZXN0IG1hbmlmZXN0LCBzbyB3aXRob3V0IGl0XG4gKiAgICAgYC5wcm9qZW5yYy50c2AgbG9hZHMgYXMgQ0pTIGFuZCB0aGUgZmlyc3QgZGVwZW5kZW5jeSB1c2luZyB0b3AtbGV2ZWwgYXdhaXRcbiAqICAgICBkaWVzIG9uIFwibm90IHN1cHBvcnRlZCB3aXRoIHRoZSBjanMgb3V0cHV0IGZvcm1hdFwiLlxuICpcbiAqIHByb2plbiByZWdlbmVyYXRlcyB0aGUgd2hvbGUgbWFuaWZlc3QgYXQgc3ludGgsIHNvIHRoaXMgb25seSBoYXMgdG8gaG9sZCB0aGVcbiAqIHNlZWQgdG9nZXRoZXIgbG9uZyBlbm91Z2ggdG8gZ2V0IHRoZXJlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2VSZWNvcmQocmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm47XG4gICAgZGVsZXRlIG1hbmlmZXN0LmRldkVuZ2luZXM7XG4gICAgbWFuaWZlc3QudHlwZSA9IFwibW9kdWxlXCI7XG4gICAgd3JpdGVGaWxlU3luYyhtYW5pZmVzdFBhdGgsIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBtYWxmb3JtZWQvYWJzZW50IG1hbmlmZXN0IGhlcmUganVzdCBtZWFucyB0aGUgbGF0ZXIgYHBucG0gYWRkYCByZWNyZWF0ZXMgaXQuXG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gdGhlIGluaXRpYWwgc3ludGggYnkgZXhlY3V0aW5nIGAucHJvamVucmMudHNgIGRpcmVjdGx5IHdpdGggdHN4ICh3aXRoXG4gKiBgUFJPSkVOX0RJU0FCTEVfUE9TVGAgc2V0KSwgTk9UIGBwcm9qZW4gPHRhc2s+YC4gVXNlIHJpZ2h0IGFmdGVyIHNlZWRpbmcgYVxuICogZnJlc2ggd29ya3NwYWNlOiB0aGUgcHJvamVuIFRBU0tTIChgc3luY2AsIGBiYXJyZWxzYCwgLi4uKSBvbmx5IGV4aXN0IG9uY2VcbiAqIGAucHJvamVucmMudHNgIGhhcyBydW4gb25jZSwgc28gYHByb2plbiBzeW5jYCBjYW4ndCBiZSB0aGUgYm9vdHN0cmFwcGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuSW5pdGlhbFN5bnRoKHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IHJlc29sdmVQbnBtQXJndigpO1xuICBleGVjLnNwYXduU3luYyhjb21tYW5kLCBbLi4ucHJlZml4LCBcImV4ZWNcIiwgXCJ0c3hcIiwgXCIucHJvamVucmMudHNcIl0sIHtcbiAgICBjd2Q6IHJvb3QsXG4gICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBQUk9KRU5fRElTQUJMRV9QT1NUOiBcInRydWVcIiB9LFxuICAgIGNoZWNrOiB0cnVlLFxuICB9KTtcbn1cbiJdfQ==
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFFakQsaUZBQWlGO0FBQ2pGLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDO0FBRXJDLHNGQUFzRjtBQUN0RixNQUFNLHlCQUF5QixHQUFHLDBCQUEwQixDQUFDO0FBRTdEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDN0IsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUM7QUFDL0UsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsNEVBQTRFO1FBQzVFLHdEQUF3RDtRQUN4RCwwRUFBMEU7UUFDMUUsNEVBQTRFO1FBQzVFLG9DQUFvQztRQUNwQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLGVBQWUsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUM5RSxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsU0FBUyxlQUFlLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDM0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELG1FQUFtRTtBQUNuRSxTQUFTLHNCQUFzQixDQUFDLElBQVk7SUFDMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNwRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDMUUsT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZO0lBQzlDLE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQzlCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTztJQUN0QixNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxJQUFJLFNBQVMsSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPO0lBQ25FLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsaUZBQWlGO0FBQ2pGLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsTUFBTSxpQkFBaUIsR0FBRzs7OztDQUl6QixDQUFDO0FBRUYsZ0dBQWdHO0FBQ2hHLE1BQU0sY0FBYyxHQUFHOzs7Q0FHdEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxJQUFZLEVBQ1osa0JBQTBCLHNCQUFzQixFQUFFO0lBRWxELEtBQUssQ0FBQyx3Q0FBd0MsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVqRSxhQUFhLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXJDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzFCLGFBQWEsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRCLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsSUFBWSxFQUNaLGtCQUEwQixzQkFBc0IsRUFBRTtJQUVsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QixxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUMvQixhQUFhLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsUUFBUTtRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1FBQy9CLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTztRQUNyQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxVQUFVLElBQUksU0FBUztRQUNuQyxNQUFNLEVBQUUsZUFBZTtLQUN4QixDQUFDLENBQUM7SUFDSCxPQUFPLENBQ0w7UUFDRSxLQUFLO1FBQ0wsd0JBQXdCO1FBQ3hCLElBQUk7UUFDSixRQUFRO1FBQ1IsbUJBQW1CO1FBQ25CLGFBQWE7UUFDYixlQUFlO0tBQ2hCLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDOUYsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTztJQUM5QixhQUFhLENBQUMsS0FBSyxFQUFFLFlBQVksUUFBUSxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFlBQW9CO0lBQ2pELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDekIsYUFBYSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUMvQyxnRkFBZ0Y7SUFDaEYsOEVBQThFO0lBQzlFLG9CQUFvQjtJQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUU7UUFDbEUsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDOUMsS0FBSyxFQUFFLElBQUk7S0FDWixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCb290c3RyYXAgYSBicmFuZC1uZXcgZm9sZGVyIGludG8gYSB3b3JraW5nIGRieC10b29scyB3b3Jrc3BhY2UgYmVmb3JlIHByb2plbiBydW5zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBpbnRybywgb3V0cm8gfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGV4ZWMsIHByb2plY3QgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBqc29uLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgY2hpbGRFbnYsIHJlc29sdmVQbnBtQXJndiwgcnVuUG5wbSB9IGZyb20gXCIuL3BucG0udHNcIjtcbmltcG9ydCB7IHJvb3RMYWJlbCB9IGZyb20gXCIuL3Jvb3QudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImRieC10b29sczpib290c3RyYXBcIik7XG5cbi8qKiBQdWJsaXNoZWQgcGFja2FnZSBuYW1lIHVzZWQgZm9yIE5vZGUncyBzZWxmLXJlZmVyZW5jZSBtYW5pZmVzdCByZXNvbHV0aW9uLiAqL1xuY29uc3QgQ0xJX1BBQ0tBR0UgPSBcIkBkYngtdG9vbHMvY2xpXCI7XG5cbi8qKiBGYWxsYmFjayB3aGVuIHRoaXMgQ0xJJ3Mgb3duIHZlcnNpb24gaXNuJ3QgYSByZWFsIHJlbGVhc2UgKGFuIGluLXJlcG8gYDAuMC4wYCkuICovXG5jb25zdCBGQUxMQkFDS19QUk9KRU5fU1BFQ0lGSUVSID0gXCJAZGJ4LXRvb2xzL3Byb2plbkBsYXRlc3RcIjtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBlbmdpbmUgYXQgVEhJUyBDTEkncyBvd24gdmVyc2lvbi4gVGhlIHR3byBhcmUgcmVsZWFzZWQgdG9nZXRoZXIgYnlcbiAqIHRoZSByb290IGBidW1wYCwgc28gdGhlIG1hdGNoaW5nIGVuZ2luZSBhbHdheXMgZXhpc3RzIG9uIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBOb3QgYEBsYXRlc3RgLCBhbmQgbm90IGEgYmFyZSBgQGRieC10b29scy9wcm9qZW5gLiBBIGJhcmUgc3BlY2lmaWVyIGNhbiBsYW5kIG9uXG4gKiBhIHN0cmF5IGAwLjAuMGAsIHdob3NlIGBeMC4wLjBgIGNhcmV0IHRoZW4gcmVhY2hlcyBubyByZWFsIHJlbGVhc2UuIGBAbGF0ZXN0YFxuICogaGFzIGEgc3VidGxlciBmYWlsdXJlOiBwbnBtIDExIGFwcGxpZXMgYSBgbWluaW11bVJlbGVhc2VBZ2VgIGRlbGF5LCBzbyBmb3IgdGhlXG4gKiBmaXJzdCBkYXkgYWZ0ZXIgYSByZWxlYXNlIGl0IGRlbGliZXJhdGVseSByZXNvbHZlcyBhIGRpc3QtdGFnIHRvIHRoZSBuZXdlc3RcbiAqIHZlcnNpb24gT0xERVIgdGhhbiB0aGUgdGhyZXNob2xkIGFuZCBtZXJlbHkgbm90ZXMgdGhlIG5ld2VyIG9uZVxuICogKGArIEBkYngtdG9vbHMvcHJvamVuIDAuMS4yNCAoMC4zLjQyIGlzIGF2YWlsYWJsZSlgKS4gQSBib290c3RyYXAgcnVuIHJpZ2h0XG4gKiBhZnRlciBhIHJlbGVhc2UgdGhlcmVmb3JlIGluc3RhbGxlZCBhIG1vbnRocy1vbGQgZW5naW5lIGFnYWluc3QgYSBjdXJyZW50IENMSSxcbiAqIHdoaWNoIGlzIGhvdyBgc3luYyAtLXdhdGNoYCBkaWVkIG9uIGFuIGVuZ2luZSBwcmVkYXRpbmcgaXRzIGBjb25jdXJyZW50bHlgXG4gKiBkZXBlbmRlbmN5LiBBbiBleHBsaWNpdCByYW5nZSBhZG1pdHMgb25seSB0aGUgdmVyc2lvbiB3ZSB3YW50LCBzbyB0aGUgYWdlXG4gKiBoZXVyaXN0aWMgaGFzIG5vdGhpbmcgb2xkZXIgdG8gZmFsbCBiYWNrIHRvLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb24gPSBvd25WZXJzaW9uKCk7XG4gIHJldHVybiB2ZXJzaW9uID8gYEBkYngtdG9vbHMvcHJvamVuQF4ke3ZlcnNpb259YCA6IEZBTExCQUNLX1BST0pFTl9TUEVDSUZJRVI7XG59XG5cbi8qKiBUaGlzIENMSSdzIG93biByZWxlYXNlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gaW4tcmVwbyBgMC4wLjBgIGJ1aWxkLiAqL1xuZnVuY3Rpb24gb3duVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIC8vIFJlc29sdmUgdGhyb3VnaCB0aGUgcGFja2FnZSdzIGV4cG9ydGVkIGAuL3BhY2thZ2UuanNvbmAsIHdoaWNoIHdvcmtzIGZyb21cbiAgICAvLyBib3RoIHNvdXJjZSAoYHNyYy9ib290c3RyYXAudHNgKSBhbmQgcHVibGlzaGVkIG91dHB1dFxuICAgIC8vIChgbGliL3NyYy9ib290c3RyYXAuanNgKS4gQSByZWxhdGl2ZSBVUkwgaXMgb25lIGxldmVsIGZyb20gdGhlIG1hbmlmZXN0XG4gICAgLy8gaW4gc291cmNlIGJ1dCB0d28gbGV2ZWxzIGF3YXkgYWZ0ZXIgY29tcGlsYXRpb24gYW5kIHNpbGVudGx5IGZlbGwgYmFjayB0b1xuICAgIC8vIGBAbGF0ZXN0YCBpbiBldmVyeSBpbnN0YWxsZWQgQ0xJLlxuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKGAke0NMSV9QQUNLQUdFfS9wYWNrYWdlLmpzb25gKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0ZjhcIikpPy52ZXJzaW9uO1xuICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiB2ZXJzaW9uICE9PSBcIjAuMC4wXCIgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDb21wYXJlIGB4LnkuemAgdHJpcGxlczsgcmV0dXJucyA8MCwgMCwgb3IgPjAuIE1pc3NpbmcgcGFydHMgY291bnQgYXMgMC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhcnRzID0gKHY6IHN0cmluZykgPT4gdi5zcGxpdChcIi5cIikubWFwKChwKSA9PiBOdW1iZXIucGFyc2VJbnQocCwgMTApIHx8IDApO1xuICBjb25zdCBbeCwgeV0gPSBbcGFydHMoYSksIHBhcnRzKGIpXTtcbiAgcmV0dXJuIHhbMF0gLSB5WzBdIHx8IHhbMV0gLSB5WzFdIHx8IHhbMl0gLSB5WzJdO1xufVxuXG4vKiogVmVyc2lvbiBvZiB0aGUgZW5naW5lIGN1cnJlbnRseSBpbnN0YWxsZWQgYXQgYHJvb3RgLCBpZiBhbnkuICovXG5mdW5jdGlvbiBpbnN0YWxsZWRFbmdpbmVWZXJzaW9uKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGRieC10b29sc1wiLCBcInByb2plblwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3QsIFwidXRmOFwiKSk/LnZlcnNpb247XG4gICAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSBcInN0cmluZ1wiID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFVwZ3JhZGUgYW4gZXN0YWJsaXNoZWQgd29ya3NwYWNlIHdob3NlIGluc3RhbGxlZCBlbmdpbmUgcHJlZGF0ZXMgdGhpcyBDTEkuXG4gKlxuICogQm9vdHN0cmFwcGluZyBwaW5zIHRoZSBlbmdpbmUgb25jZSwgYW5kIG5vdGhpbmcgYWZ0ZXJ3YXJkcyByZXZpc2l0cyBpdCAtIHNvIGFcbiAqIHdvcmtzcGFjZSBjcmVhdGVkIG1vbnRocyBhZ28ga2VwdCByZXNvbHZpbmcgaXRzIG9yaWdpbmFsIGVuZ2luZSBubyBtYXR0ZXIgaG93XG4gKiBjdXJyZW50IHRoZSBDTEkgaW52b2tpbmcgaXQgd2FzLCBhbmQgZmFpbGVkIGluc2lkZSB0aGUgT0xEIGVuZ2luZSdzIGNvZGVcbiAqIChgc3luYyAtLXdhdGNoYCBkeWluZyBvbiBhIGBjb25jdXJyZW50bHlgIHRoYXQgZW5naW5lIG5ldmVyIGRlY2xhcmVkKS4gVGhlIHR3b1xuICogYXJlIHJlbGVhc2VkIGluIGxvY2tzdGVwLCBzbyB0aGlzIENMSSdzIHZlcnNpb24gaXMgZXhhY3RseSB0aGUgZW5naW5lIGl0XG4gKiBleHBlY3RzLlxuICpcbiAqIE9ubHkgZXZlciBtb3ZlcyBGT1JXQVJEOiBhbiBlbmdpbmUgYXQgb3IgYWhlYWQgb2YgdGhpcyBDTEkgaXMgbGVmdCBhbG9uZSwgc29cbiAqIGFuIG9sZGVyIENMSSBjYW5ub3QgZG93bmdyYWRlIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5naW5lQ3VycmVudChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWQgPSBvd25WZXJzaW9uKCk7XG4gIGlmICghZXhwZWN0ZWQpIHJldHVybjtcbiAgY29uc3QgaW5zdGFsbGVkID0gaW5zdGFsbGVkRW5naW5lVmVyc2lvbihyb290KTtcbiAgaWYgKGluc3RhbGxlZCAmJiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkLCBleHBlY3RlZCkgPj0gMCkgcmV0dXJuO1xuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIGRlZmF1bHRQcm9qZW5TcGVjaWZpZXIoKV0sIHJvb3QpO1xufVxuXG4vLyBSZWFjaCB0aGUgY2xhc3MgdGhyb3VnaCBpdHMgbW9kdWxlIE5BTUVTUEFDRS4gQ3VycmVudCBlbmdpbmVzIGFsc28gaG9pc3QgaXRcbi8vIGZsYXQsIGJ1dCBldmVyeSBlbmdpbmUgZXZlciBwdWJsaXNoZWQgZXhwb3J0cyB0aGUgbmFtZXNwYWNlLCBhbmQgdGhpcyB0ZW1wbGF0ZVxuLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCBgQGxhdGVzdGAgLSBhIGZsYXQgaW1wb3J0IGRpZXMgb24gYW4gb2xkZXIgb25lIHdpdGhcbi8vIFwiZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJ0RCWFRvb2xzTm9kZVByb2plY3QnXCIuXG5jb25zdCBQUk9KRU5SQ19URU1QTEFURSA9IGBpbXBvcnQgeyBwcm9qZWN0IGFzIHByb2plY3RBcGkgfSBmcm9tIFwiQGRieC10b29scy9wcm9qZW5cIjtcblxuY29uc3QgcHJvamVjdCA9IG5ldyBwcm9qZWN0QXBpLkRCWFRvb2xzTm9kZVByb2plY3QoKTtcbnByb2plY3Quc3ludGgoKTtcbmA7XG5cbi8qKiBTZWVkIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBzbyB0aGUgZmlyc3QgXFxgcG5wbSBhZGRcXGAgY2FuIGFsbG93IGVzYnVpbGQgbm9uLWludGVyYWN0aXZlbHkuICovXG5jb25zdCBXT1JLU1BBQ0VfU0VFRCA9IGBwYWNrYWdlczogW11cbmFsbG93QnVpbGRzOlxuICBlc2J1aWxkOiB0cnVlXG5gO1xuXG4vKipcbiAqIFR1cm4gYSBmb2xkZXIgaW50byBhIGZ1bmN0aW9uaW5nIGRieC10b29scyB3b3Jrc3BhY2U6IGBwbnBtIGluaXRgLCBzZWVkXG4gKiBgcG5wbS13b3Jrc3BhY2UueWFtbGAsIGFkZCBgcHJvamVuYC9gdHlwZXNjcmlwdGAvYHRzeGAgKyB0aGUgZW5naW5lIHBhY2thZ2UsXG4gKiB3cml0ZSBhIG1pbmltYWwgYC5wcm9qZW5yYy50c2AsIHN5bnRoIG9uY2UgKHdpdGggYFBST0pFTl9ESVNBQkxFX1BPU1RgKSwgdGhlblxuICogaW5zdGFsbC4gRG9lcyBub3QgcnVuIGJhcnJlbHMgLSBydW4gYHBucG0gcnVuIGJhcnJlbHNgIG9yIGEgZnVsbCBwcm9qZW4gc3ludGhcbiAqIHBvc3QtaW5zdGFsbCB0byBnZW5lcmF0ZSBwYWNrYWdlIGJhcnJlbHMuXG4gKlxuICogRXZlcnkgc3RlcCBpcyBpZGVtcG90ZW50IGFuZCBzZWxmLWd1YXJkZWQsIHNvIHRoaXMgaXMgc2FmZSB0byBydW4gYWdhaW5zdCBhXG4gKiBmb2xkZXIgdGhhdCBBTFJFQURZIGhhcyBhIGhhbmQtYXV0aG9yZWQgYC5wcm9qZW5yYy50c2AgKGFuZCBldmVuIGEgY29tbWl0dGVkXG4gKiBgcGFja2FnZS5qc29uYCkgYnV0IGlzIG1pc3NpbmcgdGhlIGluc3RhbGxlZCB0b29sY2hhaW4gLSBlLmcuIGEgZnJlc2hseSBjb3BpZWRcbiAqIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzIChpbmNsdWRpbmcgbWFuaWZlc3RzKSBhcmUgZ2l0aWdub3JlZC4gSW4gdGhhdFxuICogY2FzZSBgcG5wbSBpbml0YCBhbmQgdGhlIGAucHJvamVucmMudHNgIHNjYWZmb2xkIGFyZSBza2lwcGVkLCBidXQgdGhlIGVuZ2luZSArXG4gKiBwcm9qZW4gKyB0c3ggYXJlIChyZSlpbnN0YWxsZWQgc28gdGhlIHN1YnNlcXVlbnQgc3ludGggY2FuIHJlZ2VuZXJhdGVcbiAqIGV2ZXJ5dGhpbmcuIFNlZSB7QGxpbmsgc2VlZFRvb2xjaGFpbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBXb3Jrc3BhY2UoXG4gIHJvb3Q6IHN0cmluZyxcbiAgcHJvamVuU3BlY2lmaWVyOiBzdHJpbmcgPSBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCksXG4pOiB2b2lkIHtcbiAgaW50cm8oYEJvb3RzdHJhcHBpbmcgZGJ4LXRvb2xzIHdvcmtzcGFjZSBpbiAke3Jvb3RMYWJlbChyb290KX1gKTtcblxuICBzZWVkVG9vbGNoYWluKHJvb3QsIHByb2plblNwZWNpZmllcik7XG5cbiAgY29uc3QgcHJvamVucmMgPSBqb2luKHJvb3QsIFwiLnByb2plbnJjLnRzXCIpO1xuICBpZiAoIWV4aXN0c1N5bmMocHJvamVucmMpKSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9qZW5yYywgUFJPSkVOUkNfVEVNUExBVEUpO1xuICB9XG5cbiAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuXG4gIHJ1blBucG0oW1wiaW5zdGFsbFwiLCBcIi0tbm8tZnJvemVuLWxvY2tmaWxlXCIsIFwiLS1mb3JjZVwiXSwgcm9vdCk7XG4gIG91dHJvKFwiV29ya3NwYWNlIHJlYWR5IC0gcmUtcnVuIGRieC10b29scyBvciBhZGQgcGFja2FnZXMgdW5kZXIgcGFja2FnZXMvXCIpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIHRvb2xjaGFpbiBhIHN5bnRoIG5lZWRzIChgcHJvamVuYCwgYHR5cGVzY3JpcHRgLCBgdHN4YCwgYW5kIHRoZVxuICogZGJ4LXRvb2xzIGVuZ2luZSksIHNlZWRpbmcgYSBgcGFja2FnZS5qc29uYCBhbmQgYHBucG0td29ya3NwYWNlLnlhbWxgIGZpcnN0XG4gKiB3aGVuIGFic2VudC4gSWRlbXBvdGVudDogcnVuIGl0IHdoZW5ldmVyIHRoZSBlbmdpbmUgaXMgbWlzc2luZywgc28gYSBjb3BpZWRcbiAqIHByb2plY3Qgd2l0aCBhIGAucHJvamVucmMudHNgIGJ1dCBubyBgbm9kZV9tb2R1bGVzYC9tYW5pZmVzdHMgY2FuIGJlIGJyb3VnaHRcbiAqIHVwIHRvIGEgc3ludGgtcmVhZHkgc3RhdGUgd2l0aG91dCBmdWxsIGJvb3RzdHJhcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkVG9vbGNoYWluKFxuICByb290OiBzdHJpbmcsXG4gIHByb2plblNwZWNpZmllcjogc3RyaW5nID0gZGVmYXVsdFByb2plblNwZWNpZmllcigpLFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcnVuUG5wbShbXCJpbml0XCJdLCByb290KTtcbiAgICBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZUZpbGUgPSBqb2luKHJvb3QsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKHdvcmtzcGFjZUZpbGUpKSB7XG4gICAgd3JpdGVGaWxlU3luYyh3b3Jrc3BhY2VGaWxlLCBXT1JLU1BBQ0VfU0VFRCk7XG4gIH1cblxuICBzZWVkUmVnaXN0cnkocm9vdCk7XG5cbiAgY29uc3Qga2VybmVsQXJjaCA9IGV4ZWMuc3Bhd25TeW5jKFwidW5hbWVcIiwgW1wiLW1cIl0sIHtcbiAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAgfSkuc3Rkb3V0O1xuICBsb2dnZXIuaW5mbyhcInNlZWRpbmcgdG9vbGNoYWluXCIsIHtcbiAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgYXJjaDogcHJvY2Vzcy5hcmNoLFxuICAgIGtlcm5lbEFyY2g6IGtlcm5lbEFyY2ggfHwgXCJ1bmtub3duXCIsXG4gICAgZW5naW5lOiBwcm9qZW5TcGVjaWZpZXIsXG4gIH0pO1xuICBydW5QbnBtKFxuICAgIFtcbiAgICAgIFwiYWRkXCIsXG4gICAgICBcIi0tcmVwb3J0ZXI9YXBwZW5kLW9ubHlcIixcbiAgICAgIFwiLURcIixcbiAgICAgIFwicHJvamVuXCIsXG4gICAgICBcInR5cGVzY3JpcHRAXjUuOS4zXCIsXG4gICAgICBcInRzeEBeNC4yMy4wXCIsXG4gICAgICBwcm9qZW5TcGVjaWZpZXIsXG4gICAgXSxcbiAgICByb290LFxuICApO1xufVxuXG4vKipcbiAqIFBpbiBhIG5vbi1kZWZhdWx0IHJlZ2lzdHJ5IGludG8gdGhlIG5ldyByb290J3MgYC5ucG1yY2AuXG4gKlxuICogVGhlIENMSSBhbHJlYWR5IGZvcmNlcyBgLS1yZWdpc3RyeWAgb250byB0aGUgcG5wbSBpbnZvY2F0aW9ucyBpdCBtYWtlcyBpdHNlbGYsXG4gKiBidXQgYSBib290c3RyYXBwZWQgd29ya3NwYWNlIG91dGxpdmVzIHRoaXMgcHJvY2VzczogZXZlcnkgbGF0ZXIgYHBucG0gaW5zdGFsbGBcbiAqIHRoZSBkZXZlbG9wZXIgKG9yIHByb2plbidzIHBvc3Qtc3ludGggc3RlcCkgcnVucyBpcyBvbiBpdHMgb3duLiBwbnBtIGlnbm9yZXNcbiAqIGBucG1fY29uZmlnX3JlZ2lzdHJ5YCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgc28gd2l0aG91dCBhIGZpbGUgb24gZGlzayB0aG9zZVxuICogcnVucyByZXZlcnQgdG8gYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2AgLSB3aGljaCBpcyBhIGhhcmQgZmFpbHVyZSB3aGVyZVxuICogdGhlIGN1c3RvbSByZWdpc3RyeSB3YXMgdGhlIG9ubHkgcmVhY2hhYmxlIG9uZS5cbiAqXG4gKiBPbmx5IHdyaXRlcyBmb3IgYW4gYWN0dWFsIG92ZXJyaWRlLCBuZXZlciBjcmVhdGVzIGEgZmlsZSBqdXN0IHRvIG5hbWUgbnBtanMsXG4gKiBhbmQgbmV2ZXIgb3ZlcndyaXRlcyBhbiBleGlzdGluZyBgLm5wbXJjYCAodGhlIGRldmVsb3BlcidzIG93biB3aW5zKS5cbiAqL1xuZnVuY3Rpb24gc2VlZFJlZ2lzdHJ5KHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWdpc3RyeSA9IHByb2plY3QubnBtUmVnaXN0cnkobnVsbCwgeyBvdmVycmlkZU9ubHk6IHRydWUsIGVudlZhcnM6IHRydWUgfSk/LnRvU3RyaW5nKCk7XG4gIGlmICghcmVnaXN0cnkpIHJldHVybjtcbiAgY29uc3QgbnBtcmMgPSBqb2luKHJvb3QsIFwiLm5wbXJjXCIpO1xuICBpZiAoZXhpc3RzU3luYyhucG1yYykpIHJldHVybjtcbiAgd3JpdGVGaWxlU3luYyhucG1yYywgYHJlZ2lzdHJ5PSR7cmVnaXN0cnl9XFxuYCk7XG59XG5cbi8qKlxuICogTWFrZSB3aGF0IGBwbnBtIGluaXRgIHByb2R1Y2VkIHNhZmUgdG8gc3ludGggYWdhaW5zdC4gVHdvIGNvcnJlY3Rpb25zLCBib3RoXG4gKiBiZWNhdXNlIHRoYXQgb3V0cHV0IHZhcmllcyBieSBwbnBtIHZlcnNpb246XG4gKlxuICogICAtIGRyb3AgYGRldkVuZ2luZXNgLCB3aGljaCBwbnBtIDExIHNlZWRzIGFzIGBwYWNrYWdlTWFuYWdlcjogeyBuYW1lOiBcInBucG1cIixcbiAqICAgICBvbkZhaWw6IFwiZG93bmxvYWRcIiB9YC4gQW55IG5wbS1iYXNlZCB0b29sIGxhdGVyIGluIHRoZSBjaGFpbiAoYW5cbiAqICAgICBgbnB4YC9kbHggZmFsbGJhY2spIHRoZW4gcmVmdXNlcyB3aXRoIEVCQURERVZFTkdJTkVTLCBpdHMgcnVubmVyIGJlaW5nIG5wbTtcbiAqICAgLSBmb3JjZSBgdHlwZTogXCJtb2R1bGVcImAsIHdoaWNoIHBucG0gMTEgd3JpdGVzIGFuZCBwbnBtIDEwIGRvZXMgbm90LiB0c3hcbiAqICAgICBwaWNrcyB0aGUgZW50cnkncyBmb3JtYXQgZnJvbSB0aGUgbmVhcmVzdCBtYW5pZmVzdCwgc28gd2l0aG91dCBpdFxuICogICAgIGAucHJvamVucmMudHNgIGxvYWRzIGFzIENKUyBhbmQgdGhlIGZpcnN0IGRlcGVuZGVuY3kgdXNpbmcgdG9wLWxldmVsIGF3YWl0XG4gKiAgICAgZGllcyBvbiBcIm5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY2pzIG91dHB1dCBmb3JtYXRcIi5cbiAqXG4gKiBwcm9qZW4gcmVnZW5lcmF0ZXMgdGhlIHdob2xlIG1hbmlmZXN0IGF0IHN5bnRoLCBzbyB0aGlzIG9ubHkgaGFzIHRvIGhvbGQgdGhlXG4gKiBzZWVkIHRvZ2V0aGVyIGxvbmcgZW5vdWdoIHRvIGdldCB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2VlZE1hbmlmZXN0KG1hbmlmZXN0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqc29uLnBhcnNlUmVjb3JkKHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIFwidXRmOFwiKSk7XG4gICAgaWYgKCFtYW5pZmVzdCkgcmV0dXJuO1xuICAgIGRlbGV0ZSBtYW5pZmVzdC5kZXZFbmdpbmVzO1xuICAgIG1hbmlmZXN0LnR5cGUgPSBcIm1vZHVsZVwiO1xuICAgIHdyaXRlRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMil9XFxuYCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgbWFsZm9ybWVkL2Fic2VudCBtYW5pZmVzdCBoZXJlIGp1c3QgbWVhbnMgdGhlIGxhdGVyIGBwbnBtIGFkZGAgcmVjcmVhdGVzIGl0LlxuICB9XG59XG5cbi8qKlxuICogUnVuIHRoZSBpbml0aWFsIHN5bnRoIGJ5IGV4ZWN1dGluZyBgLnByb2plbnJjLnRzYCBkaXJlY3RseSB3aXRoIHRzeCAod2l0aFxuICogYFBST0pFTl9ESVNBQkxFX1BPU1RgIHNldCksIE5PVCBgcHJvamVuIDx0YXNrPmAuIFVzZSByaWdodCBhZnRlciBzZWVkaW5nIGFcbiAqIGZyZXNoIHdvcmtzcGFjZTogdGhlIHByb2plbiBUQVNLUyAoYHN5bmNgLCBgYmFycmVsc2AsIC4uLikgb25seSBleGlzdCBvbmNlXG4gKiBgLnByb2plbnJjLnRzYCBoYXMgcnVuIG9uY2UsIHNvIGBwcm9qZW4gc3luY2AgY2FuJ3QgYmUgdGhlIGJvb3RzdHJhcHBpbmcgc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkluaXRpYWxTeW50aChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLnByZWZpeF0gPSByZXNvbHZlUG5wbUFyZ3YoKTtcbiAgLy8gTm8gYC0tcmVnaXN0cnlgIGhlcmU6IHRoaXMgaXMgYHBucG0gZXhlY2AsIHdob3NlIHRyYWlsaW5nIGFyZ3VtZW50cyBiZWxvbmcgdG9cbiAgLy8gdHN4LiBUaGUgcmVnaXN0cnkgcmVhY2hlcyBhbnl0aGluZyBuZXN0ZWQgdGhyb3VnaCBgY2hpbGRFbnZgIGFuZCB0aGUgc2VlZGVkXG4gIC8vIGAubnBtcmNgIGluc3RlYWQuXG4gIGV4ZWMuc3Bhd25TeW5jKGNvbW1hbmQsIFsuLi5wcmVmaXgsIFwiZXhlY1wiLCBcInRzeFwiLCBcIi5wcm9qZW5yYy50c1wiXSwge1xuICAgIGN3ZDogcm9vdCxcbiAgICBlbnY6IGNoaWxkRW52KHsgUFJPSkVOX0RJU0FCTEVfUE9TVDogXCJ0cnVlXCIgfSksXG4gICAgY2hlY2s6IHRydWUsXG4gIH0pO1xufVxuIl19
|
package/lib/src/pnpm.d.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
|
+
/** `--registry <url>` for npx, or `[]`. Placed BEFORE the package name by callers. */
|
|
2
|
+
export declare function npxRegistryArgs(): string[];
|
|
3
|
+
/** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
|
|
4
|
+
export declare function pnpmRegistryArgs(args: readonly string[]): string[];
|
|
5
|
+
/** Whether the first pnpm subcommand resolves packages and accepts `--registry`. */
|
|
6
|
+
export declare function pnpmUsesRegistry(args: readonly string[]): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* `process.env` plus the current Node executable directory and registry aliases.
|
|
9
|
+
*
|
|
10
|
+
* The executable directory matters when this CLI was launched by absolute path
|
|
11
|
+
* (for example from QuickJS or mise activation that was not exported): pnpm
|
|
12
|
+
* itself runs, but lifecycle scripts invoke `node` by name and otherwise fail
|
|
13
|
+
* with `sh: node: not found`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function childEnv(extra?: Record<string, string>): NodeJS.ProcessEnv;
|
|
1
16
|
/** Memoized `[command, ...prefix]` argv prefix to run pnpm (resolved install, else corepack, else npx). */
|
|
2
17
|
export declare const resolvePnpmArgv: () => string[];
|
|
3
|
-
/** Run pnpm with inherited stdio from `cwd
|
|
18
|
+
/** Run pnpm with inherited stdio from `cwd`, forcing the resolved registry. */
|
|
4
19
|
export declare function runPnpm(args: string[], cwd: string): void;
|
|
5
20
|
/** Install workspace dependencies when `node_modules` or projen is missing. */
|
|
6
21
|
export declare function ensureWorkspaceReady(root: string): void;
|
package/lib/src/pnpm.js
CHANGED
|
@@ -1,13 +1,110 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pnpm discovery, workspace install, and projen forwarding for the `dbx-tools` CLI.
|
|
3
3
|
*
|
|
4
|
+
* ## Forcing a custom registry
|
|
5
|
+
*
|
|
6
|
+
* pnpm and npm do NOT agree on how a registry is configured, and getting this
|
|
7
|
+
* wrong is silent. Measured against pnpm 11.0.6 and npm 11:
|
|
8
|
+
*
|
|
9
|
+
* | mechanism | npm | pnpm |
|
|
10
|
+
* | ---------------------------------------- | --- | ---- |
|
|
11
|
+
* | `--registry <url>` CLI flag | yes | yes |
|
|
12
|
+
* | project `.npmrc` | yes | yes |
|
|
13
|
+
* | `npm_config_registry` env var | yes | NO |
|
|
14
|
+
*
|
|
15
|
+
* So an env var alone reads back correctly from `npm config get registry` while
|
|
16
|
+
* pnpm ignores it and silently falls through to its built-in
|
|
17
|
+
* `https://registry.npmjs.org/`. That produced a bootstrap which logged the
|
|
18
|
+
* local registry and then tried to fetch `typescript` / `projen` / `tsx` from
|
|
19
|
+
* npmjs, failing with ECONNREFUSED on a machine that had no route to it.
|
|
20
|
+
*
|
|
21
|
+
* Hence all three channels, each where it actually applies:
|
|
22
|
+
*
|
|
23
|
+
* - {@link pnpmRegistryArgs} passes `--registry` to pnpm, but only for the
|
|
24
|
+
* subcommands that resolve packages. It must NOT be appended to
|
|
25
|
+
* `pnpm exec <cmd>`, where trailing arguments belong to `<cmd>`, not pnpm.
|
|
26
|
+
* - {@link npxRegistryArgs} passes `--registry` to npx, before the package
|
|
27
|
+
* name, so the npx fallback can fetch pnpm itself from the same registry.
|
|
28
|
+
* - {@link childEnv} keeps `npm_config_registry` set for npm-based children
|
|
29
|
+
* (npx included), which is the only channel npm exposes to nested tools.
|
|
30
|
+
*
|
|
31
|
+
* `@dbx-tools/core`'s `npmRegistry({ overrideOnly: true })` returns nothing when
|
|
32
|
+
* the effective registry IS npmjs, so none of this touches a default install.
|
|
33
|
+
*
|
|
4
34
|
* @module
|
|
5
35
|
*/
|
|
6
36
|
import { createRequire } from "node:module";
|
|
7
|
-
import { dirname, join } from "node:path";
|
|
8
|
-
import { exec } from "@dbx-tools/core";
|
|
9
|
-
import { functionModule } from "@dbx-tools/shared-core";
|
|
37
|
+
import { delimiter, dirname, join } from "node:path";
|
|
38
|
+
import { exec, project } from "@dbx-tools/core";
|
|
39
|
+
import { functionModule, log } from "@dbx-tools/shared-core";
|
|
10
40
|
import { needsInstall } from "./root.js";
|
|
41
|
+
const logger = log.logger("dbx-tools:pnpm");
|
|
42
|
+
/**
|
|
43
|
+
* pnpm subcommands that resolve packages from a registry, and therefore accept a
|
|
44
|
+
* meaningful `--registry`. Everything else (`exec`, `run`, `config`, ...) is left
|
|
45
|
+
* alone: `exec` in particular forwards trailing arguments to the command it runs,
|
|
46
|
+
* so a `--registry` appended there would land on projen or tsx instead.
|
|
47
|
+
*/
|
|
48
|
+
const REGISTRY_SUBCOMMANDS = new Set([
|
|
49
|
+
"add",
|
|
50
|
+
"create",
|
|
51
|
+
"dlx",
|
|
52
|
+
"i",
|
|
53
|
+
"import",
|
|
54
|
+
"install",
|
|
55
|
+
"link",
|
|
56
|
+
"up",
|
|
57
|
+
"update",
|
|
58
|
+
]);
|
|
59
|
+
/**
|
|
60
|
+
* The registry to force onto child package managers, or `undefined` when the
|
|
61
|
+
* effective one is already the public default.
|
|
62
|
+
*
|
|
63
|
+
* `envVars: true` also consults `npm_config_registry` directly, because a
|
|
64
|
+
* container may export it without any `.npmrc` for `npm config get` to read.
|
|
65
|
+
* Memoized: resolution shells out to npm.
|
|
66
|
+
*/
|
|
67
|
+
const registryOverride = functionModule.memoize(() => project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString());
|
|
68
|
+
/** `--registry <url>` for npx, or `[]`. Placed BEFORE the package name by callers. */
|
|
69
|
+
export function npxRegistryArgs() {
|
|
70
|
+
const url = registryOverride();
|
|
71
|
+
return url ? ["--registrsy", url] : [];
|
|
72
|
+
}
|
|
73
|
+
/** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
|
|
74
|
+
export function pnpmRegistryArgs(args) {
|
|
75
|
+
const url = registryOverride();
|
|
76
|
+
if (!url)
|
|
77
|
+
return [];
|
|
78
|
+
return pnpmUsesRegistry(args) ? ["--registry", url] : [];
|
|
79
|
+
}
|
|
80
|
+
/** Whether the first pnpm subcommand resolves packages and accepts `--registry`. */
|
|
81
|
+
export function pnpmUsesRegistry(args) {
|
|
82
|
+
const subcommand = args.find((arg) => !arg.startsWith("-"));
|
|
83
|
+
return subcommand !== undefined && REGISTRY_SUBCOMMANDS.has(subcommand);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* `process.env` plus the current Node executable directory and registry aliases.
|
|
87
|
+
*
|
|
88
|
+
* The executable directory matters when this CLI was launched by absolute path
|
|
89
|
+
* (for example from QuickJS or mise activation that was not exported): pnpm
|
|
90
|
+
* itself runs, but lifecycle scripts invoke `node` by name and otherwise fail
|
|
91
|
+
* with `sh: node: not found`.
|
|
92
|
+
*/
|
|
93
|
+
export function childEnv(extra) {
|
|
94
|
+
const env = { ...process.env, ...extra };
|
|
95
|
+
const nodeBin = dirname(process.execPath);
|
|
96
|
+
const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
97
|
+
if (!pathEntries.includes(nodeBin)) {
|
|
98
|
+
env.PATH = [nodeBin, ...pathEntries].join(delimiter);
|
|
99
|
+
}
|
|
100
|
+
const url = registryOverride();
|
|
101
|
+
if (url) {
|
|
102
|
+
// Both cases: env is case-sensitive on POSIX, and npm lowercases when reading.
|
|
103
|
+
env.npm_config_registry = url;
|
|
104
|
+
env.NPM_CONFIG_REGISTRY = url;
|
|
105
|
+
}
|
|
106
|
+
return env;
|
|
107
|
+
}
|
|
11
108
|
/** True when `pnpm --version` runs, i.e. pnpm is already on PATH. */
|
|
12
109
|
function pnpmOnPath() {
|
|
13
110
|
try {
|
|
@@ -26,12 +123,14 @@ function pnpmOnPath() {
|
|
|
26
123
|
function resolvePnpmArgvImpl() {
|
|
27
124
|
// 1. A resolvable `pnpm` dependency (the normal in-workspace case): run its
|
|
28
125
|
// bin directly with the current node - no PATH or package-manager shim.
|
|
126
|
+
// pnpm's own `--registry` rides in with the ARGS, after this entry point.
|
|
29
127
|
try {
|
|
30
128
|
const require = createRequire(import.meta.url);
|
|
31
129
|
const pkgJsonPath = require.resolve("pnpm/package.json");
|
|
32
130
|
const pkg = require(pkgJsonPath);
|
|
33
131
|
const bin = typeof pkg.bin === "string" ? pkg.bin : pkg.bin.pnpm;
|
|
34
|
-
|
|
132
|
+
if (bin)
|
|
133
|
+
return [process.execPath, join(dirname(pkgJsonPath), bin)];
|
|
35
134
|
}
|
|
36
135
|
catch {
|
|
37
136
|
// fall through
|
|
@@ -59,14 +158,24 @@ function resolvePnpmArgvImpl() {
|
|
|
59
158
|
// 4. Last resort: fetch pnpm on demand via npx. Pass `--engine-strict=false`
|
|
60
159
|
// (and skip npm's devEngines gate) so npm doesn't refuse to run just
|
|
61
160
|
// because the target manifest declares `devEngines.packageManager: pnpm`.
|
|
62
|
-
|
|
161
|
+
// npm-level flags, `--registry` among them, must precede the package name,
|
|
162
|
+
// or npx forwards them to pnpm instead of acting on them itself.
|
|
163
|
+
return ["npx", ...npxRegistryArgs(), "-y", "--engine-strict=false", "pnpm"];
|
|
63
164
|
}
|
|
64
165
|
/** Memoized `[command, ...prefix]` argv prefix to run pnpm (resolved install, else corepack, else npx). */
|
|
65
166
|
export const resolvePnpmArgv = functionModule.memoize(resolvePnpmArgvImpl);
|
|
66
|
-
/** Run pnpm with inherited stdio from `cwd
|
|
167
|
+
/** Run pnpm with inherited stdio from `cwd`, forcing the resolved registry. */
|
|
67
168
|
export function runPnpm(args, cwd) {
|
|
68
169
|
const [command, ...prefix] = resolvePnpmArgv();
|
|
69
|
-
|
|
170
|
+
const registryArgs = pnpmRegistryArgs(args);
|
|
171
|
+
if (registryArgs.length > 0) {
|
|
172
|
+
logger.info(`running pnpm with registry: ${registryArgs[1]}`);
|
|
173
|
+
}
|
|
174
|
+
exec.spawnSync(command, [...prefix, ...args, ...registryArgs], {
|
|
175
|
+
cwd,
|
|
176
|
+
check: true,
|
|
177
|
+
env: childEnv(),
|
|
178
|
+
});
|
|
70
179
|
}
|
|
71
180
|
/** Install workspace dependencies when `node_modules` or projen is missing. */
|
|
72
181
|
export function ensureWorkspaceReady(root) {
|
|
@@ -78,4 +187,4 @@ export function ensureWorkspaceReady(root) {
|
|
|
78
187
|
export function runProjen(args, root) {
|
|
79
188
|
runPnpm(["exec", "projen", ...args], root);
|
|
80
189
|
}
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG5wbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUt6QyxxRUFBcUU7QUFDckUsU0FBUyxVQUFVO0lBQ2pCLElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxFQUFFLFFBQVE7WUFDaEIsS0FBSyxFQUFFLFFBQVE7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQjtJQUMxQiw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFzQixDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsZUFBZTtJQUNqQixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSxnRUFBZ0U7SUFDaEUscUVBQXFFO0lBQ3JFLElBQUksVUFBVSxFQUFFO1FBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWxDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM3QyxNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxVQUFVLEVBQUU7WUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGVBQWU7SUFDakIsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsNkVBQTZFO0lBQzdFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUzRSxnREFBZ0Q7QUFDaEQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUFjLEVBQUUsR0FBVztJQUNqRCxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7SUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBQVk7SUFDL0MsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWMsRUFBRSxJQUFZO0lBQ3BELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwbnBtIGRpc2NvdmVyeSwgd29ya3NwYWNlIGluc3RhbGwsIGFuZCBwcm9qZW4gZm9yd2FyZGluZyBmb3IgdGhlIGBkYngtdG9vbHNgIENMSS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgZnVuY3Rpb25Nb2R1bGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbmVlZHNJbnN0YWxsIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG4vKiogQSBwYWNrYWdlLmpzb24gYGJpbmAgZmllbGQ6IGVpdGhlciBhIHNpbmdsZSBjb21tYW5kIHN0cmluZywgb3IgYSBuYW1lIC0+IHBhdGggbWFwLiAqL1xudHlwZSBCaW5GaWVsZCA9IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbi8qKiBUcnVlIHdoZW4gYHBucG0gLS12ZXJzaW9uYCBydW5zLCBpLmUuIHBucG0gaXMgYWxyZWFkeSBvbiBQQVRILiAqL1xuZnVuY3Rpb24gcG5wbU9uUGF0aCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBleGVjLnNwYXduU3luYyhcInBucG1cIiwgW1wiLS12ZXJzaW9uXCJdLCB7XG4gICAgICBzdGRlcnI6IFwiaWdub3JlXCIsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJpZ25vcmVcIixcbiAgICAgIGNoZWNrOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBucG1Bcmd2SW1wbCgpOiBzdHJpbmdbXSB7XG4gIC8vIDEuIEEgcmVzb2x2YWJsZSBgcG5wbWAgZGVwZW5kZW5jeSAodGhlIG5vcm1hbCBpbi13b3Jrc3BhY2UgY2FzZSk6IHJ1biBpdHNcbiAgLy8gICAgYmluIGRpcmVjdGx5IHdpdGggdGhlIGN1cnJlbnQgbm9kZSAtIG5vIFBBVEggb3IgcGFja2FnZS1tYW5hZ2VyIHNoaW0uXG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBwa2dKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShcInBucG0vcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IHBrZyA9IHJlcXVpcmUocGtnSnNvblBhdGgpIGFzIHsgYmluOiBCaW5GaWVsZCB9O1xuICAgIGNvbnN0IGJpbiA9IHR5cGVvZiBwa2cuYmluID09PSBcInN0cmluZ1wiID8gcGtnLmJpbiA6IHBrZy5iaW4ucG5wbTtcbiAgICByZXR1cm4gW3Byb2Nlc3MuZXhlY1BhdGgsIGpvaW4oZGlybmFtZShwa2dKc29uUGF0aCksIGJpbildO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuXG4gIC8vIDIuIEEgYmFyZSBgcG5wbWAgYWxyZWFkeSBvbiBQQVRIIChlLmcuIHJ1bm5pbmcgdW5kZXIgYHBucG0gZGx4YCkuIFByZWZlclxuICAvLyAgICB0aGlzIG92ZXIgdGhlIGNvcmVwYWNrL25weCBmYWxsYmFja3Mgc28gd2UgbmV2ZXIgc2hlbGwgdGhyb3VnaCBucG0gLVxuICAvLyAgICBgbnB4IC15IHBucG1gIHJ1bnMgdW5kZXIgbnBtLCB3aGljaCByZWplY3RzIGEgYm9vdHN0cmFwcGVkXG4gIC8vICAgIGBkZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyOiBwbnBtYCBtYW5pZmVzdCB3aXRoIEVCQURERVZFTkdJTkVTLlxuICBpZiAocG5wbU9uUGF0aCgpKSByZXR1cm4gW1wicG5wbVwiXTtcblxuICAvLyAzLiBUcnkgdG8gZW5hYmxlIHBucG0gdmlhIGNvcmVwYWNrLCB0aGVuIHVzZSBpdC5cbiAgdHJ5IHtcbiAgICBleGVjLnNwYXduU3luYyhcImNvcmVwYWNrXCIsIFtcImVuYWJsZVwiLCBcInBucG1cIl0sIHtcbiAgICAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImlnbm9yZVwiLFxuICAgICAgY2hlY2s6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHBucG1PblBhdGgoKSkgcmV0dXJuIFtcInBucG1cIl07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG5cbiAgLy8gNC4gTGFzdCByZXNvcnQ6IGZldGNoIHBucG0gb24gZGVtYW5kIHZpYSBucHguIFBhc3MgYC0tZW5naW5lLXN0cmljdD1mYWxzZWBcbiAgLy8gICAgKGFuZCBza2lwIG5wbSdzIGRldkVuZ2luZXMgZ2F0ZSkgc28gbnBtIGRvZXNuJ3QgcmVmdXNlIHRvIHJ1biBqdXN0XG4gIC8vICAgIGJlY2F1c2UgdGhlIHRhcmdldCBtYW5pZmVzdCBkZWNsYXJlcyBgZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlcjogcG5wbWAuXG4gIHJldHVybiBbXCJucHhcIiwgXCIteVwiLCBcIi0tZW5naW5lLXN0cmljdD1mYWxzZVwiLCBcInBucG1cIl07XG59XG5cbi8qKiBNZW1vaXplZCBgW2NvbW1hbmQsIC4uLnByZWZpeF1gIGFyZ3YgcHJlZml4IHRvIHJ1biBwbnBtIChyZXNvbHZlZCBpbnN0YWxsLCBlbHNlIGNvcmVwYWNrLCBlbHNlIG5weCkuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBucG1Bcmd2ID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZShyZXNvbHZlUG5wbUFyZ3ZJbXBsKTtcblxuLyoqIFJ1biBwbnBtIHdpdGggaW5oZXJpdGVkIHN0ZGlvIGZyb20gYGN3ZGAuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUG5wbShhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLnByZWZpeF0gPSByZXNvbHZlUG5wbUFyZ3YoKTtcbiAgZXhlYy5zcGF3blN5bmMoY29tbWFuZCwgWy4uLnByZWZpeCwgLi4uYXJnc10sIHsgY3dkLCBjaGVjazogdHJ1ZSB9KTtcbn1cblxuLyoqIEluc3RhbGwgd29ya3NwYWNlIGRlcGVuZGVuY2llcyB3aGVuIGBub2RlX21vZHVsZXNgIG9yIHByb2plbiBpcyBtaXNzaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVdvcmtzcGFjZVJlYWR5KHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBpZiAobmVlZHNJbnN0YWxsKHJvb3QpKSB7XG4gICAgcnVuUG5wbShbXCJpbnN0YWxsXCIsIFwiLS1uby1mcm96ZW4tbG9ja2ZpbGVcIl0sIHJvb3QpO1xuICB9XG59XG5cbi8qKiBSdW4gYHBucG0gZXhlYyBwcm9qZW5gIHdpdGggdGhlIGdpdmVuIGFyZ3MgZnJvbSBgcm9vdGAuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUHJvamVuKGFyZ3M6IHN0cmluZ1tdLCByb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgcnVuUG5wbShbXCJleGVjXCIsIFwicHJvamVuXCIsIC4uLmFyZ3NdLCByb290KTtcbn1cbiJdfQ==
|
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG5wbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBSzVDOzs7OztHQUtHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuQyxLQUFLO0lBQ0wsUUFBUTtJQUNSLEtBQUs7SUFDTCxHQUFHO0lBQ0gsUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sSUFBSTtJQUNKLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQXVCLEVBQUUsQ0FDdkUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUM3RSxDQUFDO0FBRUYsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFB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O0lBQy9DLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLEVBQUU7UUFDN0QsR0FBRztRQUNILEtBQUssRUFBRSxJQUFJO1FBQ1gsR0FBRyxFQUFFLFFBQVEsRUFBRTtLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztBQUNILENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFjLEVBQUUsSUFBWTtJQUNwRCxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcG5wbSBkaXNjb3ZlcnksIHdvcmtzcGFjZSBpbnN0YWxsLCBhbmQgcHJvamVuIGZvcndhcmRpbmcgZm9yIHRoZSBgZGJ4LXRvb2xzYCBDTEkuXG4gKlxuICogIyMgRm9yY2luZyBhIGN1c3RvbSByZWdpc3RyeVxuICpcbiAqIHBucG0gYW5kIG5wbSBkbyBOT1QgYWdyZWUgb24gaG93IGEgcmVnaXN0cnkgaXMgY29uZmlndXJlZCwgYW5kIGdldHRpbmcgdGhpc1xuICogd3JvbmcgaXMgc2lsZW50LiBNZWFzdXJlZCBhZ2FpbnN0IHBucG0gMTEuMC42IGFuZCBucG0gMTE6XG4gKlxuICogfCBtZWNoYW5pc20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbnBtIHwgcG5wbSB8XG4gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0gfCAtLS0tIHxcbiAqIHwgYC0tcmVnaXN0cnkgPHVybD5gIENMSSBmbGFnICAgICAgICAgICAgICB8IHllcyB8IHllcyAgfFxuICogfCBwcm9qZWN0IGAubnBtcmNgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzIHwgeWVzICB8XG4gKiB8IGBucG1fY29uZmlnX3JlZ2lzdHJ5YCBlbnYgdmFyICAgICAgICAgICAgfCB5ZXMgfCBOTyAgIHxcbiAqXG4gKiBTbyBhbiBlbnYgdmFyIGFsb25lIHJlYWRzIGJhY2sgY29ycmVjdGx5IGZyb20gYG5wbSBjb25maWcgZ2V0IHJlZ2lzdHJ5YCB3aGlsZVxuICogcG5wbSBpZ25vcmVzIGl0IGFuZCBzaWxlbnRseSBmYWxscyB0aHJvdWdoIHRvIGl0cyBidWlsdC1pblxuICogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2AuIFRoYXQgcHJvZHVjZWQgYSBib290c3RyYXAgd2hpY2ggbG9nZ2VkIHRoZVxuICogbG9jYWwgcmVnaXN0cnkgYW5kIHRoZW4gdHJpZWQgdG8gZmV0Y2ggYHR5cGVzY3JpcHRgIC8gYHByb2plbmAgLyBgdHN4YCBmcm9tXG4gKiBucG1qcywgZmFpbGluZyB3aXRoIEVDT05OUkVGVVNFRCBvbiBhIG1hY2hpbmUgdGhhdCBoYWQgbm8gcm91dGUgdG8gaXQuXG4gKlxuICogSGVuY2UgYWxsIHRocmVlIGNoYW5uZWxzLCBlYWNoIHdoZXJlIGl0IGFjdHVhbGx5IGFwcGxpZXM6XG4gKlxuICogIC0ge0BsaW5rIHBucG1SZWdpc3RyeUFyZ3N9IHBhc3NlcyBgLS1yZWdpc3RyeWAgdG8gcG5wbSwgYnV0IG9ubHkgZm9yIHRoZVxuICogICAgc3ViY29tbWFuZHMgdGhhdCByZXNvbHZlIHBhY2thZ2VzLiBJdCBtdXN0IE5PVCBiZSBhcHBlbmRlZCB0b1xuICogICAgYHBucG0gZXhlYyA8Y21kPmAsIHdoZXJlIHRyYWlsaW5nIGFyZ3VtZW50cyBiZWxvbmcgdG8gYDxjbWQ+YCwgbm90IHBucG0uXG4gKiAgLSB7QGxpbmsgbnB4UmVnaXN0cnlBcmdzfSBwYXNzZXMgYC0tcmVnaXN0cnlgIHRvIG5weCwgYmVmb3JlIHRoZSBwYWNrYWdlXG4gKiAgICBuYW1lLCBzbyB0aGUgbnB4IGZhbGxiYWNrIGNhbiBmZXRjaCBwbnBtIGl0c2VsZiBmcm9tIHRoZSBzYW1lIHJlZ2lzdHJ5LlxuICogIC0ge0BsaW5rIGNoaWxkRW52fSBrZWVwcyBgbnBtX2NvbmZpZ19yZWdpc3RyeWAgc2V0IGZvciBucG0tYmFzZWQgY2hpbGRyZW5cbiAqICAgIChucHggaW5jbHVkZWQpLCB3aGljaCBpcyB0aGUgb25seSBjaGFubmVsIG5wbSBleHBvc2VzIHRvIG5lc3RlZCB0b29scy5cbiAqXG4gKiBgQGRieC10b29scy9jb3JlYCdzIGBucG1SZWdpc3RyeSh7IG92ZXJyaWRlT25seTogdHJ1ZSB9KWAgcmV0dXJucyBub3RoaW5nIHdoZW5cbiAqIHRoZSBlZmZlY3RpdmUgcmVnaXN0cnkgSVMgbnBtanMsIHNvIG5vbmUgb2YgdGhpcyB0b3VjaGVzIGEgZGVmYXVsdCBpbnN0YWxsLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGVsaW1pdGVyLCBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZXhlYywgcHJvamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGZ1bmN0aW9uTW9kdWxlLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbmVlZHNJbnN0YWxsIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZGJ4LXRvb2xzOnBucG1cIik7XG5cbi8qKiBBIHBhY2thZ2UuanNvbiBgYmluYCBmaWVsZDogZWl0aGVyIGEgc2luZ2xlIGNvbW1hbmQgc3RyaW5nLCBvciBhIG5hbWUgLT4gcGF0aCBtYXAuICovXG50eXBlIEJpbkZpZWxkID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBwbnBtIHN1YmNvbW1hbmRzIHRoYXQgcmVzb2x2ZSBwYWNrYWdlcyBmcm9tIGEgcmVnaXN0cnksIGFuZCB0aGVyZWZvcmUgYWNjZXB0IGFcbiAqIG1lYW5pbmdmdWwgYC0tcmVnaXN0cnlgLiBFdmVyeXRoaW5nIGVsc2UgKGBleGVjYCwgYHJ1bmAsIGBjb25maWdgLCAuLi4pIGlzIGxlZnRcbiAqIGFsb25lOiBgZXhlY2AgaW4gcGFydGljdWxhciBmb3J3YXJkcyB0cmFpbGluZyBhcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQgaXQgcnVucyxcbiAqIHNvIGEgYC0tcmVnaXN0cnlgIGFwcGVuZGVkIHRoZXJlIHdvdWxkIGxhbmQgb24gcHJvamVuIG9yIHRzeCBpbnN0ZWFkLlxuICovXG5jb25zdCBSRUdJU1RSWV9TVUJDT01NQU5EUyA9IG5ldyBTZXQoW1xuICBcImFkZFwiLFxuICBcImNyZWF0ZVwiLFxuICBcImRseFwiLFxuICBcImlcIixcbiAgXCJpbXBvcnRcIixcbiAgXCJpbnN0YWxsXCIsXG4gIFwibGlua1wiLFxuICBcInVwXCIsXG4gIFwidXBkYXRlXCIsXG5dKTtcblxuLyoqXG4gKiBUaGUgcmVnaXN0cnkgdG8gZm9yY2Ugb250byBjaGlsZCBwYWNrYWdlIG1hbmFnZXJzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICogZWZmZWN0aXZlIG9uZSBpcyBhbHJlYWR5IHRoZSBwdWJsaWMgZGVmYXVsdC5cbiAqXG4gKiBgZW52VmFyczogdHJ1ZWAgYWxzbyBjb25zdWx0cyBgbnBtX2NvbmZpZ19yZWdpc3RyeWAgZGlyZWN0bHksIGJlY2F1c2UgYVxuICogY29udGFpbmVyIG1heSBleHBvcnQgaXQgd2l0aG91dCBhbnkgYC5ucG1yY2AgZm9yIGBucG0gY29uZmlnIGdldGAgdG8gcmVhZC5cbiAqIE1lbW9pemVkOiByZXNvbHV0aW9uIHNoZWxscyBvdXQgdG8gbnBtLlxuICovXG5jb25zdCByZWdpc3RyeU92ZXJyaWRlID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZSgoKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gIHByb2plY3QubnBtUmVnaXN0cnkobnVsbCwgeyBvdmVycmlkZU9ubHk6IHRydWUsIGVudlZhcnM6IHRydWUgfSk/LnRvU3RyaW5nKCksXG4pO1xuXG4vKiogYC0tcmVnaXN0cnkgPHVybD5gIGZvciBucHgsIG9yIGBbXWAuIFBsYWNlZCBCRUZPUkUgdGhlIHBhY2thZ2UgbmFtZSBieSBjYWxsZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5weFJlZ2lzdHJ5QXJncygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgcmV0dXJuIHVybCA/IFtcIi0tcmVnaXN0cnN5XCIsIHVybF0gOiBbXTtcbn1cblxuLyoqIGAtLXJlZ2lzdHJ5IDx1cmw+YCBmb3IgYSBwbnBtIGludm9jYXRpb24sIG9yIGBbXWAgd2hlbiB0aGUgc3ViY29tbWFuZCBkb2VzIG5vdCByZXNvbHZlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBucG1SZWdpc3RyeUFyZ3MoYXJnczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgaWYgKCF1cmwpIHJldHVybiBbXTtcbiAgcmV0dXJuIHBucG1Vc2VzUmVnaXN0cnkoYXJncykgPyBbXCItLXJlZ2lzdHJ5XCIsIHVybF0gOiBbXTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGZpcnN0IHBucG0gc3ViY29tbWFuZCByZXNvbHZlcyBwYWNrYWdlcyBhbmQgYWNjZXB0cyBgLS1yZWdpc3RyeWAuICovXG5leHBvcnQgZnVuY3Rpb24gcG5wbVVzZXNSZWdpc3RyeShhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzdWJjb21tYW5kID0gYXJncy5maW5kKChhcmcpID0+ICFhcmcuc3RhcnRzV2l0aChcIi1cIikpO1xuICByZXR1cm4gc3ViY29tbWFuZCAhPT0gdW5kZWZpbmVkICYmIFJFR0lTVFJZX1NVQkNPTU1BTkRTLmhhcyhzdWJjb21tYW5kKTtcbn1cblxuLyoqXG4gKiBgcHJvY2Vzcy5lbnZgIHBsdXMgdGhlIGN1cnJlbnQgTm9kZSBleGVjdXRhYmxlIGRpcmVjdG9yeSBhbmQgcmVnaXN0cnkgYWxpYXNlcy5cbiAqXG4gKiBUaGUgZXhlY3V0YWJsZSBkaXJlY3RvcnkgbWF0dGVycyB3aGVuIHRoaXMgQ0xJIHdhcyBsYXVuY2hlZCBieSBhYnNvbHV0ZSBwYXRoXG4gKiAoZm9yIGV4YW1wbGUgZnJvbSBRdWlja0pTIG9yIG1pc2UgYWN0aXZhdGlvbiB0aGF0IHdhcyBub3QgZXhwb3J0ZWQpOiBwbnBtXG4gKiBpdHNlbGYgcnVucywgYnV0IGxpZmVjeWNsZSBzY3JpcHRzIGludm9rZSBgbm9kZWAgYnkgbmFtZSBhbmQgb3RoZXJ3aXNlIGZhaWxcbiAqIHdpdGggYHNoOiBub2RlOiBub3QgZm91bmRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hpbGRFbnYoZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogTm9kZUpTLlByb2Nlc3NFbnYge1xuICBjb25zdCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0geyAuLi5wcm9jZXNzLmVudiwgLi4uZXh0cmEgfTtcbiAgY29uc3Qgbm9kZUJpbiA9IGRpcm5hbWUocHJvY2Vzcy5leGVjUGF0aCk7XG4gIGNvbnN0IHBhdGhFbnRyaWVzID0gKGVudi5QQVRIID8/IFwiXCIpLnNwbGl0KGRlbGltaXRlcikuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAoIXBhdGhFbnRyaWVzLmluY2x1ZGVzKG5vZGVCaW4pKSB7XG4gICAgZW52LlBBVEggPSBbbm9kZUJpbiwgLi4ucGF0aEVudHJpZXNdLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuICBjb25zdCB1cmwgPSByZWdpc3RyeU92ZXJyaWRlKCk7XG4gIGlmICh1cmwpIHtcbiAgICAvLyBCb3RoIGNhc2VzOiBlbnYgaXMgY2FzZS1zZW5zaXRpdmUgb24gUE9TSVgsIGFuZCBucG0gbG93ZXJjYXNlcyB3aGVuIHJlYWRpbmcuXG4gICAgZW52Lm5wbV9jb25maWdfcmVnaXN0cnkgPSB1cmw7XG4gICAgZW52Lk5QTV9DT05GSUdfUkVHSVNUUlkgPSB1cmw7XG4gIH1cbiAgcmV0dXJuIGVudjtcbn1cblxuLyoqIFRydWUgd2hlbiBgcG5wbSAtLXZlcnNpb25gIHJ1bnMsIGkuZS4gcG5wbSBpcyBhbHJlYWR5IG9uIFBBVEguICovXG5mdW5jdGlvbiBwbnBtT25QYXRoKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGV4ZWMuc3Bhd25TeW5jKFwicG5wbVwiLCBbXCItLXZlcnNpb25cIl0sIHtcbiAgICAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImlnbm9yZVwiLFxuICAgICAgY2hlY2s6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUG5wbUFyZ3ZJbXBsKCk6IHN0cmluZ1tdIHtcbiAgLy8gMS4gQSByZXNvbHZhYmxlIGBwbnBtYCBkZXBlbmRlbmN5ICh0aGUgbm9ybWFsIGluLXdvcmtzcGFjZSBjYXNlKTogcnVuIGl0c1xuICAvLyAgICBiaW4gZGlyZWN0bHkgd2l0aCB0aGUgY3VycmVudCBub2RlIC0gbm8gUEFUSCBvciBwYWNrYWdlLW1hbmFnZXIgc2hpbS5cbiAgLy8gICAgcG5wbSdzIG93biBgLS1yZWdpc3RyeWAgcmlkZXMgaW4gd2l0aCB0aGUgQVJHUywgYWZ0ZXIgdGhpcyBlbnRyeSBwb2ludC5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwicG5wbS9wYWNrYWdlLmpzb25cIik7XG4gICAgY29uc3QgcGtnID0gcmVxdWlyZShwa2dKc29uUGF0aCkgYXMgeyBiaW46IEJpbkZpZWxkIH07XG4gICAgY29uc3QgYmluID0gdHlwZW9mIHBrZy5iaW4gPT09IFwic3RyaW5nXCIgPyBwa2cuYmluIDogcGtnLmJpbi5wbnBtO1xuICAgIGlmIChiaW4pIHJldHVybiBbcHJvY2Vzcy5leGVjUGF0aCwgam9pbihkaXJuYW1lKHBrZ0pzb25QYXRoKSwgYmluKV07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG5cbiAgLy8gMi4gQSBiYXJlIGBwbnBtYCBhbHJlYWR5IG9uIFBBVEggKGUuZy4gcnVubmluZyB1bmRlciBgcG5wbSBkbHhgKS4gUHJlZmVyXG4gIC8vICAgIHRoaXMgb3ZlciB0aGUgY29yZXBhY2svbnB4IGZhbGxiYWNrcyBzbyB3ZSBuZXZlciBzaGVsbCB0aHJvdWdoIG5wbSAtXG4gIC8vICAgIGBucHggLXkgcG5wbWAgcnVucyB1bmRlciBucG0sIHdoaWNoIHJlamVjdHMgYSBib290c3RyYXBwZWRcbiAgLy8gICAgYGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXI6IHBucG1gIG1hbmlmZXN0IHdpdGggRUJBRERFVkVOR0lORVMuXG4gIGlmIChwbnBtT25QYXRoKCkpIHJldHVybiBbXCJwbnBtXCJdO1xuXG4gIC8vIDMuIFRyeSB0byBlbmFibGUgcG5wbSB2aWEgY29yZXBhY2ssIHRoZW4gdXNlIGl0LlxuICB0cnkge1xuICAgIGV4ZWMuc3Bhd25TeW5jKFwiY29yZXBhY2tcIiwgW1wiZW5hYmxlXCIsIFwicG5wbVwiXSwge1xuICAgICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAocG5wbU9uUGF0aCgpKSByZXR1cm4gW1wicG5wbVwiXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cblxuICAvLyA0LiBMYXN0IHJlc29ydDogZmV0Y2ggcG5wbSBvbiBkZW1hbmQgdmlhIG5weC4gUGFzcyBgLS1lbmdpbmUtc3RyaWN0PWZhbHNlYFxuICAvLyAgICAoYW5kIHNraXAgbnBtJ3MgZGV2RW5naW5lcyBnYXRlKSBzbyBucG0gZG9lc24ndCByZWZ1c2UgdG8gcnVuIGp1c3RcbiAgLy8gICAgYmVjYXVzZSB0aGUgdGFyZ2V0IG1hbmlmZXN0IGRlY2xhcmVzIGBkZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyOiBwbnBtYC5cbiAgLy8gICAgbnBtLWxldmVsIGZsYWdzLCBgLS1yZWdpc3RyeWAgYW1vbmcgdGhlbSwgbXVzdCBwcmVjZWRlIHRoZSBwYWNrYWdlIG5hbWUsXG4gIC8vICAgIG9yIG5weCBmb3J3YXJkcyB0aGVtIHRvIHBucG0gaW5zdGVhZCBvZiBhY3Rpbmcgb24gdGhlbSBpdHNlbGYuXG4gIHJldHVybiBbXCJucHhcIiwgLi4ubnB4UmVnaXN0cnlBcmdzKCksIFwiLXlcIiwgXCItLWVuZ2luZS1zdHJpY3Q9ZmFsc2VcIiwgXCJwbnBtXCJdO1xufVxuXG4vKiogTWVtb2l6ZWQgYFtjb21tYW5kLCAuLi5wcmVmaXhdYCBhcmd2IHByZWZpeCB0byBydW4gcG5wbSAocmVzb2x2ZWQgaW5zdGFsbCwgZWxzZSBjb3JlcGFjaywgZWxzZSBucHgpLiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVQbnBtQXJndiA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUocmVzb2x2ZVBucG1Bcmd2SW1wbCk7XG5cbi8qKiBSdW4gcG5wbSB3aXRoIGluaGVyaXRlZCBzdGRpbyBmcm9tIGBjd2RgLCBmb3JjaW5nIHRoZSByZXNvbHZlZCByZWdpc3RyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5QbnBtKGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IHJlc29sdmVQbnBtQXJndigpO1xuICBjb25zdCByZWdpc3RyeUFyZ3MgPSBwbnBtUmVnaXN0cnlBcmdzKGFyZ3MpO1xuICBpZiAocmVnaXN0cnlBcmdzLmxlbmd0aCA+IDApIHtcbiAgICBsb2dnZXIuaW5mbyhgcnVubmluZyBwbnBtIHdpdGggcmVnaXN0cnk6ICR7cmVnaXN0cnlBcmdzWzFdfWApO1xuICB9XG4gIGV4ZWMuc3Bhd25TeW5jKGNvbW1hbmQsIFsuLi5wcmVmaXgsIC4uLmFyZ3MsIC4uLnJlZ2lzdHJ5QXJnc10sIHtcbiAgICBjd2QsXG4gICAgY2hlY2s6IHRydWUsXG4gICAgZW52OiBjaGlsZEVudigpLFxuICB9KTtcbn1cblxuLyoqIEluc3RhbGwgd29ya3NwYWNlIGRlcGVuZGVuY2llcyB3aGVuIGBub2RlX21vZHVsZXNgIG9yIHByb2plbiBpcyBtaXNzaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVdvcmtzcGFjZVJlYWR5KHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBpZiAobmVlZHNJbnN0YWxsKHJvb3QpKSB7XG4gICAgcnVuUG5wbShbXCJpbnN0YWxsXCIsIFwiLS1uby1mcm96ZW4tbG9ja2ZpbGVcIl0sIHJvb3QpO1xuICB9XG59XG5cbi8qKiBSdW4gYHBucG0gZXhlYyBwcm9qZW5gIHdpdGggdGhlIGdpdmVuIGFyZ3MgZnJvbSBgcm9vdGAuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUHJvamVuKGFyZ3M6IHN0cmluZ1tdLCByb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgcnVuUG5wbShbXCJleGVjXCIsIFwicHJvamVuXCIsIC4uLmFyZ3NdLCByb290KTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
"@clack/prompts": "^1.7.0",
|
|
19
19
|
"commander": "^15.0.0",
|
|
20
20
|
"pnpm": "^11.0.6",
|
|
21
|
-
"@dbx-tools/core": "0.6.
|
|
22
|
-
"@dbx-tools/shared-core": "0.6.
|
|
21
|
+
"@dbx-tools/core": "0.6.34",
|
|
22
|
+
"@dbx-tools/shared-core": "0.6.34"
|
|
23
23
|
},
|
|
24
24
|
"main": "./lib/index.js",
|
|
25
25
|
"license": "UNLICENSED",
|
|
26
26
|
"publishConfig": {
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
|
-
"version": "0.6.
|
|
29
|
+
"version": "0.6.34",
|
|
30
30
|
"types": "./lib/index.d.ts",
|
|
31
31
|
"type": "module",
|
|
32
32
|
"exports": {
|
package/src/bootstrap.ts
CHANGED
|
@@ -4,14 +4,19 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { createRequire } from "node:module";
|
|
7
8
|
import { join } from "node:path";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
9
|
import { intro, outro } from "@clack/prompts";
|
|
10
|
-
import { exec } from "@dbx-tools/core";
|
|
11
|
-
import { json } from "@dbx-tools/shared-core";
|
|
12
|
-
import { resolvePnpmArgv, runPnpm } from "./pnpm.ts";
|
|
10
|
+
import { exec, project } from "@dbx-tools/core";
|
|
11
|
+
import { json, log } from "@dbx-tools/shared-core";
|
|
12
|
+
import { childEnv, resolvePnpmArgv, runPnpm } from "./pnpm.ts";
|
|
13
13
|
import { rootLabel } from "./root.ts";
|
|
14
14
|
|
|
15
|
+
const logger = log.logger("dbx-tools:bootstrap");
|
|
16
|
+
|
|
17
|
+
/** Published package name used for Node's self-reference manifest resolution. */
|
|
18
|
+
const CLI_PACKAGE = "@dbx-tools/cli";
|
|
19
|
+
|
|
15
20
|
/** Fallback when this CLI's own version isn't a real release (an in-repo `0.0.0`). */
|
|
16
21
|
const FALLBACK_PROJEN_SPECIFIER = "@dbx-tools/projen@latest";
|
|
17
22
|
|
|
@@ -38,7 +43,12 @@ function defaultProjenSpecifier(): string {
|
|
|
38
43
|
/** This CLI's own released version, or `undefined` for an in-repo `0.0.0` build. */
|
|
39
44
|
function ownVersion(): string | undefined {
|
|
40
45
|
try {
|
|
41
|
-
|
|
46
|
+
// Resolve through the package's exported `./package.json`, which works from
|
|
47
|
+
// both source (`src/bootstrap.ts`) and published output
|
|
48
|
+
// (`lib/src/bootstrap.js`). A relative URL is one level from the manifest
|
|
49
|
+
// in source but two levels away after compilation and silently fell back to
|
|
50
|
+
// `@latest` in every installed CLI.
|
|
51
|
+
const manifestPath = createRequire(import.meta.url).resolve(`${CLI_PACKAGE}/package.json`);
|
|
42
52
|
const version = json.parseRecord(readFileSync(manifestPath, "utf8"))?.version;
|
|
43
53
|
return typeof version === "string" && version !== "0.0.0" ? version : undefined;
|
|
44
54
|
} catch {
|
|
@@ -157,7 +167,53 @@ export function seedToolchain(
|
|
|
157
167
|
writeFileSync(workspaceFile, WORKSPACE_SEED);
|
|
158
168
|
}
|
|
159
169
|
|
|
160
|
-
|
|
170
|
+
seedRegistry(root);
|
|
171
|
+
|
|
172
|
+
const kernelArch = exec.spawnSync("uname", ["-m"], {
|
|
173
|
+
stdin: "ignore",
|
|
174
|
+
stdout: "capture",
|
|
175
|
+
stderr: "ignore",
|
|
176
|
+
}).stdout;
|
|
177
|
+
logger.info("seeding toolchain", {
|
|
178
|
+
node: process.version,
|
|
179
|
+
platform: process.platform,
|
|
180
|
+
arch: process.arch,
|
|
181
|
+
kernelArch: kernelArch || "unknown",
|
|
182
|
+
engine: projenSpecifier,
|
|
183
|
+
});
|
|
184
|
+
runPnpm(
|
|
185
|
+
[
|
|
186
|
+
"add",
|
|
187
|
+
"--reporter=append-only",
|
|
188
|
+
"-D",
|
|
189
|
+
"projen",
|
|
190
|
+
"typescript@^5.9.3",
|
|
191
|
+
"tsx@^4.23.0",
|
|
192
|
+
projenSpecifier,
|
|
193
|
+
],
|
|
194
|
+
root,
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Pin a non-default registry into the new root's `.npmrc`.
|
|
200
|
+
*
|
|
201
|
+
* The CLI already forces `--registry` onto the pnpm invocations it makes itself,
|
|
202
|
+
* but a bootstrapped workspace outlives this process: every later `pnpm install`
|
|
203
|
+
* the developer (or projen's post-synth step) runs is on its own. pnpm ignores
|
|
204
|
+
* `npm_config_registry` from the environment, so without a file on disk those
|
|
205
|
+
* runs revert to `https://registry.npmjs.org/` - which is a hard failure where
|
|
206
|
+
* the custom registry was the only reachable one.
|
|
207
|
+
*
|
|
208
|
+
* Only writes for an actual override, never creates a file just to name npmjs,
|
|
209
|
+
* and never overwrites an existing `.npmrc` (the developer's own wins).
|
|
210
|
+
*/
|
|
211
|
+
function seedRegistry(root: string): void {
|
|
212
|
+
const registry = project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString();
|
|
213
|
+
if (!registry) return;
|
|
214
|
+
const npmrc = join(root, ".npmrc");
|
|
215
|
+
if (existsSync(npmrc)) return;
|
|
216
|
+
writeFileSync(npmrc, `registry=${registry}\n`);
|
|
161
217
|
}
|
|
162
218
|
|
|
163
219
|
/**
|
|
@@ -195,9 +251,12 @@ function normalizeSeedManifest(manifestPath: string): void {
|
|
|
195
251
|
*/
|
|
196
252
|
export function runInitialSynth(root: string): void {
|
|
197
253
|
const [command, ...prefix] = resolvePnpmArgv();
|
|
254
|
+
// No `--registry` here: this is `pnpm exec`, whose trailing arguments belong to
|
|
255
|
+
// tsx. The registry reaches anything nested through `childEnv` and the seeded
|
|
256
|
+
// `.npmrc` instead.
|
|
198
257
|
exec.spawnSync(command, [...prefix, "exec", "tsx", ".projenrc.ts"], {
|
|
199
258
|
cwd: root,
|
|
200
|
-
env: {
|
|
259
|
+
env: childEnv({ PROJEN_DISABLE_POST: "true" }),
|
|
201
260
|
check: true,
|
|
202
261
|
});
|
|
203
262
|
}
|
package/src/pnpm.ts
CHANGED
|
@@ -1,17 +1,122 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pnpm discovery, workspace install, and projen forwarding for the `dbx-tools` CLI.
|
|
3
3
|
*
|
|
4
|
+
* ## Forcing a custom registry
|
|
5
|
+
*
|
|
6
|
+
* pnpm and npm do NOT agree on how a registry is configured, and getting this
|
|
7
|
+
* wrong is silent. Measured against pnpm 11.0.6 and npm 11:
|
|
8
|
+
*
|
|
9
|
+
* | mechanism | npm | pnpm |
|
|
10
|
+
* | ---------------------------------------- | --- | ---- |
|
|
11
|
+
* | `--registry <url>` CLI flag | yes | yes |
|
|
12
|
+
* | project `.npmrc` | yes | yes |
|
|
13
|
+
* | `npm_config_registry` env var | yes | NO |
|
|
14
|
+
*
|
|
15
|
+
* So an env var alone reads back correctly from `npm config get registry` while
|
|
16
|
+
* pnpm ignores it and silently falls through to its built-in
|
|
17
|
+
* `https://registry.npmjs.org/`. That produced a bootstrap which logged the
|
|
18
|
+
* local registry and then tried to fetch `typescript` / `projen` / `tsx` from
|
|
19
|
+
* npmjs, failing with ECONNREFUSED on a machine that had no route to it.
|
|
20
|
+
*
|
|
21
|
+
* Hence all three channels, each where it actually applies:
|
|
22
|
+
*
|
|
23
|
+
* - {@link pnpmRegistryArgs} passes `--registry` to pnpm, but only for the
|
|
24
|
+
* subcommands that resolve packages. It must NOT be appended to
|
|
25
|
+
* `pnpm exec <cmd>`, where trailing arguments belong to `<cmd>`, not pnpm.
|
|
26
|
+
* - {@link npxRegistryArgs} passes `--registry` to npx, before the package
|
|
27
|
+
* name, so the npx fallback can fetch pnpm itself from the same registry.
|
|
28
|
+
* - {@link childEnv} keeps `npm_config_registry` set for npm-based children
|
|
29
|
+
* (npx included), which is the only channel npm exposes to nested tools.
|
|
30
|
+
*
|
|
31
|
+
* `@dbx-tools/core`'s `npmRegistry({ overrideOnly: true })` returns nothing when
|
|
32
|
+
* the effective registry IS npmjs, so none of this touches a default install.
|
|
33
|
+
*
|
|
4
34
|
* @module
|
|
5
35
|
*/
|
|
6
36
|
import { createRequire } from "node:module";
|
|
7
|
-
import { dirname, join } from "node:path";
|
|
8
|
-
import { exec } from "@dbx-tools/core";
|
|
9
|
-
import { functionModule } from "@dbx-tools/shared-core";
|
|
37
|
+
import { delimiter, dirname, join } from "node:path";
|
|
38
|
+
import { exec, project } from "@dbx-tools/core";
|
|
39
|
+
import { functionModule, log } from "@dbx-tools/shared-core";
|
|
10
40
|
import { needsInstall } from "./root.ts";
|
|
11
41
|
|
|
42
|
+
const logger = log.logger("dbx-tools:pnpm");
|
|
43
|
+
|
|
12
44
|
/** A package.json `bin` field: either a single command string, or a name -> path map. */
|
|
13
45
|
type BinField = string | Record<string, string>;
|
|
14
46
|
|
|
47
|
+
/**
|
|
48
|
+
* pnpm subcommands that resolve packages from a registry, and therefore accept a
|
|
49
|
+
* meaningful `--registry`. Everything else (`exec`, `run`, `config`, ...) is left
|
|
50
|
+
* alone: `exec` in particular forwards trailing arguments to the command it runs,
|
|
51
|
+
* so a `--registry` appended there would land on projen or tsx instead.
|
|
52
|
+
*/
|
|
53
|
+
const REGISTRY_SUBCOMMANDS = new Set([
|
|
54
|
+
"add",
|
|
55
|
+
"create",
|
|
56
|
+
"dlx",
|
|
57
|
+
"i",
|
|
58
|
+
"import",
|
|
59
|
+
"install",
|
|
60
|
+
"link",
|
|
61
|
+
"up",
|
|
62
|
+
"update",
|
|
63
|
+
]);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The registry to force onto child package managers, or `undefined` when the
|
|
67
|
+
* effective one is already the public default.
|
|
68
|
+
*
|
|
69
|
+
* `envVars: true` also consults `npm_config_registry` directly, because a
|
|
70
|
+
* container may export it without any `.npmrc` for `npm config get` to read.
|
|
71
|
+
* Memoized: resolution shells out to npm.
|
|
72
|
+
*/
|
|
73
|
+
const registryOverride = functionModule.memoize((): string | undefined =>
|
|
74
|
+
project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString(),
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
/** `--registry <url>` for npx, or `[]`. Placed BEFORE the package name by callers. */
|
|
78
|
+
export function npxRegistryArgs(): string[] {
|
|
79
|
+
const url = registryOverride();
|
|
80
|
+
return url ? ["--registrsy", url] : [];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
|
|
84
|
+
export function pnpmRegistryArgs(args: readonly string[]): string[] {
|
|
85
|
+
const url = registryOverride();
|
|
86
|
+
if (!url) return [];
|
|
87
|
+
return pnpmUsesRegistry(args) ? ["--registry", url] : [];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Whether the first pnpm subcommand resolves packages and accepts `--registry`. */
|
|
91
|
+
export function pnpmUsesRegistry(args: readonly string[]): boolean {
|
|
92
|
+
const subcommand = args.find((arg) => !arg.startsWith("-"));
|
|
93
|
+
return subcommand !== undefined && REGISTRY_SUBCOMMANDS.has(subcommand);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* `process.env` plus the current Node executable directory and registry aliases.
|
|
98
|
+
*
|
|
99
|
+
* The executable directory matters when this CLI was launched by absolute path
|
|
100
|
+
* (for example from QuickJS or mise activation that was not exported): pnpm
|
|
101
|
+
* itself runs, but lifecycle scripts invoke `node` by name and otherwise fail
|
|
102
|
+
* with `sh: node: not found`.
|
|
103
|
+
*/
|
|
104
|
+
export function childEnv(extra?: Record<string, string>): NodeJS.ProcessEnv {
|
|
105
|
+
const env: NodeJS.ProcessEnv = { ...process.env, ...extra };
|
|
106
|
+
const nodeBin = dirname(process.execPath);
|
|
107
|
+
const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
108
|
+
if (!pathEntries.includes(nodeBin)) {
|
|
109
|
+
env.PATH = [nodeBin, ...pathEntries].join(delimiter);
|
|
110
|
+
}
|
|
111
|
+
const url = registryOverride();
|
|
112
|
+
if (url) {
|
|
113
|
+
// Both cases: env is case-sensitive on POSIX, and npm lowercases when reading.
|
|
114
|
+
env.npm_config_registry = url;
|
|
115
|
+
env.NPM_CONFIG_REGISTRY = url;
|
|
116
|
+
}
|
|
117
|
+
return env;
|
|
118
|
+
}
|
|
119
|
+
|
|
15
120
|
/** True when `pnpm --version` runs, i.e. pnpm is already on PATH. */
|
|
16
121
|
function pnpmOnPath(): boolean {
|
|
17
122
|
try {
|
|
@@ -30,12 +135,13 @@ function pnpmOnPath(): boolean {
|
|
|
30
135
|
function resolvePnpmArgvImpl(): string[] {
|
|
31
136
|
// 1. A resolvable `pnpm` dependency (the normal in-workspace case): run its
|
|
32
137
|
// bin directly with the current node - no PATH or package-manager shim.
|
|
138
|
+
// pnpm's own `--registry` rides in with the ARGS, after this entry point.
|
|
33
139
|
try {
|
|
34
140
|
const require = createRequire(import.meta.url);
|
|
35
141
|
const pkgJsonPath = require.resolve("pnpm/package.json");
|
|
36
142
|
const pkg = require(pkgJsonPath) as { bin: BinField };
|
|
37
143
|
const bin = typeof pkg.bin === "string" ? pkg.bin : pkg.bin.pnpm;
|
|
38
|
-
return [process.execPath, join(dirname(pkgJsonPath), bin)];
|
|
144
|
+
if (bin) return [process.execPath, join(dirname(pkgJsonPath), bin)];
|
|
39
145
|
} catch {
|
|
40
146
|
// fall through
|
|
41
147
|
}
|
|
@@ -62,16 +168,26 @@ function resolvePnpmArgvImpl(): string[] {
|
|
|
62
168
|
// 4. Last resort: fetch pnpm on demand via npx. Pass `--engine-strict=false`
|
|
63
169
|
// (and skip npm's devEngines gate) so npm doesn't refuse to run just
|
|
64
170
|
// because the target manifest declares `devEngines.packageManager: pnpm`.
|
|
65
|
-
|
|
171
|
+
// npm-level flags, `--registry` among them, must precede the package name,
|
|
172
|
+
// or npx forwards them to pnpm instead of acting on them itself.
|
|
173
|
+
return ["npx", ...npxRegistryArgs(), "-y", "--engine-strict=false", "pnpm"];
|
|
66
174
|
}
|
|
67
175
|
|
|
68
176
|
/** Memoized `[command, ...prefix]` argv prefix to run pnpm (resolved install, else corepack, else npx). */
|
|
69
177
|
export const resolvePnpmArgv = functionModule.memoize(resolvePnpmArgvImpl);
|
|
70
178
|
|
|
71
|
-
/** Run pnpm with inherited stdio from `cwd
|
|
179
|
+
/** Run pnpm with inherited stdio from `cwd`, forcing the resolved registry. */
|
|
72
180
|
export function runPnpm(args: string[], cwd: string): void {
|
|
73
181
|
const [command, ...prefix] = resolvePnpmArgv();
|
|
74
|
-
|
|
182
|
+
const registryArgs = pnpmRegistryArgs(args);
|
|
183
|
+
if (registryArgs.length > 0) {
|
|
184
|
+
logger.info(`running pnpm with registry: ${registryArgs[1]}`);
|
|
185
|
+
}
|
|
186
|
+
exec.spawnSync(command, [...prefix, ...args, ...registryArgs], {
|
|
187
|
+
cwd,
|
|
188
|
+
check: true,
|
|
189
|
+
env: childEnv(),
|
|
190
|
+
});
|
|
75
191
|
}
|
|
76
192
|
|
|
77
193
|
/** Install workspace dependencies when `node_modules` or projen is missing. */
|