@pagopa/dx-cli 0.23.2 → 0.23.3

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.
Files changed (98) hide show
  1. package/README.md +38 -12
  2. package/dist/adapters/azure/cloud-account-repository.js +1 -0
  3. package/dist/adapters/azure/cloud-account-service.js +1 -0
  4. package/dist/adapters/azure/locations.js +1 -0
  5. package/dist/adapters/codemods/git.js +1 -0
  6. package/dist/adapters/codemods/index.js +1 -0
  7. package/dist/adapters/codemods/registry.js +1 -0
  8. package/dist/adapters/codemods/update-code-review.js +1 -0
  9. package/dist/adapters/codemods/use-azure-appsvc.js +1 -0
  10. package/dist/adapters/codemods/use-pnpm.js +1 -0
  11. package/dist/adapters/codemods/yaml.js +1 -0
  12. package/dist/adapters/commander/command-errors.d.ts +31 -0
  13. package/dist/adapters/commander/command-errors.js +42 -0
  14. package/dist/adapters/commander/commands/add.js +29 -10
  15. package/dist/adapters/commander/commands/codemod.d.ts +2 -2
  16. package/dist/adapters/commander/commands/codemod.js +17 -10
  17. package/dist/adapters/commander/commands/doctor.d.ts +1 -1
  18. package/dist/adapters/commander/commands/doctor.js +26 -6
  19. package/dist/adapters/commander/commands/info.d.ts +1 -1
  20. package/dist/adapters/commander/commands/info.js +7 -3
  21. package/dist/adapters/commander/commands/init.d.ts +35 -3
  22. package/dist/adapters/commander/commands/init.js +136 -55
  23. package/dist/adapters/commander/commands/savemoney.js +2 -1
  24. package/dist/adapters/commander/commands/spec.js +1 -0
  25. package/dist/adapters/commander/env.js +1 -0
  26. package/dist/adapters/commander/error-reporting.js +1 -0
  27. package/dist/adapters/commander/global-options.d.ts +12 -0
  28. package/dist/adapters/commander/global-options.js +2 -0
  29. package/dist/adapters/commander/index.d.ts +0 -18
  30. package/dist/adapters/commander/index.js +1 -20
  31. package/dist/adapters/commander/presenters/index.js +1 -0
  32. package/dist/adapters/commander/presenters/json-command-presenter.js +1 -0
  33. package/dist/adapters/commander/presenters/text-command-presenter.js +7 -1
  34. package/dist/adapters/commander/spec.js +1 -0
  35. package/dist/adapters/execa/terraform.js +1 -0
  36. package/dist/adapters/github/github-repo.js +1 -0
  37. package/dist/adapters/node/fs/file-reader.js +1 -0
  38. package/dist/adapters/node/json/index.js +1 -0
  39. package/dist/adapters/node/package-json.js +1 -0
  40. package/dist/adapters/node/release.js +1 -0
  41. package/dist/adapters/node/repository.js +1 -0
  42. package/dist/adapters/octokit/index.js +1 -0
  43. package/dist/adapters/pagopa-technology/azure-authorization-config.js +1 -0
  44. package/dist/adapters/pagopa-technology/azure-authorization.js +1 -0
  45. package/dist/adapters/plop/actions/fetch-github-release.js +1 -0
  46. package/dist/adapters/plop/actions/get-node-version.js +1 -0
  47. package/dist/adapters/plop/actions/get-terraform-backend.js +1 -0
  48. package/dist/adapters/plop/actions/init-cloud-accounts.js +1 -0
  49. package/dist/adapters/plop/actions/provision-terraform-backend.js +1 -0
  50. package/dist/adapters/plop/actions/semver.js +1 -0
  51. package/dist/adapters/plop/actions/setup-pnpm.js +7 -4
  52. package/dist/adapters/plop/generators/environment/actions.js +1 -0
  53. package/dist/adapters/plop/generators/environment/index.js +1 -0
  54. package/dist/adapters/plop/generators/environment/prompts.js +1 -0
  55. package/dist/adapters/plop/generators/monorepo/actions.js +1 -0
  56. package/dist/adapters/plop/generators/monorepo/index.d.ts +1 -1
  57. package/dist/adapters/plop/generators/monorepo/index.js +3 -2
  58. package/dist/adapters/plop/generators/monorepo/prompts.d.ts +7 -1
  59. package/dist/adapters/plop/generators/monorepo/prompts.js +7 -4
  60. package/dist/adapters/plop/helpers/env-short.js +1 -0
  61. package/dist/adapters/plop/helpers/eq.js +1 -0
  62. package/dist/adapters/plop/helpers/resource-prefix.js +1 -0
  63. package/dist/adapters/plop/helpers/terraform-state-key.js +1 -0
  64. package/dist/adapters/plop/helpers/validate-prompt.js +1 -0
  65. package/dist/adapters/plop/index.d.ts +21 -4
  66. package/dist/adapters/plop/index.js +34 -13
  67. package/dist/adapters/plop/templates-path.js +1 -0
  68. package/dist/adapters/terraform/fmt.js +1 -0
  69. package/dist/adapters/yaml/index.js +1 -0
  70. package/dist/adapters/zod/index.js +1 -0
  71. package/dist/config.js +1 -0
  72. package/dist/domain/authorization.js +1 -0
  73. package/dist/domain/cloud-account.js +1 -0
  74. package/dist/domain/codemod.js +1 -0
  75. package/dist/domain/command-presenter.js +1 -0
  76. package/dist/domain/dependencies.d.ts +0 -2
  77. package/dist/domain/dependencies.js +1 -0
  78. package/dist/domain/doctor.d.ts +1 -3
  79. package/dist/domain/doctor.js +9 -3
  80. package/dist/domain/environment.js +1 -0
  81. package/dist/domain/github-repo.js +1 -0
  82. package/dist/domain/github.js +1 -0
  83. package/dist/domain/info.d.ts +0 -1
  84. package/dist/domain/info.js +1 -5
  85. package/dist/domain/package-json.js +1 -0
  86. package/dist/domain/remote-backend.js +1 -0
  87. package/dist/domain/repository.js +1 -0
  88. package/dist/domain/spec.js +1 -0
  89. package/dist/domain/validation.d.ts +0 -3
  90. package/dist/domain/validation.js +1 -0
  91. package/dist/domain/workspace.js +1 -0
  92. package/dist/index.js +1 -3
  93. package/dist/use-cases/apply-codemod.js +1 -0
  94. package/dist/use-cases/list-codemods.js +1 -0
  95. package/dist/use-cases/request-authorization.js +1 -0
  96. package/package.json +1 -1
  97. package/dist/adapters/logtape/validation-reporter.d.ts +0 -2
  98. package/dist/adapters/logtape/validation-reporter.js +0 -14
@@ -1,23 +1,30 @@
1
- import { getLogger } from "@logtape/logtape";
2
1
  import { Command } from "commander";
3
- import { exitWithError } from "../index.js";
2
+ import { ResultAsync } from "neverthrow";
3
+ import { asError, reportCommandError } from "../command-errors.js";
4
+ import { createCommandPresenter } from "../presenters/index.js";
4
5
  export const makeCodemodCommand = ({ applyCodemodById, listCodemods, }) => new Command("codemod")
5
6
  .description("Manage and apply migration scripts to the repository")
6
7
  .addCommand(new Command("list")
7
8
  .description("List available migration scripts")
8
9
  .action(async function () {
10
+ const { output } = this.optsWithGlobals();
11
+ const presenter = createCommandPresenter(output);
9
12
  await listCodemods()
10
- .andTee((codemods) => console.table(codemods, ["id", "description"]))
11
- .orTee(exitWithError(this));
13
+ .map((codemods) => codemods.map(({ description, id }) => ({ description, id })))
14
+ .andTee((codemods) => presenter.reportResult(codemods))
15
+ .orTee(reportCommandError(this, presenter, output));
12
16
  }))
13
17
  .addCommand(new Command("apply")
14
18
  .argument("<id>", "The id of the codemod to apply")
15
19
  .description("Apply migration scripts to the repository")
16
20
  .action(async function (id) {
17
- const logger = getLogger(["dx-cli", "codemod"]);
18
- await applyCodemodById(id)
19
- .andTee(() => {
20
- logger.info("Codemod applied ✅");
21
- })
22
- .orTee(exitWithError(this));
21
+ const { output } = this.optsWithGlobals();
22
+ const presenter = createCommandPresenter(output);
23
+ await ResultAsync.fromPromise(presenter.trackStep(`Applying codemod ${id}...`, () => applyCodemodById(id).match(() => undefined, (error) => {
24
+ throw error;
25
+ })), asError(`Failed to apply codemod ${id}`))
26
+ .map(() => ({ id }))
27
+ .andTee((result) => presenter.reportResult(result))
28
+ .orTee(reportCommandError(this, presenter, output));
23
29
  }));
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1vZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZGFwdGVycy9jb21tYW5kZXIvY29tbWFuZHMvY29kZW1vZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFLekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBT2hFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsRUFDakMsZ0JBQWdCLEVBQ2hCLFlBQVksR0FDZSxFQUFFLEVBQUUsQ0FDL0IsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO0tBQ25CLFdBQVcsQ0FBQyxzREFBc0QsQ0FBQztLQUNuRSxVQUFVLENBQ1QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDO0tBQ2hCLFdBQVcsQ0FBQyxrQ0FBa0MsQ0FBQztLQUMvQyxNQUFNLENBQUMsS0FBSztJQUNYLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFpQixDQUFDO0lBQ3pELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpELE1BQU0sWUFBWSxFQUFFO1NBQ2pCLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ2hCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQzdEO1NBQ0EsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3RELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDLENBQ0w7S0FDQSxVQUFVLENBQ1QsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO0tBQ2pCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZ0NBQWdDLENBQUM7S0FDbEQsV0FBVyxDQUFDLDJDQUEyQyxDQUFDO0tBQ3hELE1BQU0sQ0FBQyxLQUFLLFdBQVcsRUFBRTtJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBaUIsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqRCxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQzNCLFNBQVMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUNwRCxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQ3hCLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFDZixDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ1IsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDLENBQ0YsQ0FDRixFQUNELE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLENBQUMsQ0FDekM7U0FDRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDbkIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDLENBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5cbmltcG9ydCB0eXBlIHsgQXBwbHlDb2RlbW9kQnlJZCB9IGZyb20gXCIuLi8uLi8uLi91c2UtY2FzZXMvYXBwbHktY29kZW1vZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMaXN0Q29kZW1vZHMgfSBmcm9tIFwiLi4vLi4vLi4vdXNlLWNhc2VzL2xpc3QtY29kZW1vZHMuanNcIjtcblxuaW1wb3J0IHsgYXNFcnJvciwgcmVwb3J0Q29tbWFuZEVycm9yIH0gZnJvbSBcIi4uL2NvbW1hbmQtZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBHbG9iYWxPcHRpb25zIH0gZnJvbSBcIi4uL2dsb2JhbC1vcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb21tYW5kUHJlc2VudGVyIH0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcblxuZXhwb3J0IHR5cGUgQ29kZW1vZENvbW1hbmREZXBlbmRlbmNpZXMgPSB7XG4gIGFwcGx5Q29kZW1vZEJ5SWQ6IEFwcGx5Q29kZW1vZEJ5SWQ7XG4gIGxpc3RDb2RlbW9kczogTGlzdENvZGVtb2RzO1xufTtcblxuZXhwb3J0IGNvbnN0IG1ha2VDb2RlbW9kQ29tbWFuZCA9ICh7XG4gIGFwcGx5Q29kZW1vZEJ5SWQsXG4gIGxpc3RDb2RlbW9kcyxcbn06IENvZGVtb2RDb21tYW5kRGVwZW5kZW5jaWVzKSA9PlxuICBuZXcgQ29tbWFuZChcImNvZGVtb2RcIilcbiAgICAuZGVzY3JpcHRpb24oXCJNYW5hZ2UgYW5kIGFwcGx5IG1pZ3JhdGlvbiBzY3JpcHRzIHRvIHRoZSByZXBvc2l0b3J5XCIpXG4gICAgLmFkZENvbW1hbmQoXG4gICAgICBuZXcgQ29tbWFuZChcImxpc3RcIilcbiAgICAgICAgLmRlc2NyaXB0aW9uKFwiTGlzdCBhdmFpbGFibGUgbWlncmF0aW9uIHNjcmlwdHNcIilcbiAgICAgICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHRoaXMub3B0c1dpdGhHbG9iYWxzPEdsb2JhbE9wdGlvbnM+KCk7XG4gICAgICAgICAgY29uc3QgcHJlc2VudGVyID0gY3JlYXRlQ29tbWFuZFByZXNlbnRlcihvdXRwdXQpO1xuXG4gICAgICAgICAgYXdhaXQgbGlzdENvZGVtb2RzKClcbiAgICAgICAgICAgIC5tYXAoKGNvZGVtb2RzKSA9PlxuICAgICAgICAgICAgICBjb2RlbW9kcy5tYXAoKHsgZGVzY3JpcHRpb24sIGlkIH0pID0+ICh7IGRlc2NyaXB0aW9uLCBpZCB9KSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYW5kVGVlKChjb2RlbW9kcykgPT4gcHJlc2VudGVyLnJlcG9ydFJlc3VsdChjb2RlbW9kcykpXG4gICAgICAgICAgICAub3JUZWUocmVwb3J0Q29tbWFuZEVycm9yKHRoaXMsIHByZXNlbnRlciwgb3V0cHV0KSk7XG4gICAgICAgIH0pLFxuICAgIClcbiAgICAuYWRkQ29tbWFuZChcbiAgICAgIG5ldyBDb21tYW5kKFwiYXBwbHlcIilcbiAgICAgICAgLmFyZ3VtZW50KFwiPGlkPlwiLCBcIlRoZSBpZCBvZiB0aGUgY29kZW1vZCB0byBhcHBseVwiKVxuICAgICAgICAuZGVzY3JpcHRpb24oXCJBcHBseSBtaWdyYXRpb24gc2NyaXB0cyB0byB0aGUgcmVwb3NpdG9yeVwiKVxuICAgICAgICAuYWN0aW9uKGFzeW5jIGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSB0aGlzLm9wdHNXaXRoR2xvYmFsczxHbG9iYWxPcHRpb25zPigpO1xuICAgICAgICAgIGNvbnN0IHByZXNlbnRlciA9IGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIob3V0cHV0KTtcblxuICAgICAgICAgIGF3YWl0IFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICAgICAgcHJlc2VudGVyLnRyYWNrU3RlcChgQXBwbHlpbmcgY29kZW1vZCAke2lkfS4uLmAsICgpID0+XG4gICAgICAgICAgICAgIGFwcGx5Q29kZW1vZEJ5SWQoaWQpLm1hdGNoKFxuICAgICAgICAgICAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYXNFcnJvcihgRmFpbGVkIHRvIGFwcGx5IGNvZGVtb2QgJHtpZH1gKSxcbiAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKCgpID0+ICh7IGlkIH0pKVxuICAgICAgICAgICAgLmFuZFRlZSgocmVzdWx0KSA9PiBwcmVzZW50ZXIucmVwb3J0UmVzdWx0KHJlc3VsdCkpXG4gICAgICAgICAgICAub3JUZWUocmVwb3J0Q29tbWFuZEVycm9yKHRoaXMsIHByZXNlbnRlciwgb3V0cHV0KSk7XG4gICAgICAgIH0pLFxuICAgICk7XG4iXX0=
@@ -1,4 +1,4 @@
1
1
  import { Command } from "commander";
2
+ import type { Dependencies } from "../../../domain/dependencies.js";
2
3
  import { Config } from "../../../config.js";
3
- import { Dependencies } from "../../../domain/dependencies.js";
4
4
  export declare const makeDoctorCommand: (dependencies: Dependencies, config: Config) => Command;
@@ -1,12 +1,32 @@
1
+ /**
2
+ * `doctor` Commander command.
3
+ *
4
+ * Verifies the repository setup and routes the outcome through the shared
5
+ * CommandPresenter port. JSON mode emits the structured result; text mode emits
6
+ * a human-readable per-check summary. The exit code reflects whether any check
7
+ * failed, mirroring the linter convention (a successful run can still report
8
+ * problems).
9
+ */
10
+ import chalk from "chalk";
1
11
  import { Command } from "commander";
2
- import * as process from "node:process";
3
- import { printDoctorResult, runDoctor } from "../../../domain/doctor.js";
12
+ import { runDoctor } from "../../../domain/doctor.js";
13
+ import { createCommandPresenter } from "../presenters/index.js";
14
+ const formatCheck = (check) => check.isValid
15
+ ? chalk.green(`✅ ${check.successMessage}`)
16
+ : chalk.red(`❌ ${check.errorMessage}`);
17
+ const reportDoctorResult = (presenter, outputMode) => (result) => {
18
+ presenter.reportResult(outputMode === "json"
19
+ ? result
20
+ : result.checks.map(formatCheck).join("\n"));
21
+ };
4
22
  export const makeDoctorCommand = (dependencies, config) => new Command()
5
23
  .name("doctor")
6
24
  .description("Verify the repository setup according to the DevEx guidelines")
7
- .action(async () => {
25
+ .action(async function () {
26
+ const { output } = this.optsWithGlobals();
27
+ const presenter = createCommandPresenter(output);
8
28
  const result = await runDoctor(dependencies, config);
9
- printDoctorResult(dependencies, result);
10
- const exitCode = result.hasErrors ? 1 : 0;
11
- process.exit(exitCode);
29
+ reportDoctorResult(presenter, output)(result);
30
+ process.exitCode = result.hasErrors ? 1 : 0;
12
31
  });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9kb2N0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVFwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFzQixFQUFVLEVBQUUsQ0FDckQsS0FBSyxDQUFDLE9BQU87SUFDWCxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBRTNDLE1BQU0sa0JBQWtCLEdBQ3RCLENBQUMsU0FBMkIsRUFBRSxVQUEyQixFQUFFLEVBQUUsQ0FDN0QsQ0FBQyxNQUFvQixFQUFRLEVBQUU7SUFDN0IsU0FBUyxDQUFDLFlBQVksQ0FDcEIsVUFBVSxLQUFLLE1BQU07UUFDbkIsQ0FBQyxDQUFDLE1BQU07UUFDUixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUosTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsWUFBMEIsRUFDMUIsTUFBYyxFQUNMLEVBQUUsQ0FDWCxJQUFJLE9BQU8sRUFBRTtLQUNWLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDZCxXQUFXLENBQ1YsK0RBQStELENBQ2hFO0tBQ0EsTUFBTSxDQUFDLEtBQUs7SUFDWCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBaUIsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFckQsa0JBQWtCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGBkb2N0b3JgIENvbW1hbmRlciBjb21tYW5kLlxuICpcbiAqIFZlcmlmaWVzIHRoZSByZXBvc2l0b3J5IHNldHVwIGFuZCByb3V0ZXMgdGhlIG91dGNvbWUgdGhyb3VnaCB0aGUgc2hhcmVkXG4gKiBDb21tYW5kUHJlc2VudGVyIHBvcnQuIEpTT04gbW9kZSBlbWl0cyB0aGUgc3RydWN0dXJlZCByZXN1bHQ7IHRleHQgbW9kZSBlbWl0c1xuICogYSBodW1hbi1yZWFkYWJsZSBwZXItY2hlY2sgc3VtbWFyeS4gVGhlIGV4aXQgY29kZSByZWZsZWN0cyB3aGV0aGVyIGFueSBjaGVja1xuICogZmFpbGVkLCBtaXJyb3JpbmcgdGhlIGxpbnRlciBjb252ZW50aW9uIChhIHN1Y2Nlc3NmdWwgcnVuIGNhbiBzdGlsbCByZXBvcnRcbiAqIHByb2JsZW1zKS5cbiAqL1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kUHJlc2VudGVyIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9jb21tYW5kLXByZXNlbnRlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RlcGVuZGVuY2llcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEb2N0b3JSZXN1bHQgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RvY3Rvci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBWYWxpZGF0aW9uQ2hlY2sgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL3ZhbGlkYXRpb24uanNcIjtcblxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy5qc1wiO1xuaW1wb3J0IHsgcnVuRG9jdG9yIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kb2N0b3IuanNcIjtcbmltcG9ydCB7IEdsb2JhbE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2xvYmFsLW9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIgfSBmcm9tIFwiLi4vcHJlc2VudGVycy9pbmRleC5qc1wiO1xuXG5jb25zdCBmb3JtYXRDaGVjayA9IChjaGVjazogVmFsaWRhdGlvbkNoZWNrKTogc3RyaW5nID0+XG4gIGNoZWNrLmlzVmFsaWRcbiAgICA/IGNoYWxrLmdyZWVuKGDinIUgJHtjaGVjay5zdWNjZXNzTWVzc2FnZX1gKVxuICAgIDogY2hhbGsucmVkKGDinYwgJHtjaGVjay5lcnJvck1lc3NhZ2V9YCk7XG5cbmNvbnN0IHJlcG9ydERvY3RvclJlc3VsdCA9XG4gIChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIsIG91dHB1dE1vZGU6IFwianNvblwiIHwgXCJ0ZXh0XCIpID0+XG4gIChyZXN1bHQ6IERvY3RvclJlc3VsdCk6IHZvaWQgPT4ge1xuICAgIHByZXNlbnRlci5yZXBvcnRSZXN1bHQoXG4gICAgICBvdXRwdXRNb2RlID09PSBcImpzb25cIlxuICAgICAgICA/IHJlc3VsdFxuICAgICAgICA6IHJlc3VsdC5jaGVja3MubWFwKGZvcm1hdENoZWNrKS5qb2luKFwiXFxuXCIpLFxuICAgICk7XG4gIH07XG5cbmV4cG9ydCBjb25zdCBtYWtlRG9jdG9yQ29tbWFuZCA9IChcbiAgZGVwZW5kZW5jaWVzOiBEZXBlbmRlbmNpZXMsXG4gIGNvbmZpZzogQ29uZmlnLFxuKTogQ29tbWFuZCA9PlxuICBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUoXCJkb2N0b3JcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIlZlcmlmeSB0aGUgcmVwb3NpdG9yeSBzZXR1cCBhY2NvcmRpbmcgdG8gdGhlIERldkV4IGd1aWRlbGluZXNcIixcbiAgICApXG4gICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgIGNvbnN0IHByZXNlbnRlciA9IGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIob3V0cHV0KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuRG9jdG9yKGRlcGVuZGVuY2llcywgY29uZmlnKTtcblxuICAgICAgcmVwb3J0RG9jdG9yUmVzdWx0KHByZXNlbnRlciwgb3V0cHV0KShyZXN1bHQpO1xuXG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmVzdWx0Lmhhc0Vycm9ycyA/IDEgOiAwO1xuICAgIH0pO1xuIl19
@@ -1,3 +1,3 @@
1
1
  import { Command } from "commander";
2
- import { Dependencies } from "../../../domain/dependencies.js";
2
+ import type { Dependencies } from "../../../domain/dependencies.js";
3
3
  export declare const makeInfoCommand: (dependencies: Dependencies) => Command;
@@ -1,9 +1,13 @@
1
1
  import { Command } from "commander";
2
- import { getInfo, printInfo } from "../../../domain/info.js";
2
+ import { getInfo } from "../../../domain/info.js";
3
+ import { createCommandPresenter } from "../presenters/index.js";
3
4
  export const makeInfoCommand = (dependencies) => new Command()
4
5
  .name("info")
5
6
  .description("Display information about the project")
6
- .action(async () => {
7
+ .action(async function () {
8
+ const { output } = this.optsWithGlobals();
9
+ const presenter = createCommandPresenter(output);
7
10
  const result = await getInfo(dependencies)();
8
- printInfo(result);
11
+ presenter.reportResult(result);
9
12
  });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZGFwdGVycy9jb21tYW5kZXIvY29tbWFuZHMvaW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSXBDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxZQUEwQixFQUFXLEVBQUUsQ0FDckUsSUFBSSxPQUFPLEVBQUU7S0FDVixJQUFJLENBQUMsTUFBTSxDQUFDO0tBQ1osV0FBVyxDQUFDLHVDQUF1QyxDQUFDO0tBQ3BELE1BQU0sQ0FBQyxLQUFLO0lBQ1gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQWlCLENBQUM7SUFDekQsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUM3QyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcblxuaW1wb3J0IHR5cGUgeyBEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RlcGVuZGVuY2llcy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRJbmZvIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9pbmZvLmpzXCI7XG5pbXBvcnQgeyBHbG9iYWxPcHRpb25zIH0gZnJvbSBcIi4uL2dsb2JhbC1vcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb21tYW5kUHJlc2VudGVyIH0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcblxuZXhwb3J0IGNvbnN0IG1ha2VJbmZvQ29tbWFuZCA9IChkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcyk6IENvbW1hbmQgPT5cbiAgbmV3IENvbW1hbmQoKVxuICAgIC5uYW1lKFwiaW5mb1wiKVxuICAgIC5kZXNjcmlwdGlvbihcIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2plY3RcIilcbiAgICAuYWN0aW9uKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSB0aGlzLm9wdHNXaXRoR2xvYmFsczxHbG9iYWxPcHRpb25zPigpO1xuICAgICAgY29uc3QgcHJlc2VudGVyID0gY3JlYXRlQ29tbWFuZFByZXNlbnRlcihvdXRwdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0SW5mbyhkZXBlbmRlbmNpZXMpKCk7XG4gICAgICBwcmVzZW50ZXIucmVwb3J0UmVzdWx0KHJlc3VsdCk7XG4gICAgfSk7XG4iXX0=
@@ -1,8 +1,13 @@
1
1
  import { Command } from "commander";
2
2
  import { ResultAsync } from "neverthrow";
3
+ import { z } from "zod";
4
+ import type { CommandPresenter } from "../../../domain/command-presenter.js";
3
5
  import { GitHubAuthFactory } from "../../../domain/dependencies.js";
4
6
  import { Payload as MonorepoPayload } from "../../plop/generators/monorepo/index.js";
5
- export declare const checkInitPreconditions: () => ResultAsync<import("execa").Result<{
7
+ type InitInitialAnswers = Partial<MonorepoPayload> & {
8
+ publishToGitHub?: boolean;
9
+ };
10
+ export declare const runInitPreconditions: (presenter: CommandPresenter) => ResultAsync<import("execa").Result<{
6
11
  environment: {
7
12
  NO_COLOR: string;
8
13
  TF_IN_AUTOMATION: string;
@@ -10,7 +15,7 @@ export declare const checkInitPreconditions: () => ResultAsync<import("execa").R
10
15
  };
11
16
  shell: true;
12
17
  }>, Error>;
13
- export declare const checkAddEnvironmentPreconditions: () => ResultAsync<import("execa").Result<{
18
+ export declare const runAddEnvironmentPreconditions: (presenter: CommandPresenter) => ResultAsync<import("execa").Result<{
14
19
  environment: {
15
20
  NO_COLOR: string;
16
21
  TF_IN_AUTOMATION: string;
@@ -18,5 +23,32 @@ export declare const checkAddEnvironmentPreconditions: () => ResultAsync<import(
18
23
  };
19
24
  shell: true;
20
25
  }>, Error>;
21
- export declare const confirmGitHubRepoCreation: (payload: MonorepoPayload) => ResultAsync<boolean, Error>;
26
+ export declare const initCommandOptionsSchema: z.ZodObject<{
27
+ description: z.ZodOptional<z.ZodString>;
28
+ name: z.ZodOptional<z.ZodString>;
29
+ owner: z.ZodOptional<z.ZodString>;
30
+ publish: z.ZodOptional<z.ZodBoolean>;
31
+ }, z.core.$strip>;
32
+ export type InitCommandOptions = z.infer<typeof initCommandOptionsSchema>;
33
+ export declare const parseInitCommandOptions: (input: unknown) => InitCommandOptions;
34
+ export declare const getMonorepoInitialAnswers: ({ description, name, owner, publish, }: InitCommandOptions) => InitInitialAnswers;
35
+ /**
36
+ * Translates a failure of the git remote setup step into an actionable error.
37
+ *
38
+ * When `git remote add origin` exits with code 3 the remote already exists,
39
+ * which is a recoverable situation: the message tells the user how to fix it.
40
+ * The original ExecaError is preserved as `cause` so `--verbose` still surfaces
41
+ * the exit code and git's own stderr.
42
+ */
43
+ export declare const mapGitRemoteAddError: (cause: unknown) => Error;
44
+ /**
45
+ * Resolves whether the scaffolded repository should be published to GitHub.
46
+ *
47
+ * When the caller already knows the answer (e.g. the user passed `--publish`
48
+ * on the command line), that value is used as-is and no prompt is shown. When
49
+ * the preference is left undefined (flag omitted), the user is asked
50
+ * interactively.
51
+ */
52
+ export declare const confirmGitHubRepoCreation: (payload: MonorepoPayload, publishPreference?: boolean) => ResultAsync<boolean, Error>;
22
53
  export declare const makeInitCommand: (requireGitHubAuth: GitHubAuthFactory) => Command;
54
+ export {};
@@ -1,24 +1,17 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
2
  import chalk from "chalk";
3
- import { Command } from "commander";
3
+ import { Command, Option } from "commander";
4
4
  import { $, ExecaError } from "execa";
5
5
  import inquirer from "inquirer";
6
- import { okAsync, ResultAsync } from "neverthrow";
6
+ import { errAsync, okAsync, ResultAsync } from "neverthrow";
7
7
  import * as path from "node:path";
8
- import { oraPromise } from "ora";
9
8
  import { z } from "zod";
10
9
  import { Repository, } from "../../../domain/github.js";
11
10
  import { tf$ } from "../../execa/terraform.js";
12
11
  import { collectMonorepoPayload, getPlopInstance, runMonorepoActions, } from "../../plop/index.js";
13
- import { exitWithError } from "../index.js";
12
+ import { asError, reportCommandError } from "../command-errors.js";
14
13
  import { createCommandPresenter } from "../presenters/index.js";
15
14
  const isGitHubRepoCreationSkipped = (input) => "gitHubRepoCreationSkipped" in input;
16
- const withSpinner = (text, successText, failText, task) => ResultAsync.fromPromise(oraPromise(task(), {
17
- failText,
18
- successText,
19
- text,
20
- }), (cause) => new Error(failText, { cause }));
21
- const asError = (message) => (cause) => new Error(message, { cause });
22
15
  const trackStep = (presenter, name, task, mapError) => ResultAsync.fromPromise(presenter.trackStep(name, task), mapError);
23
16
  const displaySummary = (input) => {
24
17
  const docsUrl = "https://dx.pagopa.it/getting-started";
@@ -56,10 +49,8 @@ const displaySummary = (input) => {
56
49
  }
57
50
  };
58
51
  const checkTerraformCli = () => tf$ `terraform -version`;
59
- const checkTerraformCliIsInstalled = () => withSpinner("Checking Terraform installation...", "Terraform is installed!", "Please install terraform CLI before running this command. If you use tfenv, run: tfenv install latest && tfenv use latest", checkTerraformCli);
60
52
  const trackTerraformCliIsInstalled = (presenter) => trackStep(presenter, "Checking Terraform installation...", checkTerraformCli, asError("Please install terraform CLI before running this command. If you use tfenv, run: tfenv install latest && tfenv use latest"));
61
53
  const checkCorepack = () => tf$ `corepack -v`;
62
- const checkCorepackIsInstalled = () => withSpinner("Checking Corepack installation...", "Corepack is installed!", "Please install Corepack before running this command.", checkCorepack);
63
54
  const trackCorepackIsInstalled = (presenter) => trackStep(presenter, "Checking Corepack installation...", checkCorepack, asError("Please install Corepack before running this command."));
64
55
  const azureAccountSchema = z.object({
65
56
  user: z.object({
@@ -75,13 +66,45 @@ const ensureAzLogin = async () => {
75
66
  const { user } = azureAccountSchema.parse(parsed);
76
67
  return user.name;
77
68
  };
78
- const checkAzLogin = () => withSpinner("Check Azure login status...", (userName) => `You are logged in to Azure (${userName})`, "Please log in to Azure CLI using `az login` before running this command.", ensureAzLogin);
79
- const runInitPreconditions = (presenter) => trackTerraformCliIsInstalled(presenter).andThen(() => trackCorepackIsInstalled(presenter));
69
+ const trackAzLogin = (presenter) => trackStep(presenter, "Checking Azure login status...", ensureAzLogin, asError("Please log in to Azure CLI using `az login` before running this command."));
80
70
  // TODO(CES-1810): Make these checks concurrent to speed up the preconditions check phase
81
- export const checkInitPreconditions = () => checkTerraformCliIsInstalled().andThen(() => checkCorepackIsInstalled());
82
- export const checkAddEnvironmentPreconditions = () => checkTerraformCliIsInstalled()
83
- .andThen(() => checkAzLogin())
84
- .andThen(() => checkCorepackIsInstalled());
71
+ export const runInitPreconditions = (presenter) => trackTerraformCliIsInstalled(presenter).andThen(() => trackCorepackIsInstalled(presenter));
72
+ // TODO(CES-1810): Make these checks concurrent to speed up the preconditions check phase
73
+ export const runAddEnvironmentPreconditions = (presenter) => trackTerraformCliIsInstalled(presenter)
74
+ .andThen(() => trackAzLogin(presenter))
75
+ .andThen(() => trackCorepackIsInstalled(presenter));
76
+ const DEFAULT_GITHUB_PUBLISH_CONFIRMATION = true;
77
+ export const initCommandOptionsSchema = z.object({
78
+ description: z.string().optional(),
79
+ name: z.string().trim().min(1, "Repository name cannot be empty").optional(),
80
+ owner: z.string().trim().min(1, "GitHub owner cannot be empty").optional(),
81
+ publish: z.boolean().optional(),
82
+ });
83
+ export const parseInitCommandOptions = (input) => {
84
+ const result = initCommandOptionsSchema.safeParse(input);
85
+ if (!result.success) {
86
+ throw new Error(`Invalid init command options:\n${z.prettifyError(result.error)}`, {
87
+ cause: result.error,
88
+ });
89
+ }
90
+ return result.data;
91
+ };
92
+ export const getMonorepoInitialAnswers = ({ description, name, owner, publish, }) => {
93
+ const initialAnswers = {};
94
+ if (description) {
95
+ initialAnswers.repoDescription = description;
96
+ }
97
+ if (owner) {
98
+ initialAnswers.repoOwner = owner;
99
+ }
100
+ if (name) {
101
+ initialAnswers.repoName = name;
102
+ }
103
+ if (typeof publish === "boolean") {
104
+ initialAnswers.publishToGitHub = publish;
105
+ }
106
+ return initialAnswers;
107
+ };
85
108
  const createRemoteRepositoryWithPresenter = (presenter) => ({ repoName, repoOwner, }) => {
86
109
  const logger = getLogger(["dx-cli", "init"]);
87
110
  const repo$ = tf$({ cwd: path.resolve("infra", "repository") });
@@ -99,14 +122,42 @@ const createRemoteRepositoryWithPresenter = (presenter) => ({ repoName, repoOwne
99
122
  };
100
123
  return trackStep(presenter, "Creating GitHub repository...", applyTerraform, asError("Failed to create GitHub repository.")).map(() => new Repository(repoName, repoOwner));
101
124
  };
125
+ /**
126
+ * Exit code returned by `git remote add` when a remote with the requested name
127
+ * already exists. `git remote` documents this dedicated status code, so we can
128
+ * turn it into actionable guidance instead of a generic failure message.
129
+ *
130
+ * See https://git-scm.com/docs/git-remote#_exit_status
131
+ */
132
+ const GIT_REMOTE_ALREADY_EXISTS_EXIT_CODE = 3;
133
+ /**
134
+ * Translates a failure of the git remote setup step into an actionable error.
135
+ *
136
+ * When `git remote add origin` exits with code 3 the remote already exists,
137
+ * which is a recoverable situation: the message tells the user how to fix it.
138
+ * The original ExecaError is preserved as `cause` so `--verbose` still surfaces
139
+ * the exit code and git's own stderr.
140
+ */
141
+ export const mapGitRemoteAddError = (cause) => {
142
+ if (cause instanceof ExecaError &&
143
+ cause.exitCode === GIT_REMOTE_ALREADY_EXISTS_EXIT_CODE) {
144
+ return new Error("A git remote named 'origin' already exists. Remove it with `git remote remove origin` and run the command again, or start from a clean directory.", { cause });
145
+ }
146
+ return new Error("Failed to set up the local git repository and its 'origin' remote.", { cause });
147
+ };
102
148
  const initializeGitRepositoryWithPresenter = (presenter) => (repository) => {
103
149
  const branchName = "features/scaffold-workspace";
104
150
  const git$ = $({
105
151
  shell: true,
106
152
  });
107
- const pushToOrigin = async () => {
153
+ // `git remote add` is tracked separately from the push so its documented
154
+ // exit codes (e.g. 3 = remote already exists) surface a specific, actionable
155
+ // message instead of being misreported as a push failure.
156
+ const configureRemote = async () => {
108
157
  await git$ `git init`;
109
158
  await git$ `git remote add origin ${repository.origin}`;
159
+ };
160
+ const pushToOrigin = async () => {
110
161
  await git$ `git fetch origin main`;
111
162
  await git$ `git checkout -b ${branchName}`;
112
163
  // Terraform creates `main` with an initial README commit.
@@ -117,7 +168,9 @@ const initializeGitRepositoryWithPresenter = (presenter) => (repository) => {
117
168
  await git$ `git commit --no-gpg-sign -m "Scaffold workspace"`;
118
169
  await git$ `git push -u origin ${branchName}`;
119
170
  };
120
- return trackStep(presenter, "Pushing code to GitHub...", pushToOrigin, asError("Failed to push code to GitHub.")).map(() => ({ branchName, repository }));
171
+ return trackStep(presenter, "Configuring the git remote...", configureRemote, mapGitRemoteAddError)
172
+ .andThen(() => trackStep(presenter, "Pushing code to GitHub...", pushToOrigin, asError("Failed to push code to GitHub.")))
173
+ .map(() => ({ branchName, repository }));
121
174
  };
122
175
  const createPullRequestWithPresenter = ({ gitHubService, presenter }) => ({ branchName, repository, }) => trackStep(presenter, "Creating Pull Request...", () => gitHubService.createPullRequest({
123
176
  base: "main",
@@ -142,29 +195,54 @@ const handleGeneratorError = (err) => {
142
195
  }
143
196
  return new Error("Failed to run the generator", { cause: err });
144
197
  };
145
- export const confirmGitHubRepoCreation = (payload) => ResultAsync.fromPromise(inquirer
146
- .prompt({
147
- default: true,
148
- message: `The project is created on ${chalk.green(payload.repoName)}. Would you like to publish it to GitHub at ${chalk.green(`${payload.repoOwner}/${payload.repoName}`)} now?`,
149
- name: "confirm",
150
- type: "confirm",
151
- })
152
- .then(({ confirm }) => confirm), (cause) => new Error("Failed to read GitHub publish confirmation", { cause }));
153
- const runInitAction = ({ gitHubService, presenter, }) => trackStep(presenter, "Initializing workspace generator...", getPlopInstance, asError("Failed to initialize plop"))
154
- .andThen((plop) =>
155
- // The prompt phase must run outside trackStep: in text mode trackStep
156
- // renders a spinner that occupies the TTY and hides the prompts.
157
- ResultAsync.fromPromise(collectMonorepoPayload(plop, gitHubService), handleGeneratorError))
158
- .andThen(({ generator, payload }) => trackStep(presenter, "Scaffolding workspace...", () => runMonorepoActions(generator, payload), handleGeneratorError))
159
- .andTee((payload) => {
160
- process.chdir(payload.repoName);
161
- })
162
- .andThen((payload) => confirmGitHubRepoCreation(payload).andThen((confirmed) => confirmed
163
- ? handleNewGitHubRepositoryWithPresenter({
164
- gitHubService,
165
- presenter,
166
- })(payload)
167
- : okAsync({ gitHubRepoCreationSkipped: true, payload })));
198
+ /**
199
+ * Resolves whether the scaffolded repository should be published to GitHub.
200
+ *
201
+ * When the caller already knows the answer (e.g. the user passed `--publish`
202
+ * on the command line), that value is used as-is and no prompt is shown. When
203
+ * the preference is left undefined (flag omitted), the user is asked
204
+ * interactively.
205
+ */
206
+ export const confirmGitHubRepoCreation = (payload, publishPreference) =>
207
+ // A preference provided up-front (via `--publish`) skips the interactive prompt.
208
+ publishPreference !== undefined
209
+ ? okAsync(publishPreference)
210
+ : ResultAsync.fromPromise(inquirer.prompt({
211
+ default: DEFAULT_GITHUB_PUBLISH_CONFIRMATION,
212
+ message: `The project is created on ${chalk.green(payload.repoName)}. Would you like to publish it to GitHub at ${chalk.green(`${payload.repoOwner}/${payload.repoName}`)} now?`,
213
+ name: "confirm",
214
+ type: "confirm",
215
+ }), (cause) => new Error("Failed to read GitHub publish confirmation", { cause })).andThen((answer) => {
216
+ const parsedAnswer = z
217
+ .object({
218
+ confirm: z.boolean(),
219
+ })
220
+ .safeParse(answer);
221
+ if (!parsedAnswer.success) {
222
+ return errAsync(new Error("Invalid GitHub publish confirmation", {
223
+ cause: parsedAnswer.error,
224
+ }));
225
+ }
226
+ return okAsync(parsedAnswer.data.confirm);
227
+ });
228
+ const runInitAction = ({ gitHubService, initialAnswers = {}, presenter, }) => {
229
+ const { publishToGitHub, ...monorepoInitialAnswers } = initialAnswers;
230
+ return trackStep(presenter, "Initializing workspace generator...", getPlopInstance, asError("Failed to initialize plop"))
231
+ .andThen((plop) =>
232
+ // The prompt phase must run outside trackStep: in text mode trackStep
233
+ // renders a spinner that occupies the TTY and hides the prompts.
234
+ ResultAsync.fromPromise(collectMonorepoPayload(plop, gitHubService, monorepoInitialAnswers), handleGeneratorError))
235
+ .andThen(({ generator, payload }) => trackStep(presenter, "Scaffolding workspace...", () => runMonorepoActions(generator, payload), handleGeneratorError))
236
+ .andTee((payload) => {
237
+ process.chdir(payload.repoName);
238
+ })
239
+ .andThen((payload) => confirmGitHubRepoCreation(payload, publishToGitHub).andThen((confirmed) => confirmed
240
+ ? handleNewGitHubRepositoryWithPresenter({
241
+ gitHubService,
242
+ presenter,
243
+ })(payload)
244
+ : okAsync({ gitHubRepoCreationSkipped: true, payload })));
245
+ };
168
246
  const reportSummary = (presenter, outputMode) => (result) => {
169
247
  if (outputMode === "json") {
170
248
  presenter.reportResult(result);
@@ -173,23 +251,26 @@ const reportSummary = (presenter, outputMode) => (result) => {
173
251
  displaySummary(result);
174
252
  }
175
253
  };
176
- const reportCommandError = (command, presenter, outputMode) => (error) => {
177
- if (outputMode === "json") {
178
- presenter.reportError(error);
179
- process.exitCode = 1;
180
- }
181
- else {
182
- exitWithError(command)(error);
183
- }
184
- };
185
254
  export const makeInitCommand = (requireGitHubAuth) => new Command()
186
255
  .name("init")
187
256
  .description("Initialize a new DX workspace")
188
- .action(async function () {
257
+ .addOption(new Option("--name <name>", "Repository name"))
258
+ .addOption(new Option("--owner <owner>", "GitHub organization or user that will own the repository"))
259
+ .addOption(new Option("--description <description>", "Repository description"))
260
+ .addOption(new Option("--publish", "Publish the scaffolded repository to GitHub without prompting").default(undefined))
261
+ .action(async function (options) {
189
262
  const { output } = this.optsWithGlobals();
190
263
  const presenter = createCommandPresenter(output);
191
- await runInitPreconditions(presenter)
264
+ await ResultAsync.fromPromise(Promise.resolve().then(() => parseInitCommandOptions(options)), (cause) => cause instanceof Error
265
+ ? cause
266
+ : new Error("Failed to parse init command options", { cause }))
267
+ .andThen((initOptions) => runInitPreconditions(presenter)
192
268
  .andThen(() => requireGitHubAuth())
193
- .andThen((auth) => runInitAction({ gitHubService: auth.gitHubService, presenter }))
269
+ .andThen((auth) => runInitAction({
270
+ gitHubService: auth.gitHubService,
271
+ initialAnswers: getMonorepoInitialAnswers(initOptions),
272
+ presenter,
273
+ })))
194
274
  .match(reportSummary(presenter, output), reportCommandError(this, presenter, output));
195
275
  });
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZGFwdGVycy9jb21tYW5kZXIvY29tbWFuZHMvaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUQsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQU14QixPQUFPLEVBR0wsVUFBVSxHQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWNoRSxNQUFNLDJCQUEyQixHQUFHLENBQ2xDLEtBQW1CLEVBQ3VCLEVBQUUsQ0FDNUMsMkJBQTJCLElBQUksS0FBSyxDQUFDO0FBc0J2QyxNQUFNLFNBQVMsR0FBRyxDQUNoQixTQUEyQixFQUMzQixJQUFZLEVBQ1osSUFBc0IsRUFDdEIsUUFBK0IsRUFDWixFQUFFLENBQ3JCLFdBQVcsQ0FB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ciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyAkLCBFeGVjYUVycm9yIH0gZnJvbSBcImV4ZWNhXCI7XG5pbXBvcnQgaW5xdWlyZXIgZnJvbSBcImlucXVpcmVyXCI7XG5pbXBvcnQgeyBlcnJBc3luYywgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRQcmVzZW50ZXIgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2NvbW1hbmQtcHJlc2VudGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdsb2JhbE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2xvYmFsLW9wdGlvbnMuanNcIjtcblxuaW1wb3J0IHsgR2l0SHViQXV0aEZhY3RvcnkgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RlcGVuZGVuY2llcy5qc1wiO1xuaW1wb3J0IHtcbiAgR2l0SHViU2VydmljZSxcbiAgUHVsbFJlcXVlc3QsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5pbXBvcnQgeyB0ZiQgfSBmcm9tIFwiLi4vLi4vZXhlY2EvdGVycmFmb3JtLmpzXCI7XG5pbXBvcnQgeyBQYXlsb2FkIGFzIE1vbm9yZXBvUGF5bG9hZCB9IGZyb20gXCIuLi8uLi9wbG9wL2dlbmVyYXRvcnMvbW9ub3JlcG8vaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIGNvbGxlY3RNb25vcmVwb1BheWxvYWQsXG4gIGdldFBsb3BJbnN0YW5jZSxcbiAgcnVuTW9ub3JlcG9BY3Rpb25zLFxufSBmcm9tIFwiLi4vLi4vcGxvcC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNFcnJvciwgcmVwb3J0Q29tbWFuZEVycm9yIH0gZnJvbSBcIi4uL2NvbW1hbmQtZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb21tYW5kUHJlc2VudGVyIH0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcblxudHlwZSBHaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkUmVzdWx0ID0ge1xuICBnaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkOiB0cnVlO1xuICBwYXlsb2FkOiBNb25vcmVwb1BheWxvYWQ7XG59O1xuXG50eXBlIEluaXRSZXN1bHQgPSB7XG4gIHByPzogUHVsbFJlcXVlc3Q7XG4gIHJlcG9zaXRvcnk/OiBSZXBvc2l0b3J5O1xufTtcblxudHlwZSBTdW1tYXJ5SW5wdXQgPSBHaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkUmVzdWx0IHwgSW5pdFJlc3VsdDtcblxuY29uc3QgaXNHaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkID0gKFxuICBpbnB1dDogU3VtbWFyeUlucHV0LFxuKTogaW5wdXQgaXMgR2l0SHViUmVwb0NyZWF0aW9uU2tpcHBlZFJlc3VsdCA9PlxuICBcImdpdEh1YlJlcG9DcmVhdGlvblNraXBwZWRcIiBpbiBpbnB1dDtcblxudHlwZSBJbml0QWN0aW9uQ29udGV4dCA9IHtcbiAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZTtcbiAgaW5pdGlhbEFuc3dlcnM/OiBJbml0SW5pdGlhbEFuc3dlcnM7XG4gIHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcjtcbn07XG5cbnR5cGUgSW5pdEluaXRpYWxBbnN3ZXJzID0gUGFydGlhbDxNb25vcmVwb1BheWxvYWQ+ICYge1xuICBwdWJsaXNoVG9HaXRIdWI/OiBib29sZWFuO1xufTtcblxudHlwZSBMb2NhbFdvcmtzcGFjZSA9IHtcbiAgYnJhbmNoTmFtZTogc3RyaW5nO1xuICByZXBvc2l0b3J5OiBSZXBvc2l0b3J5O1xufTtcblxudHlwZSBSZXBvc2l0b3J5UHVsbFJlcXVlc3QgPSB7XG4gIHByPzogUHVsbFJlcXVlc3Q7XG4gIHJlcG9zaXRvcnk6IFJlcG9zaXRvcnk7XG59O1xuXG5jb25zdCB0cmFja1N0ZXAgPSA8VCwgRT4oXG4gIHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcixcbiAgbmFtZTogc3RyaW5nLFxuICB0YXNrOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXBFcnJvcjogKGNhdXNlOiB1bmtub3duKSA9PiBFLFxuKTogUmVzdWx0QXN5bmM8VCwgRT4gPT5cbiAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJlc2VudGVyLnRyYWNrU3RlcChuYW1lLCB0YXNrKSwgbWFwRXJyb3IpO1xuXG5jb25zdCBkaXNwbGF5U3VtbWFyeSA9IChpbnB1dDogU3VtbWFyeUlucHV0KSA9PiB7XG4gIGNvbnN0IGRvY3NVcmwgPSBcImh0dHBzOi8vZHgucGFnb3BhLml0L2dldHRpbmctc3RhcnRlZFwiO1xuXG4gIGlmIChpc0dpdEh1YlJlcG9DcmVhdGlvblNraXBwZWQoaW5wdXQpKSB7XG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBpbnB1dDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlxcbkdpdEh1YiByZXBvc2l0b3J5IGNyZWF0aW9uIHNraXBwZWQuXCIpKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBUaGUgd29ya3NwYWNlIGZpbGVzIGhhdmUgYmVlbiBzY2FmZm9sZGVkIGluICR7Y2hhbGsuY3lhbihwYXlsb2FkLnJlcG9OYW1lICsgXCIvXCIpfS5gLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlxcblRvIGZpbmlzaCB0aGUgc2V0dXAgbWFudWFsbHk6XCIpKTtcbiAgICBsZXQgc3RlcCA9IDE7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwKyt9LiBDcmVhdGUgdGhlIEdpdEh1YiByZXBvc2l0b3J5IGJ5IGFwcGx5aW5nIHRoZSBUZXJyYWZvcm0gY29uZmlnIHNjYWZmb2xkZWQgYXQgJHtjaGFsay5jeWFuKGAke3BheWxvYWQucmVwb05hbWV9L2luZnJhL3JlcG9zaXRvcnlgKX06YCxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCAgICAgICAke2NoYWxrLmN5YW4oYGNkICR7cGF5bG9hZC5yZXBvTmFtZX0vaW5mcmEvcmVwb3NpdG9yeSAmJiB0ZXJyYWZvcm0gaW5pdCAmJiB0ZXJyYWZvcm0gYXBwbHlgKX1gLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwKyt9LiBQdXNoIHRoZSBzY2FmZm9sZGVkIGNvZGUgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeTpgLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICAgICR7Y2hhbGsuY3lhbihgY2QgJHtwYXlsb2FkLnJlcG9OYW1lfSAmJiBnaXQgaW5pdCAmJiBnaXQgcmVtb3RlIGFkZCBvcmlnaW4gPHVybD4gJiYgZ2l0IHB1c2hgKX1gLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwfS4gVmlzaXQgJHtjaGFsay51bmRlcmxpbmUoZG9jc1VybCl9IHRvIGRlcGxveSB5b3VyIGZpcnN0IHByb2plY3RcXG5gLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBwciwgcmVwb3NpdG9yeSB9ID0gaW5wdXQ7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoXCJcXG5Xb3Jrc3BhY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpKTtcblxuICBpZiAocmVwb3NpdG9yeSkge1xuICAgIGNvbnNvbGUubG9nKGAtIE5hbWU6ICR7Y2hhbGsuY3lhbihyZXBvc2l0b3J5Lm5hbWUpfWApO1xuICAgIGNvbnNvbGUubG9nKGAtIEdpdEh1YiBSZXBvc2l0b3J5OiAke2NoYWxrLmN5YW4ocmVwb3NpdG9yeS51cmwpfVxcbmApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgXFxu4pqg77iPIEdpdEh1YiByZXBvc2l0b3J5IG1heSBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYXV0b21hdGljYWxseS5gLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKHByKSB7XG4gICAgbGV0IHN0ZXAgPSAxO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoXCJcXG5OZXh0IFN0ZXBzOlwiKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwKyt9LiBSZXZpZXcgdGhlIFB1bGwgUmVxdWVzdCBpbiB0aGUgR2l0SHViIHJlcG9zaXRvcnk6ICR7Y2hhbGsudW5kZXJsaW5lKHByLnVybCl9YCxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCR7c3RlcH0uIFZpc2l0ICR7Y2hhbGsudW5kZXJsaW5lKGRvY3NVcmwpfSB0byBkZXBsb3kgeW91ciBmaXJzdCBwcm9qZWN0XFxuYCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsueWVsbG93KGBcXG7imqDvuI8gVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBQdWxsIFJlcXVlc3QgY3JlYXRpb24uYCksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBQbGVhc2UsIG1hbnVhbGx5IGNyZWF0ZSBhIFB1bGwgUmVxdWVzdCBpbiB0aGUgR2l0SHViIHJlcG9zaXRvcnkgdG8gcmV2aWV3IHRoZSBzY2FmZm9sZGVkIGNvZGUuXFxuYCxcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBjaGVja1RlcnJhZm9ybUNsaSA9ICgpID0+IHRmJGB0ZXJyYWZvcm0gLXZlcnNpb25gO1xuXG5jb25zdCB0cmFja1RlcnJhZm9ybUNsaUlzSW5zdGFsbGVkID0gKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcikgPT5cbiAgdHJhY2tTdGVwKFxuICAgIHByZXNlbnRlcixcbiAgICBcIkNoZWNraW5nIFRlcnJhZm9ybSBpbnN0YWxsYXRpb24uLi5cIixcbiAgICBjaGVja1RlcnJhZm9ybUNsaSxcbiAgICBhc0Vycm9yKFxuICAgICAgXCJQbGVhc2UgaW5zdGFsbCB0ZXJyYWZvcm0gQ0xJIGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZC4gSWYgeW91IHVzZSB0ZmVudiwgcnVuOiB0ZmVudiBpbnN0YWxsIGxhdGVzdCAmJiB0ZmVudiB1c2UgbGF0ZXN0XCIsXG4gICAgKSxcbiAgKTtcblxuY29uc3QgY2hlY2tDb3JlcGFjayA9ICgpID0+IHRmJGBjb3JlcGFjayAtdmA7XG5cbmNvbnN0IHRyYWNrQ29yZXBhY2tJc0luc3RhbGxlZCA9IChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+XG4gIHRyYWNrU3RlcChcbiAgICBwcmVzZW50ZXIsXG4gICAgXCJDaGVja2luZyBDb3JlcGFjayBpbnN0YWxsYXRpb24uLi5cIixcbiAgICBjaGVja0NvcmVwYWNrLFxuICAgIGFzRXJyb3IoXCJQbGVhc2UgaW5zdGFsbCBDb3JlcGFjayBiZWZvcmUgcnVubmluZyB0aGlzIGNvbW1hbmQuXCIpLFxuICApO1xuXG5jb25zdCBhenVyZUFjY291bnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHVzZXI6IHoub2JqZWN0KHtcbiAgICBuYW1lOiB6LnN0cmluZygpLm1pbigxKSxcbiAgfSksXG59KTtcblxuY29uc3QgZW5zdXJlQXpMb2dpbiA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgdGYkYGF6IGFjY291bnQgc2hvd2A7XG4gIC8vIGBheiBhY2NvdW50IHNob3dgIHJlYWRzIHRoZSBjYWNoZWQgQ0xJIGNvbnRleHQsIGJ1dCBgYXogZ3JvdXAgbGlzdGBcbiAgLy8gZmFpbHMgd2hlbiB0aGUgY3VycmVudCBzZXNzaW9uIHRva2VuIGhhcyBleHBpcmVkLlxuICBhd2FpdCB0ZiRgYXogZ3JvdXAgbGlzdGA7XG4gIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KTtcbiAgY29uc3QgeyB1c2VyIH0gPSBhenVyZUFjY291bnRTY2hlbWEucGFyc2UocGFyc2VkKTtcbiAgcmV0dXJuIHVzZXIubmFtZTtcbn07XG5cbmNvbnN0IHRyYWNrQXpMb2dpbiA9IChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+XG4gIHRyYWNrU3RlcChcbiAgICBwcmVzZW50ZXIsXG4gICAgXCJDaGVja2luZyBBenVyZSBsb2dpbiBzdGF0dXMuLi5cIixcbiAgICBlbnN1cmVBekxvZ2luLFxuICAgIGFzRXJyb3IoXG4gICAgICBcIlBsZWFzZSBsb2cgaW4gdG8gQXp1cmUgQ0xJIHVzaW5nIGBheiBsb2dpbmAgYmVmb3JlIHJ1bm5pbmcgdGhpcyBjb21tYW5kLlwiLFxuICAgICksXG4gICk7XG5cbi8vIFRPRE8oQ0VTLTE4MTApOiBNYWtlIHRoZXNlIGNoZWNrcyBjb25jdXJyZW50IHRvIHNwZWVkIHVwIHRoZSBwcmVjb25kaXRpb25zIGNoZWNrIHBoYXNlXG5leHBvcnQgY29uc3QgcnVuSW5pdFByZWNvbmRpdGlvbnMgPSAocHJlc2VudGVyOiBDb21tYW5kUHJlc2VudGVyKSA9PlxuICB0cmFja1RlcnJhZm9ybUNsaUlzSW5zdGFsbGVkKHByZXNlbnRlcikuYW5kVGhlbigoKSA9PlxuICAgIHRyYWNrQ29yZXBhY2tJc0luc3RhbGxlZChwcmVzZW50ZXIpLFxuICApO1xuXG4vLyBUT0RPKENFUy0xODEwKTogTWFrZSB0aGVzZSBjaGVja3MgY29uY3VycmVudCB0byBzcGVlZCB1cCB0aGUgcHJlY29uZGl0aW9ucyBjaGVjayBwaGFzZVxuZXhwb3J0IGNvbnN0IHJ1bkFkZEVudmlyb25tZW50UHJlY29uZGl0aW9ucyA9IChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+XG4gIHRyYWNrVGVycmFmb3JtQ2xpSXNJbnN0YWxsZWQocHJlc2VudGVyKVxuICAgIC5hbmRUaGVuKCgpID0+IHRyYWNrQXpMb2dpbihwcmVzZW50ZXIpKVxuICAgIC5hbmRUaGVuKCgpID0+IHRyYWNrQ29yZXBhY2tJc0luc3RhbGxlZChwcmVzZW50ZXIpKTtcblxuY29uc3QgREVGQVVMVF9HSVRIVUJfUFVCTElTSF9DT05GSVJNQVRJT04gPSB0cnVlO1xuXG5leHBvcnQgY29uc3QgaW5pdENvbW1hbmRPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBuYW1lOiB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJSZXBvc2l0b3J5IG5hbWUgY2Fubm90IGJlIGVtcHR5XCIpLm9wdGlvbmFsKCksXG4gIG93bmVyOiB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJHaXRIdWIgb3duZXIgY2Fubm90IGJlIGVtcHR5XCIpLm9wdGlvbmFsKCksXG4gIHB1Ymxpc2g6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IHR5cGUgSW5pdENvbW1hbmRPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgaW5pdENvbW1hbmRPcHRpb25zU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IHBhcnNlSW5pdENvbW1hbmRPcHRpb25zID0gKGlucHV0OiB1bmtub3duKTogSW5pdENvbW1hbmRPcHRpb25zID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gaW5pdENvbW1hbmRPcHRpb25zU2NoZW1hLnNhZmVQYXJzZShpbnB1dCk7XG4gIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBpbml0IGNvbW1hbmQgb3B0aW9uczpcXG4ke3oucHJldHRpZnlFcnJvcihyZXN1bHQuZXJyb3IpfWAsXG4gICAgICB7XG4gICAgICAgIGNhdXNlOiByZXN1bHQuZXJyb3IsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TW9ub3JlcG9Jbml0aWFsQW5zd2VycyA9ICh7XG4gIGRlc2NyaXB0aW9uLFxuICBuYW1lLFxuICBvd25lcixcbiAgcHVibGlzaCxcbn06IEluaXRDb21tYW5kT3B0aW9ucyk6IEluaXRJbml0aWFsQW5zd2VycyA9PiB7XG4gIGNvbnN0IGluaXRpYWxBbnN3ZXJzOiBJbml0SW5pdGlhbEFuc3dlcnMgPSB7fTtcblxuICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICBpbml0aWFsQW5zd2Vycy5yZXBvRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGlmIChvd25lcikge1xuICAgIGluaXRpYWxBbnN3ZXJzLnJlcG9Pd25lciA9IG93bmVyO1xuICB9XG5cbiAgaWYgKG5hbWUpIHtcbiAgICBpbml0aWFsQW5zd2Vycy5yZXBvTmFtZSA9IG5hbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHB1Ymxpc2ggPT09IFwiYm9vbGVhblwiKSB7XG4gICAgaW5pdGlhbEFuc3dlcnMucHVibGlzaFRvR2l0SHViID0gcHVibGlzaDtcbiAgfVxuXG4gIHJldHVybiBpbml0aWFsQW5zd2Vycztcbn07XG5cbmNvbnN0IGNyZWF0ZVJlbW90ZVJlcG9zaXRvcnlXaXRoUHJlc2VudGVyID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcikgPT5cbiAgKHtcbiAgICByZXBvTmFtZSxcbiAgICByZXBvT3duZXIsXG4gIH06IE1vbm9yZXBvUGF5bG9hZCk6IFJlc3VsdEFzeW5jPFJlcG9zaXRvcnksIEVycm9yPiA9PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImR4LWNsaVwiLCBcImluaXRcIl0pO1xuICAgIGNvbnN0IHJlcG8kID0gdGYkKHsgY3dkOiBwYXRoLnJlc29sdmUoXCJpbmZyYVwiLCBcInJlcG9zaXRvcnlcIikgfSk7XG4gICAgY29uc3QgYXBwbHlUZXJyYWZvcm0gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZXBvJGB0ZXJyYWZvcm0gaW5pdGA7XG4gICAgICAgIGF3YWl0IHJlcG8kYHRlcnJhZm9ybSBhcHBseSAtYXV0by1hcHByb3ZlYDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEV4ZWNhRXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3Iuc2hvcnRNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0cmFja1N0ZXAoXG4gICAgICBwcmVzZW50ZXIsXG4gICAgICBcIkNyZWF0aW5nIEdpdEh1YiByZXBvc2l0b3J5Li4uXCIsXG4gICAgICBhcHBseVRlcnJhZm9ybSxcbiAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIEdpdEh1YiByZXBvc2l0b3J5LlwiKSxcbiAgICApLm1hcCgoKSA9PiBuZXcgUmVwb3NpdG9yeShyZXBvTmFtZSwgcmVwb093bmVyKSk7XG4gIH07XG4vKipcbiAqIEV4aXQgY29kZSByZXR1cm5lZCBieSBgZ2l0IHJlbW90ZSBhZGRgIHdoZW4gYSByZW1vdGUgd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWVcbiAqIGFscmVhZHkgZXhpc3RzLiBgZ2l0IHJlbW90ZWAgZG9jdW1lbnRzIHRoaXMgZGVkaWNhdGVkIHN0YXR1cyBjb2RlLCBzbyB3ZSBjYW5cbiAqIHR1cm4gaXQgaW50byBhY3Rpb25hYmxlIGd1aWRhbmNlIGluc3RlYWQgb2YgYSBnZW5lcmljIGZhaWx1cmUgbWVzc2FnZS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1yZW1vdGUjX2V4aXRfc3RhdHVzXG4gKi9cbmNvbnN0IEdJVF9SRU1PVEVfQUxSRUFEWV9FWElTVFNfRVhJVF9DT0RFID0gMztcblxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgZmFpbHVyZSBvZiB0aGUgZ2l0IHJlbW90ZSBzZXR1cCBzdGVwIGludG8gYW4gYWN0aW9uYWJsZSBlcnJvci5cbiAqXG4gKiBXaGVuIGBnaXQgcmVtb3RlIGFkZCBvcmlnaW5gIGV4aXRzIHdpdGggY29kZSAzIHRoZSByZW1vdGUgYWxyZWFkeSBleGlzdHMsXG4gKiB3aGljaCBpcyBhIHJlY292ZXJhYmxlIHNpdHVhdGlvbjogdGhlIG1lc3NhZ2UgdGVsbHMgdGhlIHVzZXIgaG93IHRvIGZpeCBpdC5cbiAqIFRoZSBvcmlnaW5hbCBFeGVjYUVycm9yIGlzIHByZXNlcnZlZCBhcyBgY2F1c2VgIHNvIGAtLXZlcmJvc2VgIHN0aWxsIHN1cmZhY2VzXG4gKiB0aGUgZXhpdCBjb2RlIGFuZCBnaXQncyBvd24gc3RkZXJyLlxuICovXG5leHBvcnQgY29uc3QgbWFwR2l0UmVtb3RlQWRkRXJyb3IgPSAoY2F1c2U6IHVua25vd24pOiBFcnJvciA9PiB7XG4gIGlmIChcbiAgICBjYXVzZSBpbnN0YW5jZW9mIEV4ZWNhRXJyb3IgJiZcbiAgICBjYXVzZS5leGl0Q29kZSA9PT0gR0lUX1JFTU9URV9BTFJFQURZX0VYSVNUU19FWElUX0NPREVcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgIFwiQSBnaXQgcmVtb3RlIG5hbWVkICdvcmlnaW4nIGFscmVhZHkgZXhpc3RzLiBSZW1vdmUgaXQgd2l0aCBgZ2l0IHJlbW90ZSByZW1vdmUgb3JpZ2luYCBhbmQgcnVuIHRoZSBjb21tYW5kIGFnYWluLCBvciBzdGFydCBmcm9tIGEgY2xlYW4gZGlyZWN0b3J5LlwiLFxuICAgICAgeyBjYXVzZSB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBcIkZhaWxlZCB0byBzZXQgdXAgdGhlIGxvY2FsIGdpdCByZXBvc2l0b3J5IGFuZCBpdHMgJ29yaWdpbicgcmVtb3RlLlwiLFxuICAgIHsgY2F1c2UgfSxcbiAgKTtcbn07XG5cbmNvbnN0IGluaXRpYWxpemVHaXRSZXBvc2l0b3J5V2l0aFByZXNlbnRlciA9XG4gIChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+IChyZXBvc2l0b3J5OiBSZXBvc2l0b3J5KSA9PiB7XG4gICAgY29uc3QgYnJhbmNoTmFtZSA9IFwiZmVhdHVyZXMvc2NhZmZvbGQtd29ya3NwYWNlXCI7XG4gICAgY29uc3QgZ2l0JCA9ICQoe1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgfSk7XG4gICAgLy8gYGdpdCByZW1vdGUgYWRkYCBpcyB0cmFja2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgcHVzaCBzbyBpdHMgZG9jdW1lbnRlZFxuICAgIC8vIGV4aXQgY29kZXMgKGUuZy4gMyA9IHJlbW90ZSBhbHJlYWR5IGV4aXN0cykgc3VyZmFjZSBhIHNwZWNpZmljLCBhY3Rpb25hYmxlXG4gICAgLy8gbWVzc2FnZSBpbnN0ZWFkIG9mIGJlaW5nIG1pc3JlcG9ydGVkIGFzIGEgcHVzaCBmYWlsdXJlLlxuICAgIGNvbnN0IGNvbmZpZ3VyZVJlbW90ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGdpdCRgZ2l0IGluaXRgO1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgcmVtb3RlIGFkZCBvcmlnaW4gJHtyZXBvc2l0b3J5Lm9yaWdpbn1gO1xuICAgIH07XG4gICAgY29uc3QgcHVzaFRvT3JpZ2luID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgZmV0Y2ggb3JpZ2luIG1haW5gO1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgY2hlY2tvdXQgLWIgJHticmFuY2hOYW1lfWA7XG4gICAgICAvLyBUZXJyYWZvcm0gY3JlYXRlcyBgbWFpbmAgd2l0aCBhbiBpbml0aWFsIFJFQURNRSBjb21taXQuXG4gICAgICAvLyBSZXNldCB0byBgb3JpZ2luL21haW5gIHNvIHRoaXMgYnJhbmNoIGlzIGJhc2VkIG9uIHRoZSByZW1vdGUgZGVmYXVsdCBicmFuY2gsXG4gICAgICAvLyB3aGlsZSBrZWVwaW5nIHRoZSBzY2FmZm9sZGVkIGxvY2FsIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUgZm9yIGEgY2xlYW4gUFIgZGlmZi5cbiAgICAgIGF3YWl0IGdpdCRgZ2l0IHJlc2V0IG9yaWdpbi9tYWluYDtcbiAgICAgIGF3YWl0IGdpdCRgZ2l0IGFkZCAuYDtcbiAgICAgIGF3YWl0IGdpdCRgZ2l0IGNvbW1pdCAtLW5vLWdwZy1zaWduIC1tIFwiU2NhZmZvbGQgd29ya3NwYWNlXCJgO1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgcHVzaCAtdSBvcmlnaW4gJHticmFuY2hOYW1lfWA7XG4gICAgfTtcbiAgICByZXR1cm4gdHJhY2tTdGVwKFxuICAgICAgcHJlc2VudGVyLFxuICAgICAgXCJDb25maWd1cmluZyB0aGUgZ2l0IHJlbW90ZS4uLlwiLFxuICAgICAgY29uZmlndXJlUmVtb3RlLFxuICAgICAgbWFwR2l0UmVtb3RlQWRkRXJyb3IsXG4gICAgKVxuICAgICAgLmFuZFRoZW4oKCkgPT5cbiAgICAgICAgdHJhY2tTdGVwKFxuICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICBcIlB1c2hpbmcgY29kZSB0byBHaXRIdWIuLi5cIixcbiAgICAgICAgICBwdXNoVG9PcmlnaW4sXG4gICAgICAgICAgYXNFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvZGUgdG8gR2l0SHViLlwiKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKCkgPT4gKHsgYnJhbmNoTmFtZSwgcmVwb3NpdG9yeSB9KSk7XG4gIH07XG5cbmNvbnN0IGNyZWF0ZVB1bGxSZXF1ZXN0V2l0aFByZXNlbnRlciA9XG4gICh7IGdpdEh1YlNlcnZpY2UsIHByZXNlbnRlciB9OiBJbml0QWN0aW9uQ29udGV4dCkgPT5cbiAgKHtcbiAgICBicmFuY2hOYW1lLFxuICAgIHJlcG9zaXRvcnksXG4gIH06IExvY2FsV29ya3NwYWNlKTogUmVzdWx0QXN5bmM8UHVsbFJlcXVlc3QgfCB1bmRlZmluZWQsIEVycm9yPiA9PlxuICAgIHRyYWNrU3RlcChcbiAgICAgIHByZXNlbnRlcixcbiAgICAgIFwiQ3JlYXRpbmcgUHVsbCBSZXF1ZXN0Li4uXCIsXG4gICAgICAoKSA9PlxuICAgICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZVB1bGxSZXF1ZXN0KHtcbiAgICAgICAgICBiYXNlOiBcIm1haW5cIixcbiAgICAgICAgICBib2R5OiBcIlRoaXMgUFIgY29udGFpbnMgdGhlIHNjYWZmb2xkZWQgbW9ub3JlcG8gc3RydWN0dXJlLlwiLFxuICAgICAgICAgIGhlYWQ6IGJyYW5jaE5hbWUsXG4gICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnkub3duZXIsXG4gICAgICAgICAgcmVwbzogcmVwb3NpdG9yeS5uYW1lLFxuICAgICAgICAgIHRpdGxlOiBcIlNjYWZmb2xkIHJlcG9zaXRvcnlcIixcbiAgICAgICAgfSksXG4gICAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBQdWxsIFJlcXVlc3QuXCIpLFxuICAgIClcbiAgICAgIC8vIElmIFBSIGNyZWF0aW9uIGZhaWxzLCBkb24ndCBibG9jayB0aGUgd29ya2Zsb3dcbiAgICAgIC5vckVsc2UoKCkgPT4gb2tBc3luYyh1bmRlZmluZWQpKTtcblxuY29uc3QgaGFuZGxlTmV3R2l0SHViUmVwb3NpdG9yeVdpdGhQcmVzZW50ZXIgPVxuICAoY29udGV4dDogSW5pdEFjdGlvbkNvbnRleHQpID0+XG4gIChwYXlsb2FkOiBNb25vcmVwb1BheWxvYWQpOiBSZXN1bHRBc3luYzxSZXBvc2l0b3J5UHVsbFJlcXVlc3QsIEVycm9yPiA9PlxuICAgIGNyZWF0ZVJlbW90ZVJlcG9zaXRvcnlXaXRoUHJlc2VudGVyKGNvbnRleHQucHJlc2VudGVyKShwYXlsb2FkKVxuICAgICAgLmFuZFRoZW4oaW5pdGlhbGl6ZUdpdFJlcG9zaXRvcnlXaXRoUHJlc2VudGVyKGNvbnRleHQucHJlc2VudGVyKSlcbiAgICAgIC5hbmRUaGVuKChsb2NhbFdvcmtzcGFjZSkgPT5cbiAgICAgICAgY3JlYXRlUHVsbFJlcXVlc3RXaXRoUHJlc2VudGVyKGNvbnRleHQpKGxvY2FsV29ya3NwYWNlKS5tYXAoKHByKSA9PiAoe1xuICAgICAgICAgIHByLFxuICAgICAgICAgIHJlcG9zaXRvcnk6IGxvY2FsV29ya3NwYWNlLnJlcG9zaXRvcnksXG4gICAgICAgIH0pKSxcbiAgICAgICk7XG5cbmNvbnN0IGhhbmRsZUdlbmVyYXRvckVycm9yID0gKGVycjogdW5rbm93bikgPT4ge1xuICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZHgtY2xpXCIsIFwiaW5pdFwiXSk7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihcIkZhaWxlZCB0byBydW4gdGhlIGdlbmVyYXRvclwiLCB7IGNhdXNlOiBlcnIgfSk7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdoZXRoZXIgdGhlIHNjYWZmb2xkZWQgcmVwb3NpdG9yeSBzaG91bGQgYmUgcHVibGlzaGVkIHRvIEdpdEh1Yi5cbiAqXG4gKiBXaGVuIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB0aGUgYW5zd2VyIChlLmcuIHRoZSB1c2VyIHBhc3NlZCBgLS1wdWJsaXNoYFxuICogb24gdGhlIGNvbW1hbmQgbGluZSksIHRoYXQgdmFsdWUgaXMgdXNlZCBhcy1pcyBhbmQgbm8gcHJvbXB0IGlzIHNob3duLiBXaGVuXG4gKiB0aGUgcHJlZmVyZW5jZSBpcyBsZWZ0IHVuZGVmaW5lZCAoZmxhZyBvbWl0dGVkKSwgdGhlIHVzZXIgaXMgYXNrZWRcbiAqIGludGVyYWN0aXZlbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBjb25maXJtR2l0SHViUmVwb0NyZWF0aW9uID0gKFxuICBwYXlsb2FkOiBNb25vcmVwb1BheWxvYWQsXG4gIHB1Ymxpc2hQcmVmZXJlbmNlPzogYm9vbGVhbixcbik6IFJlc3VsdEFzeW5jPGJvb2xlYW4sIEVycm9yPiA9PlxuICAvLyBBIHByZWZlcmVuY2UgcHJvdmlkZWQgdXAtZnJvbnQgKHZpYSBgLS1wdWJsaXNoYCkgc2tpcHMgdGhlIGludGVyYWN0aXZlIHByb21wdC5cbiAgcHVibGlzaFByZWZlcmVuY2UgIT09IHVuZGVmaW5lZFxuICAgID8gb2tBc3luYyhwdWJsaXNoUHJlZmVyZW5jZSlcbiAgICA6IFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICBpbnF1aXJlci5wcm9tcHQoe1xuICAgICAgICAgIGRlZmF1bHQ6IERFRkFVTFRfR0lUSFVCX1BVQkxJU0hfQ09ORklSTUFUSU9OLFxuICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgcHJvamVjdCBpcyBjcmVhdGVkIG9uICR7Y2hhbGsuZ3JlZW4ocGF5bG9hZC5yZXBvTmFtZSl9LiBXb3VsZCB5b3UgbGlrZSB0byBwdWJsaXNoIGl0IHRvIEdpdEh1YiBhdCAke2NoYWxrLmdyZWVuKGAke3BheWxvYWQucmVwb093bmVyfS8ke3BheWxvYWQucmVwb05hbWV9YCl9IG5vdz9gLFxuICAgICAgICAgIG5hbWU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgKGNhdXNlKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcIkZhaWxlZCB0byByZWFkIEdpdEh1YiBwdWJsaXNoIGNvbmZpcm1hdGlvblwiLCB7IGNhdXNlIH0pLFxuICAgICAgKS5hbmRUaGVuKChhbnN3ZXIpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkQW5zd2VyID0gelxuICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgY29uZmlybTogei5ib29sZWFuKCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2FmZVBhcnNlKGFuc3dlcik7XG4gICAgICAgIGlmICghcGFyc2VkQW5zd2VyLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXCJJbnZhbGlkIEdpdEh1YiBwdWJsaXNoIGNvbmZpcm1hdGlvblwiLCB7XG4gICAgICAgICAgICAgIGNhdXNlOiBwYXJzZWRBbnN3ZXIuZXJyb3IsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9rQXN5bmMocGFyc2VkQW5zd2VyLmRhdGEuY29uZmlybSk7XG4gICAgICB9KTtcblxuY29uc3QgcnVuSW5pdEFjdGlvbiA9ICh7XG4gIGdpdEh1YlNlcnZpY2UsXG4gIGluaXRpYWxBbnN3ZXJzID0ge30sXG4gIHByZXNlbnRlcixcbn06IEluaXRBY3Rpb25Db250ZXh0KTogUmVzdWx0QXN5bmM8U3VtbWFyeUlucHV0LCBFcnJvcj4gPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hUb0dpdEh1YiwgLi4ubW9ub3JlcG9Jbml0aWFsQW5zd2VycyB9ID0gaW5pdGlhbEFuc3dlcnM7XG5cbiAgcmV0dXJuIHRyYWNrU3RlcChcbiAgICBwcmVzZW50ZXIsXG4gICAgXCJJbml0aWFsaXppbmcgd29ya3NwYWNlIGdlbmVyYXRvci4uLlwiLFxuICAgIGdldFBsb3BJbnN0YW5jZSxcbiAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgcGxvcFwiKSxcbiAgKVxuICAgIC5hbmRUaGVuKChwbG9wKSA9PlxuICAgICAgLy8gVGhlIHByb21wdCBwaGFzZSBtdXN0IHJ1biBvdXRzaWRlIHRyYWNrU3RlcDogaW4gdGV4dCBtb2RlIHRyYWNrU3RlcFxuICAgICAgLy8gcmVuZGVycyBhIHNwaW5uZXIgdGhhdCBvY2N1cGllcyB0aGUgVFRZIGFuZCBoaWRlcyB0aGUgcHJvbXB0cy5cbiAgICAgIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICBjb2xsZWN0TW9ub3JlcG9QYXlsb2FkKHBsb3AsIGdpdEh1YlNlcnZpY2UsIG1vbm9yZXBvSW5pdGlhbEFuc3dlcnMpLFxuICAgICAgICBoYW5kbGVHZW5lcmF0b3JFcnJvcixcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUaGVuKCh7IGdlbmVyYXRvciwgcGF5bG9hZCB9KSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiU2NhZmZvbGRpbmcgd29ya3NwYWNlLi4uXCIsXG4gICAgICAgICgpID0+IHJ1bk1vbm9yZXBvQWN0aW9ucyhnZW5lcmF0b3IsIHBheWxvYWQpLFxuICAgICAgICBoYW5kbGVHZW5lcmF0b3JFcnJvcixcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUZWUoKHBheWxvYWQpID0+IHtcbiAgICAgIHByb2Nlc3MuY2hkaXIocGF5bG9hZC5yZXBvTmFtZSk7XG4gICAgfSlcbiAgICAuYW5kVGhlbigocGF5bG9hZCkgPT5cbiAgICAgIGNvbmZpcm1HaXRIdWJSZXBvQ3JlYXRpb24ocGF5bG9hZCwgcHVibGlzaFRvR2l0SHViKS5hbmRUaGVuPFxuICAgICAgICBTdW1tYXJ5SW5wdXQsXG4gICAgICAgIEVycm9yXG4gICAgICA+KChjb25maXJtZWQpID0+XG4gICAgICAgIGNvbmZpcm1lZFxuICAgICAgICAgID8gaGFuZGxlTmV3R2l0SHViUmVwb3NpdG9yeVdpdGhQcmVzZW50ZXIoe1xuICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgICAgICB9KShwYXlsb2FkKVxuICAgICAgICAgIDogb2tBc3luYyh7IGdpdEh1YlJlcG9DcmVhdGlvblNraXBwZWQ6IHRydWUsIHBheWxvYWQgfSksXG4gICAgICApLFxuICAgICk7XG59O1xuXG5jb25zdCByZXBvcnRTdW1tYXJ5ID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlciwgb3V0cHV0TW9kZTogXCJqc29uXCIgfCBcInRleHRcIikgPT5cbiAgKHJlc3VsdDogU3VtbWFyeUlucHV0KSA9PiB7XG4gICAgaWYgKG91dHB1dE1vZGUgPT09IFwianNvblwiKSB7XG4gICAgICBwcmVzZW50ZXIucmVwb3J0UmVzdWx0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BsYXlTdW1tYXJ5KHJlc3VsdCk7XG4gICAgfVxuICB9O1xuXG5leHBvcnQgY29uc3QgbWFrZUluaXRDb21tYW5kID0gKFxuICByZXF1aXJlR2l0SHViQXV0aDogR2l0SHViQXV0aEZhY3RvcnksXG4pOiBDb21tYW5kID0+XG4gIG5ldyBDb21tYW5kKClcbiAgICAubmFtZShcImluaXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJJbml0aWFsaXplIGEgbmV3IERYIHdvcmtzcGFjZVwiKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbihcIi0tbmFtZSA8bmFtZT5cIiwgXCJSZXBvc2l0b3J5IG5hbWVcIikpXG4gICAgLmFkZE9wdGlvbihcbiAgICAgIG5ldyBPcHRpb24oXG4gICAgICAgIFwiLS1vd25lciA8b3duZXI+XCIsXG4gICAgICAgIFwiR2l0SHViIG9yZ2FuaXphdGlvbiBvciB1c2VyIHRoYXQgd2lsbCBvd24gdGhlIHJlcG9zaXRvcnlcIixcbiAgICAgICksXG4gICAgKVxuICAgIC5hZGRPcHRpb24oXG4gICAgICBuZXcgT3B0aW9uKFwiLS1kZXNjcmlwdGlvbiA8ZGVzY3JpcHRpb24+XCIsIFwiUmVwb3NpdG9yeSBkZXNjcmlwdGlvblwiKSxcbiAgICApXG4gICAgLmFkZE9wdGlvbihcbiAgICAgIG5ldyBPcHRpb24oXG4gICAgICAgIFwiLS1wdWJsaXNoXCIsXG4gICAgICAgIFwiUHVibGlzaCB0aGUgc2NhZmZvbGRlZCByZXBvc2l0b3J5IHRvIEdpdEh1YiB3aXRob3V0IHByb21wdGluZ1wiLFxuICAgICAgKS5kZWZhdWx0KHVuZGVmaW5lZCksXG4gICAgKVxuICAgIC5hY3Rpb24oYXN5bmMgZnVuY3Rpb24gKG9wdGlvbnM6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSB0aGlzLm9wdHNXaXRoR2xvYmFsczxHbG9iYWxPcHRpb25zPigpO1xuICAgICAgY29uc3QgcHJlc2VudGVyID0gY3JlYXRlQ29tbWFuZFByZXNlbnRlcihvdXRwdXQpO1xuXG4gICAgICBhd2FpdCBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBwYXJzZUluaXRDb21tYW5kT3B0aW9ucyhvcHRpb25zKSksXG4gICAgICAgIChjYXVzZSkgPT5cbiAgICAgICAgICBjYXVzZSBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGNhdXNlXG4gICAgICAgICAgICA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpbml0IGNvbW1hbmQgb3B0aW9uc1wiLCB7IGNhdXNlIH0pLFxuICAgICAgKVxuICAgICAgICAuYW5kVGhlbigoaW5pdE9wdGlvbnMpID0+XG4gICAgICAgICAgcnVuSW5pdFByZWNvbmRpdGlvbnMocHJlc2VudGVyKVxuICAgICAgICAgICAgLmFuZFRoZW4oKCkgPT4gcmVxdWlyZUdpdEh1YkF1dGgoKSlcbiAgICAgICAgICAgIC5hbmRUaGVuKChhdXRoKSA9PlxuICAgICAgICAgICAgICBydW5Jbml0QWN0aW9uKHtcbiAgICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlOiBhdXRoLmdpdEh1YlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgaW5pdGlhbEFuc3dlcnM6IGdldE1vbm9yZXBvSW5pdGlhbEFuc3dlcnMoaW5pdE9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5tYXRjaChcbiAgICAgICAgICByZXBvcnRTdW1tYXJ5KHByZXNlbnRlciwgb3V0cHV0KSxcbiAgICAgICAgICByZXBvcnRDb21tYW5kRXJyb3IodGhpcywgcHJlc2VudGVyLCBvdXRwdXQpLFxuICAgICAgICApO1xuICAgIH0pO1xuIl19
@@ -2,7 +2,7 @@ import { azure, loadConfig } from "@pagopa/dx-savemoney";
2
2
  import { Command, InvalidArgumentError } from "commander";
3
3
  import { oraPromise } from "ora";
4
4
  import { z } from "zod";
5
- import { exitWithError } from "../index.js";
5
+ import { exitWithError } from "../command-errors.js";
6
6
  export const makeSavemoneyCommand = () => new Command("savemoney")
7
7
  .description("Analyze Azure subscriptions and report unused or inefficient resources")
8
8
  .option("-c, --config <path>", "Path to YAML configuration file")
@@ -76,3 +76,4 @@ export function parseTagsOption(tagsOption) {
76
76
  }
77
77
  return result;
78
78
  }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZW1vbmV5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9zYXZlbW9uZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDakMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHckQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxFQUFFLENBQ3ZDLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQztLQUNyQixXQUFXLENBQ1Ysd0VBQXdFLENBQ3pFO0tBQ0EsTUFBTSxDQUFDLHFCQUFxQixFQUFFLGlDQUFpQyxDQUFDO0tBQ2hFLE1BQU0sQ0FDTCx1QkFBdUIsRUFDdkIscUVBQXFFLEVBQ3JFLE9BQU8sQ0FDUjtLQUNBLE1BQU0sQ0FDTCx5QkFBeUIsRUFDekIsZ0VBQWdFLEVBQ2hFLFlBQVksQ0FDYjtLQUNBLE1BQU0sQ0FDTCxxQkFBcUIsRUFDckIsNkRBQTZELEVBQzdELElBQUksQ0FDTDtLQUNBLE1BQU0sQ0FDTCxzQkFBc0IsRUFDdEIsOEdBQThHLENBQy9HO0tBQ0EsTUFBTSxDQUNMLHVCQUF1QixFQUN2QixvRkFBb0YsRUFDcEYsaUJBQWlCLEVBQ2pCLEtBQUssQ0FDTjtLQUNBLE1BQU0sQ0FBQyxLQUFLLFdBQVcsT0FBTztJQUM3QixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBaUIsQ0FBQztJQUMxRCxJQUFJLENBQUM7UUFDSCw4RkFBOEY7UUFDOUYsTUFB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S0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEF6dXJlQ29uZmlnLCBBenVyZVNvdXJjZSB9IGZyb20gXCJAcGFnb3BhL2R4LXNhdmVtb25leVwiO1xuXG5pbXBvcnQgeyBhenVyZSwgbG9hZENvbmZpZyB9IGZyb20gXCJAcGFnb3BhL2R4LXNhdmVtb25leVwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyBvcmFQcm9taXNlIH0gZnJvbSBcIm9yYVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgZXhpdFdpdGhFcnJvciB9IGZyb20gXCIuLi9jb21tYW5kLWVycm9ycy5qc1wiO1xuaW1wb3J0IHsgR2xvYmFsT3B0aW9ucyB9IGZyb20gXCIuLi9nbG9iYWwtb3B0aW9ucy5qc1wiO1xuXG5leHBvcnQgY29uc3QgbWFrZVNhdmVtb25leUNvbW1hbmQgPSAoKSA9PlxuICBuZXcgQ29tbWFuZChcInNhdmVtb25leVwiKVxuICAgIC5kZXNjcmlwdGlvbihcbiAgICAgIFwiQW5hbHl6ZSBBenVyZSBzdWJzY3JpcHRpb25zIGFuZCByZXBvcnQgdW51c2VkIG9yIGluZWZmaWNpZW50IHJlc291cmNlc1wiLFxuICAgIClcbiAgICAub3B0aW9uKFwiLWMsIC0tY29uZmlnIDxwYXRoPlwiLCBcIlBhdGggdG8gWUFNTCBjb25maWd1cmF0aW9uIGZpbGVcIilcbiAgICAub3B0aW9uKFxuICAgICAgXCItZiwgLS1mb3JtYXQgPGZvcm1hdD5cIixcbiAgICAgIFwiUmVwb3J0IGZvcm1hdDoganNvbiwgdGFibGUsIGRldGFpbGVkLWpzb24sIG9yIGxpbnQgKGRlZmF1bHQ6IHRhYmxlKVwiLFxuICAgICAgXCJ0YWJsZVwiLFxuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgXCItbCwgLS1sb2NhdGlvbiA8c3RyaW5nPlwiLFxuICAgICAgXCJQcmVmZXJyZWQgQXp1cmUgbG9jYXRpb24gZm9yIHJlc291cmNlcyAob3ZlcnJpZGVzIGNvbmZpZyBmaWxlKVwiLFxuICAgICAgXCJpdGFseW5vcnRoXCIsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi1kLCAtLWRheXMgPG51bWJlcj5cIixcbiAgICAgIFwiTnVtYmVyIG9mIGRheXMgZm9yIG1ldHJpY3MgYW5hbHlzaXMgKG92ZXJyaWRlcyBjb25maWcgZmlsZSlcIixcbiAgICAgIFwiMzBcIixcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgIFwiLXQsIC0tdGFncyA8dGFncy4uLj5cIixcbiAgICAgIFwiRmlsdGVyIGZpbmRpbmdzIGJ5IHJlc291cmNlIHRhZ3MgKGtleT12YWx1ZSBrZXkyPXZhbHVlMikuIEFkdmlzb3Igc3Vic2NyaXB0aW9uLWxldmVsIGZpbmRpbmdzIHJlbWFpbiBnbG9iYWwuXCIsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICBcIi1zLCAtLXNvdXJjZSA8c291cmNlPlwiLFxuICAgICAgXCJSZXN0cmljdCBmaW5kaW5ncyB0byBhIHNpbmdsZSBzb3VyY2U6ICdhZHZpc29yJywgJ2N1c3RvbScsIG9yICdhbGwnIChkZWZhdWx0OiBhbGwpXCIsXG4gICAgICBwYXJzZVNvdXJjZU9wdGlvbixcbiAgICAgIFwiYWxsXCIsXG4gICAgKVxuICAgIC5hY3Rpb24oYXN5bmMgZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHsgdmVyYm9zZSB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIFlBTUwgKGluY2x1ZGVzIHN1YnNjcmlwdGlvbklkcywgbG9jYXRpb24sIHRpbWVzcGFuRGF5cywgdGhyZXNob2xkcylcbiAgICAgICAgY29uc3QgY29uZmlnOiBBenVyZUNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcob3B0aW9ucy5jb25maWcpO1xuXG4gICAgICAgIC8vIFBhcnNlIHRhZyBmaWx0ZXJcbiAgICAgICAgY29uc3QgZmlsdGVyVGFncyA9IHBhcnNlVGFnc09wdGlvbihvcHRpb25zLnRhZ3MpO1xuXG4gICAgICAgIGNvbnN0IGZpbmFsQ29uZmlnOiBBenVyZUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgZmlsdGVyVGFncyxcbiAgICAgICAgICBwcmVmZXJyZWRMb2NhdGlvbjogb3B0aW9ucy5sb2NhdGlvbiB8fCBjb25maWcucHJlZmVycmVkTG9jYXRpb24sXG4gICAgICAgICAgc291cmNlczpcbiAgICAgICAgICAgIG9wdGlvbnMuc291cmNlID09PSBcImFsbFwiXG4gICAgICAgICAgICAgID8gKGNvbmZpZy5zb3VyY2VzID8/IFtcImFkdmlzb3JcIiwgXCJjdXN0b21cIl0pXG4gICAgICAgICAgICAgIDogW29wdGlvbnMuc291cmNlIGFzIEF6dXJlU291cmNlXSxcbiAgICAgICAgICB0aW1lc3BhbkRheXM6XG4gICAgICAgICAgICBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5kYXlzLCAxMCkgfHwgY29uZmlnLnRpbWVzcGFuRGF5cyxcbiAgICAgICAgICB2ZXJib3NlOiB2ZXJib3NlID8/IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJ1biBhbmFseXNpcyBzaG93aW5nIGEgcHJvZ3Jlc3Mgc3Bpbm5lciBvbiBzdGRlcnIgc28gdGhlIENMSSBkb2Vzbid0XG4gICAgICAgIC8vIGxvb2sgZnJvemVuIGR1cmluZyB0aGUgKHBvdGVudGlhbGx5IHNldmVyYWwtbWludXRlKSBBenVyZSByb3VuZC10cmlwcy5cbiAgICAgICAgY29uc3QgcmVwb3J0cyA9IGF3YWl0IG9yYVByb21pc2UoXG4gICAgICAgICAgYXp1cmUuYW5hbHl6ZUF6dXJlUmVzb3VyY2VzKGZpbmFsQ29uZmlnKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmYWlsVGV4dDogXCJBbmFseXNpcyBmYWlsZWRcIixcbiAgICAgICAgICAgIHN0cmVhbTogcHJvY2Vzcy5zdGRlcnIsXG4gICAgICAgICAgICBzdWNjZXNzVGV4dDogXCJBbmFseXNpcyBjb21wbGV0ZVwiLFxuICAgICAgICAgICAgdGV4dDogXCJBbmFseXppbmcgQXp1cmUgcmVzb3VyY2VzXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgYXp1cmUuZ2VuZXJhdGVSZXBvcnQocmVwb3J0cywgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXhpdFdpdGhFcnJvcih0aGlzKShcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IG5ldyBFcnJvcihgQW5hbHlzaXMgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgICAgICAgICAgIDogbmV3IEVycm9yKGBBbmFseXNpcyBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuY29uc3QgU291cmNlU2NoZW1hID0gei5lbnVtKFtcImFkdmlzb3JcIiwgXCJhbGxcIiwgXCJjdXN0b21cIl0pO1xuXG4vKipcbiAqIFBhcnNlcyB0aGUgYC0tc291cmNlYCBvcHRpb24gdmlhIGEgem9kIGVudW0sIGFjY2VwdGluZyBgYWxsYCwgYGFkdmlzb3JgLFxuICogb3IgYGN1c3RvbWAgYW5kIHJlamVjdGluZyBhbnkgb3RoZXIgdmFsdWUgd2l0aCBhIENvbW1hbmRlci1mcmllbmRseSBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU291cmNlT3B0aW9uKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHQgPSBTb3VyY2VTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBBbGxvd2VkIHZhbHVlcyBhcmU6ICR7U291cmNlU2NoZW1hLm9wdGlvbnMuam9pbihcIiwgXCIpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIGFuIGFycmF5IG9mIFwia2V5PXZhbHVlXCIgc3RyaW5ncyAoZnJvbSBjb21tYW5kZXIgdmFyaWFkaWMgb3B0aW9uKSBpbnRvIGEgTWFwPHN0cmluZywgc3RyaW5nPi5cbiAqIFJldHVybnMgYW4gZW1wdHkgTWFwIHdoZW4gdGhlIG9wdGlvbiBpcyBub3QgcHJvdmlkZWQgb3IgZW1wdHkuXG4gKiBTdXBwb3J0cyB2YWx1ZXMgdGhhdCBjb250YWluIFwiPVwiIChvbmx5IHRoZSBmaXJzdCBcIj1cIiBpcyB0cmVhdGVkIGFzIHNlcGFyYXRvcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhZ3NPcHRpb24oXG4gIHRhZ3NPcHRpb246IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGlmICghdGFnc09wdGlvbiB8fCB0YWdzT3B0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCBwYWlyIG9mIHRhZ3NPcHRpb24pIHtcbiAgICBjb25zdCBbcmF3S2V5LCAuLi5yZXN0XSA9IHBhaXIuc3BsaXQoXCI9XCIpO1xuICAgIGNvbnN0IGtleSA9IHJhd0tleT8udHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gcmVzdC5qb2luKFwiPVwiKS50cmltKCk7XG4gICAgaWYgKGtleSAmJiByZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
@@ -11,3 +11,4 @@ export const makeSpecCommand = (getSpec) => new Command("spec")
11
11
  .action(() => {
12
12
  process.stdout.write(JSON.stringify(getSpec(), null, 2) + "\n");
13
13
  });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZGFwdGVycy9jb21tYW5kZXIvY29tbWFuZHMvc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSXBDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQXNCLEVBQVcsRUFBRSxDQUNqRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDaEIsV0FBVyxDQUNWLHVLQUF1SyxDQUN4SztLQUNBLE1BQU0sQ0FBQyxHQUFHLEVBQUU7SUFDWCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3BlYyBDb21tYW5kXG4gKlxuICogSW1wbGVtZW50cyB0aGUgYGR4IHNwZWNgIHN1YmNvbW1hbmQuIENhbGxzIHRoZSBpbmplY3RlZCBgZ2V0U3BlY2AgZmFjdG9yeVxuICogYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGFzIHByZXR0eS1wcmludGVkIEpTT04gdG8gc3Rkb3V0LiAgVGhlIGNvbW1hbmQgaGFzIG5vXG4gKiBkZXBlbmRlbmNpZXMgYW5kIHJlcXVpcmVzIG5vIGF1dGhlbnRpY2F0aW9uLlxuICovXG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbmltcG9ydCB0eXBlIHsgQ2xpU3BlYyB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vc3BlYy5qc1wiO1xuXG5leHBvcnQgY29uc3QgbWFrZVNwZWNDb21tYW5kID0gKGdldFNwZWM6ICgpID0+IENsaVNwZWMpOiBDb21tYW5kID0+XG4gIG5ldyBDb21tYW5kKFwic3BlY1wiKVxuICAgIC5kZXNjcmlwdGlvbihcbiAgICAgIFwiUHJpbnQgdGhlIGZ1bGwgQ0xJIHNwZWMgYXMgSlNPTiAoY29tbWFuZHMsIHN1YmNvbW1hbmRzLCBmbGFncywgYXJndW1lbnRzKS4gVXNlZnVsIGZvciBhZ2VudHMgdGhhdCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIENMSSB3aXRob3V0IHJ1bm5pbmcgLS1oZWxwIG9uIGV2ZXJ5IGNvbW1hbmQuXCIsXG4gICAgKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkoZ2V0U3BlYygpLCBudWxsLCAyKSArIFwiXFxuXCIpO1xuICAgIH0pO1xuIl19
@@ -13,3 +13,4 @@ export const cliEnvSchema = z
13
13
  CI: z.stringbool().default(false),
14
14
  })
15
15
  .loose();
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUM7S0FDMUIsTUFBTSxDQUFDO0lBQ04sd0NBQXdDO0lBQ3hDLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztDQUNsQyxDQUFDO0tBQ0QsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFpvZCBzY2hlbWEgZm9yIHRoZSBDTEkgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqIEludGVuZGVkIHRvIGNlbnRyYWxpemUgZW52IHBhcnNpbmcgYXQgdGhlIGVudHJ5cG9pbnQgKGBzcmMvaW5kZXgudHNgKSxcbiAqIHdoaWNoIHdpbGwgcGFyc2UgdGhlIHJhdyBlbnZpcm9ubWVudCBvbmNlIGFuZCBwYXNzIHRoZSB2YWxpZGF0ZWQgcmVzdWx0IGFzXG4gKiBgQ2xpRW52YCB0byBldmVyeSBjb21tYW5kLiBUaGlzIGtlZXBzIGVudi12YXIgcmVhZHMgb3V0IG9mIHVzZS1jYXNlcyBhbmRcbiAqIGFkYXB0ZXJzIGFuZCBtYWtlcyB0aGVtIGZ1bGx5IHRlc3RhYmxlLlxuICovXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgY2xpRW52U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAvLyBVc2UgYSB0cnV0aHkgdmFsdWUgdG8gZW5hYmxlIENJIG1vZGUuXG4gICAgQ0k6IHouc3RyaW5nYm9vbCgpLmRlZmF1bHQoZmFsc2UpLFxuICB9KVxuICAubG9vc2UoKTtcblxuZXhwb3J0IHR5cGUgQ2xpRW52ID0gei5pbmZlcjx0eXBlb2YgY2xpRW52U2NoZW1hPjtcbiJdfQ==
@@ -66,3 +66,4 @@ export const formatErrorDetailed = (value) => {
66
66
  }
67
67
  return lines.join("\n");
68
68
  };
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItcmVwb3J0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9lcnJvci1yZXBvcnRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVuQzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQVUsRUFBRTtJQUN2RCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBSSxLQUFLLFlBQVksY0FBYyxFQUFFLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFJLEtBQStCLENBQUMsT0FBTyxDQUFDO1FBQzlELElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEUsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFO0lBQzVELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVyxDQUFDO0lBQ2hDLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztJQUM3QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxPQUFPLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQ2hELElBQUksT0FBTyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQixzRUFBc0U7Z0JBQ3RFLHFEQUFxRDtnQkFDckQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sR0FBSSxPQUErQixDQUFDLEtBQUssQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsRCxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFeGVjYUVycm9yIH0gZnJvbSBcImV4ZWNhXCI7XG5cbi8qKlxuICogU2FmZWx5IGNvbnZlcnRzIGFuIHVua25vd24gdmFsdWUgdG8gYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLlxuICogUHJlc2VydmVzIEV4ZWNhRXJyb3Iuc2hvcnRNZXNzYWdlIHdoZW4gYXZhaWxhYmxlIGFuZCBmbGF0dGVucyBBZ2dyZWdhdGVFcnJvci5cbiAqL1xuZXhwb3J0IGNvbnN0IHRvRXJyb3JNZXNzYWdlID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJVbmtub3duIGVycm9yXCI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFeGVjYUVycm9yKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNob3J0TWVzc2FnZSB8fCB2YWx1ZS5tZXNzYWdlIHx8IFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLmVycm9ycy5tYXAoKGlubmVyKSA9PiB0b0Vycm9yTWVzc2FnZShpbm5lcikpO1xuICAgIHJldHVybiBbdmFsdWUubWVzc2FnZSwgLi4ucGFydHNdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuICAtIFwiKTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB2YWx1ZS5tZXNzYWdlIHx8IHZhbHVlLm5hbWUgfHwgXCJFcnJvclwiO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBtYXliZU1lc3NhZ2UgPSAodmFsdWUgYXMgeyBtZXNzYWdlPzogdW5rbm93biB9KS5tZXNzYWdlO1xuICAgIGlmICh0eXBlb2YgbWF5YmVNZXNzYWdlID09PSBcInN0cmluZ1wiICYmIG1heWJlTWVzc2FnZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbWF5YmVNZXNzYWdlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn07XG5cbi8qKlxuICogQnVpbGRzIGEgZGV0YWlsZWQsIG11bHRpLWxpbmUgcmVwcmVzZW50YXRpb24gb2YgYW4gZXJyb3Igc3VpdGFibGUgZm9yXG4gKiBgLS12ZXJib3NlYCBvdXRwdXQ6IGluY2x1ZGVzIHRoZSBmdWxsIGBjYXVzZWAgY2hhaW4gYW5kIHN0YWNrIHRyYWNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdEVycm9yRGV0YWlsZWQgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSB2YWx1ZTtcbiAgbGV0IGRlcHRoID0gMDtcblxuICB3aGlsZSAoY3VycmVudCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIXNlZW4uaGFzKGN1cnJlbnQpKSB7XG4gICAgc2Vlbi5hZGQoY3VycmVudCk7XG4gICAgY29uc3QgcHJlZml4ID0gZGVwdGggPT09IDAgPyBcIlwiIDogXCJDYXVzZWQgYnk6IFwiO1xuICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGxpbmVzLnB1c2goYCR7cHJlZml4fSR7Y3VycmVudC5uYW1lfTogJHt0b0Vycm9yTWVzc2FnZShjdXJyZW50KX1gKTtcbiAgICAgIGlmIChjdXJyZW50LnN0YWNrKSB7XG4gICAgICAgIC8vIGBzdGFja2AgdXN1YWxseSBzdGFydHMgd2l0aCBcIk5hbWU6IG1lc3NhZ2VcIjsgZHJvcCB0aGUgZmlyc3QgbGluZSB0b1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGlvbiB3aXRoIHRoZSBoZWFkZXIgd2UganVzdCBwcmludGVkLlxuICAgICAgICBjb25zdCBzdGFja0JvZHkgPSBjdXJyZW50LnN0YWNrLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIGlmIChzdGFja0JvZHkudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKHN0YWNrQm9keSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChgJHtwcmVmaXh9JHt0b0Vycm9yTWVzc2FnZShjdXJyZW50KX1gKTtcbiAgICAgIGN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGRlcHRoICs9IDE7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn07XG4iXX0=