@dbx-tools/cli 0.6.14 → 0.6.27

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.
@@ -7,9 +7,9 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
7
7
  import { join } from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
9
  import { intro, outro } from "@clack/prompts";
10
- import { exec } from "@dbx-tools/core";
10
+ import { exec, project } from "@dbx-tools/core";
11
11
  import { json } from "@dbx-tools/shared-core";
12
- import { resolvePnpmArgv, runPnpm } from "./pnpm.js";
12
+ import { childEnv, resolvePnpmArgv, runPnpm } from "./pnpm.js";
13
13
  import { rootLabel } from "./root.js";
14
14
  /** Fallback when this CLI's own version isn't a real release (an in-repo `0.0.0`). */
15
15
  const FALLBACK_PROJEN_SPECIFIER = "@dbx-tools/projen@latest";
@@ -139,8 +139,31 @@ export function seedToolchain(root, projenSpecifier = defaultProjenSpecifier())
139
139
  if (!existsSync(workspaceFile)) {
140
140
  writeFileSync(workspaceFile, WORKSPACE_SEED);
141
141
  }
142
+ seedRegistry(root);
142
143
  runPnpm(["add", "-D", "projen", "typescript@^5.9.3", "tsx@^4.23.0", projenSpecifier], root);
143
144
  }
145
+ /**
146
+ * Pin a non-default registry into the new root's `.npmrc`.
147
+ *
148
+ * The CLI already forces `--registry` onto the pnpm invocations it makes itself,
149
+ * but a bootstrapped workspace outlives this process: every later `pnpm install`
150
+ * the developer (or projen's post-synth step) runs is on its own. pnpm ignores
151
+ * `npm_config_registry` from the environment, so without a file on disk those
152
+ * runs revert to `https://registry.npmjs.org/` - which is a hard failure where
153
+ * the custom registry was the only reachable one.
154
+ *
155
+ * Only writes for an actual override, never creates a file just to name npmjs,
156
+ * and never overwrites an existing `.npmrc` (the developer's own wins).
157
+ */
158
+ function seedRegistry(root) {
159
+ const registry = project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString();
160
+ if (!registry)
161
+ return;
162
+ const npmrc = join(root, ".npmrc");
163
+ if (existsSync(npmrc))
164
+ return;
165
+ writeFileSync(npmrc, `registry=${registry}\n`);
166
+ }
144
167
  /**
145
168
  * Make what `pnpm init` produced safe to synth against. Two corrections, both
146
169
  * because that output varies by pnpm version:
@@ -177,10 +200,13 @@ function normalizeSeedManifest(manifestPath) {
177
200
  */
178
201
  export function runInitialSynth(root) {
179
202
  const [command, ...prefix] = resolvePnpmArgv();
203
+ // No `--registry` here: this is `pnpm exec`, whose trailing arguments belong to
204
+ // tsx. The registry reaches anything nested through `childEnv` and the seeded
205
+ // `.npmrc` instead.
180
206
  exec.spawnSync(command, [...prefix, "exec", "tsx", ".projenrc.ts"], {
181
207
  cwd: root,
182
- env: { ...process.env, PROJEN_DISABLE_POST: "true" },
208
+ env: childEnv({ PROJEN_DISABLE_POST: "true" }),
183
209
  check: true,
184
210
  });
185
211
  }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxzRkFBc0Y7QUFDdEYsTUFBTSx5QkFBeUIsR0FBRywwQkFBMEIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQzdCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO0FBQy9FLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsU0FBUyxVQUFVO0lBQ2pCLElBQUksQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMs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O1FBQ3RFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDekIsYUFBYSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUU7UUFDbEUsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFO1FBQ3BELEtBQUssRUFBRSxJQUFJO0tBQ1osQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQm9vdHN0cmFwIGEgYnJhbmQtbmV3IGZvbGRlciBpbnRvIGEgd29ya2luZyBkYngtdG9vbHMgd29ya3NwYWNlIGJlZm9yZSBwcm9qZW4gcnVucy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHsgaW50cm8sIG91dHJvIH0gZnJvbSBcIkBjbGFjay9wcm9tcHRzXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsganNvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyByZXNvbHZlUG5wbUFyZ3YsIHJ1blBucG0gfSBmcm9tIFwiLi9wbnBtLnRzXCI7XG5pbXBvcnQgeyByb290TGFiZWwgfSBmcm9tIFwiLi9yb290LnRzXCI7XG5cbi8qKiBGYWxsYmFjayB3aGVuIHRoaXMgQ0xJJ3Mgb3duIHZlcnNpb24gaXNuJ3QgYSByZWFsIHJlbGVhc2UgKGFuIGluLXJlcG8gYDAuMC4wYCkuICovXG5jb25zdCBGQUxMQkFDS19QUk9KRU5fU1BFQ0lGSUVSID0gXCJAZGJ4LXRvb2xzL3Byb2plbkBsYXRlc3RcIjtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBlbmdpbmUgYXQgVEhJUyBDTEkncyBvd24gdmVyc2lvbi4gVGhlIHR3byBhcmUgcmVsZWFzZWQgdG9nZXRoZXIgYnlcbiAqIHRoZSByb290IGBidW1wYCwgc28gdGhlIG1hdGNoaW5nIGVuZ2luZSBhbHdheXMgZXhpc3RzIG9uIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBOb3QgYEBsYXRlc3RgLCBhbmQgbm90IGEgYmFyZSBgQGRieC10b29scy9wcm9qZW5gLiBBIGJhcmUgc3BlY2lmaWVyIGNhbiBsYW5kIG9uXG4gKiBhIHN0cmF5IGAwLjAuMGAsIHdob3NlIGBeMC4wLjBgIGNhcmV0IHRoZW4gcmVhY2hlcyBubyByZWFsIHJlbGVhc2UuIGBAbGF0ZXN0YFxuICogaGFzIGEgc3VidGxlciBmYWlsdXJlOiBwbnBtIDExIGFwcGxpZXMgYSBgbWluaW11bVJlbGVhc2VBZ2VgIGRlbGF5LCBzbyBmb3IgdGhlXG4gKiBmaXJzdCBkYXkgYWZ0ZXIgYSByZWxlYXNlIGl0IGRlbGliZXJhdGVseSByZXNvbHZlcyBhIGRpc3QtdGFnIHRvIHRoZSBuZXdlc3RcbiAqIHZlcnNpb24gT0xERVIgdGhhbiB0aGUgdGhyZXNob2xkIGFuZCBtZXJlbHkgbm90ZXMgdGhlIG5ld2VyIG9uZVxuICogKGArIEBkYngtdG9vbHMvcHJvamVuIDAuMS4yNCAoMC4zLjQyIGlzIGF2YWlsYWJsZSlgKS4gQSBib290c3RyYXAgcnVuIHJpZ2h0XG4gKiBhZnRlciBhIHJlbGVhc2UgdGhlcmVmb3JlIGluc3RhbGxlZCBhIG1vbnRocy1vbGQgZW5naW5lIGFnYWluc3QgYSBjdXJyZW50IENMSSxcbiAqIHdoaWNoIGlzIGhvdyBgc3luYyAtLXdhdGNoYCBkaWVkIG9uIGFuIGVuZ2luZSBwcmVkYXRpbmcgaXRzIGBjb25jdXJyZW50bHlgXG4gKiBkZXBlbmRlbmN5LiBBbiBleHBsaWNpdCByYW5nZSBhZG1pdHMgb25seSB0aGUgdmVyc2lvbiB3ZSB3YW50LCBzbyB0aGUgYWdlXG4gKiBoZXVyaXN0aWMgaGFzIG5vdGhpbmcgb2xkZXIgdG8gZmFsbCBiYWNrIHRvLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb24gPSBvd25WZXJzaW9uKCk7XG4gIHJldHVybiB2ZXJzaW9uID8gYEBkYngtdG9vbHMvcHJvamVuQF4ke3ZlcnNpb259YCA6IEZBTExCQUNLX1BST0pFTl9TUEVDSUZJRVI7XG59XG5cbi8qKiBUaGlzIENMSSdzIG93biByZWxlYXNlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gaW4tcmVwbyBgMC4wLjBgIGJ1aWxkLiAqL1xuZnVuY3Rpb24gb3duVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGZpbGVVUkxUb1BhdGgobmV3IFVSTChcIi4uL3BhY2thZ2UuanNvblwiLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0ZjhcIikpPy52ZXJzaW9uO1xuICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiB2ZXJzaW9uICE9PSBcIjAuMC4wXCIgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDb21wYXJlIGB4LnkuemAgdHJpcGxlczsgcmV0dXJucyA8MCwgMCwgb3IgPjAuIE1pc3NpbmcgcGFydHMgY291bnQgYXMgMC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhcnRzID0gKHY6IHN0cmluZykgPT4gdi5zcGxpdChcIi5cIikubWFwKChwKSA9PiBOdW1iZXIucGFyc2VJbnQocCwgMTApIHx8IDApO1xuICBjb25zdCBbeCwgeV0gPSBbcGFydHMoYSksIHBhcnRzKGIpXTtcbiAgcmV0dXJuIHhbMF0gLSB5WzBdIHx8IHhbMV0gLSB5WzFdIHx8IHhbMl0gLSB5WzJdO1xufVxuXG4vKiogVmVyc2lvbiBvZiB0aGUgZW5naW5lIGN1cnJlbnRseSBpbnN0YWxsZWQgYXQgYHJvb3RgLCBpZiBhbnkuICovXG5mdW5jdGlvbiBpbnN0YWxsZWRFbmdpbmVWZXJzaW9uKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGRieC10b29sc1wiLCBcInByb2plblwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3QsIFwidXRmOFwiKSk/LnZlcnNpb247XG4gICAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSBcInN0cmluZ1wiID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFVwZ3JhZGUgYW4gZXN0YWJsaXNoZWQgd29ya3NwYWNlIHdob3NlIGluc3RhbGxlZCBlbmdpbmUgcHJlZGF0ZXMgdGhpcyBDTEkuXG4gKlxuICogQm9vdHN0cmFwcGluZyBwaW5zIHRoZSBlbmdpbmUgb25jZSwgYW5kIG5vdGhpbmcgYWZ0ZXJ3YXJkcyByZXZpc2l0cyBpdCAtIHNvIGFcbiAqIHdvcmtzcGFjZSBjcmVhdGVkIG1vbnRocyBhZ28ga2VwdCByZXNvbHZpbmcgaXRzIG9yaWdpbmFsIGVuZ2luZSBubyBtYXR0ZXIgaG93XG4gKiBjdXJyZW50IHRoZSBDTEkgaW52b2tpbmcgaXQgd2FzLCBhbmQgZmFpbGVkIGluc2lkZSB0aGUgT0xEIGVuZ2luZSdzIGNvZGVcbiAqIChgc3luYyAtLXdhdGNoYCBkeWluZyBvbiBhIGBjb25jdXJyZW50bHlgIHRoYXQgZW5naW5lIG5ldmVyIGRlY2xhcmVkKS4gVGhlIHR3b1xuICogYXJlIHJlbGVhc2VkIGluIGxvY2tzdGVwLCBzbyB0aGlzIENMSSdzIHZlcnNpb24gaXMgZXhhY3RseSB0aGUgZW5naW5lIGl0XG4gKiBleHBlY3RzLlxuICpcbiAqIE9ubHkgZXZlciBtb3ZlcyBGT1JXQVJEOiBhbiBlbmdpbmUgYXQgb3IgYWhlYWQgb2YgdGhpcyBDTEkgaXMgbGVmdCBhbG9uZSwgc29cbiAqIGFuIG9sZGVyIENMSSBjYW5ub3QgZG93bmdyYWRlIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5naW5lQ3VycmVudChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWQgPSBvd25WZXJzaW9uKCk7XG4gIGlmICghZXhwZWN0ZWQpIHJldHVybjtcbiAgY29uc3QgaW5zdGFsbGVkID0gaW5zdGFsbGVkRW5naW5lVmVyc2lvbihyb290KTtcbiAgaWYgKGluc3RhbGxlZCAmJiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkLCBleHBlY3RlZCkgPj0gMCkgcmV0dXJuO1xuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIGRlZmF1bHRQcm9qZW5TcGVjaWZpZXIoKV0sIHJvb3QpO1xufVxuXG4vLyBSZWFjaCB0aGUgY2xhc3MgdGhyb3VnaCBpdHMgbW9kdWxlIE5BTUVTUEFDRS4gQ3VycmVudCBlbmdpbmVzIGFsc28gaG9pc3QgaXRcbi8vIGZsYXQsIGJ1dCBldmVyeSBlbmdpbmUgZXZlciBwdWJsaXNoZWQgZXhwb3J0cyB0aGUgbmFtZXNwYWNlLCBhbmQgdGhpcyB0ZW1wbGF0ZVxuLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCBgQGxhdGVzdGAgLSBhIGZsYXQgaW1wb3J0IGRpZXMgb24gYW4gb2xkZXIgb25lIHdpdGhcbi8vIFwiZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJ0RCWFRvb2xzTm9kZVByb2plY3QnXCIuXG5jb25zdCBQUk9KRU5SQ19URU1QTEFURSA9IGBpbXBvcnQgeyBwcm9qZWN0IGFzIHByb2plY3RBcGkgfSBmcm9tIFwiQGRieC10b29scy9wcm9qZW5cIjtcblxuY29uc3QgcHJvamVjdCA9IG5ldyBwcm9qZWN0QXBpLkRCWFRvb2xzTm9kZVByb2plY3QoKTtcbnByb2plY3Quc3ludGgoKTtcbmA7XG5cbi8qKiBTZWVkIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBzbyB0aGUgZmlyc3QgXFxgcG5wbSBhZGRcXGAgY2FuIGFsbG93IGVzYnVpbGQgbm9uLWludGVyYWN0aXZlbHkuICovXG5jb25zdCBXT1JLU1BBQ0VfU0VFRCA9IGBwYWNrYWdlczogW11cbmFsbG93QnVpbGRzOlxuICBlc2J1aWxkOiB0cnVlXG5gO1xuXG4vKipcbiAqIFR1cm4gYSBmb2xkZXIgaW50byBhIGZ1bmN0aW9uaW5nIGRieC10b29scyB3b3Jrc3BhY2U6IGBwbnBtIGluaXRgLCBzZWVkXG4gKiBgcG5wbS13b3Jrc3BhY2UueWFtbGAsIGFkZCBgcHJvamVuYC9gdHlwZXNjcmlwdGAvYHRzeGAgKyB0aGUgZW5naW5lIHBhY2thZ2UsXG4gKiB3cml0ZSBhIG1pbmltYWwgYC5wcm9qZW5yYy50c2AsIHN5bnRoIG9uY2UgKHdpdGggYFBST0pFTl9ESVNBQkxFX1BPU1RgKSwgdGhlblxuICogaW5zdGFsbC4gRG9lcyBub3QgcnVuIGJhcnJlbHMgLSBydW4gYHBucG0gcnVuIGJhcnJlbHNgIG9yIGEgZnVsbCBwcm9qZW4gc3ludGhcbiAqIHBvc3QtaW5zdGFsbCB0byBnZW5lcmF0ZSBwYWNrYWdlIGJhcnJlbHMuXG4gKlxuICogRXZlcnkgc3RlcCBpcyBpZGVtcG90ZW50IGFuZCBzZWxmLWd1YXJkZWQsIHNvIHRoaXMgaXMgc2FmZSB0byBydW4gYWdhaW5zdCBhXG4gKiBmb2xkZXIgdGhhdCBBTFJFQURZIGhhcyBhIGhhbmQtYXV0aG9yZWQgYC5wcm9qZW5yYy50c2AgKGFuZCBldmVuIGEgY29tbWl0dGVkXG4gKiBgcGFja2FnZS5qc29uYCkgYnV0IGlzIG1pc3NpbmcgdGhlIGluc3RhbGxlZCB0b29sY2hhaW4gLSBlLmcuIGEgZnJlc2hseSBjb3BpZWRcbiAqIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzIChpbmNsdWRpbmcgbWFuaWZlc3RzKSBhcmUgZ2l0aWdub3JlZC4gSW4gdGhhdFxuICogY2FzZSBgcG5wbSBpbml0YCBhbmQgdGhlIGAucHJvamVucmMudHNgIHNjYWZmb2xkIGFyZSBza2lwcGVkLCBidXQgdGhlIGVuZ2luZSArXG4gKiBwcm9qZW4gKyB0c3ggYXJlIChyZSlpbnN0YWxsZWQgc28gdGhlIHN1YnNlcXVlbnQgc3ludGggY2FuIHJlZ2VuZXJhdGVcbiAqIGV2ZXJ5dGhpbmcuIFNlZSB7QGxpbmsgc2VlZFRvb2xjaGFpbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBXb3Jrc3BhY2UoXG4gIHJvb3Q6IHN0cmluZyxcbiAgcHJvamVuU3BlY2lmaWVyOiBzdHJpbmcgPSBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCksXG4pOiB2b2lkIHtcbiAgaW50cm8oYEJvb3RzdHJhcHBpbmcgZGJ4LXRvb2xzIHdvcmtzcGFjZSBpbiAke3Jvb3RMYWJlbChyb290KX1gKTtcblxuICBzZWVkVG9vbGNoYWluKHJvb3QsIHByb2plblNwZWNpZmllcik7XG5cbiAgY29uc3QgcHJvamVucmMgPSBqb2luKHJvb3QsIFwiLnByb2plbnJjLnRzXCIpO1xuICBpZiAoIWV4aXN0c1N5bmMocHJvamVucmMpKSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9qZW5yYywgUFJPSkVOUkNfVEVNUExBVEUpO1xuICB9XG5cbiAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuXG4gIHJ1blBucG0oW1wiaW5zdGFsbFwiLCBcIi0tbm8tZnJvemVuLWxvY2tmaWxlXCIsIFwiLS1mb3JjZVwiXSwgcm9vdCk7XG4gIG91dHJvKFwiV29ya3NwYWNlIHJlYWR5IC0gcmUtcnVuIGRieC10b29scyBvciBhZGQgcGFja2FnZXMgdW5kZXIgcGFja2FnZXMvXCIpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIHRvb2xjaGFpbiBhIHN5bnRoIG5lZWRzIChgcHJvamVuYCwgYHR5cGVzY3JpcHRgLCBgdHN4YCwgYW5kIHRoZVxuICogZGJ4LXRvb2xzIGVuZ2luZSksIHNlZWRpbmcgYSBgcGFja2FnZS5qc29uYCBhbmQgYHBucG0td29ya3NwYWNlLnlhbWxgIGZpcnN0XG4gKiB3aGVuIGFic2VudC4gSWRlbXBvdGVudDogcnVuIGl0IHdoZW5ldmVyIHRoZSBlbmdpbmUgaXMgbWlzc2luZywgc28gYSBjb3BpZWRcbiAqIHByb2plY3Qgd2l0aCBhIGAucHJvamVucmMudHNgIGJ1dCBubyBgbm9kZV9tb2R1bGVzYC9tYW5pZmVzdHMgY2FuIGJlIGJyb3VnaHRcbiAqIHVwIHRvIGEgc3ludGgtcmVhZHkgc3RhdGUgd2l0aG91dCBmdWxsIGJvb3RzdHJhcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkVG9vbGNoYWluKFxuICByb290OiBzdHJpbmcsXG4gIHByb2plblNwZWNpZmllcjogc3RyaW5nID0gZGVmYXVsdFByb2plblNwZWNpZmllcigpLFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcnVuUG5wbShbXCJpbml0XCJdLCByb290KTtcbiAgICBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZUZpbGUgPSBqb2luKHJvb3QsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKHdvcmtzcGFjZUZpbGUpKSB7XG4gICAgd3JpdGVGaWxlU3luYyh3b3Jrc3BhY2VGaWxlLCBXT1JLU1BBQ0VfU0VFRCk7XG4gIH1cblxuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIFwicHJvamVuXCIsIFwidHlwZXNjcmlwdEBeNS45LjNcIiwgXCJ0c3hAXjQuMjMuMFwiLCBwcm9qZW5TcGVjaWZpZXJdLCByb290KTtcbn1cblxuLyoqXG4gKiBNYWtlIHdoYXQgYHBucG0gaW5pdGAgcHJvZHVjZWQgc2FmZSB0byBzeW50aCBhZ2FpbnN0LiBUd28gY29ycmVjdGlvbnMsIGJvdGhcbiAqIGJlY2F1c2UgdGhhdCBvdXRwdXQgdmFyaWVzIGJ5IHBucG0gdmVyc2lvbjpcbiAqXG4gKiAgIC0gZHJvcCBgZGV2RW5naW5lc2AsIHdoaWNoIHBucG0gMTEgc2VlZHMgYXMgYHBhY2thZ2VNYW5hZ2VyOiB7IG5hbWU6IFwicG5wbVwiLFxuICogICAgIG9uRmFpbDogXCJkb3dubG9hZFwiIH1gLiBBbnkgbnBtLWJhc2VkIHRvb2wgbGF0ZXIgaW4gdGhlIGNoYWluIChhblxuICogICAgIGBucHhgL2RseCBmYWxsYmFjaykgdGhlbiByZWZ1c2VzIHdpdGggRUJBRERFVkVOR0lORVMsIGl0cyBydW5uZXIgYmVpbmcgbnBtO1xuICogICAtIGZvcmNlIGB0eXBlOiBcIm1vZHVsZVwiYCwgd2hpY2ggcG5wbSAxMSB3cml0ZXMgYW5kIHBucG0gMTAgZG9lcyBub3QuIHRzeFxuICogICAgIHBpY2tzIHRoZSBlbnRyeSdzIGZvcm1hdCBmcm9tIHRoZSBuZWFyZXN0IG1hbmlmZXN0LCBzbyB3aXRob3V0IGl0XG4gKiAgICAgYC5wcm9qZW5yYy50c2AgbG9hZHMgYXMgQ0pTIGFuZCB0aGUgZmlyc3QgZGVwZW5kZW5jeSB1c2luZyB0b3AtbGV2ZWwgYXdhaXRcbiAqICAgICBkaWVzIG9uIFwibm90IHN1cHBvcnRlZCB3aXRoIHRoZSBjanMgb3V0cHV0IGZvcm1hdFwiLlxuICpcbiAqIHByb2plbiByZWdlbmVyYXRlcyB0aGUgd2hvbGUgbWFuaWZlc3QgYXQgc3ludGgsIHNvIHRoaXMgb25seSBoYXMgdG8gaG9sZCB0aGVcbiAqIHNlZWQgdG9nZXRoZXIgbG9uZyBlbm91Z2ggdG8gZ2V0IHRoZXJlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2VSZWNvcmQocmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm47XG4gICAgZGVsZXRlIG1hbmlmZXN0LmRldkVuZ2luZXM7XG4gICAgbWFuaWZlc3QudHlwZSA9IFwibW9kdWxlXCI7XG4gICAgd3JpdGVGaWxlU3luYyhtYW5pZmVzdFBhdGgsIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBtYWxmb3JtZWQvYWJzZW50IG1hbmlmZXN0IGhlcmUganVzdCBtZWFucyB0aGUgbGF0ZXIgYHBucG0gYWRkYCByZWNyZWF0ZXMgaXQuXG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gdGhlIGluaXRpYWwgc3ludGggYnkgZXhlY3V0aW5nIGAucHJvamVucmMudHNgIGRpcmVjdGx5IHdpdGggdHN4ICh3aXRoXG4gKiBgUFJPSkVOX0RJU0FCTEVfUE9TVGAgc2V0KSwgTk9UIGBwcm9qZW4gPHRhc2s+YC4gVXNlIHJpZ2h0IGFmdGVyIHNlZWRpbmcgYVxuICogZnJlc2ggd29ya3NwYWNlOiB0aGUgcHJvamVuIFRBU0tTIChgc3luY2AsIGBiYXJyZWxzYCwgLi4uKSBvbmx5IGV4aXN0IG9uY2VcbiAqIGAucHJvamVucmMudHNgIGhhcyBydW4gb25jZSwgc28gYHByb2plbiBzeW5jYCBjYW4ndCBiZSB0aGUgYm9vdHN0cmFwcGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuSW5pdGlhbFN5bnRoKHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IHJlc29sdmVQbnBtQXJndigpO1xuICBleGVjLnNwYXduU3luYyhjb21tYW5kLCBbLi4ucHJlZml4LCBcImV4ZWNcIiwgXCJ0c3hcIiwgXCIucHJvamVucmMudHNcIl0sIHtcbiAgICBjd2Q6IHJvb3QsXG4gICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBQUk9KRU5fRElTQUJMRV9QT1NUOiBcInRydWVcIiB9LFxuICAgIGNoZWNrOiB0cnVlLFxuICB9KTtcbn1cbiJdfQ==
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRDLHNGQUFzRjtBQUN0RixNQUFNLHlCQUF5QixHQUFHLDBCQUEwQixDQUFDO0FBRTdEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDN0IsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUM7QUFDL0UsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMs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bEUsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDOUMsS0FBSyxFQUFFLElBQUk7S0FDWixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCb290c3RyYXAgYSBicmFuZC1uZXcgZm9sZGVyIGludG8gYSB3b3JraW5nIGRieC10b29scyB3b3Jrc3BhY2UgYmVmb3JlIHByb2plbiBydW5zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBpbnRybywgb3V0cm8gfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGV4ZWMsIHByb2plY3QgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBqc29uIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGNoaWxkRW52LCByZXNvbHZlUG5wbUFyZ3YsIHJ1blBucG0gfSBmcm9tIFwiLi9wbnBtLnRzXCI7XG5pbXBvcnQgeyByb290TGFiZWwgfSBmcm9tIFwiLi9yb290LnRzXCI7XG5cbi8qKiBGYWxsYmFjayB3aGVuIHRoaXMgQ0xJJ3Mgb3duIHZlcnNpb24gaXNuJ3QgYSByZWFsIHJlbGVhc2UgKGFuIGluLXJlcG8gYDAuMC4wYCkuICovXG5jb25zdCBGQUxMQkFDS19QUk9KRU5fU1BFQ0lGSUVSID0gXCJAZGJ4LXRvb2xzL3Byb2plbkBsYXRlc3RcIjtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBlbmdpbmUgYXQgVEhJUyBDTEkncyBvd24gdmVyc2lvbi4gVGhlIHR3byBhcmUgcmVsZWFzZWQgdG9nZXRoZXIgYnlcbiAqIHRoZSByb290IGBidW1wYCwgc28gdGhlIG1hdGNoaW5nIGVuZ2luZSBhbHdheXMgZXhpc3RzIG9uIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBOb3QgYEBsYXRlc3RgLCBhbmQgbm90IGEgYmFyZSBgQGRieC10b29scy9wcm9qZW5gLiBBIGJhcmUgc3BlY2lmaWVyIGNhbiBsYW5kIG9uXG4gKiBhIHN0cmF5IGAwLjAuMGAsIHdob3NlIGBeMC4wLjBgIGNhcmV0IHRoZW4gcmVhY2hlcyBubyByZWFsIHJlbGVhc2UuIGBAbGF0ZXN0YFxuICogaGFzIGEgc3VidGxlciBmYWlsdXJlOiBwbnBtIDExIGFwcGxpZXMgYSBgbWluaW11bVJlbGVhc2VBZ2VgIGRlbGF5LCBzbyBmb3IgdGhlXG4gKiBmaXJzdCBkYXkgYWZ0ZXIgYSByZWxlYXNlIGl0IGRlbGliZXJhdGVseSByZXNvbHZlcyBhIGRpc3QtdGFnIHRvIHRoZSBuZXdlc3RcbiAqIHZlcnNpb24gT0xERVIgdGhhbiB0aGUgdGhyZXNob2xkIGFuZCBtZXJlbHkgbm90ZXMgdGhlIG5ld2VyIG9uZVxuICogKGArIEBkYngtdG9vbHMvcHJvamVuIDAuMS4yNCAoMC4zLjQyIGlzIGF2YWlsYWJsZSlgKS4gQSBib290c3RyYXAgcnVuIHJpZ2h0XG4gKiBhZnRlciBhIHJlbGVhc2UgdGhlcmVmb3JlIGluc3RhbGxlZCBhIG1vbnRocy1vbGQgZW5naW5lIGFnYWluc3QgYSBjdXJyZW50IENMSSxcbiAqIHdoaWNoIGlzIGhvdyBgc3luYyAtLXdhdGNoYCBkaWVkIG9uIGFuIGVuZ2luZSBwcmVkYXRpbmcgaXRzIGBjb25jdXJyZW50bHlgXG4gKiBkZXBlbmRlbmN5LiBBbiBleHBsaWNpdCByYW5nZSBhZG1pdHMgb25seSB0aGUgdmVyc2lvbiB3ZSB3YW50LCBzbyB0aGUgYWdlXG4gKiBoZXVyaXN0aWMgaGFzIG5vdGhpbmcgb2xkZXIgdG8gZmFsbCBiYWNrIHRvLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb24gPSBvd25WZXJzaW9uKCk7XG4gIHJldHVybiB2ZXJzaW9uID8gYEBkYngtdG9vbHMvcHJvamVuQF4ke3ZlcnNpb259YCA6IEZBTExCQUNLX1BST0pFTl9TUEVDSUZJRVI7XG59XG5cbi8qKiBUaGlzIENMSSdzIG93biByZWxlYXNlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gaW4tcmVwbyBgMC4wLjBgIGJ1aWxkLiAqL1xuZnVuY3Rpb24gb3duVmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGZpbGVVUkxUb1BhdGgobmV3IFVSTChcIi4uL3BhY2thZ2UuanNvblwiLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0ZjhcIikpPy52ZXJzaW9uO1xuICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiB2ZXJzaW9uICE9PSBcIjAuMC4wXCIgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDb21wYXJlIGB4LnkuemAgdHJpcGxlczsgcmV0dXJucyA8MCwgMCwgb3IgPjAuIE1pc3NpbmcgcGFydHMgY291bnQgYXMgMC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhcnRzID0gKHY6IHN0cmluZykgPT4gdi5zcGxpdChcIi5cIikubWFwKChwKSA9PiBOdW1iZXIucGFyc2VJbnQocCwgMTApIHx8IDApO1xuICBjb25zdCBbeCwgeV0gPSBbcGFydHMoYSksIHBhcnRzKGIpXTtcbiAgcmV0dXJuIHhbMF0gLSB5WzBdIHx8IHhbMV0gLSB5WzFdIHx8IHhbMl0gLSB5WzJdO1xufVxuXG4vKiogVmVyc2lvbiBvZiB0aGUgZW5naW5lIGN1cnJlbnRseSBpbnN0YWxsZWQgYXQgYHJvb3RgLCBpZiBhbnkuICovXG5mdW5jdGlvbiBpbnN0YWxsZWRFbmdpbmVWZXJzaW9uKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGRieC10b29sc1wiLCBcInByb2plblwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCB2ZXJzaW9uID0ganNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMobWFuaWZlc3QsIFwidXRmOFwiKSk/LnZlcnNpb247XG4gICAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSBcInN0cmluZ1wiID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFVwZ3JhZGUgYW4gZXN0YWJsaXNoZWQgd29ya3NwYWNlIHdob3NlIGluc3RhbGxlZCBlbmdpbmUgcHJlZGF0ZXMgdGhpcyBDTEkuXG4gKlxuICogQm9vdHN0cmFwcGluZyBwaW5zIHRoZSBlbmdpbmUgb25jZSwgYW5kIG5vdGhpbmcgYWZ0ZXJ3YXJkcyByZXZpc2l0cyBpdCAtIHNvIGFcbiAqIHdvcmtzcGFjZSBjcmVhdGVkIG1vbnRocyBhZ28ga2VwdCByZXNvbHZpbmcgaXRzIG9yaWdpbmFsIGVuZ2luZSBubyBtYXR0ZXIgaG93XG4gKiBjdXJyZW50IHRoZSBDTEkgaW52b2tpbmcgaXQgd2FzLCBhbmQgZmFpbGVkIGluc2lkZSB0aGUgT0xEIGVuZ2luZSdzIGNvZGVcbiAqIChgc3luYyAtLXdhdGNoYCBkeWluZyBvbiBhIGBjb25jdXJyZW50bHlgIHRoYXQgZW5naW5lIG5ldmVyIGRlY2xhcmVkKS4gVGhlIHR3b1xuICogYXJlIHJlbGVhc2VkIGluIGxvY2tzdGVwLCBzbyB0aGlzIENMSSdzIHZlcnNpb24gaXMgZXhhY3RseSB0aGUgZW5naW5lIGl0XG4gKiBleHBlY3RzLlxuICpcbiAqIE9ubHkgZXZlciBtb3ZlcyBGT1JXQVJEOiBhbiBlbmdpbmUgYXQgb3IgYWhlYWQgb2YgdGhpcyBDTEkgaXMgbGVmdCBhbG9uZSwgc29cbiAqIGFuIG9sZGVyIENMSSBjYW5ub3QgZG93bmdyYWRlIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5naW5lQ3VycmVudChyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWQgPSBvd25WZXJzaW9uKCk7XG4gIGlmICghZXhwZWN0ZWQpIHJldHVybjtcbiAgY29uc3QgaW5zdGFsbGVkID0gaW5zdGFsbGVkRW5naW5lVmVyc2lvbihyb290KTtcbiAgaWYgKGluc3RhbGxlZCAmJiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkLCBleHBlY3RlZCkgPj0gMCkgcmV0dXJuO1xuICBydW5QbnBtKFtcImFkZFwiLCBcIi1EXCIsIGRlZmF1bHRQcm9qZW5TcGVjaWZpZXIoKV0sIHJvb3QpO1xufVxuXG4vLyBSZWFjaCB0aGUgY2xhc3MgdGhyb3VnaCBpdHMgbW9kdWxlIE5BTUVTUEFDRS4gQ3VycmVudCBlbmdpbmVzIGFsc28gaG9pc3QgaXRcbi8vIGZsYXQsIGJ1dCBldmVyeSBlbmdpbmUgZXZlciBwdWJsaXNoZWQgZXhwb3J0cyB0aGUgbmFtZXNwYWNlLCBhbmQgdGhpcyB0ZW1wbGF0ZVxuLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCBgQGxhdGVzdGAgLSBhIGZsYXQgaW1wb3J0IGRpZXMgb24gYW4gb2xkZXIgb25lIHdpdGhcbi8vIFwiZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJ0RCWFRvb2xzTm9kZVByb2plY3QnXCIuXG5jb25zdCBQUk9KRU5SQ19URU1QTEFURSA9IGBpbXBvcnQgeyBwcm9qZWN0IGFzIHByb2plY3RBcGkgfSBmcm9tIFwiQGRieC10b29scy9wcm9qZW5cIjtcblxuY29uc3QgcHJvamVjdCA9IG5ldyBwcm9qZWN0QXBpLkRCWFRvb2xzTm9kZVByb2plY3QoKTtcbnByb2plY3Quc3ludGgoKTtcbmA7XG5cbi8qKiBTZWVkIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBzbyB0aGUgZmlyc3QgXFxgcG5wbSBhZGRcXGAgY2FuIGFsbG93IGVzYnVpbGQgbm9uLWludGVyYWN0aXZlbHkuICovXG5jb25zdCBXT1JLU1BBQ0VfU0VFRCA9IGBwYWNrYWdlczogW11cbmFsbG93QnVpbGRzOlxuICBlc2J1aWxkOiB0cnVlXG5gO1xuXG4vKipcbiAqIFR1cm4gYSBmb2xkZXIgaW50byBhIGZ1bmN0aW9uaW5nIGRieC10b29scyB3b3Jrc3BhY2U6IGBwbnBtIGluaXRgLCBzZWVkXG4gKiBgcG5wbS13b3Jrc3BhY2UueWFtbGAsIGFkZCBgcHJvamVuYC9gdHlwZXNjcmlwdGAvYHRzeGAgKyB0aGUgZW5naW5lIHBhY2thZ2UsXG4gKiB3cml0ZSBhIG1pbmltYWwgYC5wcm9qZW5yYy50c2AsIHN5bnRoIG9uY2UgKHdpdGggYFBST0pFTl9ESVNBQkxFX1BPU1RgKSwgdGhlblxuICogaW5zdGFsbC4gRG9lcyBub3QgcnVuIGJhcnJlbHMgLSBydW4gYHBucG0gcnVuIGJhcnJlbHNgIG9yIGEgZnVsbCBwcm9qZW4gc3ludGhcbiAqIHBvc3QtaW5zdGFsbCB0byBnZW5lcmF0ZSBwYWNrYWdlIGJhcnJlbHMuXG4gKlxuICogRXZlcnkgc3RlcCBpcyBpZGVtcG90ZW50IGFuZCBzZWxmLWd1YXJkZWQsIHNvIHRoaXMgaXMgc2FmZSB0byBydW4gYWdhaW5zdCBhXG4gKiBmb2xkZXIgdGhhdCBBTFJFQURZIGhhcyBhIGhhbmQtYXV0aG9yZWQgYC5wcm9qZW5yYy50c2AgKGFuZCBldmVuIGEgY29tbWl0dGVkXG4gKiBgcGFja2FnZS5qc29uYCkgYnV0IGlzIG1pc3NpbmcgdGhlIGluc3RhbGxlZCB0b29sY2hhaW4gLSBlLmcuIGEgZnJlc2hseSBjb3BpZWRcbiAqIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzIChpbmNsdWRpbmcgbWFuaWZlc3RzKSBhcmUgZ2l0aWdub3JlZC4gSW4gdGhhdFxuICogY2FzZSBgcG5wbSBpbml0YCBhbmQgdGhlIGAucHJvamVucmMudHNgIHNjYWZmb2xkIGFyZSBza2lwcGVkLCBidXQgdGhlIGVuZ2luZSArXG4gKiBwcm9qZW4gKyB0c3ggYXJlIChyZSlpbnN0YWxsZWQgc28gdGhlIHN1YnNlcXVlbnQgc3ludGggY2FuIHJlZ2VuZXJhdGVcbiAqIGV2ZXJ5dGhpbmcuIFNlZSB7QGxpbmsgc2VlZFRvb2xjaGFpbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBXb3Jrc3BhY2UoXG4gIHJvb3Q6IHN0cmluZyxcbiAgcHJvamVuU3BlY2lmaWVyOiBzdHJpbmcgPSBkZWZhdWx0UHJvamVuU3BlY2lmaWVyKCksXG4pOiB2b2lkIHtcbiAgaW50cm8oYEJvb3RzdHJhcHBpbmcgZGJ4LXRvb2xzIHdvcmtzcGFjZSBpbiAke3Jvb3RMYWJlbChyb290KX1gKTtcblxuICBzZWVkVG9vbGNoYWluKHJvb3QsIHByb2plblNwZWNpZmllcik7XG5cbiAgY29uc3QgcHJvamVucmMgPSBqb2luKHJvb3QsIFwiLnByb2plbnJjLnRzXCIpO1xuICBpZiAoIWV4aXN0c1N5bmMocHJvamVucmMpKSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9qZW5yYywgUFJPSkVOUkNfVEVNUExBVEUpO1xuICB9XG5cbiAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuXG4gIHJ1blBucG0oW1wiaW5zdGFsbFwiLCBcIi0tbm8tZnJvemVuLWxvY2tmaWxlXCIsIFwiLS1mb3JjZVwiXSwgcm9vdCk7XG4gIG91dHJvKFwiV29ya3NwYWNlIHJlYWR5IC0gcmUtcnVuIGRieC10b29scyBvciBhZGQgcGFja2FnZXMgdW5kZXIgcGFja2FnZXMvXCIpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIHRvb2xjaGFpbiBhIHN5bnRoIG5lZWRzIChgcHJvamVuYCwgYHR5cGVzY3JpcHRgLCBgdHN4YCwgYW5kIHRoZVxuICogZGJ4LXRvb2xzIGVuZ2luZSksIHNlZWRpbmcgYSBgcGFja2FnZS5qc29uYCBhbmQgYHBucG0td29ya3NwYWNlLnlhbWxgIGZpcnN0XG4gKiB3aGVuIGFic2VudC4gSWRlbXBvdGVudDogcnVuIGl0IHdoZW5ldmVyIHRoZSBlbmdpbmUgaXMgbWlzc2luZywgc28gYSBjb3BpZWRcbiAqIHByb2plY3Qgd2l0aCBhIGAucHJvamVucmMudHNgIGJ1dCBubyBgbm9kZV9tb2R1bGVzYC9tYW5pZmVzdHMgY2FuIGJlIGJyb3VnaHRcbiAqIHVwIHRvIGEgc3ludGgtcmVhZHkgc3RhdGUgd2l0aG91dCBmdWxsIGJvb3RzdHJhcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkVG9vbGNoYWluKFxuICByb290OiBzdHJpbmcsXG4gIHByb2plblNwZWNpZmllcjogc3RyaW5nID0gZGVmYXVsdFByb2plblNwZWNpZmllcigpLFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcnVuUG5wbShbXCJpbml0XCJdLCByb290KTtcbiAgICBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZUZpbGUgPSBqb2luKHJvb3QsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKHdvcmtzcGFjZUZpbGUpKSB7XG4gICAgd3JpdGVGaWxlU3luYyh3b3Jrc3BhY2VGaWxlLCBXT1JLU1BBQ0VfU0VFRCk7XG4gIH1cblxuICBzZWVkUmVnaXN0cnkocm9vdCk7XG5cbiAgcnVuUG5wbShbXCJhZGRcIiwgXCItRFwiLCBcInByb2plblwiLCBcInR5cGVzY3JpcHRAXjUuOS4zXCIsIFwidHN4QF40LjIzLjBcIiwgcHJvamVuU3BlY2lmaWVyXSwgcm9vdCk7XG59XG5cbi8qKlxuICogUGluIGEgbm9uLWRlZmF1bHQgcmVnaXN0cnkgaW50byB0aGUgbmV3IHJvb3QncyBgLm5wbXJjYC5cbiAqXG4gKiBUaGUgQ0xJIGFscmVhZHkgZm9yY2VzIGAtLXJlZ2lzdHJ5YCBvbnRvIHRoZSBwbnBtIGludm9jYXRpb25zIGl0IG1ha2VzIGl0c2VsZixcbiAqIGJ1dCBhIGJvb3RzdHJhcHBlZCB3b3Jrc3BhY2Ugb3V0bGl2ZXMgdGhpcyBwcm9jZXNzOiBldmVyeSBsYXRlciBgcG5wbSBpbnN0YWxsYFxuICogdGhlIGRldmVsb3BlciAob3IgcHJvamVuJ3MgcG9zdC1zeW50aCBzdGVwKSBydW5zIGlzIG9uIGl0cyBvd24uIHBucG0gaWdub3Jlc1xuICogYG5wbV9jb25maWdfcmVnaXN0cnlgIGZyb20gdGhlIGVudmlyb25tZW50LCBzbyB3aXRob3V0IGEgZmlsZSBvbiBkaXNrIHRob3NlXG4gKiBydW5zIHJldmVydCB0byBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYCAtIHdoaWNoIGlzIGEgaGFyZCBmYWlsdXJlIHdoZXJlXG4gKiB0aGUgY3VzdG9tIHJlZ2lzdHJ5IHdhcyB0aGUgb25seSByZWFjaGFibGUgb25lLlxuICpcbiAqIE9ubHkgd3JpdGVzIGZvciBhbiBhY3R1YWwgb3ZlcnJpZGUsIG5ldmVyIGNyZWF0ZXMgYSBmaWxlIGp1c3QgdG8gbmFtZSBucG1qcyxcbiAqIGFuZCBuZXZlciBvdmVyd3JpdGVzIGFuIGV4aXN0aW5nIGAubnBtcmNgICh0aGUgZGV2ZWxvcGVyJ3Mgb3duIHdpbnMpLlxuICovXG5mdW5jdGlvbiBzZWVkUmVnaXN0cnkocm9vdDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gcHJvamVjdC5ucG1SZWdpc3RyeShudWxsLCB7IG92ZXJyaWRlT25seTogdHJ1ZSwgZW52VmFyczogdHJ1ZSB9KT8udG9TdHJpbmcoKTtcbiAgaWYgKCFyZWdpc3RyeSkgcmV0dXJuO1xuICBjb25zdCBucG1yYyA9IGpvaW4ocm9vdCwgXCIubnBtcmNcIik7XG4gIGlmIChleGlzdHNTeW5jKG5wbXJjKSkgcmV0dXJuO1xuICB3cml0ZUZpbGVTeW5jKG5wbXJjLCBgcmVnaXN0cnk9JHtyZWdpc3RyeX1cXG5gKTtcbn1cblxuLyoqXG4gKiBNYWtlIHdoYXQgYHBucG0gaW5pdGAgcHJvZHVjZWQgc2FmZSB0byBzeW50aCBhZ2FpbnN0LiBUd28gY29ycmVjdGlvbnMsIGJvdGhcbiAqIGJlY2F1c2UgdGhhdCBvdXRwdXQgdmFyaWVzIGJ5IHBucG0gdmVyc2lvbjpcbiAqXG4gKiAgIC0gZHJvcCBgZGV2RW5naW5lc2AsIHdoaWNoIHBucG0gMTEgc2VlZHMgYXMgYHBhY2thZ2VNYW5hZ2VyOiB7IG5hbWU6IFwicG5wbVwiLFxuICogICAgIG9uRmFpbDogXCJkb3dubG9hZFwiIH1gLiBBbnkgbnBtLWJhc2VkIHRvb2wgbGF0ZXIgaW4gdGhlIGNoYWluIChhblxuICogICAgIGBucHhgL2RseCBmYWxsYmFjaykgdGhlbiByZWZ1c2VzIHdpdGggRUJBRERFVkVOR0lORVMsIGl0cyBydW5uZXIgYmVpbmcgbnBtO1xuICogICAtIGZvcmNlIGB0eXBlOiBcIm1vZHVsZVwiYCwgd2hpY2ggcG5wbSAxMSB3cml0ZXMgYW5kIHBucG0gMTAgZG9lcyBub3QuIHRzeFxuICogICAgIHBpY2tzIHRoZSBlbnRyeSdzIGZvcm1hdCBmcm9tIHRoZSBuZWFyZXN0IG1hbmlmZXN0LCBzbyB3aXRob3V0IGl0XG4gKiAgICAgYC5wcm9qZW5yYy50c2AgbG9hZHMgYXMgQ0pTIGFuZCB0aGUgZmlyc3QgZGVwZW5kZW5jeSB1c2luZyB0b3AtbGV2ZWwgYXdhaXRcbiAqICAgICBkaWVzIG9uIFwibm90IHN1cHBvcnRlZCB3aXRoIHRoZSBjanMgb3V0cHV0IGZvcm1hdFwiLlxuICpcbiAqIHByb2plbiByZWdlbmVyYXRlcyB0aGUgd2hvbGUgbWFuaWZlc3QgYXQgc3ludGgsIHNvIHRoaXMgb25seSBoYXMgdG8gaG9sZCB0aGVcbiAqIHNlZWQgdG9nZXRoZXIgbG9uZyBlbm91Z2ggdG8gZ2V0IHRoZXJlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTZWVkTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2VSZWNvcmQocmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm47XG4gICAgZGVsZXRlIG1hbmlmZXN0LmRldkVuZ2luZXM7XG4gICAgbWFuaWZlc3QudHlwZSA9IFwibW9kdWxlXCI7XG4gICAgd3JpdGVGaWxlU3luYyhtYW5pZmVzdFBhdGgsIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBtYWxmb3JtZWQvYWJzZW50IG1hbmlmZXN0IGhlcmUganVzdCBtZWFucyB0aGUgbGF0ZXIgYHBucG0gYWRkYCByZWNyZWF0ZXMgaXQuXG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gdGhlIGluaXRpYWwgc3ludGggYnkgZXhlY3V0aW5nIGAucHJvamVucmMudHNgIGRpcmVjdGx5IHdpdGggdHN4ICh3aXRoXG4gKiBgUFJPSkVOX0RJU0FCTEVfUE9TVGAgc2V0KSwgTk9UIGBwcm9qZW4gPHRhc2s+YC4gVXNlIHJpZ2h0IGFmdGVyIHNlZWRpbmcgYVxuICogZnJlc2ggd29ya3NwYWNlOiB0aGUgcHJvamVuIFRBU0tTIChgc3luY2AsIGBiYXJyZWxzYCwgLi4uKSBvbmx5IGV4aXN0IG9uY2VcbiAqIGAucHJvamVucmMudHNgIGhhcyBydW4gb25jZSwgc28gYHByb2plbiBzeW5jYCBjYW4ndCBiZSB0aGUgYm9vdHN0cmFwcGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuSW5pdGlhbFN5bnRoKHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IHJlc29sdmVQbnBtQXJndigpO1xuICAvLyBObyBgLS1yZWdpc3RyeWAgaGVyZTogdGhpcyBpcyBgcG5wbSBleGVjYCwgd2hvc2UgdHJhaWxpbmcgYXJndW1lbnRzIGJlbG9uZyB0b1xuICAvLyB0c3guIFRoZSByZWdpc3RyeSByZWFjaGVzIGFueXRoaW5nIG5lc3RlZCB0aHJvdWdoIGBjaGlsZEVudmAgYW5kIHRoZSBzZWVkZWRcbiAgLy8gYC5ucG1yY2AgaW5zdGVhZC5cbiAgZXhlYy5zcGF3blN5bmMoY29tbWFuZCwgWy4uLnByZWZpeCwgXCJleGVjXCIsIFwidHN4XCIsIFwiLnByb2plbnJjLnRzXCJdLCB7XG4gICAgY3dkOiByb290LFxuICAgIGVudjogY2hpbGRFbnYoeyBQUk9KRU5fRElTQUJMRV9QT1NUOiBcInRydWVcIiB9KSxcbiAgICBjaGVjazogdHJ1ZSxcbiAgfSk7XG59XG4iXX0=
package/lib/src/pnpm.d.ts CHANGED
@@ -1,6 +1,16 @@
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
+ /**
6
+ * `process.env` plus the registry under npm's env-var convention, for children
7
+ * that read it (npm, npx, and anything they spawn). pnpm ignores it, which is
8
+ * why the CLI flags above exist.
9
+ */
10
+ export declare function childEnv(extra?: Record<string, string>): NodeJS.ProcessEnv;
1
11
  /** Memoized `[command, ...prefix]` argv prefix to run pnpm (resolved install, else corepack, else npx). */
2
12
  export declare const resolvePnpmArgv: () => string[];
3
- /** Run pnpm with inherited stdio from `cwd`. */
13
+ /** Run pnpm with inherited stdio from `cwd`, forcing the resolved registry. */
4
14
  export declare function runPnpm(args: string[], cwd: string): void;
5
15
  /** Install workspace dependencies when `node_modules` or projen is missing. */
6
16
  export declare function ensureWorkspaceReady(root: string): void;
package/lib/src/pnpm.js CHANGED
@@ -1,13 +1,99 @@
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
37
  import { dirname, join } from "node:path";
8
- import { exec } from "@dbx-tools/core";
9
- import { functionModule } from "@dbx-tools/shared-core";
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
+ "init",
55
+ "install",
56
+ "link",
57
+ "up",
58
+ "update",
59
+ ]);
60
+ /**
61
+ * The registry to force onto child package managers, or `undefined` when the
62
+ * effective one is already the public default.
63
+ *
64
+ * `envVars: true` also consults `npm_config_registry` directly, because a
65
+ * container may export it without any `.npmrc` for `npm config get` to read.
66
+ * Memoized: resolution shells out to npm.
67
+ */
68
+ const registryOverride = functionModule.memoize(() => project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString());
69
+ /** `--registry <url>` for npx, or `[]`. Placed BEFORE the package name by callers. */
70
+ export function npxRegistryArgs() {
71
+ const url = registryOverride();
72
+ return url ? ["--registry", url] : [];
73
+ }
74
+ /** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
75
+ export function pnpmRegistryArgs(args) {
76
+ const url = registryOverride();
77
+ if (!url)
78
+ return [];
79
+ const subcommand = args.find((arg) => !arg.startsWith("-"));
80
+ return subcommand && REGISTRY_SUBCOMMANDS.has(subcommand) ? ["--registry", url] : [];
81
+ }
82
+ /**
83
+ * `process.env` plus the registry under npm's env-var convention, for children
84
+ * that read it (npm, npx, and anything they spawn). pnpm ignores it, which is
85
+ * why the CLI flags above exist.
86
+ */
87
+ export function childEnv(extra) {
88
+ const env = { ...process.env, ...extra };
89
+ const url = registryOverride();
90
+ if (url) {
91
+ // Both cases: env is case-sensitive on POSIX, and npm lowercases when reading.
92
+ env.npm_config_registry = url;
93
+ env.NPM_CONFIG_REGISTRY = url;
94
+ }
95
+ return env;
96
+ }
11
97
  /** True when `pnpm --version` runs, i.e. pnpm is already on PATH. */
12
98
  function pnpmOnPath() {
13
99
  try {
@@ -26,12 +112,14 @@ function pnpmOnPath() {
26
112
  function resolvePnpmArgvImpl() {
27
113
  // 1. A resolvable `pnpm` dependency (the normal in-workspace case): run its
28
114
  // bin directly with the current node - no PATH or package-manager shim.
115
+ // pnpm's own `--registry` rides in with the ARGS, after this entry point.
29
116
  try {
30
117
  const require = createRequire(import.meta.url);
31
118
  const pkgJsonPath = require.resolve("pnpm/package.json");
32
119
  const pkg = require(pkgJsonPath);
33
120
  const bin = typeof pkg.bin === "string" ? pkg.bin : pkg.bin.pnpm;
34
- return [process.execPath, join(dirname(pkgJsonPath), bin)];
121
+ if (bin)
122
+ return [process.execPath, join(dirname(pkgJsonPath), bin)];
35
123
  }
36
124
  catch {
37
125
  // fall through
@@ -59,14 +147,24 @@ function resolvePnpmArgvImpl() {
59
147
  // 4. Last resort: fetch pnpm on demand via npx. Pass `--engine-strict=false`
60
148
  // (and skip npm's devEngines gate) so npm doesn't refuse to run just
61
149
  // because the target manifest declares `devEngines.packageManager: pnpm`.
62
- return ["npx", "-y", "--engine-strict=false", "pnpm"];
150
+ // npm-level flags, `--registry` among them, must precede the package name,
151
+ // or npx forwards them to pnpm instead of acting on them itself.
152
+ return ["npx", ...npxRegistryArgs(), "-y", "--engine-strict=false", "pnpm"];
63
153
  }
64
154
  /** Memoized `[command, ...prefix]` argv prefix to run pnpm (resolved install, else corepack, else npx). */
65
155
  export const resolvePnpmArgv = functionModule.memoize(resolvePnpmArgvImpl);
66
- /** Run pnpm with inherited stdio from `cwd`. */
156
+ /** Run pnpm with inherited stdio from `cwd`, forcing the resolved registry. */
67
157
  export function runPnpm(args, cwd) {
68
158
  const [command, ...prefix] = resolvePnpmArgv();
69
- exec.spawnSync(command, [...prefix, ...args], { cwd, check: true });
159
+ const registryArgs = pnpmRegistryArgs(args);
160
+ if (registryArgs.length > 0) {
161
+ logger.info(`running pnpm with registry: ${registryArgs[1]}`);
162
+ }
163
+ exec.spawnSync(command, [...prefix, ...args, ...registryArgs], {
164
+ cwd,
165
+ check: true,
166
+ env: childEnv(),
167
+ });
70
168
  }
71
169
  /** Install workspace dependencies when `node_modules` or projen is missing. */
72
170
  export function ensureWorkspaceReady(root) {
@@ -78,4 +176,4 @@ export function ensureWorkspaceReady(root) {
78
176
  export function runProjen(args, root) {
79
177
  runPnpm(["exec", "projen", ...args], root);
80
178
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG5wbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUt6QyxxRUFBcUU7QUFDckUsU0FBUyxVQUFVO0lBQ2pCLElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxFQUFFLFFBQVE7WUFDaEIsS0FBSyxFQUFFLFFBQVE7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQjtJQUMxQiw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFzQixDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsZUFBZTtJQUNqQixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSxnRUFBZ0U7SUFDaEUscUVBQXFFO0lBQ3JFLElBQUksVUFBVSxFQUFFO1FBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWxDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM3QyxNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxVQUFVLEVBQUU7WUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGVBQWU7SUFDakIsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsNkVBQTZFO0lBQzdFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUzRSxnREFBZ0Q7QUFDaEQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUFjLEVBQUUsR0FBVztJQUNqRCxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7SUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBQVk7SUFDL0MsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWMsRUFBRSxJQUFZO0lBQ3BELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwbnBtIGRpc2NvdmVyeSwgd29ya3NwYWNlIGluc3RhbGwsIGFuZCBwcm9qZW4gZm9yd2FyZGluZyBmb3IgdGhlIGBkYngtdG9vbHNgIENMSS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgZnVuY3Rpb25Nb2R1bGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbmVlZHNJbnN0YWxsIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG4vKiogQSBwYWNrYWdlLmpzb24gYGJpbmAgZmllbGQ6IGVpdGhlciBhIHNpbmdsZSBjb21tYW5kIHN0cmluZywgb3IgYSBuYW1lIC0+IHBhdGggbWFwLiAqL1xudHlwZSBCaW5GaWVsZCA9IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbi8qKiBUcnVlIHdoZW4gYHBucG0gLS12ZXJzaW9uYCBydW5zLCBpLmUuIHBucG0gaXMgYWxyZWFkeSBvbiBQQVRILiAqL1xuZnVuY3Rpb24gcG5wbU9uUGF0aCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBleGVjLnNwYXduU3luYyhcInBucG1cIiwgW1wiLS12ZXJzaW9uXCJdLCB7XG4gICAgICBzdGRlcnI6IFwiaWdub3JlXCIsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJpZ25vcmVcIixcbiAgICAgIGNoZWNrOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBucG1Bcmd2SW1wbCgpOiBzdHJpbmdbXSB7XG4gIC8vIDEuIEEgcmVzb2x2YWJsZSBgcG5wbWAgZGVwZW5kZW5jeSAodGhlIG5vcm1hbCBpbi13b3Jrc3BhY2UgY2FzZSk6IHJ1biBpdHNcbiAgLy8gICAgYmluIGRpcmVjdGx5IHdpdGggdGhlIGN1cnJlbnQgbm9kZSAtIG5vIFBBVEggb3IgcGFja2FnZS1tYW5hZ2VyIHNoaW0uXG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBwa2dKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShcInBucG0vcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IHBrZyA9IHJlcXVpcmUocGtnSnNvblBhdGgpIGFzIHsgYmluOiBCaW5GaWVsZCB9O1xuICAgIGNvbnN0IGJpbiA9IHR5cGVvZiBwa2cuYmluID09PSBcInN0cmluZ1wiID8gcGtnLmJpbiA6IHBrZy5iaW4ucG5wbTtcbiAgICByZXR1cm4gW3Byb2Nlc3MuZXhlY1BhdGgsIGpvaW4oZGlybmFtZShwa2dKc29uUGF0aCksIGJpbildO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuXG4gIC8vIDIuIEEgYmFyZSBgcG5wbWAgYWxyZWFkeSBvbiBQQVRIIChlLmcuIHJ1bm5pbmcgdW5kZXIgYHBucG0gZGx4YCkuIFByZWZlclxuICAvLyAgICB0aGlzIG92ZXIgdGhlIGNvcmVwYWNrL25weCBmYWxsYmFja3Mgc28gd2UgbmV2ZXIgc2hlbGwgdGhyb3VnaCBucG0gLVxuICAvLyAgICBgbnB4IC15IHBucG1gIHJ1bnMgdW5kZXIgbnBtLCB3aGljaCByZWplY3RzIGEgYm9vdHN0cmFwcGVkXG4gIC8vICAgIGBkZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyOiBwbnBtYCBtYW5pZmVzdCB3aXRoIEVCQURERVZFTkdJTkVTLlxuICBpZiAocG5wbU9uUGF0aCgpKSByZXR1cm4gW1wicG5wbVwiXTtcblxuICAvLyAzLiBUcnkgdG8gZW5hYmxlIHBucG0gdmlhIGNvcmVwYWNrLCB0aGVuIHVzZSBpdC5cbiAgdHJ5IHtcbiAgICBleGVjLnNwYXduU3luYyhcImNvcmVwYWNrXCIsIFtcImVuYWJsZVwiLCBcInBucG1cIl0sIHtcbiAgICAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImlnbm9yZVwiLFxuICAgICAgY2hlY2s6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHBucG1PblBhdGgoKSkgcmV0dXJuIFtcInBucG1cIl07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG5cbiAgLy8gNC4gTGFzdCByZXNvcnQ6IGZldGNoIHBucG0gb24gZGVtYW5kIHZpYSBucHguIFBhc3MgYC0tZW5naW5lLXN0cmljdD1mYWxzZWBcbiAgLy8gICAgKGFuZCBza2lwIG5wbSdzIGRldkVuZ2luZXMgZ2F0ZSkgc28gbnBtIGRvZXNuJ3QgcmVmdXNlIHRvIHJ1biBqdXN0XG4gIC8vICAgIGJlY2F1c2UgdGhlIHRhcmdldCBtYW5pZmVzdCBkZWNsYXJlcyBgZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlcjogcG5wbWAuXG4gIHJldHVybiBbXCJucHhcIiwgXCIteVwiLCBcIi0tZW5naW5lLXN0cmljdD1mYWxzZVwiLCBcInBucG1cIl07XG59XG5cbi8qKiBNZW1vaXplZCBgW2NvbW1hbmQsIC4uLnByZWZpeF1gIGFyZ3YgcHJlZml4IHRvIHJ1biBwbnBtIChyZXNvbHZlZCBpbnN0YWxsLCBlbHNlIGNvcmVwYWNrLCBlbHNlIG5weCkuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBucG1Bcmd2ID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZShyZXNvbHZlUG5wbUFyZ3ZJbXBsKTtcblxuLyoqIFJ1biBwbnBtIHdpdGggaW5oZXJpdGVkIHN0ZGlvIGZyb20gYGN3ZGAuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUG5wbShhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLnByZWZpeF0gPSByZXNvbHZlUG5wbUFyZ3YoKTtcbiAgZXhlYy5zcGF3blN5bmMoY29tbWFuZCwgWy4uLnByZWZpeCwgLi4uYXJnc10sIHsgY3dkLCBjaGVjazogdHJ1ZSB9KTtcbn1cblxuLyoqIEluc3RhbGwgd29ya3NwYWNlIGRlcGVuZGVuY2llcyB3aGVuIGBub2RlX21vZHVsZXNgIG9yIHByb2plbiBpcyBtaXNzaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVdvcmtzcGFjZVJlYWR5KHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBpZiAobmVlZHNJbnN0YWxsKHJvb3QpKSB7XG4gICAgcnVuUG5wbShbXCJpbnN0YWxsXCIsIFwiLS1uby1mcm96ZW4tbG9ja2ZpbGVcIl0sIHJvb3QpO1xuICB9XG59XG5cbi8qKiBSdW4gYHBucG0gZXhlYyBwcm9qZW5gIHdpdGggdGhlIGdpdmVuIGFyZ3MgZnJvbSBgcm9vdGAuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUHJvamVuKGFyZ3M6IHN0cmluZ1tdLCByb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgcnVuUG5wbShbXCJleGVjXCIsIFwicHJvamVuXCIsIC4uLmFyZ3NdLCByb290KTtcbn1cbiJdfQ==
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG5wbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFLNUM7Ozs7O0dBS0c7QUFDSCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25DLEtBQUs7SUFDTCxRQUFRO0lBQ1IsS0FBSztJQUNMLEdBQUc7SUFDSCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sSUFBSTtJQUNKLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQXVCLEVBQUUsQ0FDdkUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUM3RSxDQUFDO0FBRUYsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFB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Q0FBQztRQUN2QixPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWMsRUFBRSxJQUFZO0lBQ3BELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwbnBtIGRpc2NvdmVyeSwgd29ya3NwYWNlIGluc3RhbGwsIGFuZCBwcm9qZW4gZm9yd2FyZGluZyBmb3IgdGhlIGBkYngtdG9vbHNgIENMSS5cbiAqXG4gKiAjIyBGb3JjaW5nIGEgY3VzdG9tIHJlZ2lzdHJ5XG4gKlxuICogcG5wbSBhbmQgbnBtIGRvIE5PVCBhZ3JlZSBvbiBob3cgYSByZWdpc3RyeSBpcyBjb25maWd1cmVkLCBhbmQgZ2V0dGluZyB0aGlzXG4gKiB3cm9uZyBpcyBzaWxlbnQuIE1lYXN1cmVkIGFnYWluc3QgcG5wbSAxMS4wLjYgYW5kIG5wbSAxMTpcbiAqXG4gKiB8IG1lY2hhbmlzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBucG0gfCBwbnBtIHxcbiAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLSB8IC0tLS0gfFxuICogfCBgLS1yZWdpc3RyeSA8dXJsPmAgQ0xJIGZsYWcgICAgICAgICAgICAgIHwgeWVzIHwgeWVzICB8XG4gKiB8IHByb2plY3QgYC5ucG1yY2AgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgfCB5ZXMgIHxcbiAqIHwgYG5wbV9jb25maWdfcmVnaXN0cnlgIGVudiB2YXIgICAgICAgICAgICB8IHllcyB8IE5PICAgfFxuICpcbiAqIFNvIGFuIGVudiB2YXIgYWxvbmUgcmVhZHMgYmFjayBjb3JyZWN0bHkgZnJvbSBgbnBtIGNvbmZpZyBnZXQgcmVnaXN0cnlgIHdoaWxlXG4gKiBwbnBtIGlnbm9yZXMgaXQgYW5kIHNpbGVudGx5IGZhbGxzIHRocm91Z2ggdG8gaXRzIGJ1aWx0LWluXG4gKiBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYC4gVGhhdCBwcm9kdWNlZCBhIGJvb3RzdHJhcCB3aGljaCBsb2dnZWQgdGhlXG4gKiBsb2NhbCByZWdpc3RyeSBhbmQgdGhlbiB0cmllZCB0byBmZXRjaCBgdHlwZXNjcmlwdGAgLyBgcHJvamVuYCAvIGB0c3hgIGZyb21cbiAqIG5wbWpzLCBmYWlsaW5nIHdpdGggRUNPTk5SRUZVU0VEIG9uIGEgbWFjaGluZSB0aGF0IGhhZCBubyByb3V0ZSB0byBpdC5cbiAqXG4gKiBIZW5jZSBhbGwgdGhyZWUgY2hhbm5lbHMsIGVhY2ggd2hlcmUgaXQgYWN0dWFsbHkgYXBwbGllczpcbiAqXG4gKiAgLSB7QGxpbmsgcG5wbVJlZ2lzdHJ5QXJnc30gcGFzc2VzIGAtLXJlZ2lzdHJ5YCB0byBwbnBtLCBidXQgb25seSBmb3IgdGhlXG4gKiAgICBzdWJjb21tYW5kcyB0aGF0IHJlc29sdmUgcGFja2FnZXMuIEl0IG11c3QgTk9UIGJlIGFwcGVuZGVkIHRvXG4gKiAgICBgcG5wbSBleGVjIDxjbWQ+YCwgd2hlcmUgdHJhaWxpbmcgYXJndW1lbnRzIGJlbG9uZyB0byBgPGNtZD5gLCBub3QgcG5wbS5cbiAqICAtIHtAbGluayBucHhSZWdpc3RyeUFyZ3N9IHBhc3NlcyBgLS1yZWdpc3RyeWAgdG8gbnB4LCBiZWZvcmUgdGhlIHBhY2thZ2VcbiAqICAgIG5hbWUsIHNvIHRoZSBucHggZmFsbGJhY2sgY2FuIGZldGNoIHBucG0gaXRzZWxmIGZyb20gdGhlIHNhbWUgcmVnaXN0cnkuXG4gKiAgLSB7QGxpbmsgY2hpbGRFbnZ9IGtlZXBzIGBucG1fY29uZmlnX3JlZ2lzdHJ5YCBzZXQgZm9yIG5wbS1iYXNlZCBjaGlsZHJlblxuICogICAgKG5weCBpbmNsdWRlZCksIHdoaWNoIGlzIHRoZSBvbmx5IGNoYW5uZWwgbnBtIGV4cG9zZXMgdG8gbmVzdGVkIHRvb2xzLlxuICpcbiAqIGBAZGJ4LXRvb2xzL2NvcmVgJ3MgYG5wbVJlZ2lzdHJ5KHsgb3ZlcnJpZGVPbmx5OiB0cnVlIH0pYCByZXR1cm5zIG5vdGhpbmcgd2hlblxuICogdGhlIGVmZmVjdGl2ZSByZWdpc3RyeSBJUyBucG1qcywgc28gbm9uZSBvZiB0aGlzIHRvdWNoZXMgYSBkZWZhdWx0IGluc3RhbGwuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZXhlYywgcHJvamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGZ1bmN0aW9uTW9kdWxlLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbmVlZHNJbnN0YWxsIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZGJ4LXRvb2xzOnBucG1cIik7XG5cbi8qKiBBIHBhY2thZ2UuanNvbiBgYmluYCBmaWVsZDogZWl0aGVyIGEgc2luZ2xlIGNvbW1hbmQgc3RyaW5nLCBvciBhIG5hbWUgLT4gcGF0aCBtYXAuICovXG50eXBlIEJpbkZpZWxkID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBwbnBtIHN1YmNvbW1hbmRzIHRoYXQgcmVzb2x2ZSBwYWNrYWdlcyBmcm9tIGEgcmVnaXN0cnksIGFuZCB0aGVyZWZvcmUgYWNjZXB0IGFcbiAqIG1lYW5pbmdmdWwgYC0tcmVnaXN0cnlgLiBFdmVyeXRoaW5nIGVsc2UgKGBleGVjYCwgYHJ1bmAsIGBjb25maWdgLCAuLi4pIGlzIGxlZnRcbiAqIGFsb25lOiBgZXhlY2AgaW4gcGFydGljdWxhciBmb3J3YXJkcyB0cmFpbGluZyBhcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQgaXQgcnVucyxcbiAqIHNvIGEgYC0tcmVnaXN0cnlgIGFwcGVuZGVkIHRoZXJlIHdvdWxkIGxhbmQgb24gcHJvamVuIG9yIHRzeCBpbnN0ZWFkLlxuICovXG5jb25zdCBSRUdJU1RSWV9TVUJDT01NQU5EUyA9IG5ldyBTZXQoW1xuICBcImFkZFwiLFxuICBcImNyZWF0ZVwiLFxuICBcImRseFwiLFxuICBcImlcIixcbiAgXCJpbXBvcnRcIixcbiAgXCJpbml0XCIsXG4gIFwiaW5zdGFsbFwiLFxuICBcImxpbmtcIixcbiAgXCJ1cFwiLFxuICBcInVwZGF0ZVwiLFxuXSk7XG5cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IHRvIGZvcmNlIG9udG8gY2hpbGQgcGFja2FnZSBtYW5hZ2Vycywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIGVmZmVjdGl2ZSBvbmUgaXMgYWxyZWFkeSB0aGUgcHVibGljIGRlZmF1bHQuXG4gKlxuICogYGVudlZhcnM6IHRydWVgIGFsc28gY29uc3VsdHMgYG5wbV9jb25maWdfcmVnaXN0cnlgIGRpcmVjdGx5LCBiZWNhdXNlIGFcbiAqIGNvbnRhaW5lciBtYXkgZXhwb3J0IGl0IHdpdGhvdXQgYW55IGAubnBtcmNgIGZvciBgbnBtIGNvbmZpZyBnZXRgIHRvIHJlYWQuXG4gKiBNZW1vaXplZDogcmVzb2x1dGlvbiBzaGVsbHMgb3V0IHRvIG5wbS5cbiAqL1xuY29uc3QgcmVnaXN0cnlPdmVycmlkZSA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICBwcm9qZWN0Lm5wbVJlZ2lzdHJ5KG51bGwsIHsgb3ZlcnJpZGVPbmx5OiB0cnVlLCBlbnZWYXJzOiB0cnVlIH0pPy50b1N0cmluZygpLFxuKTtcblxuLyoqIGAtLXJlZ2lzdHJ5IDx1cmw+YCBmb3IgbnB4LCBvciBgW11gLiBQbGFjZWQgQkVGT1JFIHRoZSBwYWNrYWdlIG5hbWUgYnkgY2FsbGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBucHhSZWdpc3RyeUFyZ3MoKTogc3RyaW5nW10ge1xuICBjb25zdCB1cmwgPSByZWdpc3RyeU92ZXJyaWRlKCk7XG4gIHJldHVybiB1cmwgPyBbXCItLXJlZ2lzdHJ5XCIsIHVybF0gOiBbXTtcbn1cblxuLyoqIGAtLXJlZ2lzdHJ5IDx1cmw+YCBmb3IgYSBwbnBtIGludm9jYXRpb24sIG9yIGBbXWAgd2hlbiB0aGUgc3ViY29tbWFuZCBkb2VzIG5vdCByZXNvbHZlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBucG1SZWdpc3RyeUFyZ3MoYXJnczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgaWYgKCF1cmwpIHJldHVybiBbXTtcbiAgY29uc3Qgc3ViY29tbWFuZCA9IGFyZ3MuZmluZCgoYXJnKSA9PiAhYXJnLnN0YXJ0c1dpdGgoXCItXCIpKTtcbiAgcmV0dXJuIHN1YmNvbW1hbmQgJiYgUkVHSVNUUllfU1VCQ09NTUFORFMuaGFzKHN1YmNvbW1hbmQpID8gW1wiLS1yZWdpc3RyeVwiLCB1cmxdIDogW107XG59XG5cbi8qKlxuICogYHByb2Nlc3MuZW52YCBwbHVzIHRoZSByZWdpc3RyeSB1bmRlciBucG0ncyBlbnYtdmFyIGNvbnZlbnRpb24sIGZvciBjaGlsZHJlblxuICogdGhhdCByZWFkIGl0IChucG0sIG5weCwgYW5kIGFueXRoaW5nIHRoZXkgc3Bhd24pLiBwbnBtIGlnbm9yZXMgaXQsIHdoaWNoIGlzXG4gKiB3aHkgdGhlIENMSSBmbGFncyBhYm92ZSBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkRW52KGV4dHJhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IE5vZGVKUy5Qcm9jZXNzRW52IHtcbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmV4dHJhIH07XG4gIGNvbnN0IHVybCA9IHJlZ2lzdHJ5T3ZlcnJpZGUoKTtcbiAgaWYgKHVybCkge1xuICAgIC8vIEJvdGggY2FzZXM6IGVudiBpcyBjYXNlLXNlbnNpdGl2ZSBvbiBQT1NJWCwgYW5kIG5wbSBsb3dlcmNhc2VzIHdoZW4gcmVhZGluZy5cbiAgICBlbnYubnBtX2NvbmZpZ19yZWdpc3RyeSA9IHVybDtcbiAgICBlbnYuTlBNX0NPTkZJR19SRUdJU1RSWSA9IHVybDtcbiAgfVxuICByZXR1cm4gZW52O1xufVxuXG4vKiogVHJ1ZSB3aGVuIGBwbnBtIC0tdmVyc2lvbmAgcnVucywgaS5lLiBwbnBtIGlzIGFscmVhZHkgb24gUEFUSC4gKi9cbmZ1bmN0aW9uIHBucG1PblBhdGgoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgZXhlYy5zcGF3blN5bmMoXCJwbnBtXCIsIFtcIi0tdmVyc2lvblwiXSwge1xuICAgICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQbnBtQXJndkltcGwoKTogc3RyaW5nW10ge1xuICAvLyAxLiBBIHJlc29sdmFibGUgYHBucG1gIGRlcGVuZGVuY3kgKHRoZSBub3JtYWwgaW4td29ya3NwYWNlIGNhc2UpOiBydW4gaXRzXG4gIC8vICAgIGJpbiBkaXJlY3RseSB3aXRoIHRoZSBjdXJyZW50IG5vZGUgLSBubyBQQVRIIG9yIHBhY2thZ2UtbWFuYWdlciBzaGltLlxuICAvLyAgICBwbnBtJ3Mgb3duIGAtLXJlZ2lzdHJ5YCByaWRlcyBpbiB3aXRoIHRoZSBBUkdTLCBhZnRlciB0aGlzIGVudHJ5IHBvaW50LlxuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoXCJwbnBtL3BhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCBwa2cgPSByZXF1aXJlKHBrZ0pzb25QYXRoKSBhcyB7IGJpbjogQmluRmllbGQgfTtcbiAgICBjb25zdCBiaW4gPSB0eXBlb2YgcGtnLmJpbiA9PT0gXCJzdHJpbmdcIiA/IHBrZy5iaW4gOiBwa2cuYmluLnBucG07XG4gICAgaWYgKGJpbikgcmV0dXJuIFtwcm9jZXNzLmV4ZWNQYXRoLCBqb2luKGRpcm5hbWUocGtnSnNvblBhdGgpLCBiaW4pXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cblxuICAvLyAyLiBBIGJhcmUgYHBucG1gIGFscmVhZHkgb24gUEFUSCAoZS5nLiBydW5uaW5nIHVuZGVyIGBwbnBtIGRseGApLiBQcmVmZXJcbiAgLy8gICAgdGhpcyBvdmVyIHRoZSBjb3JlcGFjay9ucHggZmFsbGJhY2tzIHNvIHdlIG5ldmVyIHNoZWxsIHRocm91Z2ggbnBtIC1cbiAgLy8gICAgYG5weCAteSBwbnBtYCBydW5zIHVuZGVyIG5wbSwgd2hpY2ggcmVqZWN0cyBhIGJvb3RzdHJhcHBlZFxuICAvLyAgICBgZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlcjogcG5wbWAgbWFuaWZlc3Qgd2l0aCBFQkFEREVWRU5HSU5FUy5cbiAgaWYgKHBucG1PblBhdGgoKSkgcmV0dXJuIFtcInBucG1cIl07XG5cbiAgLy8gMy4gVHJ5IHRvIGVuYWJsZSBwbnBtIHZpYSBjb3JlcGFjaywgdGhlbiB1c2UgaXQuXG4gIHRyeSB7XG4gICAgZXhlYy5zcGF3blN5bmMoXCJjb3JlcGFja1wiLCBbXCJlbmFibGVcIiwgXCJwbnBtXCJdLCB7XG4gICAgICBzdGRlcnI6IFwiaWdub3JlXCIsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJpZ25vcmVcIixcbiAgICAgIGNoZWNrOiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChwbnBtT25QYXRoKCkpIHJldHVybiBbXCJwbnBtXCJdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuXG4gIC8vIDQuIExhc3QgcmVzb3J0OiBmZXRjaCBwbnBtIG9uIGRlbWFuZCB2aWEgbnB4LiBQYXNzIGAtLWVuZ2luZS1zdHJpY3Q9ZmFsc2VgXG4gIC8vICAgIChhbmQgc2tpcCBucG0ncyBkZXZFbmdpbmVzIGdhdGUpIHNvIG5wbSBkb2Vzbid0IHJlZnVzZSB0byBydW4ganVzdFxuICAvLyAgICBiZWNhdXNlIHRoZSB0YXJnZXQgbWFuaWZlc3QgZGVjbGFyZXMgYGRldkVuZ2luZXMucGFja2FnZU1hbmFnZXI6IHBucG1gLlxuICAvLyAgICBucG0tbGV2ZWwgZmxhZ3MsIGAtLXJlZ2lzdHJ5YCBhbW9uZyB0aGVtLCBtdXN0IHByZWNlZGUgdGhlIHBhY2thZ2UgbmFtZSxcbiAgLy8gICAgb3IgbnB4IGZvcndhcmRzIHRoZW0gdG8gcG5wbSBpbnN0ZWFkIG9mIGFjdGluZyBvbiB0aGVtIGl0c2VsZi5cbiAgcmV0dXJuIFtcIm5weFwiLCAuLi5ucHhSZWdpc3RyeUFyZ3MoKSwgXCIteVwiLCBcIi0tZW5naW5lLXN0cmljdD1mYWxzZVwiLCBcInBucG1cIl07XG59XG5cbi8qKiBNZW1vaXplZCBgW2NvbW1hbmQsIC4uLnByZWZpeF1gIGFyZ3YgcHJlZml4IHRvIHJ1biBwbnBtIChyZXNvbHZlZCBpbnN0YWxsLCBlbHNlIGNvcmVwYWNrLCBlbHNlIG5weCkuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBucG1Bcmd2ID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZShyZXNvbHZlUG5wbUFyZ3ZJbXBsKTtcblxuLyoqIFJ1biBwbnBtIHdpdGggaW5oZXJpdGVkIHN0ZGlvIGZyb20gYGN3ZGAsIGZvcmNpbmcgdGhlIHJlc29sdmVkIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blBucG0oYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IFtjb21tYW5kLCAuLi5wcmVmaXhdID0gcmVzb2x2ZVBucG1Bcmd2KCk7XG4gIGNvbnN0IHJlZ2lzdHJ5QXJncyA9IHBucG1SZWdpc3RyeUFyZ3MoYXJncyk7XG4gIGlmIChyZWdpc3RyeUFyZ3MubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci5pbmZvKGBydW5uaW5nIHBucG0gd2l0aCByZWdpc3RyeTogJHtyZWdpc3RyeUFyZ3NbMV19YCk7XG4gIH1cbiAgZXhlYy5zcGF3blN5bmMoY29tbWFuZCwgWy4uLnByZWZpeCwgLi4uYXJncywgLi4ucmVnaXN0cnlBcmdzXSwge1xuICAgIGN3ZCxcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBlbnY6IGNoaWxkRW52KCksXG4gIH0pO1xufVxuXG4vKiogSW5zdGFsbCB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIHdoZW4gYG5vZGVfbW9kdWxlc2Agb3IgcHJvamVuIGlzIG1pc3NpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlV29ya3NwYWNlUmVhZHkocm9vdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChuZWVkc0luc3RhbGwocm9vdCkpIHtcbiAgICBydW5QbnBtKFtcImluc3RhbGxcIiwgXCItLW5vLWZyb3plbi1sb2NrZmlsZVwiXSwgcm9vdCk7XG4gIH1cbn1cblxuLyoqIFJ1biBgcG5wbSBleGVjIHByb2plbmAgd2l0aCB0aGUgZ2l2ZW4gYXJncyBmcm9tIGByb290YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Qcm9qZW4oYXJnczogc3RyaW5nW10sIHJvb3Q6IHN0cmluZyk6IHZvaWQge1xuICBydW5QbnBtKFtcImV4ZWNcIiwgXCJwcm9qZW5cIiwgLi4uYXJnc10sIHJvb3QpO1xufVxuIl19
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.14",
22
- "@dbx-tools/shared-core": "0.6.14"
21
+ "@dbx-tools/core": "0.6.27",
22
+ "@dbx-tools/shared-core": "0.6.27"
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.14",
29
+ "version": "0.6.27",
30
30
  "types": "./lib/index.d.ts",
31
31
  "type": "module",
32
32
  "exports": {
package/src/bootstrap.ts CHANGED
@@ -7,9 +7,9 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
7
7
  import { join } from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
9
  import { intro, outro } from "@clack/prompts";
10
- import { exec } from "@dbx-tools/core";
10
+ import { exec, project } from "@dbx-tools/core";
11
11
  import { json } from "@dbx-tools/shared-core";
12
- import { resolvePnpmArgv, runPnpm } from "./pnpm.ts";
12
+ import { childEnv, resolvePnpmArgv, runPnpm } from "./pnpm.ts";
13
13
  import { rootLabel } from "./root.ts";
14
14
 
15
15
  /** Fallback when this CLI's own version isn't a real release (an in-repo `0.0.0`). */
@@ -157,9 +157,32 @@ export function seedToolchain(
157
157
  writeFileSync(workspaceFile, WORKSPACE_SEED);
158
158
  }
159
159
 
160
+ seedRegistry(root);
161
+
160
162
  runPnpm(["add", "-D", "projen", "typescript@^5.9.3", "tsx@^4.23.0", projenSpecifier], root);
161
163
  }
162
164
 
165
+ /**
166
+ * Pin a non-default registry into the new root's `.npmrc`.
167
+ *
168
+ * The CLI already forces `--registry` onto the pnpm invocations it makes itself,
169
+ * but a bootstrapped workspace outlives this process: every later `pnpm install`
170
+ * the developer (or projen's post-synth step) runs is on its own. pnpm ignores
171
+ * `npm_config_registry` from the environment, so without a file on disk those
172
+ * runs revert to `https://registry.npmjs.org/` - which is a hard failure where
173
+ * the custom registry was the only reachable one.
174
+ *
175
+ * Only writes for an actual override, never creates a file just to name npmjs,
176
+ * and never overwrites an existing `.npmrc` (the developer's own wins).
177
+ */
178
+ function seedRegistry(root: string): void {
179
+ const registry = project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString();
180
+ if (!registry) return;
181
+ const npmrc = join(root, ".npmrc");
182
+ if (existsSync(npmrc)) return;
183
+ writeFileSync(npmrc, `registry=${registry}\n`);
184
+ }
185
+
163
186
  /**
164
187
  * Make what `pnpm init` produced safe to synth against. Two corrections, both
165
188
  * because that output varies by pnpm version:
@@ -195,9 +218,12 @@ function normalizeSeedManifest(manifestPath: string): void {
195
218
  */
196
219
  export function runInitialSynth(root: string): void {
197
220
  const [command, ...prefix] = resolvePnpmArgv();
221
+ // No `--registry` here: this is `pnpm exec`, whose trailing arguments belong to
222
+ // tsx. The registry reaches anything nested through `childEnv` and the seeded
223
+ // `.npmrc` instead.
198
224
  exec.spawnSync(command, [...prefix, "exec", "tsx", ".projenrc.ts"], {
199
225
  cwd: root,
200
- env: { ...process.env, PROJEN_DISABLE_POST: "true" },
226
+ env: childEnv({ PROJEN_DISABLE_POST: "true" }),
201
227
  check: true,
202
228
  });
203
229
  }
package/src/pnpm.ts CHANGED
@@ -1,17 +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
37
  import { dirname, join } from "node:path";
8
- import { exec } from "@dbx-tools/core";
9
- import { functionModule } from "@dbx-tools/shared-core";
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
+ "init",
60
+ "install",
61
+ "link",
62
+ "up",
63
+ "update",
64
+ ]);
65
+
66
+ /**
67
+ * The registry to force onto child package managers, or `undefined` when the
68
+ * effective one is already the public default.
69
+ *
70
+ * `envVars: true` also consults `npm_config_registry` directly, because a
71
+ * container may export it without any `.npmrc` for `npm config get` to read.
72
+ * Memoized: resolution shells out to npm.
73
+ */
74
+ const registryOverride = functionModule.memoize((): string | undefined =>
75
+ project.npmRegistry(null, { overrideOnly: true, envVars: true })?.toString(),
76
+ );
77
+
78
+ /** `--registry <url>` for npx, or `[]`. Placed BEFORE the package name by callers. */
79
+ export function npxRegistryArgs(): string[] {
80
+ const url = registryOverride();
81
+ return url ? ["--registry", url] : [];
82
+ }
83
+
84
+ /** `--registry <url>` for a pnpm invocation, or `[]` when the subcommand does not resolve. */
85
+ export function pnpmRegistryArgs(args: readonly string[]): string[] {
86
+ const url = registryOverride();
87
+ if (!url) return [];
88
+ const subcommand = args.find((arg) => !arg.startsWith("-"));
89
+ return subcommand && REGISTRY_SUBCOMMANDS.has(subcommand) ? ["--registry", url] : [];
90
+ }
91
+
92
+ /**
93
+ * `process.env` plus the registry under npm's env-var convention, for children
94
+ * that read it (npm, npx, and anything they spawn). pnpm ignores it, which is
95
+ * why the CLI flags above exist.
96
+ */
97
+ export function childEnv(extra?: Record<string, string>): NodeJS.ProcessEnv {
98
+ const env: NodeJS.ProcessEnv = { ...process.env, ...extra };
99
+ const url = registryOverride();
100
+ if (url) {
101
+ // Both cases: env is case-sensitive on POSIX, and npm lowercases when reading.
102
+ env.npm_config_registry = url;
103
+ env.NPM_CONFIG_REGISTRY = url;
104
+ }
105
+ return env;
106
+ }
107
+
15
108
  /** True when `pnpm --version` runs, i.e. pnpm is already on PATH. */
16
109
  function pnpmOnPath(): boolean {
17
110
  try {
@@ -30,12 +123,13 @@ function pnpmOnPath(): boolean {
30
123
  function resolvePnpmArgvImpl(): string[] {
31
124
  // 1. A resolvable `pnpm` dependency (the normal in-workspace case): run its
32
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.
33
127
  try {
34
128
  const require = createRequire(import.meta.url);
35
129
  const pkgJsonPath = require.resolve("pnpm/package.json");
36
130
  const pkg = require(pkgJsonPath) as { bin: BinField };
37
131
  const bin = typeof pkg.bin === "string" ? pkg.bin : pkg.bin.pnpm;
38
- return [process.execPath, join(dirname(pkgJsonPath), bin)];
132
+ if (bin) return [process.execPath, join(dirname(pkgJsonPath), bin)];
39
133
  } catch {
40
134
  // fall through
41
135
  }
@@ -62,16 +156,26 @@ function resolvePnpmArgvImpl(): string[] {
62
156
  // 4. Last resort: fetch pnpm on demand via npx. Pass `--engine-strict=false`
63
157
  // (and skip npm's devEngines gate) so npm doesn't refuse to run just
64
158
  // because the target manifest declares `devEngines.packageManager: pnpm`.
65
- return ["npx", "-y", "--engine-strict=false", "pnpm"];
159
+ // npm-level flags, `--registry` among them, must precede the package name,
160
+ // or npx forwards them to pnpm instead of acting on them itself.
161
+ return ["npx", ...npxRegistryArgs(), "-y", "--engine-strict=false", "pnpm"];
66
162
  }
67
163
 
68
164
  /** Memoized `[command, ...prefix]` argv prefix to run pnpm (resolved install, else corepack, else npx). */
69
165
  export const resolvePnpmArgv = functionModule.memoize(resolvePnpmArgvImpl);
70
166
 
71
- /** Run pnpm with inherited stdio from `cwd`. */
167
+ /** Run pnpm with inherited stdio from `cwd`, forcing the resolved registry. */
72
168
  export function runPnpm(args: string[], cwd: string): void {
73
169
  const [command, ...prefix] = resolvePnpmArgv();
74
- 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
+ });
75
179
  }
76
180
 
77
181
  /** Install workspace dependencies when `node_modules` or projen is missing. */