@catladder/cli 0.0.0-next-4e7c6848 → 0.0.0-next-8b9ad5ca

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 (103) hide show
  1. package/dist/bundles/catenv/index.js +617 -19
  2. package/dist/bundles/cli/index.js +811 -18
  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 +52 -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 +37 -0
  36. package/dist/cli/src/commands/project/commandSecretsSyncGithub.js +127 -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 +15 -0
  48. package/dist/cli/src/utils/github.js +54 -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/index.d.ts +17 -1
  72. package/dist/pipeline/src/backends/index.js +33 -1
  73. package/dist/pipeline/src/backends/index.js.map +1 -1
  74. package/dist/pipeline/src/constants.js +1 -1
  75. package/dist/pipeline/src/deploy/cloudRun/index.js +11 -4
  76. package/dist/pipeline/src/deploy/cloudRun/index.js.map +1 -1
  77. package/dist/pipeline/src/types/config.d.ts +37 -3
  78. package/dist/tsconfig.tsbuildinfo +1 -1
  79. package/package.json +1 -1
  80. package/src/adapters/baseContext.ts +10 -0
  81. package/src/adapters/nonInteractive.ts +30 -0
  82. package/src/adapters/programmatic.ts +7 -1
  83. package/src/adapters/terminal.ts +9 -1
  84. package/src/adapters/vaultManagerAccess.ts +25 -0
  85. package/src/apps/catenv/catenv.ts +5 -1
  86. package/src/apps/catenv/printVariables.ts +16 -6
  87. package/src/apps/catenv/types.ts +9 -0
  88. package/src/apps/catenv/writeDotEnvFiles.ts +3 -3
  89. package/src/apps/cli/commands/project/commandConfigSecrets.ts +94 -9
  90. package/src/catenv.ts +22 -2
  91. package/src/commands/index.ts +1 -0
  92. package/src/commands/project/commandSecretsSyncGithub.ts +149 -0
  93. package/src/config/getProjectConfig.ts +21 -7
  94. package/src/core/types.ts +23 -0
  95. package/src/git/gitProjectInformation.ts +5 -3
  96. package/src/utils/github.ts +59 -0
  97. package/src/vault/BitwardenVault.ts +161 -0
  98. package/src/vault/GitlabVault.ts +25 -0
  99. package/src/vault/VaultManager.ts +211 -0
  100. package/src/vault/bw.ts +110 -0
  101. package/src/vault/cache.ts +80 -0
  102. package/src/vault/index.ts +5 -0
  103. package/src/vault/types.ts +42 -0
@@ -0,0 +1,80 @@
1
+ import { mkdir, readFile, writeFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import { getProjectRootPath } from "../git/gitProjectInformation";
4
+
5
+ /**
6
+ * hierarchical: env -> componentName -> key -> value.
7
+ * Only the "local" env is ever cached — other envs' secrets have no
8
+ * business sitting on developer machines.
9
+ *
10
+ * `null` records a declared secret that was absent in the vault at the
11
+ * last refresh (e.g. deploy credentials that intentionally don't exist
12
+ * for local) — a known miss, so it doesn't force re-contacting the
13
+ * vault on every run.
14
+ */
15
+ export type CachedSecrets = {
16
+ [env: string]: { [componentName: string]: { [key: string]: string | null } };
17
+ };
18
+
19
+ /**
20
+ * local, project-scoped cache of the vault secrets, so that frequent
21
+ * catenv runs don't have to contact the vault (e.g. unlock bitwarden)
22
+ * every time. Plaintext — like the .env files catenv writes anyway —
23
+ * but never committed (the folder ignores itself).
24
+ */
25
+ type SecretsCache = {
26
+ /** the vault this cache was filled from */
27
+ vaultId: string;
28
+ updatedAt: string;
29
+ secrets: CachedSecrets;
30
+ };
31
+
32
+ const getCacheFolder = async () =>
33
+ join(await getProjectRootPath(), ".catladder");
34
+
35
+ const getCachePath = async () => join(await getCacheFolder(), "secrets.json");
36
+
37
+ export const readSecretsCache = async (): Promise<SecretsCache | null> => {
38
+ try {
39
+ return JSON.parse(await readFile(await getCachePath(), "utf-8"));
40
+ } catch {
41
+ return null;
42
+ }
43
+ };
44
+
45
+ export const writeSecretsCache = async (
46
+ vaultId: string,
47
+ secrets: CachedSecrets,
48
+ ): Promise<void> => {
49
+ const folder = await getCacheFolder();
50
+ await mkdir(folder, { recursive: true });
51
+ // the folder ignores itself, so the cache can never be committed
52
+ await writeFile(join(folder, ".gitignore"), "*\n");
53
+ const cache: SecretsCache = {
54
+ vaultId,
55
+ updatedAt: new Date().toISOString(),
56
+ secrets,
57
+ };
58
+ await writeFile(await getCachePath(), JSON.stringify(cache, null, 2));
59
+ };
60
+
61
+ /**
62
+ * merges freshly written secrets of one env/component into the cache
63
+ * (write-through from config-secrets), so the next catenv run doesn't
64
+ * need the vault
65
+ */
66
+ export const updateSecretsCache = async (
67
+ vaultId: string,
68
+ env: string,
69
+ componentName: string,
70
+ values: Record<string, string>,
71
+ ): Promise<void> => {
72
+ const existing = await readSecretsCache();
73
+ const secrets: CachedSecrets =
74
+ existing?.vaultId === vaultId ? existing.secrets : {};
75
+ secrets[env] = {
76
+ ...secrets[env],
77
+ [componentName]: { ...secrets[env]?.[componentName], ...values },
78
+ };
79
+ await writeSecretsCache(vaultId, secrets);
80
+ };
@@ -0,0 +1,5 @@
1
+ export * from "./types";
2
+ export * from "./VaultManager";
3
+ export { GitlabVault } from "./GitlabVault";
4
+ export { BitwardenVault } from "./BitwardenVault";
5
+ export { updateSecretsCache } from "./cache";
@@ -0,0 +1,42 @@
1
+ import type { IO } from "../core/types";
2
+
3
+ /**
4
+ * a secrets vault is the readable source of truth for secret values.
5
+ * CI backends (gitlab variables, github secrets) only receive mirrored
6
+ * copies of what is stored here.
7
+ */
8
+ export type SecretsVault = {
9
+ /**
10
+ * identity of the vault (incl. its config), used to invalidate the
11
+ * local cache when the vault changes
12
+ */
13
+ id: string;
14
+
15
+ /**
16
+ * all secrets as a flat map of raw secret variable names
17
+ * (CL_<ENV>_<COMPONENT>_<KEY>) to values
18
+ */
19
+ readAllSecrets(io: IO | null): Promise<Record<string, string>>;
20
+
21
+ /**
22
+ * upserts the secrets of one env and component
23
+ * (keys as declared in the config, not the raw variable names)
24
+ */
25
+ writeSecrets(
26
+ io: IO,
27
+ env: string,
28
+ componentName: string,
29
+ secrets: Record<string, unknown>,
30
+ ): Promise<void>;
31
+ };
32
+
33
+ /**
34
+ * how secret resolution may interact with the vault:
35
+ * - auto (default): contact the vault when the local cache is
36
+ * incomplete, prompting to unlock if necessary
37
+ * - no-prompt: contact the vault only if that needs no interaction;
38
+ * fail on missing secrets instead of prompting to unlock
39
+ * - offline: never contact the vault, use only the local cache
40
+ * - refresh: ignore the local cache once and refresh it from the vault
41
+ */
42
+ export type SecretsMode = "auto" | "no-prompt" | "offline" | "refresh";