@pagopa/dx-cli 0.15.2 → 0.15.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.
Files changed (195) hide show
  1. package/bin/index.js +8 -1280
  2. package/dist/adapters/azure/__tests__/cloud-account-repository.test.d.ts +1 -0
  3. package/dist/adapters/azure/__tests__/cloud-account-repository.test.js +95 -0
  4. package/dist/adapters/azure/__tests__/cloud-account-service.test.d.ts +1 -0
  5. package/dist/adapters/azure/__tests__/cloud-account-service.test.js +95 -0
  6. package/dist/adapters/azure/cloud-account-repository.d.ts +12 -0
  7. package/dist/adapters/azure/cloud-account-repository.js +23 -0
  8. package/dist/adapters/azure/cloud-account-service.d.ts +22 -0
  9. package/dist/adapters/azure/cloud-account-service.js +255 -0
  10. package/dist/adapters/azure/locations.d.ts +7 -0
  11. package/dist/adapters/azure/locations.js +21 -0
  12. package/dist/adapters/codemods/__tests__/registry.test.d.ts +1 -0
  13. package/dist/adapters/codemods/__tests__/registry.test.js +59 -0
  14. package/dist/adapters/codemods/__tests__/use-azure-appsvc.test.d.ts +1 -0
  15. package/dist/adapters/codemods/__tests__/use-azure-appsvc.test.js +77 -0
  16. package/dist/adapters/codemods/__tests__/use-pnpm.test.d.ts +1 -0
  17. package/dist/adapters/codemods/__tests__/use-pnpm.test.js +148 -0
  18. package/dist/adapters/codemods/git.d.ts +2 -0
  19. package/dist/adapters/codemods/git.js +18 -0
  20. package/dist/adapters/codemods/index.d.ts +3 -0
  21. package/dist/adapters/codemods/index.js +9 -0
  22. package/dist/adapters/codemods/registry.d.ts +8 -0
  23. package/dist/adapters/codemods/registry.js +16 -0
  24. package/dist/adapters/codemods/update-code-review.d.ts +3 -0
  25. package/dist/adapters/codemods/update-code-review.js +60 -0
  26. package/dist/adapters/codemods/use-azure-appsvc.d.ts +3 -0
  27. package/dist/adapters/codemods/use-azure-appsvc.js +84 -0
  28. package/dist/adapters/codemods/use-pnpm.d.ts +22 -0
  29. package/dist/adapters/codemods/use-pnpm.js +214 -0
  30. package/dist/adapters/codemods/yaml.d.ts +2 -0
  31. package/dist/adapters/codemods/yaml.js +8 -0
  32. package/dist/adapters/commander/commands/codemod.d.ts +8 -0
  33. package/dist/adapters/commander/commands/codemod.js +22 -0
  34. package/dist/adapters/commander/commands/doctor.d.ts +4 -0
  35. package/dist/adapters/commander/commands/doctor.js +12 -0
  36. package/dist/adapters/commander/commands/info.d.ts +3 -0
  37. package/dist/adapters/commander/commands/info.js +9 -0
  38. package/dist/adapters/commander/commands/init.d.ts +7 -0
  39. package/dist/adapters/commander/commands/init.js +126 -0
  40. package/dist/adapters/commander/commands/savemoney.d.ts +2 -0
  41. package/dist/adapters/commander/commands/savemoney.js +26 -0
  42. package/dist/adapters/commander/index.d.ts +7 -0
  43. package/dist/adapters/commander/index.js +19 -0
  44. package/dist/adapters/execa/terraform.d.ts +27 -0
  45. package/dist/adapters/execa/terraform.js +28 -0
  46. package/dist/adapters/github/__tests__/github-repo.spec.d.ts +1 -0
  47. package/dist/adapters/github/__tests__/github-repo.spec.js +67 -0
  48. package/dist/adapters/github/github-repo.d.ts +2 -0
  49. package/dist/adapters/github/github-repo.js +31 -0
  50. package/dist/adapters/logtape/validation-reporter.d.ts +2 -0
  51. package/dist/adapters/logtape/validation-reporter.js +14 -0
  52. package/dist/adapters/node/__tests__/data.d.ts +18 -0
  53. package/dist/adapters/node/__tests__/data.js +22 -0
  54. package/dist/adapters/node/__tests__/package-json.test.d.ts +1 -0
  55. package/dist/adapters/node/__tests__/package-json.test.js +86 -0
  56. package/dist/adapters/node/__tests__/repository.test.d.ts +1 -0
  57. package/dist/adapters/node/__tests__/repository.test.js +77 -0
  58. package/dist/adapters/node/fs/__tests__/file-reader.test.d.ts +1 -0
  59. package/dist/adapters/node/fs/__tests__/file-reader.test.js +80 -0
  60. package/dist/adapters/node/fs/file-reader.d.ts +24 -0
  61. package/dist/adapters/node/fs/file-reader.js +26 -0
  62. package/dist/adapters/node/json/__tests__/index.test.d.ts +1 -0
  63. package/dist/adapters/node/json/__tests__/index.test.js +14 -0
  64. package/dist/adapters/node/json/index.d.ts +2 -0
  65. package/dist/adapters/node/json/index.js +2 -0
  66. package/dist/adapters/node/package-json.d.ts +2 -0
  67. package/dist/adapters/node/package-json.js +22 -0
  68. package/dist/adapters/node/release.d.ts +2 -0
  69. package/dist/adapters/node/release.js +33 -0
  70. package/dist/adapters/node/repository.d.ts +2 -0
  71. package/dist/adapters/node/repository.js +47 -0
  72. package/dist/adapters/octokit/__tests__/index.test.d.ts +1 -0
  73. package/dist/adapters/octokit/__tests__/index.test.js +197 -0
  74. package/dist/adapters/octokit/index.d.ts +24 -0
  75. package/dist/adapters/octokit/index.js +65 -0
  76. package/dist/adapters/plop/actions/__tests__/init-cloud-accounts.test.d.ts +1 -0
  77. package/dist/adapters/plop/actions/__tests__/init-cloud-accounts.test.js +115 -0
  78. package/dist/adapters/plop/actions/__tests__/provision-terraform-backend.test.d.ts +1 -0
  79. package/dist/adapters/plop/actions/__tests__/provision-terraform-backend.test.js +116 -0
  80. package/dist/adapters/plop/actions/fetch-github-release.d.ts +12 -0
  81. package/dist/adapters/plop/actions/fetch-github-release.js +20 -0
  82. package/dist/adapters/plop/actions/get-node-version.d.ts +2 -0
  83. package/dist/adapters/plop/actions/get-node-version.js +9 -0
  84. package/dist/adapters/plop/actions/get-terraform-backend.d.ts +3 -0
  85. package/dist/adapters/plop/actions/get-terraform-backend.js +17 -0
  86. package/dist/adapters/plop/actions/init-cloud-accounts.d.ts +5 -0
  87. package/dist/adapters/plop/actions/init-cloud-accounts.js +13 -0
  88. package/dist/adapters/plop/actions/provision-terraform-backend.d.ts +10 -0
  89. package/dist/adapters/plop/actions/provision-terraform-backend.js +16 -0
  90. package/dist/adapters/plop/actions/semver.d.ts +19 -0
  91. package/dist/adapters/plop/actions/semver.js +27 -0
  92. package/dist/adapters/plop/actions/setup-pnpm.d.ts +2 -0
  93. package/dist/adapters/plop/actions/setup-pnpm.js +26 -0
  94. package/dist/adapters/plop/generators/environment/__tests__/actions.test.d.ts +2 -0
  95. package/dist/adapters/plop/generators/environment/__tests__/actions.test.js +55 -0
  96. package/dist/adapters/plop/generators/environment/actions.d.ts +2 -0
  97. package/dist/adapters/plop/generators/environment/actions.js +54 -0
  98. package/dist/adapters/plop/generators/environment/index.d.ts +3 -0
  99. package/dist/adapters/plop/generators/environment/index.js +19 -0
  100. package/dist/adapters/plop/generators/environment/prompts.d.ts +66 -0
  101. package/dist/adapters/plop/generators/environment/prompts.js +166 -0
  102. package/dist/adapters/plop/generators/monorepo/actions.d.ts +51 -0
  103. package/dist/adapters/plop/generators/monorepo/actions.js +35 -0
  104. package/dist/adapters/plop/generators/monorepo/index.d.ts +6 -0
  105. package/dist/adapters/plop/generators/monorepo/index.js +17 -0
  106. package/dist/adapters/plop/generators/monorepo/prompts.d.ts +10 -0
  107. package/dist/adapters/plop/generators/monorepo/prompts.js +31 -0
  108. package/dist/adapters/plop/helpers/__tests__/resource-prefix.test.d.ts +1 -0
  109. package/dist/adapters/plop/helpers/__tests__/resource-prefix.test.js +113 -0
  110. package/dist/adapters/plop/helpers/env-short.d.ts +3 -0
  111. package/dist/adapters/plop/helpers/env-short.js +9 -0
  112. package/dist/adapters/plop/helpers/resource-prefix.d.ts +5 -0
  113. package/dist/adapters/plop/helpers/resource-prefix.js +18 -0
  114. package/dist/adapters/plop/index.d.ts +8 -0
  115. package/dist/adapters/plop/index.js +24 -0
  116. package/dist/adapters/terraform/fmt.d.ts +1 -0
  117. package/dist/adapters/terraform/fmt.js +17 -0
  118. package/dist/adapters/yaml/__tests__/index.test.d.ts +1 -0
  119. package/dist/adapters/yaml/__tests__/index.test.js +53 -0
  120. package/dist/adapters/yaml/index.d.ts +8 -0
  121. package/dist/adapters/yaml/index.js +9 -0
  122. package/dist/adapters/zod/index.d.ts +23 -0
  123. package/dist/adapters/zod/index.js +22 -0
  124. package/dist/config.d.ts +6 -0
  125. package/dist/config.js +5 -0
  126. package/dist/domain/__tests__/data.d.ts +17 -0
  127. package/dist/domain/__tests__/data.js +27 -0
  128. package/dist/domain/__tests__/environment.test.d.ts +1 -0
  129. package/dist/domain/__tests__/environment.test.js +282 -0
  130. package/dist/domain/__tests__/info.test.d.ts +1 -0
  131. package/dist/domain/__tests__/info.test.js +77 -0
  132. package/dist/domain/__tests__/package-json.test.d.ts +1 -0
  133. package/dist/domain/__tests__/package-json.test.js +39 -0
  134. package/dist/domain/__tests__/repository.test.d.ts +1 -0
  135. package/dist/domain/__tests__/repository.test.js +101 -0
  136. package/dist/domain/__tests__/workspace.test.d.ts +1 -0
  137. package/dist/domain/__tests__/workspace.test.js +57 -0
  138. package/dist/domain/cloud-account.d.ts +28 -0
  139. package/dist/domain/cloud-account.js +12 -0
  140. package/dist/domain/codemod.d.ts +11 -0
  141. package/dist/domain/codemod.js +1 -0
  142. package/dist/domain/dependencies.d.ts +10 -0
  143. package/dist/domain/dependencies.js +1 -0
  144. package/dist/domain/doctor.d.ts +10 -0
  145. package/dist/domain/doctor.js +50 -0
  146. package/dist/domain/environment.d.ts +40 -0
  147. package/dist/domain/environment.js +57 -0
  148. package/dist/domain/github-repo.d.ts +6 -0
  149. package/dist/domain/github-repo.js +8 -0
  150. package/dist/domain/github.d.ts +37 -0
  151. package/dist/domain/github.js +29 -0
  152. package/dist/domain/info.d.ts +11 -0
  153. package/dist/domain/info.js +52 -0
  154. package/dist/domain/package-json.d.ts +42 -0
  155. package/dist/domain/package-json.js +69 -0
  156. package/dist/domain/remote-backend.d.ts +8 -0
  157. package/dist/domain/remote-backend.js +9 -0
  158. package/dist/domain/repository.d.ts +13 -0
  159. package/dist/domain/repository.js +72 -0
  160. package/dist/domain/validation.d.ts +16 -0
  161. package/dist/domain/validation.js +1 -0
  162. package/dist/domain/workspace.d.ts +9 -0
  163. package/dist/domain/workspace.js +32 -0
  164. package/dist/index.d.ts +2 -0
  165. package/dist/index.js +35 -0
  166. package/dist/use-cases/__tests__/apply-codemod.test.d.ts +1 -0
  167. package/dist/use-cases/__tests__/apply-codemod.test.js +73 -0
  168. package/dist/use-cases/__tests__/list-codemods.test.d.ts +1 -0
  169. package/dist/use-cases/__tests__/list-codemods.test.js +38 -0
  170. package/dist/use-cases/apply-codemod.d.ts +5 -0
  171. package/dist/use-cases/apply-codemod.js +14 -0
  172. package/dist/use-cases/list-codemods.d.ts +4 -0
  173. package/dist/use-cases/list-codemods.js +1 -0
  174. package/package.json +18 -7
  175. package/templates/environment/bootstrapper/{{env.name}}/data.tf.hbs +13 -0
  176. package/templates/environment/bootstrapper/{{env.name}}/main.tf.hbs +70 -0
  177. package/templates/environment/bootstrapper/{{env.name}}/providers.tf.hbs +26 -0
  178. package/templates/environment/core/{{env.name}}/main.tf.hbs +21 -0
  179. package/templates/environment/core/{{env.name}}/outputs.tf.hbs +8 -0
  180. package/templates/environment/core/{{env.name}}/providers.tf.hbs +21 -0
  181. package/templates/environment/shared/backend.tf.hbs +14 -0
  182. package/templates/environment/shared/locals.tf.hbs +26 -0
  183. package/templates/monorepo/.editorconfig +8 -0
  184. package/templates/monorepo/.node-version.hbs +1 -0
  185. package/templates/monorepo/.pre-commit-config.yaml.hbs +34 -0
  186. package/templates/monorepo/.prettierignore +5 -0
  187. package/templates/monorepo/.terraform-version.hbs +1 -0
  188. package/templates/monorepo/.trivyignore +16 -0
  189. package/templates/monorepo/README.md.hbs +163 -0
  190. package/templates/monorepo/infra/repository/main.tf.hbs +11 -0
  191. package/templates/monorepo/infra/repository/outputs.tf.hbs +11 -0
  192. package/templates/monorepo/infra/repository/providers.tf.hbs +13 -0
  193. package/templates/monorepo/package.json.hbs +7 -0
  194. package/templates/monorepo/pnpm-workspace.yaml +7 -0
  195. package/templates/monorepo/turbo.json +29 -0
@@ -0,0 +1,113 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { resourcePrefix } from "../resource-prefix.js";
3
+ const createMockPayload = (overrides = {}) => ({
4
+ env: {
5
+ cloudAccounts: [],
6
+ name: "dev",
7
+ prefix: "dx",
8
+ },
9
+ workspace: {
10
+ domain: "",
11
+ },
12
+ ...overrides,
13
+ });
14
+ describe("resourcePrefix", () => {
15
+ it("should return prefix with env prefix and environment short code when domain is empty", () => {
16
+ const payload = createMockPayload({
17
+ env: {
18
+ cloudAccounts: [],
19
+ name: "dev",
20
+ prefix: "dx",
21
+ },
22
+ workspace: {
23
+ domain: "",
24
+ },
25
+ });
26
+ const result = resourcePrefix(payload);
27
+ expect(result).toBe("dx-d");
28
+ });
29
+ it("should return prefix with env prefix, environment short code, and domain when domain is provided", () => {
30
+ const payload = createMockPayload({
31
+ env: {
32
+ cloudAccounts: [],
33
+ name: "dev",
34
+ prefix: "dx",
35
+ },
36
+ workspace: {
37
+ domain: "api",
38
+ },
39
+ });
40
+ const result = resourcePrefix(payload);
41
+ expect(result).toBe("dx-d-api");
42
+ });
43
+ it("should handle prod environment with short code 'p'", () => {
44
+ const payload = createMockPayload({
45
+ env: {
46
+ cloudAccounts: [],
47
+ name: "prod",
48
+ prefix: "pgo",
49
+ },
50
+ workspace: {
51
+ domain: "core",
52
+ },
53
+ });
54
+ const result = resourcePrefix(payload);
55
+ expect(result).toBe("pgo-p-core");
56
+ });
57
+ it("should handle uat environment with short code 'u'", () => {
58
+ const payload = createMockPayload({
59
+ env: {
60
+ cloudAccounts: [],
61
+ name: "uat",
62
+ prefix: "test",
63
+ },
64
+ workspace: {
65
+ domain: "web",
66
+ },
67
+ });
68
+ const result = resourcePrefix(payload);
69
+ expect(result).toBe("test-u-web");
70
+ });
71
+ it("should convert result to lowercase", () => {
72
+ const payload = createMockPayload({
73
+ env: {
74
+ cloudAccounts: [
75
+ {
76
+ csp: "azure",
77
+ defaultLocation: "westeurope",
78
+ displayName: "Test Account",
79
+ id: "test-account-id",
80
+ },
81
+ ],
82
+ name: "prod",
83
+ prefix: "UPPER",
84
+ },
85
+ workspace: {
86
+ domain: "DOMAIN",
87
+ },
88
+ });
89
+ const result = resourcePrefix(payload);
90
+ expect(result).toBe("upper-p-domain");
91
+ });
92
+ it("should handle different prefix lengths", () => {
93
+ const payload = createMockPayload({
94
+ env: {
95
+ cloudAccounts: [
96
+ {
97
+ csp: "azure",
98
+ defaultLocation: "westeurope",
99
+ displayName: "Test Account",
100
+ id: "test-account-id",
101
+ },
102
+ ],
103
+ name: "dev",
104
+ prefix: "ab",
105
+ },
106
+ workspace: {
107
+ domain: "",
108
+ },
109
+ });
110
+ const result = resourcePrefix(payload);
111
+ expect(result).toBe("ab-d");
112
+ });
113
+ });
@@ -0,0 +1,3 @@
1
+ import { type NodePlopAPI } from "node-plop";
2
+ declare const _default: (plop: NodePlopAPI) => void;
3
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import * as assert from "node:assert/strict";
2
+ import { environmentSchema, environmentShort, } from "../../../domain/environment.js";
3
+ export default (plop) => {
4
+ plop.setHelper("envShort", (ctx) => {
5
+ const result = environmentSchema.shape.name.safeParse(ctx);
6
+ assert.ok(result.success, "envShort: Invalid Environment name provided");
7
+ return environmentShort[result.data];
8
+ });
9
+ };
@@ -0,0 +1,5 @@
1
+ import { type NodePlopAPI } from "node-plop";
2
+ import { Payload } from "../generators/environment/prompts.js";
3
+ export declare const resourcePrefix: (payload: Pick<Payload, "env" | "workspace">) => string;
4
+ declare const _default: (plop: NodePlopAPI) => void;
5
+ export default _default;
@@ -0,0 +1,18 @@
1
+ import * as assert from "node:assert/strict";
2
+ import { environmentShort } from "../../../domain/environment.js";
3
+ import { payloadSchema } from "../generators/environment/prompts.js";
4
+ export const resourcePrefix = (payload) => {
5
+ const { env, workspace } = payload;
6
+ const prefix = [env.prefix, environmentShort[env.name]];
7
+ if (workspace.domain) {
8
+ prefix.push(workspace.domain);
9
+ }
10
+ return prefix.join("-").toLowerCase();
11
+ };
12
+ export default (plop) => {
13
+ plop.setHelper("resourcePrefix", (ctx) => {
14
+ const result = payloadSchema.safeParse(ctx);
15
+ assert.ok(result.success, "resourcePrefix: Invalid payload provided");
16
+ return resourcePrefix(result.data);
17
+ });
18
+ };
@@ -0,0 +1,8 @@
1
+ import type { NodePlopAPI } from "plop";
2
+ import { Result, ResultAsync } from "neverthrow";
3
+ import { PlopGenerator } from "node-plop";
4
+ export declare const initPlop: () => ResultAsync<NodePlopAPI, Error>;
5
+ export declare const getGenerator: (plopAPI: NodePlopAPI) => (name: string) => Result<PlopGenerator, Error>;
6
+ export declare const getPrompts: (generator: PlopGenerator) => ResultAsync<any, Error>;
7
+ export declare const setMonorepoGenerator: (plop: NodePlopAPI) => void;
8
+ export declare const setDeploymentEnvironmentGenerator: (plop: NodePlopAPI) => void;
@@ -0,0 +1,24 @@
1
+ import { DefaultAzureCredential } from "@azure/identity";
2
+ import { Result, ResultAsync } from "neverthrow";
3
+ import nodePlop from "node-plop";
4
+ import path from "node:path";
5
+ import { Octokit } from "octokit";
6
+ import { AzureSubscriptionRepository } from "../azure/cloud-account-repository.js";
7
+ import { AzureCloudAccountService } from "../azure/cloud-account-service.js";
8
+ import createDeploymentEnvironmentGenerator from "../plop/generators/environment/index.js";
9
+ import createMonorepoGenerator from "../plop/generators/monorepo/index.js";
10
+ export const initPlop = () => ResultAsync.fromPromise(nodePlop(), () => new Error("Failed to initialize plop"));
11
+ export const getGenerator = (plopAPI) => Result.fromThrowable(plopAPI.getGenerator, () => new Error("Generator not found"));
12
+ export const getPrompts = (generator) => ResultAsync.fromPromise(generator.runPrompts(), (cause) => new Error("Failed to run the generator prompts", { cause }));
13
+ export const setMonorepoGenerator = (plop) => {
14
+ const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
15
+ const templatesPath = path.join(import.meta.dirname, "../../../templates/monorepo");
16
+ createMonorepoGenerator(plop, templatesPath, octokit);
17
+ };
18
+ export const setDeploymentEnvironmentGenerator = (plop) => {
19
+ const credential = new DefaultAzureCredential();
20
+ const cloudAccountRepository = new AzureSubscriptionRepository(credential);
21
+ const cloudAccountService = new AzureCloudAccountService(credential);
22
+ const templatesPath = path.join(import.meta.dirname, "../../../templates/environment");
23
+ createDeploymentEnvironmentGenerator(plop, templatesPath, cloudAccountRepository, cloudAccountService);
24
+ };
@@ -0,0 +1 @@
1
+ export declare function formatTerraformCode(sourceCode: string): Promise<string>;
@@ -0,0 +1,17 @@
1
+ import { getLogger } from "@logtape/logtape";
2
+ import { execa } from "execa";
3
+ export async function formatTerraformCode(sourceCode) {
4
+ try {
5
+ const result = await execa({
6
+ input: sourceCode.trim(),
7
+ })("terraform", ["fmt", "-"]);
8
+ return result.stdout;
9
+ }
10
+ catch {
11
+ const logger = getLogger(["gen", "env"]);
12
+ logger.error("Failed to format Terraform code. {sourceCode}", {
13
+ sourceCode,
14
+ });
15
+ throw new Error("Failed to format Terraform code");
16
+ }
17
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,53 @@
1
+ import { err, ok } from "neverthrow";
2
+ import { describe, expect, it } from "vitest";
3
+ import { parseYaml } from "../index.js";
4
+ describe("parseYaml", () => {
5
+ const yamlContent = `
6
+ packages:
7
+ - packages/*
8
+ - apps/*
9
+ - infra/modules/*
10
+
11
+ catalog:
12
+ prettier: 3.6.2
13
+ eslint: ^9.30.1
14
+ typescript: ~5.8.3
15
+ tsup: ^8.5.0
16
+ vitest: ^3.2.4
17
+ '@vitest/coverage-v8': ^3.2.4
18
+ '@tsconfig/node20': ^20.1.6
19
+ '@types/node': ^20.19.4
20
+
21
+ onlyBuiltDependencies:
22
+ - esbuild
23
+
24
+ packageImportMethod: clone-or-copy
25
+ `;
26
+ it("should parse valid YAML content", () => {
27
+ const result = parseYaml(yamlContent);
28
+ expect(result).toStrictEqual(ok({
29
+ catalog: {
30
+ "@tsconfig/node20": "^20.1.6",
31
+ "@types/node": "^20.19.4",
32
+ "@vitest/coverage-v8": "^3.2.4",
33
+ eslint: "^9.30.1",
34
+ prettier: "3.6.2",
35
+ tsup: "^8.5.0",
36
+ typescript: "~5.8.3",
37
+ vitest: "^3.2.4",
38
+ },
39
+ onlyBuiltDependencies: ["esbuild"],
40
+ packageImportMethod: "clone-or-copy",
41
+ packages: ["packages/*", "apps/*", "infra/modules/*"],
42
+ }));
43
+ });
44
+ it("should parse empty YAML content", () => {
45
+ const yamlContent = "";
46
+ const result = parseYaml(yamlContent);
47
+ expect(result).toStrictEqual(ok(null));
48
+ });
49
+ it("should return an error for invalid YAML content", () => {
50
+ const result = parseYaml("invalid: yaml: content: here");
51
+ expect(result).toStrictEqual(err(new Error("Failed to parse YAML")));
52
+ });
53
+ });
@@ -0,0 +1,8 @@
1
+ import { Result } from "neverthrow";
2
+ /**
3
+ * Parses YAML content and returns the parsed object.
4
+ *
5
+ * @param content - The YAML content to parse
6
+ * @returns Result with parsed YAML object or error
7
+ */
8
+ export declare const parseYaml: (content: string) => Result<any, Error>;
@@ -0,0 +1,9 @@
1
+ import { Result } from "neverthrow";
2
+ import yaml from "yaml";
3
+ /**
4
+ * Parses YAML content and returns the parsed object.
5
+ *
6
+ * @param content - The YAML content to parse
7
+ * @returns Result with parsed YAML object or error
8
+ */
9
+ export const parseYaml = Result.fromThrowable((content) => yaml.parse(content), () => new Error("Failed to parse YAML"));
@@ -0,0 +1,23 @@
1
+ import { ResultAsync } from "neverthrow";
2
+ import { z } from "zod/v4";
3
+ /**
4
+ * A utility function to decode and validate data against a given Zod schema.
5
+ *
6
+ * @template T - The type of the data to be validated.
7
+ * @param {z.ZodSchema<T>} schema - The Zod schema used to validate the data.
8
+ * @returns {(data: unknown) => ResultAsync<T, Error>} - A function that takes unknown data,
9
+ * validates it asynchronously against the schema, and returns a `ResultAsync` object.
10
+ *
11
+ * The `ResultAsync` object:
12
+ * - Resolves with the validated data of type `T` if the validation succeeds.
13
+ * - Rejects with an `Error` if the validation fails, including the cause of the failure.
14
+ *
15
+ * @example
16
+ * const schema = z.object({ name: z.string() });
17
+ * const decodeName = decode(schema);
18
+ *
19
+ * decodeName({ name: "John" })
20
+ * .map((data) => console.log("Valid data:", data))
21
+ * .mapErr((err) => console.error("Validation error:", err));
22
+ */
23
+ export declare const decode: <T>(schema: z.ZodSchema<T>) => (data: unknown) => ResultAsync<T, Error>;
@@ -0,0 +1,22 @@
1
+ import { ResultAsync } from "neverthrow";
2
+ /**
3
+ * A utility function to decode and validate data against a given Zod schema.
4
+ *
5
+ * @template T - The type of the data to be validated.
6
+ * @param {z.ZodSchema<T>} schema - The Zod schema used to validate the data.
7
+ * @returns {(data: unknown) => ResultAsync<T, Error>} - A function that takes unknown data,
8
+ * validates it asynchronously against the schema, and returns a `ResultAsync` object.
9
+ *
10
+ * The `ResultAsync` object:
11
+ * - Resolves with the validated data of type `T` if the validation succeeds.
12
+ * - Rejects with an `Error` if the validation fails, including the cause of the failure.
13
+ *
14
+ * @example
15
+ * const schema = z.object({ name: z.string() });
16
+ * const decodeName = decode(schema);
17
+ *
18
+ * decodeName({ name: "John" })
19
+ * .map((data) => console.log("Valid data:", data))
20
+ * .mapErr((err) => console.error("Validation error:", err));
21
+ */
22
+ export const decode = (schema) => (data) => ResultAsync.fromPromise(schema.parseAsync(data), (cause) => new Error("Input is not valid for the given schema", { cause }));
@@ -0,0 +1,6 @@
1
+ export type Config = {
2
+ minVersions: {
3
+ turbo: string;
4
+ };
5
+ };
6
+ export declare const getConfig: () => Config;
package/dist/config.js ADDED
@@ -0,0 +1,5 @@
1
+ export const getConfig = () => ({
2
+ minVersions: {
3
+ turbo: "2",
4
+ },
5
+ });
@@ -0,0 +1,17 @@
1
+ import { Octokit } from "octokit";
2
+ import { DeepMockProxy, MockProxy } from "vitest-mock-extended";
3
+ import { Config } from "../../config.js";
4
+ import { GitHubService } from "../github.js";
5
+ import { PackageJson, PackageJsonReader } from "../package-json.js";
6
+ import { RepositoryReader } from "../repository.js";
7
+ import { ValidationReporter } from "../validation.js";
8
+ export declare const makeMockPackageJson: (overrides?: Partial<PackageJson>) => PackageJson;
9
+ export declare const makeMockDependencies: () => {
10
+ gitHubService: MockProxy<GitHubService>;
11
+ octokit: DeepMockProxy<Octokit>;
12
+ packageJsonReader: MockProxy<PackageJsonReader>;
13
+ repositoryReader: MockProxy<RepositoryReader>;
14
+ validationReporter: MockProxy<ValidationReporter>;
15
+ };
16
+ export declare const makeMockConfig: () => Config;
17
+ export declare const makeMockRepositoryRoot: () => string;
@@ -0,0 +1,27 @@
1
+ import { mock, mockDeep } from "vitest-mock-extended";
2
+ export const makeMockPackageJson = (overrides = {}) => {
3
+ const basePackageJson = {
4
+ dependencies: new Map(),
5
+ devDependencies: new Map(),
6
+ name: "test-package",
7
+ packageManager: "pnpm",
8
+ scripts: new Map(),
9
+ };
10
+ return {
11
+ ...basePackageJson,
12
+ ...overrides,
13
+ };
14
+ };
15
+ export const makeMockDependencies = () => ({
16
+ gitHubService: mock(),
17
+ octokit: mockDeep(),
18
+ packageJsonReader: mock(),
19
+ repositoryReader: mock(),
20
+ validationReporter: mock(),
21
+ });
22
+ export const makeMockConfig = () => ({
23
+ minVersions: {
24
+ turbo: "2.5.0",
25
+ },
26
+ });
27
+ export const makeMockRepositoryRoot = () => "a/repo/root";
@@ -0,0 +1 @@
1
+ export {};