@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.
- package/dist/bundles/catenv/index.js +617 -19
- package/dist/bundles/cli/index.js +811 -18
- package/dist/cli/src/adapters/baseContext.d.ts +4 -0
- package/dist/cli/src/adapters/baseContext.js +5 -0
- package/dist/cli/src/adapters/baseContext.js.map +1 -1
- package/dist/cli/src/adapters/nonInteractive.d.ts +9 -0
- package/dist/cli/src/adapters/nonInteractive.js +32 -0
- package/dist/cli/src/adapters/nonInteractive.js.map +1 -0
- package/dist/cli/src/adapters/programmatic.d.ts +1 -0
- package/dist/cli/src/adapters/programmatic.js +6 -1
- package/dist/cli/src/adapters/programmatic.js.map +1 -1
- package/dist/cli/src/adapters/terminal.d.ts +1 -0
- package/dist/cli/src/adapters/terminal.js +10 -1
- package/dist/cli/src/adapters/terminal.js.map +1 -1
- package/dist/cli/src/adapters/vaultManagerAccess.d.ts +8 -0
- package/dist/cli/src/adapters/vaultManagerAccess.js +26 -0
- package/dist/cli/src/adapters/vaultManagerAccess.js.map +1 -0
- package/dist/cli/src/apps/catenv/catenv.d.ts +2 -0
- package/dist/cli/src/apps/catenv/catenv.js +8 -1
- package/dist/cli/src/apps/catenv/catenv.js.map +1 -1
- package/dist/cli/src/apps/catenv/printVariables.d.ts +2 -2
- package/dist/cli/src/apps/catenv/printVariables.js +4 -4
- package/dist/cli/src/apps/catenv/printVariables.js.map +1 -1
- package/dist/cli/src/apps/catenv/types.d.ts +9 -0
- package/dist/cli/src/apps/catenv/writeDotEnvFiles.d.ts +2 -2
- package/dist/cli/src/apps/catenv/writeDotEnvFiles.js +1 -1
- package/dist/cli/src/apps/catenv/writeDotEnvFiles.js.map +1 -1
- package/dist/cli/src/apps/cli/commands/project/commandConfigSecrets.js +52 -3
- package/dist/cli/src/apps/cli/commands/project/commandConfigSecrets.js.map +1 -1
- package/dist/cli/src/catenv.js +3 -2
- package/dist/cli/src/catenv.js.map +1 -1
- package/dist/cli/src/commands/index.d.ts +1 -0
- package/dist/cli/src/commands/index.js +8 -1
- package/dist/cli/src/commands/index.js.map +1 -1
- package/dist/cli/src/commands/project/commandSecretsSyncGithub.d.ts +37 -0
- package/dist/cli/src/commands/project/commandSecretsSyncGithub.js +127 -0
- package/dist/cli/src/commands/project/commandSecretsSyncGithub.js.map +1 -0
- package/dist/cli/src/config/getProjectConfig.d.ts +1 -1
- package/dist/cli/src/config/getProjectConfig.js +12 -2
- package/dist/cli/src/config/getProjectConfig.js.map +1 -1
- package/dist/cli/src/core/types.d.ts +15 -0
- package/dist/cli/src/core/types.js +8 -1
- package/dist/cli/src/core/types.js.map +1 -1
- package/dist/cli/src/git/gitProjectInformation.d.ts +1 -1
- package/dist/cli/src/git/gitProjectInformation.js +3 -3
- package/dist/cli/src/git/gitProjectInformation.js.map +1 -1
- package/dist/cli/src/utils/github.d.ts +15 -0
- package/dist/cli/src/utils/github.js +54 -0
- package/dist/cli/src/utils/github.js.map +1 -0
- package/dist/cli/src/vault/BitwardenVault.d.ts +24 -0
- package/dist/cli/src/vault/BitwardenVault.js +107 -0
- package/dist/cli/src/vault/BitwardenVault.js.map +1 -0
- package/dist/cli/src/vault/GitlabVault.d.ts +11 -0
- package/dist/cli/src/vault/GitlabVault.js +24 -0
- package/dist/cli/src/vault/GitlabVault.js.map +1 -0
- package/dist/cli/src/vault/VaultManager.d.ts +43 -0
- package/dist/cli/src/vault/VaultManager.js +131 -0
- package/dist/cli/src/vault/VaultManager.js.map +1 -0
- package/dist/cli/src/vault/bw.d.ts +15 -0
- package/dist/cli/src/vault/bw.js +89 -0
- package/dist/cli/src/vault/bw.js.map +1 -0
- package/dist/cli/src/vault/cache.d.ts +38 -0
- package/dist/cli/src/vault/cache.js +53 -0
- package/dist/cli/src/vault/cache.js.map +1 -0
- package/dist/cli/src/vault/index.d.ts +5 -0
- package/dist/cli/src/vault/index.js +48 -0
- package/dist/cli/src/vault/index.js.map +1 -0
- package/dist/cli/src/vault/types.d.ts +33 -0
- package/dist/cli/src/vault/types.js +5 -0
- package/dist/cli/src/vault/types.js.map +1 -0
- package/dist/pipeline/src/backends/index.d.ts +17 -1
- package/dist/pipeline/src/backends/index.js +33 -1
- package/dist/pipeline/src/backends/index.js.map +1 -1
- package/dist/pipeline/src/constants.js +1 -1
- package/dist/pipeline/src/deploy/cloudRun/index.js +11 -4
- package/dist/pipeline/src/deploy/cloudRun/index.js.map +1 -1
- package/dist/pipeline/src/types/config.d.ts +37 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/adapters/baseContext.ts +10 -0
- package/src/adapters/nonInteractive.ts +30 -0
- package/src/adapters/programmatic.ts +7 -1
- package/src/adapters/terminal.ts +9 -1
- package/src/adapters/vaultManagerAccess.ts +25 -0
- package/src/apps/catenv/catenv.ts +5 -1
- package/src/apps/catenv/printVariables.ts +16 -6
- package/src/apps/catenv/types.ts +9 -0
- package/src/apps/catenv/writeDotEnvFiles.ts +3 -3
- package/src/apps/cli/commands/project/commandConfigSecrets.ts +94 -9
- package/src/catenv.ts +22 -2
- package/src/commands/index.ts +1 -0
- package/src/commands/project/commandSecretsSyncGithub.ts +149 -0
- package/src/config/getProjectConfig.ts +21 -7
- package/src/core/types.ts +23 -0
- package/src/git/gitProjectInformation.ts +5 -3
- package/src/utils/github.ts +59 -0
- package/src/vault/BitwardenVault.ts +161 -0
- package/src/vault/GitlabVault.ts +25 -0
- package/src/vault/VaultManager.ts +211 -0
- package/src/vault/bw.ts +110 -0
- package/src/vault/cache.ts +80 -0
- package/src/vault/index.ts +5 -0
- 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,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";
|