@pagopa/dx-cli 0.23.2 → 0.23.4
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.d.ts +2 -1
- package/dist/adapters/commander/commands/add.js +31 -11
- package/dist/adapters/commander/commands/codemod.d.ts +4 -3
- package/dist/adapters/commander/commands/codemod.js +20 -11
- package/dist/adapters/commander/commands/doctor.d.ts +3 -2
- package/dist/adapters/commander/commands/doctor.js +28 -7
- package/dist/adapters/commander/commands/info.d.ts +3 -2
- package/dist/adapters/commander/commands/info.js +8 -4
- package/dist/adapters/commander/commands/init.d.ts +37 -4
- package/dist/adapters/commander/commands/init.js +141 -59
- 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 +2 -19
- package/dist/adapters/commander/index.js +7 -26
- package/dist/adapters/commander/presenters/index.d.ts +17 -8
- package/dist/adapters/commander/presenters/index.js +15 -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 +4 -4
- 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,32 @@
|
|
|
1
|
-
import { getLogger } from "@logtape/logtape";
|
|
2
1
|
import { Command } from "commander";
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { ResultAsync } from "neverthrow";
|
|
3
|
+
import { asError, reportCommandError } from "../command-errors.js";
|
|
4
|
+
import { createCommandPresenter, resolveOutputMode, } from "../presenters/index.js";
|
|
5
|
+
export const makeCodemodCommand = ({ applyCodemodById, listCodemods }, env) => 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 outputMode = resolveOutputMode(env, output);
|
|
12
|
+
const presenter = createCommandPresenter(outputMode);
|
|
9
13
|
await listCodemods()
|
|
10
|
-
.
|
|
11
|
-
.
|
|
14
|
+
.map((codemods) => codemods.map(({ description, id }) => ({ description, id })))
|
|
15
|
+
.andTee((codemods) => presenter.reportResult(codemods))
|
|
16
|
+
.orTee(reportCommandError(this, presenter, outputMode));
|
|
12
17
|
}))
|
|
13
18
|
.addCommand(new Command("apply")
|
|
14
19
|
.argument("<id>", "The id of the codemod to apply")
|
|
15
20
|
.description("Apply migration scripts to the repository")
|
|
16
21
|
.action(async function (id) {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
const { output } = this.optsWithGlobals();
|
|
23
|
+
const outputMode = resolveOutputMode(env, output);
|
|
24
|
+
const presenter = createCommandPresenter(outputMode);
|
|
25
|
+
await ResultAsync.fromPromise(presenter.trackStep(`Applying codemod ${id}...`, () => applyCodemodById(id).match(() => undefined, (error) => {
|
|
26
|
+
throw error;
|
|
27
|
+
})), asError(`Failed to apply codemod ${id}`))
|
|
28
|
+
.map(() => ({ id }))
|
|
29
|
+
.andTee((result) => presenter.reportResult(result))
|
|
30
|
+
.orTee(reportCommandError(this, presenter, outputMode));
|
|
23
31
|
}));
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1vZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZGFwdGVycy9jb21tYW5kZXIvY29tbWFuZHMvY29kZW1vZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFPekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFPaEMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FDaEMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQThCLEVBQzlELEdBQVcsRUFDWCxFQUFFLENBQ0YsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO0tBQ25CLFdBQVcsQ0FBQyxzREFBc0QsQ0FBQztLQUNuRSxVQUFVLENBQ1QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDO0tBQ2hCLFdBQVcsQ0FBQyxrQ0FBa0MsQ0FBQztLQUMvQyxNQUFNLENBQUMsS0FBSztJQUNYLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFpQixDQUFDO0lBQ3pELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVyRCxNQUFNLFlBQVksRUFBRTtTQUNqQixHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUNoQixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUM3RDtTQUNBLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN0RCxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUMsQ0FBQyxDQUNMO0tBQ0EsVUFBVSxDQUNULElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztLQUNqQixRQUFRLENBQUMsTUFBTSxFQUFFLGdDQUFnQyxDQUFDO0tBQ2xELFdBQVcsQ0FBQywyQ0FBMkMsQ0FBQztLQUN4RCxNQUFNLENBQUMsS0FBSyxXQUFXLEVBQUU7SUFDeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQWlCLENBQUM7SUFDekQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJELE1BQU0sV0FBVyxDQUFDLFdBQVcsQ0FDM0IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQ3BELGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FDeEIsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUNmLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDUixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUMsQ0FDRixDQUNGLEVBQ0QsT0FBTyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUN6QztTQUNFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNuQixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM1RCxDQUFDLENBQUMsQ0FDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcblxuaW1wb3J0IHR5cGUgeyBBcHBseUNvZGVtb2RCeUlkIH0gZnJvbSBcIi4uLy4uLy4uL3VzZS1jYXNlcy9hcHBseS1jb2RlbW9kLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RDb2RlbW9kcyB9IGZyb20gXCIuLi8uLi8uLi91c2UtY2FzZXMvbGlzdC1jb2RlbW9kcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGlFbnYgfSBmcm9tIFwiLi4vZW52LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdsb2JhbE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2xvYmFsLW9wdGlvbnMuanNcIjtcblxuaW1wb3J0IHsgYXNFcnJvciwgcmVwb3J0Q29tbWFuZEVycm9yIH0gZnJvbSBcIi4uL2NvbW1hbmQtZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVDb21tYW5kUHJlc2VudGVyLFxuICByZXNvbHZlT3V0cHV0TW9kZSxcbn0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcblxuZXhwb3J0IHR5cGUgQ29kZW1vZENvbW1hbmREZXBlbmRlbmNpZXMgPSB7XG4gIGFwcGx5Q29kZW1vZEJ5SWQ6IEFwcGx5Q29kZW1vZEJ5SWQ7XG4gIGxpc3RDb2RlbW9kczogTGlzdENvZGVtb2RzO1xufTtcblxuZXhwb3J0IGNvbnN0IG1ha2VDb2RlbW9kQ29tbWFuZCA9IChcbiAgeyBhcHBseUNvZGVtb2RCeUlkLCBsaXN0Q29kZW1vZHMgfTogQ29kZW1vZENvbW1hbmREZXBlbmRlbmNpZXMsXG4gIGVudjogQ2xpRW52LFxuKSA9PlxuICBuZXcgQ29tbWFuZChcImNvZGVtb2RcIilcbiAgICAuZGVzY3JpcHRpb24oXCJNYW5hZ2UgYW5kIGFwcGx5IG1pZ3JhdGlvbiBzY3JpcHRzIHRvIHRoZSByZXBvc2l0b3J5XCIpXG4gICAgLmFkZENvbW1hbmQoXG4gICAgICBuZXcgQ29tbWFuZChcImxpc3RcIilcbiAgICAgICAgLmRlc2NyaXB0aW9uKFwiTGlzdCBhdmFpbGFibGUgbWlncmF0aW9uIHNjcmlwdHNcIilcbiAgICAgICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHRoaXMub3B0c1dpdGhHbG9iYWxzPEdsb2JhbE9wdGlvbnM+KCk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0TW9kZSA9IHJlc29sdmVPdXRwdXRNb2RlKGVudiwgb3V0cHV0KTtcbiAgICAgICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICAgICAgYXdhaXQgbGlzdENvZGVtb2RzKClcbiAgICAgICAgICAgIC5tYXAoKGNvZGVtb2RzKSA9PlxuICAgICAgICAgICAgICBjb2RlbW9kcy5tYXAoKHsgZGVzY3JpcHRpb24sIGlkIH0pID0+ICh7IGRlc2NyaXB0aW9uLCBpZCB9KSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYW5kVGVlKChjb2RlbW9kcykgPT4gcHJlc2VudGVyLnJlcG9ydFJlc3VsdChjb2RlbW9kcykpXG4gICAgICAgICAgICAub3JUZWUocmVwb3J0Q29tbWFuZEVycm9yKHRoaXMsIHByZXNlbnRlciwgb3V0cHV0TW9kZSkpO1xuICAgICAgICB9KSxcbiAgICApXG4gICAgLmFkZENvbW1hbmQoXG4gICAgICBuZXcgQ29tbWFuZChcImFwcGx5XCIpXG4gICAgICAgIC5hcmd1bWVudChcIjxpZD5cIiwgXCJUaGUgaWQgb2YgdGhlIGNvZGVtb2QgdG8gYXBwbHlcIilcbiAgICAgICAgLmRlc2NyaXB0aW9uKFwiQXBwbHkgbWlncmF0aW9uIHNjcmlwdHMgdG8gdGhlIHJlcG9zaXRvcnlcIilcbiAgICAgICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgICAgICBjb25zdCBvdXRwdXRNb2RlID0gcmVzb2x2ZU91dHB1dE1vZGUoZW52LCBvdXRwdXQpO1xuICAgICAgICAgIGNvbnN0IHByZXNlbnRlciA9IGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIob3V0cHV0TW9kZSk7XG5cbiAgICAgICAgICBhd2FpdCBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgICAgICAgIHByZXNlbnRlci50cmFja1N0ZXAoYEFwcGx5aW5nIGNvZGVtb2QgJHtpZH0uLi5gLCAoKSA9PlxuICAgICAgICAgICAgICBhcHBseUNvZGVtb2RCeUlkKGlkKS5tYXRjaChcbiAgICAgICAgICAgICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGFzRXJyb3IoYEZhaWxlZCB0byBhcHBseSBjb2RlbW9kICR7aWR9YCksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoKSA9PiAoeyBpZCB9KSlcbiAgICAgICAgICAgIC5hbmRUZWUoKHJlc3VsdCkgPT4gcHJlc2VudGVyLnJlcG9ydFJlc3VsdChyZXN1bHQpKVxuICAgICAgICAgICAgLm9yVGVlKHJlcG9ydENvbW1hbmRFcnJvcih0aGlzLCBwcmVzZW50ZXIsIG91dHB1dE1vZGUpKTtcbiAgICAgICAgfSksXG4gICAgKTtcbiJdfQ==
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
import type { Dependencies } from "../../../domain/dependencies.js";
|
|
3
|
+
import type { CliEnv } from "../env.js";
|
|
2
4
|
import { Config } from "../../../config.js";
|
|
3
|
-
|
|
4
|
-
export declare const makeDoctorCommand: (dependencies: Dependencies, config: Config) => Command;
|
|
5
|
+
export declare const makeDoctorCommand: (dependencies: Dependencies, config: Config, env: CliEnv) => Command;
|
|
@@ -1,12 +1,33 @@
|
|
|
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 {
|
|
4
|
-
|
|
12
|
+
import { runDoctor } from "../../../domain/doctor.js";
|
|
13
|
+
import { createCommandPresenter, resolveOutputMode, } 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
|
+
};
|
|
22
|
+
export const makeDoctorCommand = (dependencies, config, env) => 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 outputMode = resolveOutputMode(env, output);
|
|
28
|
+
const presenter = createCommandPresenter(outputMode);
|
|
8
29
|
const result = await runDoctor(dependencies, config);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
process.exit(exitCode);
|
|
30
|
+
reportDoctorResult(presenter, outputMode)(result);
|
|
31
|
+
process.exitCode = result.hasErrors ? 1 : 0;
|
|
12
32
|
});
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9kb2N0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixpQkFBaUIsR0FDbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQXNCLEVBQVUsRUFBRSxDQUNyRCxLQUFLLENBQUMsT0FBTztJQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFM0MsTUFBTSxrQkFBa0IsR0FDdEIsQ0FBQyxTQUEyQixFQUFFLFVBQTJCLEVBQUUsRUFBRSxDQUM3RCxDQUFDLE1BQW9CLEVBQVEsRUFBRTtJQUM3QixTQUFTLENBQUMsWUFBWSxDQUNwQixVQUFVLEtBQUssTUFBTTtRQUNuQixDQUFDLENBQUMsTUFBTTtRQUNSLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzlDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixZQUEwQixFQUMxQixNQUFjLEVBQ2QsR0FBVyxFQUNGLEVBQUUsQ0FDWCxJQUFJLE9BQU8sRUFBRTtLQUNWLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDZCxXQUFXLENBQ1YsK0RBQStELENBQ2hFO0tBQ0EsTUFBTSxDQUFDLEtBQUs7SUFDWCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBaUIsQ0FBQztJQUN6RCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXJELGtCQUFrQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVsRCxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgZG9jdG9yYCBDb21tYW5kZXIgY29tbWFuZC5cbiAqXG4gKiBWZXJpZmllcyB0aGUgcmVwb3NpdG9yeSBzZXR1cCBhbmQgcm91dGVzIHRoZSBvdXRjb21lIHRocm91Z2ggdGhlIHNoYXJlZFxuICogQ29tbWFuZFByZXNlbnRlciBwb3J0LiBKU09OIG1vZGUgZW1pdHMgdGhlIHN0cnVjdHVyZWQgcmVzdWx0OyB0ZXh0IG1vZGUgZW1pdHNcbiAqIGEgaHVtYW4tcmVhZGFibGUgcGVyLWNoZWNrIHN1bW1hcnkuIFRoZSBleGl0IGNvZGUgcmVmbGVjdHMgd2hldGhlciBhbnkgY2hlY2tcbiAqIGZhaWxlZCwgbWlycm9yaW5nIHRoZSBsaW50ZXIgY29udmVudGlvbiAoYSBzdWNjZXNzZnVsIHJ1biBjYW4gc3RpbGwgcmVwb3J0XG4gKiBwcm9ibGVtcykuXG4gKi9cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZFByZXNlbnRlciB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vY29tbWFuZC1wcmVzZW50ZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kZXBlbmRlbmNpZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgRG9jdG9yUmVzdWx0IH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kb2N0b3IuanNcIjtcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGlvbkNoZWNrIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi92YWxpZGF0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENsaUVudiB9IGZyb20gXCIuLi9lbnYuanNcIjtcbmltcG9ydCB0eXBlIHsgR2xvYmFsT3B0aW9ucyB9IGZyb20gXCIuLi9nbG9iYWwtb3B0aW9ucy5qc1wiO1xuXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgeyBydW5Eb2N0b3IgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RvY3Rvci5qc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29tbWFuZFByZXNlbnRlcixcbiAgcmVzb2x2ZU91dHB1dE1vZGUsXG59IGZyb20gXCIuLi9wcmVzZW50ZXJzL2luZGV4LmpzXCI7XG5cbmNvbnN0IGZvcm1hdENoZWNrID0gKGNoZWNrOiBWYWxpZGF0aW9uQ2hlY2spOiBzdHJpbmcgPT5cbiAgY2hlY2suaXNWYWxpZFxuICAgID8gY2hhbGsuZ3JlZW4oYOKchSAke2NoZWNrLnN1Y2Nlc3NNZXNzYWdlfWApXG4gICAgOiBjaGFsay5yZWQoYOKdjCAke2NoZWNrLmVycm9yTWVzc2FnZX1gKTtcblxuY29uc3QgcmVwb3J0RG9jdG9yUmVzdWx0ID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlciwgb3V0cHV0TW9kZTogXCJqc29uXCIgfCBcInRleHRcIikgPT5cbiAgKHJlc3VsdDogRG9jdG9yUmVzdWx0KTogdm9pZCA9PiB7XG4gICAgcHJlc2VudGVyLnJlcG9ydFJlc3VsdChcbiAgICAgIG91dHB1dE1vZGUgPT09IFwianNvblwiXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogcmVzdWx0LmNoZWNrcy5tYXAoZm9ybWF0Q2hlY2spLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IG1ha2VEb2N0b3JDb21tYW5kID0gKFxuICBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcyxcbiAgY29uZmlnOiBDb25maWcsXG4gIGVudjogQ2xpRW52LFxuKTogQ29tbWFuZCA9PlxuICBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUoXCJkb2N0b3JcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIlZlcmlmeSB0aGUgcmVwb3NpdG9yeSBzZXR1cCBhY2NvcmRpbmcgdG8gdGhlIERldkV4IGd1aWRlbGluZXNcIixcbiAgICApXG4gICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgIGNvbnN0IG91dHB1dE1vZGUgPSByZXNvbHZlT3V0cHV0TW9kZShlbnYsIG91dHB1dCk7XG4gICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Eb2N0b3IoZGVwZW5kZW5jaWVzLCBjb25maWcpO1xuXG4gICAgICByZXBvcnREb2N0b3JSZXN1bHQocHJlc2VudGVyLCBvdXRwdXRNb2RlKShyZXN1bHQpO1xuXG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmVzdWx0Lmhhc0Vycm9ycyA/IDEgOiAwO1xuICAgIH0pO1xuIl19
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { Dependencies } from "../../../domain/dependencies.js";
|
|
3
|
-
|
|
2
|
+
import type { Dependencies } from "../../../domain/dependencies.js";
|
|
3
|
+
import type { CliEnv } from "../env.js";
|
|
4
|
+
export declare const makeInfoCommand: (dependencies: Dependencies, env: CliEnv) => Command;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { getInfo
|
|
3
|
-
|
|
2
|
+
import { getInfo } from "../../../domain/info.js";
|
|
3
|
+
import { createCommandPresenter, resolveOutputMode, } from "../presenters/index.js";
|
|
4
|
+
export const makeInfoCommand = (dependencies, env) => 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(resolveOutputMode(env, output));
|
|
7
10
|
const result = await getInfo(dependencies)();
|
|
8
|
-
|
|
11
|
+
presenter.reportResult(result);
|
|
9
12
|
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZGFwdGVycy9jb21tYW5kZXIvY29tbWFuZHMvaW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBTXBDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGlCQUFpQixHQUNsQixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUM3QixZQUEwQixFQUMxQixHQUFXLEVBQ0YsRUFBRSxDQUNYLElBQUksT0FBTyxFQUFFO0tBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUNaLFdBQVcsQ0FBQyx1Q0FBdUMsQ0FBQztLQUNwRCxNQUFNLENBQUMsS0FBSztJQUNYLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFpQixDQUFDO0lBQ3pELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7SUFDN0MsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbmltcG9ydCB0eXBlIHsgRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kZXBlbmRlbmNpZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgQ2xpRW52IH0gZnJvbSBcIi4uL2Vudi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHbG9iYWxPcHRpb25zIH0gZnJvbSBcIi4uL2dsb2JhbC1vcHRpb25zLmpzXCI7XG5cbmltcG9ydCB7IGdldEluZm8gfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2luZm8uanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIsXG4gIHJlc29sdmVPdXRwdXRNb2RlLFxufSBmcm9tIFwiLi4vcHJlc2VudGVycy9pbmRleC5qc1wiO1xuXG5leHBvcnQgY29uc3QgbWFrZUluZm9Db21tYW5kID0gKFxuICBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcyxcbiAgZW52OiBDbGlFbnYsXG4pOiBDb21tYW5kID0+XG4gIG5ldyBDb21tYW5kKClcbiAgICAubmFtZShcImluZm9cIilcbiAgICAuZGVzY3JpcHRpb24oXCJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9qZWN0XCIpXG4gICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgIGNvbnN0IHByZXNlbnRlciA9IGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIocmVzb2x2ZU91dHB1dE1vZGUoZW52LCBvdXRwdXQpKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEluZm8oZGVwZW5kZW5jaWVzKSgpO1xuICAgICAgcHJlc2VudGVyLnJlcG9ydFJlc3VsdChyZXN1bHQpO1xuICAgIH0pO1xuIl19
|
|
@@ -1,8 +1,14 @@
|
|
|
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";
|
|
5
|
+
import type { CliEnv } from "../env.js";
|
|
3
6
|
import { GitHubAuthFactory } from "../../../domain/dependencies.js";
|
|
4
7
|
import { Payload as MonorepoPayload } from "../../plop/generators/monorepo/index.js";
|
|
5
|
-
|
|
8
|
+
type InitInitialAnswers = Partial<MonorepoPayload> & {
|
|
9
|
+
publishToGitHub?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare const runInitPreconditions: (presenter: CommandPresenter) => ResultAsync<import("execa").Result<{
|
|
6
12
|
environment: {
|
|
7
13
|
NO_COLOR: string;
|
|
8
14
|
TF_IN_AUTOMATION: string;
|
|
@@ -10,7 +16,7 @@ export declare const checkInitPreconditions: () => ResultAsync<import("execa").R
|
|
|
10
16
|
};
|
|
11
17
|
shell: true;
|
|
12
18
|
}>, Error>;
|
|
13
|
-
export declare const
|
|
19
|
+
export declare const runAddEnvironmentPreconditions: (presenter: CommandPresenter) => ResultAsync<import("execa").Result<{
|
|
14
20
|
environment: {
|
|
15
21
|
NO_COLOR: string;
|
|
16
22
|
TF_IN_AUTOMATION: string;
|
|
@@ -18,5 +24,32 @@ export declare const checkAddEnvironmentPreconditions: () => ResultAsync<import(
|
|
|
18
24
|
};
|
|
19
25
|
shell: true;
|
|
20
26
|
}>, Error>;
|
|
21
|
-
export declare const
|
|
22
|
-
|
|
27
|
+
export declare const initCommandOptionsSchema: z.ZodObject<{
|
|
28
|
+
description: z.ZodOptional<z.ZodString>;
|
|
29
|
+
name: z.ZodOptional<z.ZodString>;
|
|
30
|
+
owner: z.ZodOptional<z.ZodString>;
|
|
31
|
+
publish: z.ZodOptional<z.ZodBoolean>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type InitCommandOptions = z.infer<typeof initCommandOptionsSchema>;
|
|
34
|
+
export declare const parseInitCommandOptions: (input: unknown) => InitCommandOptions;
|
|
35
|
+
export declare const getMonorepoInitialAnswers: ({ description, name, owner, publish, }: InitCommandOptions) => InitInitialAnswers;
|
|
36
|
+
/**
|
|
37
|
+
* Translates a failure of the git remote setup step into an actionable error.
|
|
38
|
+
*
|
|
39
|
+
* When `git remote add origin` exits with code 3 the remote already exists,
|
|
40
|
+
* which is a recoverable situation: the message tells the user how to fix it.
|
|
41
|
+
* The original ExecaError is preserved as `cause` so `--verbose` still surfaces
|
|
42
|
+
* the exit code and git's own stderr.
|
|
43
|
+
*/
|
|
44
|
+
export declare const mapGitRemoteAddError: (cause: unknown) => Error;
|
|
45
|
+
/**
|
|
46
|
+
* Resolves whether the scaffolded repository should be published to GitHub.
|
|
47
|
+
*
|
|
48
|
+
* When the caller already knows the answer (e.g. the user passed `--publish`
|
|
49
|
+
* on the command line), that value is used as-is and no prompt is shown. When
|
|
50
|
+
* the preference is left undefined (flag omitted), the user is asked
|
|
51
|
+
* interactively.
|
|
52
|
+
*/
|
|
53
|
+
export declare const confirmGitHubRepoCreation: (payload: MonorepoPayload, publishPreference?: boolean) => ResultAsync<boolean, Error>;
|
|
54
|
+
export declare const makeInitCommand: (requireGitHubAuth: GitHubAuthFactory, env: CliEnv) => Command;
|
|
55
|
+
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 {
|
|
14
|
-
import { createCommandPresenter } from "../presenters/index.js";
|
|
12
|
+
import { asError, reportCommandError } from "../command-errors.js";
|
|
13
|
+
import { createCommandPresenter, resolveOutputMode, } 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,27 @@ const reportSummary = (presenter, outputMode) => (result) => {
|
|
|
173
251
|
displaySummary(result);
|
|
174
252
|
}
|
|
175
253
|
};
|
|
176
|
-
const
|
|
177
|
-
if (outputMode === "json") {
|
|
178
|
-
presenter.reportError(error);
|
|
179
|
-
process.exitCode = 1;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
exitWithError(command)(error);
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
export const makeInitCommand = (requireGitHubAuth) => new Command()
|
|
254
|
+
export const makeInitCommand = (requireGitHubAuth, env) => 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
|
-
const
|
|
191
|
-
|
|
263
|
+
const outputMode = resolveOutputMode(env, output);
|
|
264
|
+
const presenter = createCommandPresenter(outputMode);
|
|
265
|
+
await ResultAsync.fromPromise(Promise.resolve().then(() => parseInitCommandOptions(options)), (cause) => cause instanceof Error
|
|
266
|
+
? cause
|
|
267
|
+
: new Error("Failed to parse init command options", { cause }))
|
|
268
|
+
.andThen((initOptions) => runInitPreconditions(presenter)
|
|
192
269
|
.andThen(() => requireGitHubAuth())
|
|
193
|
-
.andThen((auth) => runInitAction({
|
|
194
|
-
.
|
|
270
|
+
.andThen((auth) => runInitAction({
|
|
271
|
+
gitHubService: auth.gitHubService,
|
|
272
|
+
initialAnswers: getMonorepoInitialAnswers(initOptions),
|
|
273
|
+
presenter,
|
|
274
|
+
})))
|
|
275
|
+
.match(reportSummary(presenter, outputMode), reportCommandError(this, presenter, outputMode));
|
|
195
276
|
});
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZGFwdGVycy9jb21tYW5kZXIvY29tbWFuZHMvaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUQsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQU94QixPQUFPLEVBR0wsVUFBVSxHQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGlCQUFpQixHQUNsQixNQUFNLHdCQUF3QixDQUFDO0FBY2hDLE1BQU0sMkJBQTJCLEdBQUcsQ0FDbEMsS0FBbUIsRUFDdUIsRUFBRSxDQUM1QywyQkFBMkIsSUFBSSxLQUFLLENBQUM7QUFzQnZDLE1BQU0sU0FBUyxHQUFHLENBQ2hCLFNBQTJCLEVBQzNCLElBQVksRUFDWixJQUFzQixFQUN0QixRQUErQixFQUNaLEVBQUUs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QUFFLFVBQVUsQ0FBQyxDQUNoRCxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgJCwgRXhlY2FFcnJvciB9IGZyb20gXCJleGVjYVwiO1xuaW1wb3J0IGlucXVpcmVyIGZyb20gXCJpbnF1aXJlclwiO1xuaW1wb3J0IHsgZXJyQXN5bmMsIG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kUHJlc2VudGVyIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9jb21tYW5kLXByZXNlbnRlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGlFbnYgfSBmcm9tIFwiLi4vZW52LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdsb2JhbE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2xvYmFsLW9wdGlvbnMuanNcIjtcblxuaW1wb3J0IHsgR2l0SHViQXV0aEZhY3RvcnkgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RlcGVuZGVuY2llcy5qc1wiO1xuaW1wb3J0IHtcbiAgR2l0SHViU2VydmljZSxcbiAgUHVsbFJlcXVlc3QsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5pbXBvcnQgeyB0ZiQgfSBmcm9tIFwiLi4vLi4vZXhlY2EvdGVycmFmb3JtLmpzXCI7XG5pbXBvcnQgeyBQYXlsb2FkIGFzIE1vbm9yZXBvUGF5bG9hZCB9IGZyb20gXCIuLi8uLi9wbG9wL2dlbmVyYXRvcnMvbW9ub3JlcG8vaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIGNvbGxlY3RNb25vcmVwb1BheWxvYWQsXG4gIGdldFBsb3BJbnN0YW5jZSxcbiAgcnVuTW9ub3JlcG9BY3Rpb25zLFxufSBmcm9tIFwiLi4vLi4vcGxvcC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNFcnJvciwgcmVwb3J0Q29tbWFuZEVycm9yIH0gZnJvbSBcIi4uL2NvbW1hbmQtZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVDb21tYW5kUHJlc2VudGVyLFxuICByZXNvbHZlT3V0cHV0TW9kZSxcbn0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcblxudHlwZSBHaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkUmVzdWx0ID0ge1xuICBnaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkOiB0cnVlO1xuICBwYXlsb2FkOiBNb25vcmVwb1BheWxvYWQ7XG59O1xuXG50eXBlIEluaXRSZXN1bHQgPSB7XG4gIHByPzogUHVsbFJlcXVlc3Q7XG4gIHJlcG9zaXRvcnk/OiBSZXBvc2l0b3J5O1xufTtcblxudHlwZSBTdW1tYXJ5SW5wdXQgPSBHaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkUmVzdWx0IHwgSW5pdFJlc3VsdDtcblxuY29uc3QgaXNHaXRIdWJSZXBvQ3JlYXRpb25Ta2lwcGVkID0gKFxuICBpbnB1dDogU3VtbWFyeUlucHV0LFxuKTogaW5wdXQgaXMgR2l0SHViUmVwb0NyZWF0aW9uU2tpcHBlZFJlc3VsdCA9PlxuICBcImdpdEh1YlJlcG9DcmVhdGlvblNraXBwZWRcIiBpbiBpbnB1dDtcblxudHlwZSBJbml0QWN0aW9uQ29udGV4dCA9IHtcbiAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZTtcbiAgaW5pdGlhbEFuc3dlcnM/OiBJbml0SW5pdGlhbEFuc3dlcnM7XG4gIHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcjtcbn07XG5cbnR5cGUgSW5pdEluaXRpYWxBbnN3ZXJzID0gUGFydGlhbDxNb25vcmVwb1BheWxvYWQ+ICYge1xuICBwdWJsaXNoVG9HaXRIdWI/OiBib29sZWFuO1xufTtcblxudHlwZSBMb2NhbFdvcmtzcGFjZSA9IHtcbiAgYnJhbmNoTmFtZTogc3RyaW5nO1xuICByZXBvc2l0b3J5OiBSZXBvc2l0b3J5O1xufTtcblxudHlwZSBSZXBvc2l0b3J5UHVsbFJlcXVlc3QgPSB7XG4gIHByPzogUHVsbFJlcXVlc3Q7XG4gIHJlcG9zaXRvcnk6IFJlcG9zaXRvcnk7XG59O1xuXG5jb25zdCB0cmFja1N0ZXAgPSA8VCwgRT4oXG4gIHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcixcbiAgbmFtZTogc3RyaW5nLFxuICB0YXNrOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXBFcnJvcjogKGNhdXNlOiB1bmtub3duKSA9PiBFLFxuKTogUmVzdWx0QXN5bmM8VCwgRT4gPT5cbiAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJlc2VudGVyLnRyYWNrU3RlcChuYW1lLCB0YXNrKSwgbWFwRXJyb3IpO1xuXG5jb25zdCBkaXNwbGF5U3VtbWFyeSA9IChpbnB1dDogU3VtbWFyeUlucHV0KSA9PiB7XG4gIGNvbnN0IGRvY3NVcmwgPSBcImh0dHBzOi8vZHgucGFnb3BhLml0L2dldHRpbmctc3RhcnRlZFwiO1xuXG4gIGlmIChpc0dpdEh1YlJlcG9DcmVhdGlvblNraXBwZWQoaW5wdXQpKSB7XG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBpbnB1dDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlxcbkdpdEh1YiByZXBvc2l0b3J5IGNyZWF0aW9uIHNraXBwZWQuXCIpKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBUaGUgd29ya3NwYWNlIGZpbGVzIGhhdmUgYmVlbiBzY2FmZm9sZGVkIGluICR7Y2hhbGsuY3lhbihwYXlsb2FkLnJlcG9OYW1lICsgXCIvXCIpfS5gLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlxcblRvIGZpbmlzaCB0aGUgc2V0dXAgbWFudWFsbHk6XCIpKTtcbiAgICBsZXQgc3RlcCA9IDE7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwKyt9LiBDcmVhdGUgdGhlIEdpdEh1YiByZXBvc2l0b3J5IGJ5IGFwcGx5aW5nIHRoZSBUZXJyYWZvcm0gY29uZmlnIHNjYWZmb2xkZWQgYXQgJHtjaGFsay5jeWFuKGAke3BheWxvYWQucmVwb05hbWV9L2luZnJhL3JlcG9zaXRvcnlgKX06YCxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCAgICAgICAke2NoYWxrLmN5YW4oYGNkICR7cGF5bG9hZC5yZXBvTmFtZX0vaW5mcmEvcmVwb3NpdG9yeSAmJiB0ZXJyYWZvcm0gaW5pdCAmJiB0ZXJyYWZvcm0gYXBwbHlgKX1gLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwKyt9LiBQdXNoIHRoZSBzY2FmZm9sZGVkIGNvZGUgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeTpgLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICAgICR7Y2hhbGsuY3lhbihgY2QgJHtwYXlsb2FkLnJlcG9OYW1lfSAmJiBnaXQgaW5pdCAmJiBnaXQgcmVtb3RlIGFkZCBvcmlnaW4gPHVybD4gJiYgZ2l0IHB1c2hgKX1gLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwfS4gVmlzaXQgJHtjaGFsay51bmRlcmxpbmUoZG9jc1VybCl9IHRvIGRlcGxveSB5b3VyIGZpcnN0IHByb2plY3RcXG5gLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBwciwgcmVwb3NpdG9yeSB9ID0gaW5wdXQ7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoXCJcXG5Xb3Jrc3BhY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpKTtcblxuICBpZiAocmVwb3NpdG9yeSkge1xuICAgIGNvbnNvbGUubG9nKGAtIE5hbWU6ICR7Y2hhbGsuY3lhbihyZXBvc2l0b3J5Lm5hbWUpfWApO1xuICAgIGNvbnNvbGUubG9nKGAtIEdpdEh1YiBSZXBvc2l0b3J5OiAke2NoYWxrLmN5YW4ocmVwb3NpdG9yeS51cmwpfVxcbmApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgXFxu4pqg77iPIEdpdEh1YiByZXBvc2l0b3J5IG1heSBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYXV0b21hdGljYWxseS5gLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKHByKSB7XG4gICAgbGV0IHN0ZXAgPSAxO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoXCJcXG5OZXh0IFN0ZXBzOlwiKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGVwKyt9LiBSZXZpZXcgdGhlIFB1bGwgUmVxdWVzdCBpbiB0aGUgR2l0SHViIHJlcG9zaXRvcnk6ICR7Y2hhbGsudW5kZXJsaW5lKHByLnVybCl9YCxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCR7c3RlcH0uIFZpc2l0ICR7Y2hhbGsudW5kZXJsaW5lKGRvY3NVcmwpfSB0byBkZXBsb3kgeW91ciBmaXJzdCBwcm9qZWN0XFxuYCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsueWVsbG93KGBcXG7imqDvuI8gVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBQdWxsIFJlcXVlc3QgY3JlYXRpb24uYCksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBQbGVhc2UsIG1hbnVhbGx5IGNyZWF0ZSBhIFB1bGwgUmVxdWVzdCBpbiB0aGUgR2l0SHViIHJlcG9zaXRvcnkgdG8gcmV2aWV3IHRoZSBzY2FmZm9sZGVkIGNvZGUuXFxuYCxcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBjaGVja1RlcnJhZm9ybUNsaSA9ICgpID0+IHRmJGB0ZXJyYWZvcm0gLXZlcnNpb25gO1xuXG5jb25zdCB0cmFja1RlcnJhZm9ybUNsaUlzSW5zdGFsbGVkID0gKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcikgPT5cbiAgdHJhY2tTdGVwKFxuICAgIHByZXNlbnRlcixcbiAgICBcIkNoZWNraW5nIFRlcnJhZm9ybSBpbnN0YWxsYXRpb24uLi5cIixcbiAgICBjaGVja1RlcnJhZm9ybUNsaSxcbiAgICBhc0Vycm9yKFxuICAgICAgXCJQbGVhc2UgaW5zdGFsbCB0ZXJyYWZvcm0gQ0xJIGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZC4gSWYgeW91IHVzZSB0ZmVudiwgcnVuOiB0ZmVudiBpbnN0YWxsIGxhdGVzdCAmJiB0ZmVudiB1c2UgbGF0ZXN0XCIsXG4gICAgKSxcbiAgKTtcblxuY29uc3QgY2hlY2tDb3JlcGFjayA9ICgpID0+IHRmJGBjb3JlcGFjayAtdmA7XG5cbmNvbnN0IHRyYWNrQ29yZXBhY2tJc0luc3RhbGxlZCA9IChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+XG4gIHRyYWNrU3RlcChcbiAgICBwcmVzZW50ZXIsXG4gICAgXCJDaGVja2luZyBDb3JlcGFjayBpbnN0YWxsYXRpb24uLi5cIixcbiAgICBjaGVja0NvcmVwYWNrLFxuICAgIGFzRXJyb3IoXCJQbGVhc2UgaW5zdGFsbCBDb3JlcGFjayBiZWZvcmUgcnVubmluZyB0aGlzIGNvbW1hbmQuXCIpLFxuICApO1xuXG5jb25zdCBhenVyZUFjY291bnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHVzZXI6IHoub2JqZWN0KHtcbiAgICBuYW1lOiB6LnN0cmluZygpLm1pbigxKSxcbiAgfSksXG59KTtcblxuY29uc3QgZW5zdXJlQXpMb2dpbiA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgdGYkYGF6IGFjY291bnQgc2hvd2A7XG4gIC8vIGBheiBhY2NvdW50IHNob3dgIHJlYWRzIHRoZSBjYWNoZWQgQ0xJIGNvbnRleHQsIGJ1dCBgYXogZ3JvdXAgbGlzdGBcbiAgLy8gZmFpbHMgd2hlbiB0aGUgY3VycmVudCBzZXNzaW9uIHRva2VuIGhhcyBleHBpcmVkLlxuICBhd2FpdCB0ZiRgYXogZ3JvdXAgbGlzdGA7XG4gIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KTtcbiAgY29uc3QgeyB1c2VyIH0gPSBhenVyZUFjY291bnRTY2hlbWEucGFyc2UocGFyc2VkKTtcbiAgcmV0dXJuIHVzZXIubmFtZTtcbn07XG5cbmNvbnN0IHRyYWNrQXpMb2dpbiA9IChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+XG4gIHRyYWNrU3RlcChcbiAgICBwcmVzZW50ZXIsXG4gICAgXCJDaGVja2luZyBBenVyZSBsb2dpbiBzdGF0dXMuLi5cIixcbiAgICBlbnN1cmVBekxvZ2luLFxuICAgIGFzRXJyb3IoXG4gICAgICBcIlBsZWFzZSBsb2cgaW4gdG8gQXp1cmUgQ0xJIHVzaW5nIGBheiBsb2dpbmAgYmVmb3JlIHJ1bm5pbmcgdGhpcyBjb21tYW5kLlwiLFxuICAgICksXG4gICk7XG5cbi8vIFRPRE8oQ0VTLTE4MTApOiBNYWtlIHRoZXNlIGNoZWNrcyBjb25jdXJyZW50IHRvIHNwZWVkIHVwIHRoZSBwcmVjb25kaXRpb25zIGNoZWNrIHBoYXNlXG5leHBvcnQgY29uc3QgcnVuSW5pdFByZWNvbmRpdGlvbnMgPSAocHJlc2VudGVyOiBDb21tYW5kUHJlc2VudGVyKSA9PlxuICB0cmFja1RlcnJhZm9ybUNsaUlzSW5zdGFsbGVkKHByZXNlbnRlcikuYW5kVGhlbigoKSA9PlxuICAgIHRyYWNrQ29yZXBhY2tJc0luc3RhbGxlZChwcmVzZW50ZXIpLFxuICApO1xuXG4vLyBUT0RPKENFUy0xODEwKTogTWFrZSB0aGVzZSBjaGVja3MgY29uY3VycmVudCB0byBzcGVlZCB1cCB0aGUgcHJlY29uZGl0aW9ucyBjaGVjayBwaGFzZVxuZXhwb3J0IGNvbnN0IHJ1bkFkZEVudmlyb25tZW50UHJlY29uZGl0aW9ucyA9IChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+XG4gIHRyYWNrVGVycmFmb3JtQ2xpSXNJbnN0YWxsZWQocHJlc2VudGVyKVxuICAgIC5hbmRUaGVuKCgpID0+IHRyYWNrQXpMb2dpbihwcmVzZW50ZXIpKVxuICAgIC5hbmRUaGVuKCgpID0+IHRyYWNrQ29yZXBhY2tJc0luc3RhbGxlZChwcmVzZW50ZXIpKTtcblxuY29uc3QgREVGQVVMVF9HSVRIVUJfUFVCTElTSF9DT05GSVJNQVRJT04gPSB0cnVlO1xuXG5leHBvcnQgY29uc3QgaW5pdENvbW1hbmRPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBuYW1lOiB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJSZXBvc2l0b3J5IG5hbWUgY2Fubm90IGJlIGVtcHR5XCIpLm9wdGlvbmFsKCksXG4gIG93bmVyOiB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJHaXRIdWIgb3duZXIgY2Fubm90IGJlIGVtcHR5XCIpLm9wdGlvbmFsKCksXG4gIHB1Ymxpc2g6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IHR5cGUgSW5pdENvbW1hbmRPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgaW5pdENvbW1hbmRPcHRpb25zU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IHBhcnNlSW5pdENvbW1hbmRPcHRpb25zID0gKGlucHV0OiB1bmtub3duKTogSW5pdENvbW1hbmRPcHRpb25zID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gaW5pdENvbW1hbmRPcHRpb25zU2NoZW1hLnNhZmVQYXJzZShpbnB1dCk7XG4gIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBpbml0IGNvbW1hbmQgb3B0aW9uczpcXG4ke3oucHJldHRpZnlFcnJvcihyZXN1bHQuZXJyb3IpfWAsXG4gICAgICB7XG4gICAgICAgIGNhdXNlOiByZXN1bHQuZXJyb3IsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TW9ub3JlcG9Jbml0aWFsQW5zd2VycyA9ICh7XG4gIGRlc2NyaXB0aW9uLFxuICBuYW1lLFxuICBvd25lcixcbiAgcHVibGlzaCxcbn06IEluaXRDb21tYW5kT3B0aW9ucyk6IEluaXRJbml0aWFsQW5zd2VycyA9PiB7XG4gIGNvbnN0IGluaXRpYWxBbnN3ZXJzOiBJbml0SW5pdGlhbEFuc3dlcnMgPSB7fTtcblxuICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICBpbml0aWFsQW5zd2Vycy5yZXBvRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGlmIChvd25lcikge1xuICAgIGluaXRpYWxBbnN3ZXJzLnJlcG9Pd25lciA9IG93bmVyO1xuICB9XG5cbiAgaWYgKG5hbWUpIHtcbiAgICBpbml0aWFsQW5zd2Vycy5yZXBvTmFtZSA9IG5hbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHB1Ymxpc2ggPT09IFwiYm9vbGVhblwiKSB7XG4gICAgaW5pdGlhbEFuc3dlcnMucHVibGlzaFRvR2l0SHViID0gcHVibGlzaDtcbiAgfVxuXG4gIHJldHVybiBpbml0aWFsQW5zd2Vycztcbn07XG5cbmNvbnN0IGNyZWF0ZVJlbW90ZVJlcG9zaXRvcnlXaXRoUHJlc2VudGVyID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcikgPT5cbiAgKHtcbiAgICByZXBvTmFtZSxcbiAgICByZXBvT3duZXIsXG4gIH06IE1vbm9yZXBvUGF5bG9hZCk6IFJlc3VsdEFzeW5jPFJlcG9zaXRvcnksIEVycm9yPiA9PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImR4LWNsaVwiLCBcImluaXRcIl0pO1xuICAgIGNvbnN0IHJlcG8kID0gdGYkKHsgY3dkOiBwYXRoLnJlc29sdmUoXCJpbmZyYVwiLCBcInJlcG9zaXRvcnlcIikgfSk7XG4gICAgY29uc3QgYXBwbHlUZXJyYWZvcm0gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZXBvJGB0ZXJyYWZvcm0gaW5pdGA7XG4gICAgICAgIGF3YWl0IHJlcG8kYHRlcnJhZm9ybSBhcHBseSAtYXV0by1hcHByb3ZlYDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEV4ZWNhRXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3Iuc2hvcnRNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0cmFja1N0ZXAoXG4gICAgICBwcmVzZW50ZXIsXG4gICAgICBcIkNyZWF0aW5nIEdpdEh1YiByZXBvc2l0b3J5Li4uXCIsXG4gICAgICBhcHBseVRlcnJhZm9ybSxcbiAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIEdpdEh1YiByZXBvc2l0b3J5LlwiKSxcbiAgICApLm1hcCgoKSA9PiBuZXcgUmVwb3NpdG9yeShyZXBvTmFtZSwgcmVwb093bmVyKSk7XG4gIH07XG4vKipcbiAqIEV4aXQgY29kZSByZXR1cm5lZCBieSBgZ2l0IHJlbW90ZSBhZGRgIHdoZW4gYSByZW1vdGUgd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWVcbiAqIGFscmVhZHkgZXhpc3RzLiBgZ2l0IHJlbW90ZWAgZG9jdW1lbnRzIHRoaXMgZGVkaWNhdGVkIHN0YXR1cyBjb2RlLCBzbyB3ZSBjYW5cbiAqIHR1cm4gaXQgaW50byBhY3Rpb25hYmxlIGd1aWRhbmNlIGluc3RlYWQgb2YgYSBnZW5lcmljIGZhaWx1cmUgbWVzc2FnZS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1yZW1vdGUjX2V4aXRfc3RhdHVzXG4gKi9cbmNvbnN0IEdJVF9SRU1PVEVfQUxSRUFEWV9FWElTVFNfRVhJVF9DT0RFID0gMztcblxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgZmFpbHVyZSBvZiB0aGUgZ2l0IHJlbW90ZSBzZXR1cCBzdGVwIGludG8gYW4gYWN0aW9uYWJsZSBlcnJvci5cbiAqXG4gKiBXaGVuIGBnaXQgcmVtb3RlIGFkZCBvcmlnaW5gIGV4aXRzIHdpdGggY29kZSAzIHRoZSByZW1vdGUgYWxyZWFkeSBleGlzdHMsXG4gKiB3aGljaCBpcyBhIHJlY292ZXJhYmxlIHNpdHVhdGlvbjogdGhlIG1lc3NhZ2UgdGVsbHMgdGhlIHVzZXIgaG93IHRvIGZpeCBpdC5cbiAqIFRoZSBvcmlnaW5hbCBFeGVjYUVycm9yIGlzIHByZXNlcnZlZCBhcyBgY2F1c2VgIHNvIGAtLXZlcmJvc2VgIHN0aWxsIHN1cmZhY2VzXG4gKiB0aGUgZXhpdCBjb2RlIGFuZCBnaXQncyBvd24gc3RkZXJyLlxuICovXG5leHBvcnQgY29uc3QgbWFwR2l0UmVtb3RlQWRkRXJyb3IgPSAoY2F1c2U6IHVua25vd24pOiBFcnJvciA9PiB7XG4gIGlmIChcbiAgICBjYXVzZSBpbnN0YW5jZW9mIEV4ZWNhRXJyb3IgJiZcbiAgICBjYXVzZS5leGl0Q29kZSA9PT0gR0lUX1JFTU9URV9BTFJFQURZX0VYSVNUU19FWElUX0NPREVcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgIFwiQSBnaXQgcmVtb3RlIG5hbWVkICdvcmlnaW4nIGFscmVhZHkgZXhpc3RzLiBSZW1vdmUgaXQgd2l0aCBgZ2l0IHJlbW90ZSByZW1vdmUgb3JpZ2luYCBhbmQgcnVuIHRoZSBjb21tYW5kIGFnYWluLCBvciBzdGFydCBmcm9tIGEgY2xlYW4gZGlyZWN0b3J5LlwiLFxuICAgICAgeyBjYXVzZSB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBcIkZhaWxlZCB0byBzZXQgdXAgdGhlIGxvY2FsIGdpdCByZXBvc2l0b3J5IGFuZCBpdHMgJ29yaWdpbicgcmVtb3RlLlwiLFxuICAgIHsgY2F1c2UgfSxcbiAgKTtcbn07XG5cbmNvbnN0IGluaXRpYWxpemVHaXRSZXBvc2l0b3J5V2l0aFByZXNlbnRlciA9XG4gIChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIpID0+IChyZXBvc2l0b3J5OiBSZXBvc2l0b3J5KSA9PiB7XG4gICAgY29uc3QgYnJhbmNoTmFtZSA9IFwiZmVhdHVyZXMvc2NhZmZvbGQtd29ya3NwYWNlXCI7XG4gICAgY29uc3QgZ2l0JCA9ICQoe1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgfSk7XG4gICAgLy8gYGdpdCByZW1vdGUgYWRkYCBpcyB0cmFja2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgcHVzaCBzbyBpdHMgZG9jdW1lbnRlZFxuICAgIC8vIGV4aXQgY29kZXMgKGUuZy4gMyA9IHJlbW90ZSBhbHJlYWR5IGV4aXN0cykgc3VyZmFjZSBhIHNwZWNpZmljLCBhY3Rpb25hYmxlXG4gICAgLy8gbWVzc2FnZSBpbnN0ZWFkIG9mIGJlaW5nIG1pc3JlcG9ydGVkIGFzIGEgcHVzaCBmYWlsdXJlLlxuICAgIGNvbnN0IGNvbmZpZ3VyZVJlbW90ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGdpdCRgZ2l0IGluaXRgO1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgcmVtb3RlIGFkZCBvcmlnaW4gJHtyZXBvc2l0b3J5Lm9yaWdpbn1gO1xuICAgIH07XG4gICAgY29uc3QgcHVzaFRvT3JpZ2luID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgZmV0Y2ggb3JpZ2luIG1haW5gO1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgY2hlY2tvdXQgLWIgJHticmFuY2hOYW1lfWA7XG4gICAgICAvLyBUZXJyYWZvcm0gY3JlYXRlcyBgbWFpbmAgd2l0aCBhbiBpbml0aWFsIFJFQURNRSBjb21taXQuXG4gICAgICAvLyBSZXNldCB0byBgb3JpZ2luL21haW5gIHNvIHRoaXMgYnJhbmNoIGlzIGJhc2VkIG9uIHRoZSByZW1vdGUgZGVmYXVsdCBicmFuY2gsXG4gICAgICAvLyB3aGlsZSBrZWVwaW5nIHRoZSBzY2FmZm9sZGVkIGxvY2FsIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUgZm9yIGEgY2xlYW4gUFIgZGlmZi5cbiAgICAgIGF3YWl0IGdpdCRgZ2l0IHJlc2V0IG9yaWdpbi9tYWluYDtcbiAgICAgIGF3YWl0IGdpdCRgZ2l0IGFkZCAuYDtcbiAgICAgIGF3YWl0IGdpdCRgZ2l0IGNvbW1pdCAtLW5vLWdwZy1zaWduIC1tIFwiU2NhZmZvbGQgd29ya3NwYWNlXCJgO1xuICAgICAgYXdhaXQgZ2l0JGBnaXQgcHVzaCAtdSBvcmlnaW4gJHticmFuY2hOYW1lfWA7XG4gICAgfTtcbiAgICByZXR1cm4gdHJhY2tTdGVwKFxuICAgICAgcHJlc2VudGVyLFxuICAgICAgXCJDb25maWd1cmluZyB0aGUgZ2l0IHJlbW90ZS4uLlwiLFxuICAgICAgY29uZmlndXJlUmVtb3RlLFxuICAgICAgbWFwR2l0UmVtb3RlQWRkRXJyb3IsXG4gICAgKVxuICAgICAgLmFuZFRoZW4oKCkgPT5cbiAgICAgICAgdHJhY2tTdGVwKFxuICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICBcIlB1c2hpbmcgY29kZSB0byBHaXRIdWIuLi5cIixcbiAgICAgICAgICBwdXNoVG9PcmlnaW4sXG4gICAgICAgICAgYXNFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvZGUgdG8gR2l0SHViLlwiKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKCkgPT4gKHsgYnJhbmNoTmFtZSwgcmVwb3NpdG9yeSB9KSk7XG4gIH07XG5cbmNvbnN0IGNyZWF0ZVB1bGxSZXF1ZXN0V2l0aFByZXNlbnRlciA9XG4gICh7IGdpdEh1YlNlcnZpY2UsIHByZXNlbnRlciB9OiBJbml0QWN0aW9uQ29udGV4dCkgPT5cbiAgKHtcbiAgICBicmFuY2hOYW1lLFxuICAgIHJlcG9zaXRvcnksXG4gIH06IExvY2FsV29ya3NwYWNlKTogUmVzdWx0QXN5bmM8UHVsbFJlcXVlc3QgfCB1bmRlZmluZWQsIEVycm9yPiA9PlxuICAgIHRyYWNrU3RlcChcbiAgICAgIHByZXNlbnRlcixcbiAgICAgIFwiQ3JlYXRpbmcgUHVsbCBSZXF1ZXN0Li4uXCIsXG4gICAgICAoKSA9PlxuICAgICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZVB1bGxSZXF1ZXN0KHtcbiAgICAgICAgICBiYXNlOiBcIm1haW5cIixcbiAgICAgICAgICBib2R5OiBcIlRoaXMgUFIgY29udGFpbnMgdGhlIHNjYWZmb2xkZWQgbW9ub3JlcG8gc3RydWN0dXJlLlwiLFxuICAgICAgICAgIGhlYWQ6IGJyYW5jaE5hbWUsXG4gICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnkub3duZXIsXG4gICAgICAgICAgcmVwbzogcmVwb3NpdG9yeS5uYW1lLFxuICAgICAgICAgIHRpdGxlOiBcIlNjYWZmb2xkIHJlcG9zaXRvcnlcIixcbiAgICAgICAgfSksXG4gICAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBQdWxsIFJlcXVlc3QuXCIpLFxuICAgIClcbiAgICAgIC8vIElmIFBSIGNyZWF0aW9uIGZhaWxzLCBkb24ndCBibG9jayB0aGUgd29ya2Zsb3dcbiAgICAgIC5vckVsc2UoKCkgPT4gb2tBc3luYyh1bmRlZmluZWQpKTtcblxuY29uc3QgaGFuZGxlTmV3R2l0SHViUmVwb3NpdG9yeVdpdGhQcmVzZW50ZXIgPVxuICAoY29udGV4dDogSW5pdEFjdGlvbkNvbnRleHQpID0+XG4gIChwYXlsb2FkOiBNb25vcmVwb1BheWxvYWQpOiBSZXN1bHRBc3luYzxSZXBvc2l0b3J5UHVsbFJlcXVlc3QsIEVycm9yPiA9PlxuICAgIGNyZWF0ZVJlbW90ZVJlcG9zaXRvcnlXaXRoUHJlc2VudGVyKGNvbnRleHQucHJlc2VudGVyKShwYXlsb2FkKVxuICAgICAgLmFuZFRoZW4oaW5pdGlhbGl6ZUdpdFJlcG9zaXRvcnlXaXRoUHJlc2VudGVyKGNvbnRleHQucHJlc2VudGVyKSlcbiAgICAgIC5hbmRUaGVuKChsb2NhbFdvcmtzcGFjZSkgPT5cbiAgICAgICAgY3JlYXRlUHVsbFJlcXVlc3RXaXRoUHJlc2VudGVyKGNvbnRleHQpKGxvY2FsV29ya3NwYWNlKS5tYXAoKHByKSA9PiAoe1xuICAgICAgICAgIHByLFxuICAgICAgICAgIHJlcG9zaXRvcnk6IGxvY2FsV29ya3NwYWNlLnJlcG9zaXRvcnksXG4gICAgICAgIH0pKSxcbiAgICAgICk7XG5cbmNvbnN0IGhhbmRsZUdlbmVyYXRvckVycm9yID0gKGVycjogdW5rbm93bikgPT4ge1xuICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZHgtY2xpXCIsIFwiaW5pdFwiXSk7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihcIkZhaWxlZCB0byBydW4gdGhlIGdlbmVyYXRvclwiLCB7IGNhdXNlOiBlcnIgfSk7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdoZXRoZXIgdGhlIHNjYWZmb2xkZWQgcmVwb3NpdG9yeSBzaG91bGQgYmUgcHVibGlzaGVkIHRvIEdpdEh1Yi5cbiAqXG4gKiBXaGVuIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB0aGUgYW5zd2VyIChlLmcuIHRoZSB1c2VyIHBhc3NlZCBgLS1wdWJsaXNoYFxuICogb24gdGhlIGNvbW1hbmQgbGluZSksIHRoYXQgdmFsdWUgaXMgdXNlZCBhcy1pcyBhbmQgbm8gcHJvbXB0IGlzIHNob3duLiBXaGVuXG4gKiB0aGUgcHJlZmVyZW5jZSBpcyBsZWZ0IHVuZGVmaW5lZCAoZmxhZyBvbWl0dGVkKSwgdGhlIHVzZXIgaXMgYXNrZWRcbiAqIGludGVyYWN0aXZlbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBjb25maXJtR2l0SHViUmVwb0NyZWF0aW9uID0gKFxuICBwYXlsb2FkOiBNb25vcmVwb1BheWxvYWQsXG4gIHB1Ymxpc2hQcmVmZXJlbmNlPzogYm9vbGVhbixcbik6IFJlc3VsdEFzeW5jPGJvb2xlYW4sIEVycm9yPiA9PlxuICAvLyBBIHByZWZlcmVuY2UgcHJvdmlkZWQgdXAtZnJvbnQgKHZpYSBgLS1wdWJsaXNoYCkgc2tpcHMgdGhlIGludGVyYWN0aXZlIHByb21wdC5cbiAgcHVibGlzaFByZWZlcmVuY2UgIT09IHVuZGVmaW5lZFxuICAgID8gb2tBc3luYyhwdWJsaXNoUHJlZmVyZW5jZSlcbiAgICA6IFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICBpbnF1aXJlci5wcm9tcHQoe1xuICAgICAgICAgIGRlZmF1bHQ6IERFRkFVTFRfR0lUSFVCX1BVQkxJU0hfQ09ORklSTUFUSU9OLFxuICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgcHJvamVjdCBpcyBjcmVhdGVkIG9uICR7Y2hhbGsuZ3JlZW4ocGF5bG9hZC5yZXBvTmFtZSl9LiBXb3VsZCB5b3UgbGlrZSB0byBwdWJsaXNoIGl0IHRvIEdpdEh1YiBhdCAke2NoYWxrLmdyZWVuKGAke3BheWxvYWQucmVwb093bmVyfS8ke3BheWxvYWQucmVwb05hbWV9YCl9IG5vdz9gLFxuICAgICAgICAgIG5hbWU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgKGNhdXNlKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcIkZhaWxlZCB0byByZWFkIEdpdEh1YiBwdWJsaXNoIGNvbmZpcm1hdGlvblwiLCB7IGNhdXNlIH0pLFxuICAgICAgKS5hbmRUaGVuKChhbnN3ZXIpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkQW5zd2VyID0gelxuICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgY29uZmlybTogei5ib29sZWFuKCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2FmZVBhcnNlKGFuc3dlcik7XG4gICAgICAgIGlmICghcGFyc2VkQW5zd2VyLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXCJJbnZhbGlkIEdpdEh1YiBwdWJsaXNoIGNvbmZpcm1hdGlvblwiLCB7XG4gICAgICAgICAgICAgIGNhdXNlOiBwYXJzZWRBbnN3ZXIuZXJyb3IsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9rQXN5bmMocGFyc2VkQW5zd2VyLmRhdGEuY29uZmlybSk7XG4gICAgICB9KTtcblxuY29uc3QgcnVuSW5pdEFjdGlvbiA9ICh7XG4gIGdpdEh1YlNlcnZpY2UsXG4gIGluaXRpYWxBbnN3ZXJzID0ge30sXG4gIHByZXNlbnRlcixcbn06IEluaXRBY3Rpb25Db250ZXh0KTogUmVzdWx0QXN5bmM8U3VtbWFyeUlucHV0LCBFcnJvcj4gPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hUb0dpdEh1YiwgLi4ubW9ub3JlcG9Jbml0aWFsQW5zd2VycyB9ID0gaW5pdGlhbEFuc3dlcnM7XG5cbiAgcmV0dXJuIHRyYWNrU3RlcChcbiAgICBwcmVzZW50ZXIsXG4gICAgXCJJbml0aWFsaXppbmcgd29ya3NwYWNlIGdlbmVyYXRvci4uLlwiLFxuICAgIGdldFBsb3BJbnN0YW5jZSxcbiAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgcGxvcFwiKSxcbiAgKVxuICAgIC5hbmRUaGVuKChwbG9wKSA9PlxuICAgICAgLy8gVGhlIHByb21wdCBwaGFzZSBtdXN0IHJ1biBvdXRzaWRlIHRyYWNrU3RlcDogaW4gdGV4dCBtb2RlIHRyYWNrU3RlcFxuICAgICAgLy8gcmVuZGVycyBhIHNwaW5uZXIgdGhhdCBvY2N1cGllcyB0aGUgVFRZIGFuZCBoaWRlcyB0aGUgcHJvbXB0cy5cbiAgICAgIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICBjb2xsZWN0TW9ub3JlcG9QYXlsb2FkKHBsb3AsIGdpdEh1YlNlcnZpY2UsIG1vbm9yZXBvSW5pdGlhbEFuc3dlcnMpLFxuICAgICAgICBoYW5kbGVHZW5lcmF0b3JFcnJvcixcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUaGVuKCh7IGdlbmVyYXRvciwgcGF5bG9hZCB9KSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiU2NhZmZvbGRpbmcgd29ya3NwYWNlLi4uXCIsXG4gICAgICAgICgpID0+IHJ1bk1vbm9yZXBvQWN0aW9ucyhnZW5lcmF0b3IsIHBheWxvYWQpLFxuICAgICAgICBoYW5kbGVHZW5lcmF0b3JFcnJvcixcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUZWUoKHBheWxvYWQpID0+IHtcbiAgICAgIHByb2Nlc3MuY2hkaXIocGF5bG9hZC5yZXBvTmFtZSk7XG4gICAgfSlcbiAgICAuYW5kVGhlbigocGF5bG9hZCkgPT5cbiAgICAgIGNvbmZpcm1HaXRIdWJSZXBvQ3JlYXRpb24ocGF5bG9hZCwgcHVibGlzaFRvR2l0SHViKS5hbmRUaGVuPFxuICAgICAgICBTdW1tYXJ5SW5wdXQsXG4gICAgICAgIEVycm9yXG4gICAgICA+KChjb25maXJtZWQpID0+XG4gICAgICAgIGNvbmZpcm1lZFxuICAgICAgICAgID8gaGFuZGxlTmV3R2l0SHViUmVwb3NpdG9yeVdpdGhQcmVzZW50ZXIoe1xuICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgICAgICB9KShwYXlsb2FkKVxuICAgICAgICAgIDogb2tBc3luYyh7IGdpdEh1YlJlcG9DcmVhdGlvblNraXBwZWQ6IHRydWUsIHBheWxvYWQgfSksXG4gICAgICApLFxuICAgICk7XG59O1xuXG5jb25zdCByZXBvcnRTdW1tYXJ5ID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlciwgb3V0cHV0TW9kZTogXCJqc29uXCIgfCBcInRleHRcIikgPT5cbiAgKHJlc3VsdDogU3VtbWFyeUlucHV0KSA9PiB7XG4gICAgaWYgKG91dHB1dE1vZGUgPT09IFwianNvblwiKSB7XG4gICAgICBwcmVzZW50ZXIucmVwb3J0UmVzdWx0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BsYXlTdW1tYXJ5KHJlc3VsdCk7XG4gICAgfVxuICB9O1xuXG5leHBvcnQgY29uc3QgbWFrZUluaXRDb21tYW5kID0gKFxuICByZXF1aXJlR2l0SHViQXV0aDogR2l0SHViQXV0aEZhY3RvcnksXG4gIGVudjogQ2xpRW52LFxuKTogQ29tbWFuZCA9PlxuICBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUoXCJpbml0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiSW5pdGlhbGl6ZSBhIG5ldyBEWCB3b3Jrc3BhY2VcIilcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oXCItLW5hbWUgPG5hbWU+XCIsIFwiUmVwb3NpdG9yeSBuYW1lXCIpKVxuICAgIC5hZGRPcHRpb24oXG4gICAgICBuZXcgT3B0aW9uKFxuICAgICAgICBcIi0tb3duZXIgPG93bmVyPlwiLFxuICAgICAgICBcIkdpdEh1YiBvcmdhbml6YXRpb24gb3IgdXNlciB0aGF0IHdpbGwgb3duIHRoZSByZXBvc2l0b3J5XCIsXG4gICAgICApLFxuICAgIClcbiAgICAuYWRkT3B0aW9uKFxuICAgICAgbmV3IE9wdGlvbihcIi0tZGVzY3JpcHRpb24gPGRlc2NyaXB0aW9uPlwiLCBcIlJlcG9zaXRvcnkgZGVzY3JpcHRpb25cIiksXG4gICAgKVxuICAgIC5hZGRPcHRpb24oXG4gICAgICBuZXcgT3B0aW9uKFxuICAgICAgICBcIi0tcHVibGlzaFwiLFxuICAgICAgICBcIlB1Ymxpc2ggdGhlIHNjYWZmb2xkZWQgcmVwb3NpdG9yeSB0byBHaXRIdWIgd2l0aG91dCBwcm9tcHRpbmdcIixcbiAgICAgICkuZGVmYXVsdCh1bmRlZmluZWQpLFxuICAgIClcbiAgICAuYWN0aW9uKGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiB1bmtub3duKSB7XG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgIGNvbnN0IG91dHB1dE1vZGUgPSByZXNvbHZlT3V0cHV0TW9kZShlbnYsIG91dHB1dCk7XG4gICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICBhd2FpdCBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBwYXJzZUluaXRDb21tYW5kT3B0aW9ucyhvcHRpb25zKSksXG4gICAgICAgIChjYXVzZSkgPT5cbiAgICAgICAgICBjYXVzZSBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGNhdXNlXG4gICAgICAgICAgICA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpbml0IGNvbW1hbmQgb3B0aW9uc1wiLCB7IGNhdXNlIH0pLFxuICAgICAgKVxuICAgICAgICAuYW5kVGhlbigoaW5pdE9wdGlvbnMpID0+XG4gICAgICAgICAgcnVuSW5pdFByZWNvbmRpdGlvbnMocHJlc2VudGVyKVxuICAgICAgICAgICAgLmFuZFRoZW4oKCkgPT4gcmVxdWlyZUdpdEh1YkF1dGgoKSlcbiAgICAgICAgICAgIC5hbmRUaGVuKChhdXRoKSA9PlxuICAgICAgICAgICAgICBydW5Jbml0QWN0aW9uKHtcbiAgICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlOiBhdXRoLmdpdEh1YlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgaW5pdGlhbEFuc3dlcnM6IGdldE1vbm9yZXBvSW5pdGlhbEFuc3dlcnMoaW5pdE9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5tYXRjaChcbiAgICAgICAgICByZXBvcnRTdW1tYXJ5KHByZXNlbnRlciwgb3V0cHV0TW9kZSksXG4gICAgICAgICAgcmVwb3J0Q29tbWFuZEVycm9yKHRoaXMsIHByZXNlbnRlciwgb3V0cHV0TW9kZSksXG4gICAgICAgICk7XG4gICAgfSk7XG4iXX0=
|
|
@@ -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==
|