@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.
- package/README.md +38 -12
- package/dist/adapters/azure/cloud-account-repository.js +1 -0
- package/dist/adapters/azure/cloud-account-service.js +1 -0
- package/dist/adapters/azure/locations.js +1 -0
- package/dist/adapters/codemods/git.js +1 -0
- package/dist/adapters/codemods/index.js +1 -0
- package/dist/adapters/codemods/registry.js +1 -0
- package/dist/adapters/codemods/update-code-review.js +1 -0
- package/dist/adapters/codemods/use-azure-appsvc.js +1 -0
- package/dist/adapters/codemods/use-pnpm.js +1 -0
- package/dist/adapters/codemods/yaml.js +1 -0
- package/dist/adapters/commander/command-errors.d.ts +31 -0
- package/dist/adapters/commander/command-errors.js +42 -0
- package/dist/adapters/commander/commands/add.js +29 -10
- package/dist/adapters/commander/commands/codemod.d.ts +2 -2
- package/dist/adapters/commander/commands/codemod.js +17 -10
- package/dist/adapters/commander/commands/doctor.d.ts +1 -1
- package/dist/adapters/commander/commands/doctor.js +26 -6
- package/dist/adapters/commander/commands/info.d.ts +1 -1
- package/dist/adapters/commander/commands/info.js +7 -3
- package/dist/adapters/commander/commands/init.d.ts +35 -3
- package/dist/adapters/commander/commands/init.js +136 -55
- package/dist/adapters/commander/commands/savemoney.js +2 -1
- package/dist/adapters/commander/commands/spec.js +1 -0
- package/dist/adapters/commander/env.js +1 -0
- package/dist/adapters/commander/error-reporting.js +1 -0
- package/dist/adapters/commander/global-options.d.ts +12 -0
- package/dist/adapters/commander/global-options.js +2 -0
- package/dist/adapters/commander/index.d.ts +0 -18
- package/dist/adapters/commander/index.js +1 -20
- package/dist/adapters/commander/presenters/index.js +1 -0
- package/dist/adapters/commander/presenters/json-command-presenter.js +1 -0
- package/dist/adapters/commander/presenters/text-command-presenter.js +7 -1
- package/dist/adapters/commander/spec.js +1 -0
- package/dist/adapters/execa/terraform.js +1 -0
- package/dist/adapters/github/github-repo.js +1 -0
- package/dist/adapters/node/fs/file-reader.js +1 -0
- package/dist/adapters/node/json/index.js +1 -0
- package/dist/adapters/node/package-json.js +1 -0
- package/dist/adapters/node/release.js +1 -0
- package/dist/adapters/node/repository.js +1 -0
- package/dist/adapters/octokit/index.js +1 -0
- package/dist/adapters/pagopa-technology/azure-authorization-config.js +1 -0
- package/dist/adapters/pagopa-technology/azure-authorization.js +1 -0
- package/dist/adapters/plop/actions/fetch-github-release.js +1 -0
- package/dist/adapters/plop/actions/get-node-version.js +1 -0
- package/dist/adapters/plop/actions/get-terraform-backend.js +1 -0
- package/dist/adapters/plop/actions/init-cloud-accounts.js +1 -0
- package/dist/adapters/plop/actions/provision-terraform-backend.js +1 -0
- package/dist/adapters/plop/actions/semver.js +1 -0
- package/dist/adapters/plop/actions/setup-pnpm.js +7 -4
- package/dist/adapters/plop/generators/environment/actions.js +1 -0
- package/dist/adapters/plop/generators/environment/index.js +1 -0
- package/dist/adapters/plop/generators/environment/prompts.js +1 -0
- package/dist/adapters/plop/generators/monorepo/actions.js +1 -0
- package/dist/adapters/plop/generators/monorepo/index.d.ts +1 -1
- package/dist/adapters/plop/generators/monorepo/index.js +3 -2
- package/dist/adapters/plop/generators/monorepo/prompts.d.ts +7 -1
- package/dist/adapters/plop/generators/monorepo/prompts.js +7 -4
- package/dist/adapters/plop/helpers/env-short.js +1 -0
- package/dist/adapters/plop/helpers/eq.js +1 -0
- package/dist/adapters/plop/helpers/resource-prefix.js +1 -0
- package/dist/adapters/plop/helpers/terraform-state-key.js +1 -0
- package/dist/adapters/plop/helpers/validate-prompt.js +1 -0
- package/dist/adapters/plop/index.d.ts +21 -4
- package/dist/adapters/plop/index.js +34 -13
- package/dist/adapters/plop/templates-path.js +1 -0
- package/dist/adapters/terraform/fmt.js +1 -0
- package/dist/adapters/yaml/index.js +1 -0
- package/dist/adapters/zod/index.js +1 -0
- package/dist/config.js +1 -0
- package/dist/domain/authorization.js +1 -0
- package/dist/domain/cloud-account.js +1 -0
- package/dist/domain/codemod.js +1 -0
- package/dist/domain/command-presenter.js +1 -0
- package/dist/domain/dependencies.d.ts +0 -2
- package/dist/domain/dependencies.js +1 -0
- package/dist/domain/doctor.d.ts +1 -3
- package/dist/domain/doctor.js +9 -3
- package/dist/domain/environment.js +1 -0
- package/dist/domain/github-repo.js +1 -0
- package/dist/domain/github.js +1 -0
- package/dist/domain/info.d.ts +0 -1
- package/dist/domain/info.js +1 -5
- package/dist/domain/package-json.js +1 -0
- package/dist/domain/remote-backend.js +1 -0
- package/dist/domain/repository.js +1 -0
- package/dist/domain/spec.js +1 -0
- package/dist/domain/validation.d.ts +0 -3
- package/dist/domain/validation.js +1 -0
- package/dist/domain/workspace.js +1 -0
- package/dist/index.js +1 -3
- package/dist/use-cases/apply-codemod.js +1 -0
- package/dist/use-cases/list-codemods.js +1 -0
- package/dist/use-cases/request-authorization.js +1 -0
- package/package.json +1 -1
- package/dist/adapters/logtape/validation-reporter.d.ts +0 -2
- 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 {
|
|
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
|
-
.
|
|
11
|
-
.
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
})
|
|
22
|
-
.
|
|
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
|
|
3
|
-
import {
|
|
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
|
-
|
|
10
|
-
|
|
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,9 +1,13 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { getInfo
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
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
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
.andThen(() =>
|
|
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
|
-
|
|
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, "
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
ResultAsync.fromPromise(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
.
|
|
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
|
|
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({
|
|
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 "../
|
|
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=
|