@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.
@@ -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
- const manifestPath = fileURLToPath(new URL("../package.json", import.meta.url));
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
- runPnpm(["add", "-D", "projen", "typescript@^5.9.3", "tsx@^4.23.0", projenSpecifier], root);
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: { ...process.env, PROJEN_DISABLE_POST: "true" },
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFFakQsaUZBQWlGO0FBQ2pGLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDO0FBRXJDLHNGQUFzRjtBQUN0RixNQUFNLHlCQUF5QixHQUFHLDBCQUEwQixDQUFDO0FBRTdEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDN0IsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUM7QUFDL0UsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsNEVBQTRFO1FB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LElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDekIsYUFBYSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUMvQyxnRkFBZ0Y7SUFDaEYsOEVBQThFO0lBQzlFLG9CQUFvQjtJQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUU7UUFDbEUsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDOUMsS0FBSyxFQUFFLElBQUk7S0FDWixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCb290c3RyYXAgYSBicmFuZC1uZXcgZm9sZGVyIGludG8gYSB3b3JraW5nIGRieC10b29scyB3b3Jrc3BhY2UgYmVmb3JlIHByb2plbiBydW5zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBpbnRybywgb3V0cm8gfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGV4ZWMsIHByb2plY3QgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBqc29uLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgY2hpbGRFbnYsIHJlc29sdmVQbnBtQXJndiwgcnVuUG5wbSB9IGZyb20gXCIuL3BucG0udHNcIjtcbmltcG9ydCB7IHJvb3RMYWJlbCB9IGZyb20gXCIuL3Jvb3QudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImRieC10b29sczpib290c3RyYXBcIik7XG5cbi8qKiBQdWJsaXNoZWQgcGFja2FnZSBuYW1lIHVzZWQgZm9yIE5vZGUncyBzZWxmLXJlZmVyZW5jZSBtYW5pZmVzdCByZXNvbHV0aW9uLiAqL1xuY29uc3QgQ0xJX1BBQ0tBR0UgPSBcIkBkYngtdG9vbHMvY2xpXCI7XG5cbi8qKiBGYWxsYmFjayB3aGVuIHRoaXMgQ0xJJ3Mgb3duIHZlcnNpb24gaXNuJ3QgYSByZWFsIHJlbGVhc2UgKGFuIGluLXJlcG8gYDAuMC4wYCkuICovXG5jb25zdCBGQUxMQkFDS19QUk9KRU5fU1BFQ0lGSUVSID0gXCJAZGJ4LXRvb2xzL3Byb2plbkBsYXRlc3RcIjtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBlbmdpbmUgYXQgVEhJUyBDTEkncyBvd24gdmVyc2lvbi4gVGhlIHR3byBhcmUgcmVsZWFzZWQgdG9nZXRoZXIgYnlcbiAqIHRoZSByb290IGBidW1wYCwgc28gdGhlIG1hdGNoaW5nIGVuZ2luZSBhbHdheXMgZXhpc3RzIG9uIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBOb3QgYEBsYXRlc3RgLCBhbmQgbm90IGEgYmFyZSBgQGRieC10b29scy9wcm9qZW5gLiBBIGJhcmUgc3BlY2lmaWVyIGNhbiBsYW5kIG9uXG4gKiBhIHN0cmF5IGAwLjAuMGAsIHdob3NlIGBeMC4wLjBgIGNhcmV0IHRoZW4gcmVhY2hlcyBubyByZWFsIHJlbGVhc2UuIGBAbGF0ZXN0YFxuICogaGFzIGEgc3VidGxlciBmYWlsdXJlOiBwbnBtIDExIGFwcGxpZXMgYSBgbWluaW11bVJlbGVhc2VBZ2VgIGRlbGF5LCBzbyBmb3IgdGhlXG4gKiBmaXJzdCBkYXkgYWZ0ZXIgYSByZWxlYXNlIGl0IGRlbGliZXJhdGVseSByZXNvbHZlcyBhIGRpc3QtdGFnIHRvIHRoZSBuZXdlc3RcbiAqIHZlcnNpb24gT0xERVIgdGhhbiB0aGUgdGhyZXNob2xkIGFuZCBtZXJlbHkgbm90ZXMgdGhlIG5ld2VyIG9uZVxuICogKGArIEBkYngtdG9vbHMvcHJvamVuIDAuMS4yNCAoMC4zLjQyIGlzIGF2YWlsYWJsZSlgKS4gQSBib290c3RyYXAgcnVuIHJpZ2h0XG4gKiBhZnRlciBhIHJlbGVhc2UgdGhlcmVmb3JlIGluc3RhbGxlZCBhIG1vbnRocy1vbGQgZW5naW5lIGFnYWluc3QgYSBjdXJyZW50IENMSSxcbiAqIHdoaWNoIGlzIGhvdyBgc3luYyAtLXdhdGNoYCBkaWVkIG9uIGFuIGVuZ2luZSBwcmVkYXRpbmcgaXRzIGBjb25jdXJyZW50bHlgXG4gKiBkZXBlbmRlbmN5LiBBbiBleHBsaWNpdCByYW5nZSBhZG1pdHMgb25seSB0aGUgdmVyc2lvbiB3ZSB3YW50LCBzbyB0aGUgYWdlXG4gKiBoZXVyaXN0aWMgaGFzIG5vdGhpbmcgb2xkZXIgdG8gZmFsbCBiYWNrIHRvLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb24gPSBvd25WZXJzaW9uKCk7XG4gIHJldHVybiB2ZXJzaW9uID8gYEBkYngtdG9vbHMvcHJvamVuQF4ke3ZlcnNpb259YCA6IEZBTExCQUNLX1BST0pFTl9TUEVDSUZJRVI7XG59XG5cbi8qKiBUaGlzIENMSSdzIG93biByZWxlYXNlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gaW4tcmVwbyBgMC4wLjBgIGJ1aWxkLiAqL1xuZnVuY3Rpb24gb3duVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIC8vIFJlc29sdmUgdGhyb3VnaCB0aGUgcGFja2FnZSdzIGV4cG9ydGVkIGAuL3BhY2thZ2UuanNvbmAsIHdoaWNoIHdvcmtzIGZyb21cbiAgICAvLyBib3RoIHNvdXJjZSAoYHNyYy9ib290c3RyYXAudHNgKSBhbmQgcHVibGlzaGVkIG91dHB1dFxuICAgIC8vIChgbGliL3NyYy9ib290c3RyYXAuanNgKS4gQSByZWxhdGl2ZSBVUkwgaXMgb25lIGxldmVsIGZyb20gdGhlIG1hbmlmZXN0XG4gICAgLy8gaW4gc291cmNlIGJ1dCB0d28gbGV2ZWxzIGF3YXkgYWZ0ZXIgY29tcGlsYXRpb24gYW5kIHNpbGVudGx5IGZlbGwgYmFjayB0b1xuICAgIC8vIGBAbGF0ZXN0YCBpbiBldmVyeSBpbnN0YWxsZWQgQ0xJLlxuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKGAke0NMSV9QQUNLQUdFfS9wYWNrYWdlLmpzb25gKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0ZjhcIikpPy52ZXJzaW9uO1xuICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiB2ZXJzaW9uICE9PSBcIjAuMC4wXCIgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDb21wYXJlIGB4LnkuemAgdHJpcGxlczsgcmV0dXJucyA8MCwgMCwgb3IgPjAuIE1pc3NpbmcgcGFydHMgY291bnQgYXMgMC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhcnRzID0gKHY6IHN0cmluZykgPT4gdi5zcGxpdChcIi5cIikubWFwKChwKSA9PiBOdW1iZXIucGFyc2VJbnQocCwgMTApIHx8IDApO1xuICBjb25zdCBbeCwgeV0gPSBbcGFydHMoYSksIHBhcnRzKGIpXTtcbiAgcmV0dXJuIHhbMF0gLSB5WzBdIHx8IHhbMV0gLSB5WzFdIHx8IHhbMl0gLSB5WzJdO1xufVxuXG4vKiogVmVyc2lvbiBvZiB0aGUgZW5naW5lIGN1cnJlbnRseSBpbnN0YWxsZWQgYXQgYHJvb3RgLCBpZiBhbnkuICovXG5mdW5jdGlvbiBpbnN0YWxsZWRFbmdpbmVWZXJzaW9uKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGRieC10b29sc1wiLCBcInByb2plblwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3QsIFwidXRmOFwiKSk/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
- return [process.execPath, join(dirname(pkgJsonPath), bin)];
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
- return ["npx", "-y", "--engine-strict=false", "pnpm"];
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
- exec.spawnSync(command, [...prefix, ...args], { cwd, check: true });
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.15",
22
- "@dbx-tools/shared-core": "0.6.15"
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.15",
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
- const manifestPath = fileURLToPath(new URL("../package.json", import.meta.url));
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
- runPnpm(["add", "-D", "projen", "typescript@^5.9.3", "tsx@^4.23.0", projenSpecifier], root);
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: { ...process.env, PROJEN_DISABLE_POST: "true" },
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
- return ["npx", "-y", "--engine-strict=false", "pnpm"];
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
- exec.spawnSync(command, [...prefix, ...args], { cwd, check: true });
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. */