@catladder/cli 0.0.0-next-4e7c6848 → 0.0.0-next-6a4450e0

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 (171) hide show
  1. package/dist/bundles/catenv/index.js +1392 -116
  2. package/dist/bundles/cli/index.js +1631 -112
  3. package/dist/cli/src/adapters/baseContext.d.ts +4 -0
  4. package/dist/cli/src/adapters/baseContext.js +5 -0
  5. package/dist/cli/src/adapters/baseContext.js.map +1 -1
  6. package/dist/cli/src/adapters/nonInteractive.d.ts +9 -0
  7. package/dist/cli/src/adapters/nonInteractive.js +32 -0
  8. package/dist/cli/src/adapters/nonInteractive.js.map +1 -0
  9. package/dist/cli/src/adapters/programmatic.d.ts +1 -0
  10. package/dist/cli/src/adapters/programmatic.js +6 -1
  11. package/dist/cli/src/adapters/programmatic.js.map +1 -1
  12. package/dist/cli/src/adapters/terminal.d.ts +1 -0
  13. package/dist/cli/src/adapters/terminal.js +10 -1
  14. package/dist/cli/src/adapters/terminal.js.map +1 -1
  15. package/dist/cli/src/adapters/vaultManagerAccess.d.ts +8 -0
  16. package/dist/cli/src/adapters/vaultManagerAccess.js +26 -0
  17. package/dist/cli/src/adapters/vaultManagerAccess.js.map +1 -0
  18. package/dist/cli/src/apps/catenv/catenv.d.ts +2 -0
  19. package/dist/cli/src/apps/catenv/catenv.js +8 -1
  20. package/dist/cli/src/apps/catenv/catenv.js.map +1 -1
  21. package/dist/cli/src/apps/catenv/printVariables.d.ts +2 -2
  22. package/dist/cli/src/apps/catenv/printVariables.js +4 -4
  23. package/dist/cli/src/apps/catenv/printVariables.js.map +1 -1
  24. package/dist/cli/src/apps/catenv/types.d.ts +9 -0
  25. package/dist/cli/src/apps/catenv/writeDotEnvFiles.d.ts +2 -2
  26. package/dist/cli/src/apps/catenv/writeDotEnvFiles.js +1 -1
  27. package/dist/cli/src/apps/catenv/writeDotEnvFiles.js.map +1 -1
  28. package/dist/cli/src/apps/cli/commands/project/commandConfigSecrets.js +70 -3
  29. package/dist/cli/src/apps/cli/commands/project/commandConfigSecrets.js.map +1 -1
  30. package/dist/cli/src/catenv.js +3 -2
  31. package/dist/cli/src/catenv.js.map +1 -1
  32. package/dist/cli/src/commands/index.d.ts +1 -0
  33. package/dist/cli/src/commands/index.js +8 -1
  34. package/dist/cli/src/commands/index.js.map +1 -1
  35. package/dist/cli/src/commands/project/commandSecretsSyncGithub.d.ts +46 -0
  36. package/dist/cli/src/commands/project/commandSecretsSyncGithub.js +150 -0
  37. package/dist/cli/src/commands/project/commandSecretsSyncGithub.js.map +1 -0
  38. package/dist/cli/src/config/getProjectConfig.d.ts +1 -1
  39. package/dist/cli/src/config/getProjectConfig.js +12 -2
  40. package/dist/cli/src/config/getProjectConfig.js.map +1 -1
  41. package/dist/cli/src/core/types.d.ts +15 -0
  42. package/dist/cli/src/core/types.js +8 -1
  43. package/dist/cli/src/core/types.js.map +1 -1
  44. package/dist/cli/src/git/gitProjectInformation.d.ts +1 -1
  45. package/dist/cli/src/git/gitProjectInformation.js +3 -3
  46. package/dist/cli/src/git/gitProjectInformation.js.map +1 -1
  47. package/dist/cli/src/utils/github.d.ts +20 -0
  48. package/dist/cli/src/utils/github.js +61 -0
  49. package/dist/cli/src/utils/github.js.map +1 -0
  50. package/dist/cli/src/vault/BitwardenVault.d.ts +24 -0
  51. package/dist/cli/src/vault/BitwardenVault.js +107 -0
  52. package/dist/cli/src/vault/BitwardenVault.js.map +1 -0
  53. package/dist/cli/src/vault/GitlabVault.d.ts +11 -0
  54. package/dist/cli/src/vault/GitlabVault.js +24 -0
  55. package/dist/cli/src/vault/GitlabVault.js.map +1 -0
  56. package/dist/cli/src/vault/VaultManager.d.ts +43 -0
  57. package/dist/cli/src/vault/VaultManager.js +131 -0
  58. package/dist/cli/src/vault/VaultManager.js.map +1 -0
  59. package/dist/cli/src/vault/bw.d.ts +15 -0
  60. package/dist/cli/src/vault/bw.js +89 -0
  61. package/dist/cli/src/vault/bw.js.map +1 -0
  62. package/dist/cli/src/vault/cache.d.ts +38 -0
  63. package/dist/cli/src/vault/cache.js +53 -0
  64. package/dist/cli/src/vault/cache.js.map +1 -0
  65. package/dist/cli/src/vault/index.d.ts +5 -0
  66. package/dist/cli/src/vault/index.js +48 -0
  67. package/dist/cli/src/vault/index.js.map +1 -0
  68. package/dist/cli/src/vault/types.d.ts +33 -0
  69. package/dist/cli/src/vault/types.js +5 -0
  70. package/dist/cli/src/vault/types.js.map +1 -0
  71. package/dist/pipeline/src/backends/github/GithubBackend.d.ts +4 -1
  72. package/dist/pipeline/src/backends/github/GithubBackend.js +70 -12
  73. package/dist/pipeline/src/backends/github/GithubBackend.js.map +1 -1
  74. package/dist/pipeline/src/backends/github/ciVariables.js +3 -1
  75. package/dist/pipeline/src/backends/github/ciVariables.js.map +1 -1
  76. package/dist/pipeline/src/backends/github/createGithubJobs.d.ts +13 -3
  77. package/dist/pipeline/src/backends/github/createGithubJobs.js +80 -14
  78. package/dist/pipeline/src/backends/github/createGithubJobs.js.map +1 -1
  79. package/dist/pipeline/src/backends/github/githubReleaseJobs.d.ts +2 -1
  80. package/dist/pipeline/src/backends/github/githubReleaseJobs.js +46 -33
  81. package/dist/pipeline/src/backends/github/githubReleaseJobs.js.map +1 -1
  82. package/dist/pipeline/src/backends/github/index.d.ts +2 -1
  83. package/dist/pipeline/src/backends/github/index.js +2 -1
  84. package/dist/pipeline/src/backends/github/index.js.map +1 -1
  85. package/dist/pipeline/src/backends/github/scriptFiles.d.ts +25 -0
  86. package/dist/pipeline/src/backends/github/scriptFiles.js +50 -0
  87. package/dist/pipeline/src/backends/github/scriptFiles.js.map +1 -0
  88. package/dist/pipeline/src/backends/gitlab/GitlabBackend.d.ts +1 -0
  89. package/dist/pipeline/src/backends/gitlab/GitlabBackend.js +18 -8
  90. package/dist/pipeline/src/backends/gitlab/GitlabBackend.js.map +1 -1
  91. package/dist/pipeline/src/backends/gitlab/ciVariables.js +2 -1
  92. package/dist/pipeline/src/backends/gitlab/ciVariables.js.map +1 -1
  93. package/dist/pipeline/src/backends/gitlab/createGitlabJobs.d.ts +3 -2
  94. package/dist/pipeline/src/backends/gitlab/createGitlabJobs.js +84 -10
  95. package/dist/pipeline/src/backends/gitlab/createGitlabJobs.js.map +1 -1
  96. package/dist/pipeline/src/backends/gitlab/createGitlabPipeline.js +1 -1
  97. package/dist/pipeline/src/backends/gitlab/createGitlabPipeline.js.map +1 -1
  98. package/dist/pipeline/src/backends/gitlab/gitlabReleaseJobs.js +2 -2
  99. package/dist/pipeline/src/backends/gitlab/gitlabReleaseJobs.js.map +1 -1
  100. package/dist/pipeline/src/backends/index.d.ts +17 -1
  101. package/dist/pipeline/src/backends/index.js +33 -1
  102. package/dist/pipeline/src/backends/index.js.map +1 -1
  103. package/dist/pipeline/src/backends/types.d.ts +2 -1
  104. package/dist/pipeline/src/bash/ciVariables.d.ts +1 -1
  105. package/dist/pipeline/src/bash/ciVariables.js.map +1 -1
  106. package/dist/pipeline/src/build/node/yarn.js +4 -1
  107. package/dist/pipeline/src/build/node/yarn.js.map +1 -1
  108. package/dist/pipeline/src/build/types.d.ts +1 -1
  109. package/dist/pipeline/src/constants.js +1 -1
  110. package/dist/pipeline/src/context/getEnvironmentVariables.d.ts +8 -0
  111. package/dist/pipeline/src/context/getEnvironmentVariables.js +3 -3
  112. package/dist/pipeline/src/context/getEnvironmentVariables.js.map +1 -1
  113. package/dist/pipeline/src/context/transformJobOnlyVars.js +2 -2
  114. package/dist/pipeline/src/context/transformJobOnlyVars.js.map +1 -1
  115. package/dist/pipeline/src/context/utils/envVars.d.ts +7 -0
  116. package/dist/pipeline/src/context/utils/envVars.js +22 -1
  117. package/dist/pipeline/src/context/utils/envVars.js.map +1 -1
  118. package/dist/pipeline/src/customImages/hash.d.ts +15 -0
  119. package/dist/pipeline/src/customImages/hash.js +71 -0
  120. package/dist/pipeline/src/customImages/hash.js.map +1 -0
  121. package/dist/pipeline/src/customImages/jobImagesPlan.d.ts +59 -0
  122. package/dist/pipeline/src/customImages/jobImagesPlan.js +172 -0
  123. package/dist/pipeline/src/customImages/jobImagesPlan.js.map +1 -0
  124. package/dist/pipeline/src/customImages/shippedImages.d.ts +28 -0
  125. package/dist/pipeline/src/customImages/shippedImages.js +60 -0
  126. package/dist/pipeline/src/customImages/shippedImages.js.map +1 -0
  127. package/dist/pipeline/src/deploy/cloudRun/index.js +15 -5
  128. package/dist/pipeline/src/deploy/cloudRun/index.js.map +1 -1
  129. package/dist/pipeline/src/deploy/cloudRun/utils/database.js +4 -1
  130. package/dist/pipeline/src/deploy/cloudRun/utils/database.js.map +1 -1
  131. package/dist/pipeline/src/pipeline/generatePipelineFiles.js +16 -1
  132. package/dist/pipeline/src/pipeline/generatePipelineFiles.js.map +1 -1
  133. package/dist/pipeline/src/runner/index.d.ts +20 -1
  134. package/dist/pipeline/src/runner/index.js +16 -3
  135. package/dist/pipeline/src/runner/index.js.map +1 -1
  136. package/dist/pipeline/src/types/config.d.ts +63 -5
  137. package/dist/pipeline/src/types/github-types.d.ts +5 -0
  138. package/dist/pipeline/src/types/jobs.d.ts +10 -2
  139. package/dist/pipeline/src/types/jobs.js.map +1 -1
  140. package/dist/pipeline/src/utils/gitlab.d.ts +5 -0
  141. package/dist/pipeline/src/utils/gitlab.js +6 -0
  142. package/dist/pipeline/src/utils/gitlab.js.map +1 -1
  143. package/dist/pipeline/src/utils/writeFiles.d.ts +6 -0
  144. package/dist/pipeline/src/utils/writeFiles.js +8 -0
  145. package/dist/pipeline/src/utils/writeFiles.js.map +1 -1
  146. package/dist/tsconfig.tsbuildinfo +1 -1
  147. package/package.json +1 -1
  148. package/src/adapters/baseContext.ts +10 -0
  149. package/src/adapters/nonInteractive.ts +30 -0
  150. package/src/adapters/programmatic.ts +7 -1
  151. package/src/adapters/terminal.ts +9 -1
  152. package/src/adapters/vaultManagerAccess.ts +25 -0
  153. package/src/apps/catenv/catenv.ts +5 -1
  154. package/src/apps/catenv/printVariables.ts +16 -6
  155. package/src/apps/catenv/types.ts +9 -0
  156. package/src/apps/catenv/writeDotEnvFiles.ts +3 -3
  157. package/src/apps/cli/commands/project/commandConfigSecrets.ts +114 -9
  158. package/src/catenv.ts +22 -2
  159. package/src/commands/index.ts +1 -0
  160. package/src/commands/project/commandSecretsSyncGithub.ts +172 -0
  161. package/src/config/getProjectConfig.ts +21 -7
  162. package/src/core/types.ts +23 -0
  163. package/src/git/gitProjectInformation.ts +5 -3
  164. package/src/utils/github.ts +76 -0
  165. package/src/vault/BitwardenVault.ts +161 -0
  166. package/src/vault/GitlabVault.ts +25 -0
  167. package/src/vault/VaultManager.ts +211 -0
  168. package/src/vault/bw.ts +110 -0
  169. package/src/vault/cache.ts +80 -0
  170. package/src/vault/index.ts +5 -0
  171. package/src/vault/types.ts +42 -0
@@ -0,0 +1,46 @@
1
+ import type { IO } from "../../core/types";
2
+ /**
3
+ * all secrets declared in the config, with their values read from the
4
+ * vault (github secrets are write-only and can never act as a source)
5
+ */
6
+ export declare const collectSecretsFromVault: (io: IO, envFilter?: string[]) => Promise<{
7
+ secrets: {
8
+ name: string;
9
+ value: string;
10
+ kind: "variable" | "secret";
11
+ }[];
12
+ missing: string[];
13
+ }>;
14
+ /**
15
+ * pushes vault values to github via the gh cli: sensitive ones as repo
16
+ * secrets (masked), "variable"-kind ones as repo variables (plain)
17
+ */
18
+ export declare const pushSecretsToGithub: (io: IO, repo: string, secrets: {
19
+ name: string;
20
+ value: string;
21
+ kind: "secret" | "variable";
22
+ }[]) => Promise<void>;
23
+ /**
24
+ * resolves the github repository from the configured git remote
25
+ * (`pipelines.github.gitRemote`, defaults to origin)
26
+ */
27
+ export declare const getConfiguredGithubRepo: () => Promise<string | undefined>;
28
+ /**
29
+ * copies the catladder secrets from the vault to github actions
30
+ * repository secrets, keeping the exact same names, so the github
31
+ * pipeline can reference them as ${{ secrets.<NAME> }}.
32
+ */
33
+ export declare const commandSecretsSyncGithub: import("../../core/types").CommandDef<{
34
+ readonly repo: {
35
+ readonly type: "string";
36
+ readonly message: "github repository (owner/name)";
37
+ readonly positional: true;
38
+ readonly required: false;
39
+ };
40
+ readonly env: {
41
+ readonly type: "string";
42
+ readonly message: "only sync these environments (comma-separated, e.g. review,dev) — github allows at most 100 repo secrets";
43
+ readonly positional: true;
44
+ readonly required: false;
45
+ };
46
+ }>;
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.commandSecretsSyncGithub = exports.getConfiguredGithubRepo = exports.pushSecretsToGithub = exports.collectSecretsFromVault = void 0;
7
+ const pipeline_1 = require("../../../../pipeline/src/index.js");
8
+ const getProjectConfig_1 = require("../../config/getProjectConfig");
9
+ const defineCommand_1 = require("../../core/defineCommand");
10
+ const github_1 = require("../../utils/github");
11
+ /**
12
+ * all secrets declared in the config, with their values read from the
13
+ * vault (github secrets are write-only and can never act as a source)
14
+ */
15
+ const collectSecretsFromVault = async (io, envFilter) => {
16
+ const envAndComponents = await (0, getProjectConfig_1.getAllComponentsWithAllEnvsHierarchical)();
17
+ const kinds = new Map();
18
+ for (const [componentName, envs] of Object.entries(envAndComponents)) {
19
+ for (const env of envs) {
20
+ if (envFilter && !envFilter.includes(env)) {
21
+ continue;
22
+ }
23
+ const {
24
+ secretEnvVarKeys,
25
+ jobOnlyVars
26
+ } = await (0, getProjectConfig_1.getEnvironment)(env, componentName);
27
+ const keys = [...secretEnvVarKeys, ...jobOnlyVars.build.secretEnvVarKeys, ...jobOnlyVars.deploy.secretEnvVarKeys];
28
+ keys.forEach(({
29
+ key,
30
+ kind
31
+ }) => kinds.set((0, pipeline_1.getSecretVarName)(env, componentName, key), kind !== null && kind !== void 0 ? kind : "secret"));
32
+ }
33
+ }
34
+ const names = [...kinds.keys()];
35
+ const values = await (await io.getVaultManager()).readSecrets(names, io);
36
+ const secrets = names.filter(name => values[name] !== undefined).map(name => {
37
+ var _a;
38
+ return {
39
+ name,
40
+ value: values[name],
41
+ kind: (_a = kinds.get(name)) !== null && _a !== void 0 ? _a : "secret"
42
+ };
43
+ });
44
+ const missing = names.filter(name => values[name] === undefined);
45
+ return {
46
+ secrets,
47
+ missing
48
+ };
49
+ };
50
+ exports.collectSecretsFromVault = collectSecretsFromVault;
51
+ /**
52
+ * pushes vault values to github via the gh cli: sensitive ones as repo
53
+ * secrets (masked), "variable"-kind ones as repo variables (plain)
54
+ */
55
+ const pushSecretsToGithub = async (io, repo, secrets) => {
56
+ for (const {
57
+ name,
58
+ value,
59
+ kind
60
+ } of secrets) {
61
+ if (kind === "variable") {
62
+ await (0, github_1.setGithubVariable)(repo, name, value);
63
+ io.log(`📖 ${name} (variable)`);
64
+ } else {
65
+ await (0, github_1.setGithubSecret)(repo, name, value);
66
+ io.log(`✅ ${name}`);
67
+ }
68
+ }
69
+ };
70
+ exports.pushSecretsToGithub = pushSecretsToGithub;
71
+ /**
72
+ * resolves the github repository from the configured git remote
73
+ * (`pipelines.github.gitRemote`, defaults to origin)
74
+ */
75
+ const getConfiguredGithubRepo = async () => {
76
+ const config = await (0, getProjectConfig_1.getProjectConfig)();
77
+ if (!config) {
78
+ return undefined;
79
+ }
80
+ return (0, github_1.getGithubRepoFromRemote)((0, pipeline_1.getPipelineGitRemote)(config, "github"));
81
+ };
82
+ exports.getConfiguredGithubRepo = getConfiguredGithubRepo;
83
+ /**
84
+ * copies the catladder secrets from the vault to github actions
85
+ * repository secrets, keeping the exact same names, so the github
86
+ * pipeline can reference them as ${{ secrets.<NAME> }}.
87
+ */
88
+ exports.commandSecretsSyncGithub = (0, defineCommand_1.defineCommand)({
89
+ name: "project secrets-sync-github",
90
+ description: "copies all secrets from the vault to github repo secrets (same names), for the github pipeline",
91
+ group: "project",
92
+ inputs: {
93
+ repo: {
94
+ type: "string",
95
+ message: "github repository (owner/name)",
96
+ positional: true,
97
+ required: false
98
+ },
99
+ env: {
100
+ type: "string",
101
+ message: "only sync these environments (comma-separated, e.g. review,dev) — github allows at most 100 repo secrets",
102
+ positional: true,
103
+ required: false
104
+ }
105
+ },
106
+ execute: async ctx => {
107
+ var _a, _b;
108
+ const config = await (0, getProjectConfig_1.getProjectConfig)();
109
+ if (!config) {
110
+ throw new Error("no catladder config found");
111
+ }
112
+ const enabled = (0, pipeline_1.getEnabledPipelineTypes)(config);
113
+ if (!enabled.includes("github")) {
114
+ throw new Error("the github pipeline is not enabled in `pipelines` — nothing to sync to");
115
+ }
116
+ if (!(await (0, github_1.isGhAuthenticated)())) {
117
+ throw new Error("the github cli (gh) is not installed or not authenticated — run `gh auth login` first");
118
+ }
119
+ const repo = (_a = await ctx.get("repo")) !== null && _a !== void 0 ? _a : await (0, exports.getConfiguredGithubRepo)();
120
+ if (!repo) {
121
+ throw new Error(`no github repository found on the '${(0, pipeline_1.getPipelineGitRemote)(config, "github")}' remote — pass it as owner/name or configure pipelines.github.gitRemote`);
122
+ }
123
+ const envFilter = (_b = await ctx.get("env")) === null || _b === void 0 ? void 0 : _b.split(",").map(e => e.trim());
124
+ const {
125
+ secrets,
126
+ missing
127
+ } = await (0, exports.collectSecretsFromVault)(ctx, envFilter);
128
+ if (missing.length > 0) {
129
+ ctx.log(`⚠️ ${missing.length} secrets are not set in the vault and will be skipped:`);
130
+ missing.forEach(name => ctx.log(` - ${name}`));
131
+ ctx.log("");
132
+ }
133
+ if (secrets.length === 0) {
134
+ ctx.log("no secrets to sync 🤷");
135
+ return;
136
+ }
137
+ ctx.log(`about to set ${secrets.length} secrets on '${repo}':`);
138
+ secrets.forEach(({
139
+ name
140
+ }) => ctx.log(` - ${name}`));
141
+ ctx.log("");
142
+ const confirmed = await ctx.confirm("continue? 🤔");
143
+ if (!confirmed) {
144
+ throw new Error("abort");
145
+ }
146
+ await (0, exports.pushSecretsToGithub)(ctx, repo, secrets);
147
+ ctx.log("");
148
+ ctx.log("done! 😻 the github pipeline can use them as ${{ secrets.<NAME> }}");
149
+ }
150
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandSecretsSyncGithub.js","sourceRoot":"","sources":["../../../../../src/commands/project/commandSecretsSyncGithub.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ export declare const getAllPipelineContexts: (onlyComponent?: string | string[],
18
18
  }) => Promise<import("../../../pipeline/src/index.js").ComponentContext[]>;
19
19
  export declare const getEnvironment: (env: string, componentName: string) => Promise<import("../../../pipeline/src/index.js").Environment>;
20
20
  export declare const getGitlabVar: (io: IO, env: string, componentName: string, variableName: string) => Promise<string>;
21
- export declare const getEnvVarsResolved: (io: IO | null, env: string, componentName: string | null) => Promise<Record<string, string>>;
21
+ export declare const getEnvVarsResolved: (io: IO, env: string, componentName: string | null) => Promise<Record<string, string>>;
22
22
  /**
23
23
  *
24
24
  * is used to get job only vars that should also be editable locally with catladder.
@@ -89,14 +89,24 @@ const getGitlabVar = async (io, env, componentName, variableName) => {
89
89
  };
90
90
  exports.getGitlabVar = getGitlabVar;
91
91
  const resolveSecrets = async (io, varSets) => {
92
- const allVariablesInGitlab = await (0, gitlab_1.getAllVariables)(io);
92
+ // the secret variables actually referenced by the env var values —
93
+ // when they are all in the local cache, the vault is not contacted
94
+ const referencedNames = [...new Set(varSets.flatMap(({
95
+ envVars
96
+ }) => Object.values(envVars).flatMap(value => {
97
+ var _a;
98
+ return (_a = `${value}`.match(/\$CL_\w+/g)) !== null && _a !== void 0 ? _a : [];
99
+ })))].map(reference => reference.slice(1));
100
+ const vaultManager = await io.getVaultManager();
101
+ const secrets = await vaultManager.readSecrets(referencedNames, io);
102
+ const secretEntries = Object.entries(secrets);
93
103
  return Object.fromEntries(varSets.flatMap(({
94
104
  envVars,
95
105
  secretEnvVarKeys
96
106
  }) => Object.entries(envVars).filter(([key, value]) => {
97
107
  var _a;
98
108
  return value !== undefined && value !== null && !((_a = secretEnvVarKeys.find(k => k.key === key)) === null || _a === void 0 ? void 0 : _a.hidden);
99
- }).map(([key, value]) => [key, allVariablesInGitlab.reduce((acc, curr) => acc.replace(new RegExp("\\$" + curr.key, "g"), curr.value), `${value}`)])));
109
+ }).map(([key, value]) => [key, secretEntries.reduce((acc, [name, secretValue]) => acc.replace(new RegExp("\\$" + name, "g"), secretValue), `${value}`)])));
100
110
  };
101
111
  const getEnvVarsResolved = async (io, env, componentName) => {
102
112
  if (!componentName) {
@@ -1 +1 @@
1
- {"version":3,"file":"getProjectConfig.js","sourceRoot":"","sources":["../../../../src/config/getProjectConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getProjectConfig.js","sourceRoot":"","sources":["../../../../src/config/getProjectConfig.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { VaultManager } from "../vault/VaultManager";
1
2
  import type { ComponentContext } from "../../../pipeline/src/index.js";
2
3
  export type PromptChoice = string | {
3
4
  name: string;
@@ -57,6 +58,17 @@ export type InputsSchema = Record<string, InputDef>;
57
58
  * that are NOT part of a command's declared input schema.
58
59
  */
59
60
  export interface IO {
61
+ /**
62
+ * whether this context can interact with the user (prompts, editors).
63
+ * Non-interactive contexts throw {@link NonInteractiveError} when an
64
+ * interaction would be required.
65
+ */
66
+ readonly interactive: boolean;
67
+ /**
68
+ * the secrets vault of this context, created lazily from the project
69
+ * config
70
+ */
71
+ getVaultManager(): Promise<VaultManager>;
60
72
  log(message: string): void;
61
73
  /**
62
74
  * Ask for confirmation. Returns true/false.
@@ -100,6 +112,9 @@ export interface CommandDef<TInputs extends InputsSchema = InputsSchema> {
100
112
  isAvailable?: (contexts: ComponentContext[]) => boolean;
101
113
  execute: (ctx: CommandContext<TInputs>) => Promise<void>;
102
114
  }
115
+ export declare class NonInteractiveError extends Error {
116
+ constructor(interaction: string);
117
+ }
103
118
  export declare class MissingInputError extends Error {
104
119
  readonly inputName: string;
105
120
  readonly promptMessage: string;
@@ -3,8 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.MissingInputError = void 0;
6
+ exports.MissingInputError = exports.NonInteractiveError = void 0;
7
7
  // ─── Errors ──────────────────────────────────────────────────────────
8
+ class NonInteractiveError extends Error {
9
+ constructor(interaction) {
10
+ super(`${interaction} requires an interactive terminal, but this context is not interactive`);
11
+ this.name = "NonInteractiveError";
12
+ }
13
+ }
14
+ exports.NonInteractiveError = NonInteractiveError;
8
15
  class MissingInputError extends Error {
9
16
  constructor(inputName, promptMessage) {
10
17
  super(`Missing required input: "${inputName}" (${promptMessage}). ` + `Provide it via --${inputName}=<value> or --inputs='{"${inputName}": ...}'`);
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":";;;AAmIA,wEAAwE;AAExE,MAAa,iBAAkB,SAAQ,KAAK;IAC1C,YACkB,SAAiB,EACjB,aAAqB;QAErC,KAAK,CACH,4BAA4B,SAAS,MAAM,aAAa,KAAK;YAC3D,oBAAoB,SAAS,2BAA2B,SAAS,UAAU,CAC9E,CAAC;QANc,cAAS,GAAT,SAAS,CAAQ;QACjB,kBAAa,GAAb,aAAa,CAAQ;QAMrC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAXD,8CAWC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":";;;AAiJA,wEAAwE;AAExE,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,WAAmB;QAC7B,KAAK,CACH,GAAG,WAAW,wEAAwE,CACvF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAPD,kDAOC;AAED,MAAa,iBAAkB,SAAQ,KAAK;IAC1C,YACkB,SAAiB,EACjB,aAAqB;QAErC,KAAK,CACH,4BAA4B,SAAS,MAAM,aAAa,KAAK;YAC3D,oBAAoB,SAAS,2BAA2B,SAAS,UAAU,CAC9E,CAAC;QANc,cAAS,GAAT,SAAS,CAAQ;QACjB,kBAAa,GAAb,aAAa,CAAQ;QAMrC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAXD,8CAWC"}
@@ -5,7 +5,7 @@ export declare const getProjectRootPath: () => Promise<string>;
5
5
  /**
6
6
  * Get the git remote hostname and project path from the git config.
7
7
  */
8
- export declare const getGitRemoteHostAndPath: () => Promise<{
8
+ export declare const getGitRemoteHostAndPath: (remoteName?: string) => Promise<{
9
9
  gitRemoteHost: string;
10
10
  gitRemotePath: string;
11
11
  }>;
@@ -19,14 +19,14 @@ exports.getProjectRootPath = getProjectRootPath;
19
19
  /**
20
20
  * Get the git remote hostname and project path from the git config.
21
21
  */
22
- const getGitRemoteHostAndPath = async () => {
22
+ const getGitRemoteHostAndPath = async (remoteName = "origin") => {
23
23
  var _a;
24
- const remoteUrl = await (0, gitConfig_1.gitConfigGet)("remote.origin.url");
24
+ const remoteUrl = await (0, gitConfig_1.gitConfigGet)(`remote.${remoteName}.url`);
25
25
  const remoteReg = /(https:\/\/|git@)([^:/]+)[:/]([^.]*)(\.git)?/;
26
26
  const match = (_a = remoteUrl.match(remoteReg)) !== null && _a !== void 0 ? _a : [];
27
27
  const [,, gitRemoteHost, gitRemotePath] = match;
28
28
  if (!(gitRemoteHost === null || gitRemoteHost === void 0 ? void 0 : gitRemoteHost.length) || !(gitRemotePath === null || gitRemotePath === void 0 ? void 0 : gitRemotePath.length)) {
29
- throw new Error(`Failed to parse git remote hostname and path from git configs remote.origin.url! ${remoteUrl}`);
29
+ throw new Error(`Failed to parse git remote hostname and path from git configs remote.${remoteName}.url! ${remoteUrl}`);
30
30
  }
31
31
  return {
32
32
  gitRemoteHost,
@@ -1 +1 @@
1
- {"version":3,"file":"gitProjectInformation.js","sourceRoot":"","sources":["../../../../src/git/gitProjectInformation.ts"],"names":[],"mappings":";;;AAAA,2CAA2C;AAC3C,iEAA6C;AAE7C;;GAEG;AACI,MAAM,kBAAkB,GAAG,KAAK,IAAqB,EAAE;IAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,4BAAI,EAAC,+BAA+B,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAHW,QAAA,kBAAkB,sBAG7B;AAEF;;GAEG;AACI,MAAM,uBAAuB,GAAG,KAAK,IAGzC,EAAE;;IACH,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAY,EAAC,mBAAmB,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,8CAA8C,CAAC;IACjE,MAAM,KAAK,GAAG,MAAA,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,mCAAI,EAAE,CAAC;IAC/C,MAAM,CAAC,EAAE,AAAD,EAAG,aAAa,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC;IACjD,IAAI,CAAC,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,CAAA,IAAI,CAAC,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,CAAA,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,oFAAoF,SAAS,EAAE,CAChG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AAC1C,CAAC,CAAC;AAdW,QAAA,uBAAuB,2BAclC;AAEK,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;IAC9C,MAAM,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3E,CAAC,IAAA,+BAAuB,GAAE,EAAE,IAAA,0BAAkB,GAAE,CAAC,CAClD,CAAC;IACF,OAAO;QACL,aAAa;QACb,aAAa;QACb,eAAe;KAChB,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,qBAAqB,yBAShC"}
1
+ {"version":3,"file":"gitProjectInformation.js","sourceRoot":"","sources":["../../../../src/git/gitProjectInformation.ts"],"names":[],"mappings":";;;AAAA,2CAA2C;AAC3C,iEAA6C;AAE7C;;GAEG;AACI,MAAM,kBAAkB,GAAG,KAAK,IAAqB,EAAE;IAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,4BAAI,EAAC,+BAA+B,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAHW,QAAA,kBAAkB,sBAG7B;AAEF;;GAEG;AACI,MAAM,uBAAuB,GAAG,KAAK,EAC1C,UAAU,GAAG,QAAQ,EAIpB,EAAE;;IACH,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAY,EAAC,UAAU,UAAU,MAAM,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,8CAA8C,CAAC;IACjE,MAAM,KAAK,GAAG,MAAA,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,mCAAI,EAAE,CAAC;IAC/C,MAAM,CAAC,EAAE,AAAD,EAAG,aAAa,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC;IACjD,IAAI,CAAC,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,CAAA,IAAI,CAAC,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,CAAA,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,wEAAwE,UAAU,SAAS,SAAS,EAAE,CACvG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AAC1C,CAAC,CAAC;AAhBW,QAAA,uBAAuB,2BAgBlC;AAEK,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;IAC9C,MAAM,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3E,CAAC,IAAA,+BAAuB,GAAE,EAAE,IAAA,0BAAkB,GAAE,CAAC,CAClD,CAAC;IACF,OAAO;QACL,aAAa;QACb,aAAa;QACb,eAAe;KAChB,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,qBAAqB,yBAShC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * whether the github cli (gh) is installed and authenticated
3
+ */
4
+ export declare const isGhAuthenticated: () => Promise<boolean>;
5
+ /**
6
+ * the github repository (owner/name) a git remote points to.
7
+ * Which remote belongs to github is configured per pipeline type
8
+ * (`pipelines.github.gitRemote`, defaults to origin).
9
+ */
10
+ export declare const getGithubRepoFromRemote: (remoteName: string) => Promise<string | undefined>;
11
+ /**
12
+ * sets a github actions repository secret via the gh cli.
13
+ * The value is passed via stdin so it never shows up in a process list.
14
+ */
15
+ export declare const setGithubSecret: (repo: string, name: string, value: string) => Promise<void>;
16
+ /**
17
+ * sets a github actions repository variable (plain, unmasked) via the
18
+ * gh cli — for vault values classified as not sensitive
19
+ */
20
+ export declare const setGithubVariable: (repo: string, name: string, value: string) => Promise<void>;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setGithubVariable = exports.setGithubSecret = exports.getGithubRepoFromRemote = exports.isGhAuthenticated = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const util_1 = require("util");
9
+ const execFile = (0, util_1.promisify)(child_process_1.execFile);
10
+ /**
11
+ * whether the github cli (gh) is installed and authenticated
12
+ */
13
+ const isGhAuthenticated = async () => {
14
+ try {
15
+ await execFile("gh", ["auth", "status"]);
16
+ return true;
17
+ } catch (_a) {
18
+ return false;
19
+ }
20
+ };
21
+ exports.isGhAuthenticated = isGhAuthenticated;
22
+ /**
23
+ * the github repository (owner/name) a git remote points to.
24
+ * Which remote belongs to github is configured per pipeline type
25
+ * (`pipelines.github.gitRemote`, defaults to origin).
26
+ */
27
+ const getGithubRepoFromRemote = async remoteName => {
28
+ try {
29
+ const {
30
+ stdout
31
+ } = await execFile("git", ["remote", "get-url", remoteName]);
32
+ const match = stdout.match(/github\.com[:/]([\w.-]+\/[\w.-]+?)(\.git)?\s*$/);
33
+ return match === null || match === void 0 ? void 0 : match[1];
34
+ } catch (_a) {
35
+ return undefined;
36
+ }
37
+ };
38
+ exports.getGithubRepoFromRemote = getGithubRepoFromRemote;
39
+ const ghSetViaStdin = (kind, repo, name, value) => new Promise((resolve, reject) => {
40
+ var _a, _b;
41
+ const child = (0, child_process_1.spawn)("gh", [kind, "set", name, "--repo", repo], {
42
+ stdio: ["pipe", "ignore", "pipe"]
43
+ });
44
+ let stderr = "";
45
+ (_a = child.stderr) === null || _a === void 0 ? void 0 : _a.on("data", data => stderr += data);
46
+ child.on("error", reject);
47
+ child.on("close", code => code === 0 ? resolve() : reject(new Error(`gh ${kind} set ${name} failed: ${stderr.trim()}`)));
48
+ (_b = child.stdin) === null || _b === void 0 ? void 0 : _b.end(value);
49
+ });
50
+ /**
51
+ * sets a github actions repository secret via the gh cli.
52
+ * The value is passed via stdin so it never shows up in a process list.
53
+ */
54
+ const setGithubSecret = async (repo, name, value) => ghSetViaStdin("secret", repo, name, value);
55
+ exports.setGithubSecret = setGithubSecret;
56
+ /**
57
+ * sets a github actions repository variable (plain, unmasked) via the
58
+ * gh cli — for vault values classified as not sensitive
59
+ */
60
+ const setGithubVariable = async (repo, name, value) => ghSetViaStdin("variable", repo, name, value);
61
+ exports.setGithubVariable = setGithubVariable;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/utils/github.ts"],"names":[],"mappings":";;;AAAA,iDAA8D;AAC9D,+BAAiC;AAEjC,MAAM,QAAQ,GAAG,IAAA,gBAAS,EAAC,wBAAU,CAAC,CAAC;AAEvC;;GAEG;AACI,MAAM,iBAAiB,GAAG,KAAK,IAAsB,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,iBAAiB,qBAO5B;AAEF;;;;GAIG;AACI,MAAM,uBAAuB,GAAG,KAAK,EAC1C,UAAkB,EACW,EAAE;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CACxB,gDAAgD,CACjD,CAAC;QACF,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,uBAAuB,2BAYlC;AAEF,MAAM,aAAa,GAAG,CACpB,IAA2B,EAC3B,IAAY,EACZ,IAAY,EACZ,KAAa,EACE,EAAE,CACjB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;;IACpC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE;QAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAA,KAAK,CAAC,MAAM,0CAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;IACrD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,IAAI,KAAK,CAAC;QACR,CAAC,CAAC,OAAO,EAAE;QACX,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,IAAI,YAAY,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CACzE,CAAC;IACF,MAAA,KAAK,CAAC,KAAK,0CAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL;;;GAGG;AACI,MAAM,eAAe,GAAG,KAAK,EAClC,IAAY,EACZ,IAAY,EACZ,KAAa,EACE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAJlD,QAAA,eAAe,mBAImC;AAE/D;;;GAGG;AACI,MAAM,iBAAiB,GAAG,KAAK,EACpC,IAAY,EACZ,IAAY,EACZ,KAAa,EACE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAJpD,QAAA,iBAAiB,qBAImC"}
@@ -0,0 +1,24 @@
1
+ import type { Config } from "../../../pipeline/src/index.js";
2
+ import type { IO } from "../core/types";
3
+ import type { SecretsVault } from "./types";
4
+ export declare class BitwardenVault implements SecretsVault {
5
+ private readonly config;
6
+ /**
7
+ * whether a locked bitwarden may be unlocked interactively
8
+ * (false with catenv --vault-mode no-prompt)
9
+ */
10
+ private readonly allowPrompt;
11
+ readonly id: string;
12
+ private readonly collectionName;
13
+ constructor(config: Config, options: {
14
+ collection?: string;
15
+ },
16
+ /**
17
+ * whether a locked bitwarden may be unlocked interactively
18
+ * (false with catenv --vault-mode no-prompt)
19
+ */
20
+ allowPrompt: boolean);
21
+ private session;
22
+ readAllSecrets(io: IO | null): Promise<Record<string, string>>;
23
+ writeSecrets(io: IO, env: string, componentName: string, secrets: Record<string, unknown>): Promise<void>;
24
+ }
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BitwardenVault = void 0;
7
+ const pipeline_1 = require("../../../pipeline/src/index.js");
8
+ const yaml_1 = require("yaml");
9
+ const bw_1 = require("./bw");
10
+ const DEFAULT_COLLECTION = "catladder";
11
+ const SECURE_NOTE_TYPE = 2;
12
+ /**
13
+ * one yaml note per env and component:
14
+ * `<customerName>/<appName>/<env>/<componentName>/secrets.yml`
15
+ */
16
+ const itemName = (config, env, componentName) => `${config.customerName}/${config.appName}/${env}/${componentName}/secrets.yml`;
17
+ const itemPrefix = config => `${config.customerName}/${config.appName}/`;
18
+ /**
19
+ * parses env and componentName back out of an item name
20
+ */
21
+ const parseItemName = (config, name) => {
22
+ const match = name.slice(itemPrefix(config).length).match(/^([^/]+)\/([^/]+)\/secrets\.yml$/);
23
+ return match ? {
24
+ env: match[1],
25
+ componentName: match[2]
26
+ } : null;
27
+ };
28
+ const findCollection = async (session, collectionName) => {
29
+ const collections = await (0, bw_1.runBwJson)(session, ["list", "collections", "--search", collectionName]);
30
+ const collection = collections.find(c => c.name === collectionName);
31
+ if (!collection) {
32
+ throw new Error(`bitwarden collection '${collectionName}' not found — create it and make sure you have access`);
33
+ }
34
+ return collection;
35
+ };
36
+ const encodePayload = payload => Buffer.from(JSON.stringify(payload), "utf-8").toString("base64");
37
+ class BitwardenVault {
38
+ constructor(config, options,
39
+ /**
40
+ * whether a locked bitwarden may be unlocked interactively
41
+ * (false with catenv --vault-mode no-prompt)
42
+ */
43
+ allowPrompt) {
44
+ var _a;
45
+ this.config = config;
46
+ this.allowPrompt = allowPrompt;
47
+ this.collectionName = (_a = options.collection) !== null && _a !== void 0 ? _a : DEFAULT_COLLECTION;
48
+ this.id = `bitwarden:${this.collectionName}`;
49
+ }
50
+ session(io) {
51
+ return (0, bw_1.getBwSession)(io, {
52
+ allowPrompt: this.allowPrompt
53
+ });
54
+ }
55
+ async readAllSecrets(io) {
56
+ const {
57
+ config,
58
+ collectionName
59
+ } = this;
60
+ const bwSession = await this.session(io);
61
+ const collection = await findCollection(bwSession, collectionName);
62
+ const items = await (0, bw_1.runBwJson)(bwSession, ["list", "items", "--collectionid", collection.id]);
63
+ const secrets = {};
64
+ for (const item of items) {
65
+ const parsed = parseItemName(config, item.name);
66
+ if (!parsed || !item.notes) {
67
+ continue;
68
+ }
69
+ const values = (0, yaml_1.parse)(item.notes);
70
+ Object.entries(values !== null && values !== void 0 ? values : {}).forEach(([key, value]) => {
71
+ secrets[(0, pipeline_1.getSecretVarName)(parsed.env, parsed.componentName, key)] = typeof value === "string" ? value : JSON.stringify(value);
72
+ });
73
+ }
74
+ return secrets;
75
+ }
76
+ async writeSecrets(io, env, componentName, secrets) {
77
+ const {
78
+ config,
79
+ collectionName
80
+ } = this;
81
+ const bwSession = await this.session(io);
82
+ const collection = await findCollection(bwSession, collectionName);
83
+ const name = itemName(config, env, componentName);
84
+ const existing = (await (0, bw_1.runBwJson)(bwSession, ["list", "items", "--collectionid", collection.id, "--search", name])).find(item => item.name === name);
85
+ const notes = (0, yaml_1.stringify)(secrets);
86
+ if (existing) {
87
+ await (0, bw_1.runBw)(bwSession, ["edit", "item", existing.id, encodePayload({
88
+ ...existing,
89
+ notes
90
+ })]);
91
+ } else {
92
+ await (0, bw_1.runBw)(bwSession, ["create", "item", encodePayload({
93
+ type: SECURE_NOTE_TYPE,
94
+ secureNote: {
95
+ type: 0
96
+ },
97
+ name,
98
+ notes,
99
+ ...(collection.organizationId ? {
100
+ organizationId: collection.organizationId,
101
+ collectionIds: [collection.id]
102
+ } : {})
103
+ })]);
104
+ }
105
+ }
106
+ }
107
+ exports.BitwardenVault = BitwardenVault;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitwardenVault.js","sourceRoot":"","sources":["../../../../src/vault/BitwardenVault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { IO } from "../core/types";
2
+ import type { SecretsVault } from "./types";
3
+ /**
4
+ * the legacy (and default) vault: the gitlab project variables double
5
+ * as the secret store
6
+ */
7
+ export declare class GitlabVault implements SecretsVault {
8
+ readonly id = "gitlab";
9
+ readAllSecrets(io: IO | null): Promise<Record<string, string>>;
10
+ writeSecrets(io: IO, env: string, componentName: string, secrets: Record<string, unknown>): Promise<void>;
11
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GitlabVault = void 0;
7
+ const gitlab_1 = require("../utils/gitlab");
8
+ /**
9
+ * the legacy (and default) vault: the gitlab project variables double
10
+ * as the secret store
11
+ */
12
+ class GitlabVault {
13
+ constructor() {
14
+ this.id = "gitlab";
15
+ }
16
+ async readAllSecrets(io) {
17
+ const variables = await (0, gitlab_1.getAllVariables)(io);
18
+ return Object.fromEntries(variables.map(v => [v.key, v.value]));
19
+ }
20
+ async writeSecrets(io, env, componentName, secrets) {
21
+ await (0, gitlab_1.upsertAllVariables)(io, secrets, env, componentName);
22
+ }
23
+ }
24
+ exports.GitlabVault = GitlabVault;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitlabVault.js","sourceRoot":"","sources":["../../../../src/vault/GitlabVault.ts"],"names":[],"mappings":";;;AACA,4CAAsE;AAGtE;;;GAGG;AACH,MAAa,WAAW;IAAxB;QACW,OAAE,GAAG,QAAQ,CAAC;IAezB,CAAC;IAbC,KAAK,CAAC,cAAc,CAAC,EAAa;QAChC,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,EAAM,EACN,GAAW,EACX,aAAqB,EACrB,OAAgC;QAEhC,MAAM,IAAA,2BAAkB,EAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;CACF;AAhBD,kCAgBC"}