monorepo-secret-manager 2.0.0
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/LICENSE +21 -0
- package/MIGRATION.md +51 -0
- package/README.md +156 -0
- package/dist/ConfigManager.d.ts +20 -0
- package/dist/ConfigManager.d.ts.map +1 -0
- package/dist/ConfigManager.js +253 -0
- package/dist/ConfigManager.js.map +1 -0
- package/dist/GcpMonorepoSecretManager.d.ts +3 -0
- package/dist/GcpMonorepoSecretManager.d.ts.map +1 -0
- package/dist/GcpMonorepoSecretManager.js +7 -0
- package/dist/GcpMonorepoSecretManager.js.map +1 -0
- package/dist/MonorepoSecretManager.d.ts +30 -0
- package/dist/MonorepoSecretManager.d.ts.map +1 -0
- package/dist/MonorepoSecretManager.js +172 -0
- package/dist/MonorepoSecretManager.js.map +1 -0
- package/dist/backends/aws.d.ts +18 -0
- package/dist/backends/aws.d.ts.map +1 -0
- package/dist/backends/aws.js +110 -0
- package/dist/backends/aws.js.map +1 -0
- package/dist/backends/azure.d.ts +15 -0
- package/dist/backends/azure.d.ts.map +1 -0
- package/dist/backends/azure.js +112 -0
- package/dist/backends/azure.js.map +1 -0
- package/dist/backends/createBackend.d.ts +7 -0
- package/dist/backends/createBackend.d.ts.map +1 -0
- package/dist/backends/createBackend.js +23 -0
- package/dist/backends/createBackend.js.map +1 -0
- package/dist/backends/gcp.d.ts +16 -0
- package/dist/backends/gcp.d.ts.map +1 -0
- package/dist/backends/gcp.js +150 -0
- package/dist/backends/gcp.js.map +1 -0
- package/dist/backends/local.d.ts +27 -0
- package/dist/backends/local.d.ts.map +1 -0
- package/dist/backends/local.js +197 -0
- package/dist/backends/local.js.map +1 -0
- package/dist/backends/types.d.ts +19 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +36 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +181 -0
- package/dist/cli.js.map +1 -0
- package/dist/cliInit.d.ts +4 -0
- package/dist/cliInit.d.ts.map +1 -0
- package/dist/cliInit.js +404 -0
- package/dist/cliInit.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/initSecretManagerClient.d.ts +6 -0
- package/dist/initSecretManagerClient.d.ts.map +1 -0
- package/dist/initSecretManagerClient.js +23 -0
- package/dist/initSecretManagerClient.js.map +1 -0
- package/dist/kinds/binary.d.ts +3 -0
- package/dist/kinds/binary.d.ts.map +1 -0
- package/dist/kinds/binary.js +51 -0
- package/dist/kinds/binary.js.map +1 -0
- package/dist/kinds/env-file.d.ts +3 -0
- package/dist/kinds/env-file.d.ts.map +1 -0
- package/dist/kinds/env-file.js +54 -0
- package/dist/kinds/env-file.js.map +1 -0
- package/dist/kinds/envelope.d.ts +13 -0
- package/dist/kinds/envelope.d.ts.map +1 -0
- package/dist/kinds/envelope.js +44 -0
- package/dist/kinds/envelope.js.map +1 -0
- package/dist/kinds/index.d.ts +11 -0
- package/dist/kinds/index.d.ts.map +1 -0
- package/dist/kinds/index.js +29 -0
- package/dist/kinds/index.js.map +1 -0
- package/dist/kinds/json.d.ts +3 -0
- package/dist/kinds/json.d.ts.map +1 -0
- package/dist/kinds/json.js +62 -0
- package/dist/kinds/json.js.map +1 -0
- package/dist/kinds/ssh-keypair.d.ts +3 -0
- package/dist/kinds/ssh-keypair.d.ts.map +1 -0
- package/dist/kinds/ssh-keypair.js +83 -0
- package/dist/kinds/ssh-keypair.js.map +1 -0
- package/dist/kinds/tls-bundle.d.ts +3 -0
- package/dist/kinds/tls-bundle.d.ts.map +1 -0
- package/dist/kinds/tls-bundle.js +70 -0
- package/dist/kinds/tls-bundle.js.map +1 -0
- package/dist/kinds/types.d.ts +9 -0
- package/dist/kinds/types.d.ts.map +1 -0
- package/dist/kinds/types.js +3 -0
- package/dist/kinds/types.js.map +1 -0
- package/dist/loadConfig.d.ts +2 -0
- package/dist/loadConfig.d.ts.map +1 -0
- package/dist/loadConfig.js +6 -0
- package/dist/loadConfig.js.map +1 -0
- package/dist/pathUtils.d.ts +6 -0
- package/dist/pathUtils.d.ts.map +1 -0
- package/dist/pathUtils.js +32 -0
- package/dist/pathUtils.js.map +1 -0
- package/dist/prompt.d.ts +5 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +53 -0
- package/dist/prompt.js.map +1 -0
- package/dist/runtimeConfig.d.ts +7 -0
- package/dist/runtimeConfig.d.ts.map +1 -0
- package/dist/runtimeConfig.js +86 -0
- package/dist/runtimeConfig.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +123 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Adam Siwiec
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/MIGRATION.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Migration from gcp-monorepo-secret-manager
|
|
2
|
+
|
|
3
|
+
npm cannot rename a package. `monorepo-secret-manager` is a new name. The old name stays installable and should be deprecated, not unpublished.
|
|
4
|
+
|
|
5
|
+
## For consumers
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm uninstall gcp-monorepo-secret-manager
|
|
9
|
+
npm install monorepo-secret-manager
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
If you use GCP, also install the optional SDK:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @google-cloud/secret-manager
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Update imports:
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
// before
|
|
22
|
+
import { loadConfig, GcpMonorepoSecretManager } from "gcp-monorepo-secret-manager";
|
|
23
|
+
|
|
24
|
+
// after
|
|
25
|
+
import { loadConfig, MonorepoSecretManager } from "monorepo-secret-manager";
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`GcpMonorepoSecretManager` still works as a deprecated alias for one major version.
|
|
29
|
+
|
|
30
|
+
The `msm` binary is unchanged, so scripts like `msm --download --service all --stg --set` keep working.
|
|
31
|
+
|
|
32
|
+
Existing `.secrets-config` files that use `serviceAccountPaths` and `projectIds` are still valid. They are treated as GCP. Run `msm --init` when you want provider-aware v2 config.
|
|
33
|
+
|
|
34
|
+
## For maintainers: publish and deprecate
|
|
35
|
+
|
|
36
|
+
Run these from the **repo root**, not from `compat/`. npm will prompt for a 2FA OTP (or pass `--otp=XXXXXX`).
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cd /path/to/gcp-monorepo-secret-manager
|
|
40
|
+
npm publish --access public --otp=XXXXXX
|
|
41
|
+
npm run publish:shim -- --otp=XXXXXX
|
|
42
|
+
npm run deprecate:legacy
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`publish:shim` publishes `compat/gcp-monorepo-secret-manager` as `gcp-monorepo-secret-manager@1.2.0`. Do not `cd` into that folder first.
|
|
46
|
+
|
|
47
|
+
Do not unpublish `gcp-monorepo-secret-manager`. That breaks existing `1.1.0` installs.
|
|
48
|
+
|
|
49
|
+
## GitHub repository
|
|
50
|
+
|
|
51
|
+
Rename `the-freetech-company/gcp-monorepo-secret-manager` to `monorepo-secret-manager` in GitHub settings. Old clone URLs redirect.
|
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Monorepo Secret Manager
|
|
2
|
+
|
|
3
|
+
Sync env files, SSH keypairs, TLS bundles, JSON, and binary files across a monorepo to GCP Secret Manager, AWS Secrets Manager, Azure Key Vault, or a local encrypted store.
|
|
4
|
+
|
|
5
|
+
This package was previously published as `gcp-monorepo-secret-manager`. See [MIGRATION.md](./MIGRATION.md).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g monorepo-secret-manager
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Install only the SDK for the backend you use:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @google-cloud/secret-manager
|
|
17
|
+
npm install -g @aws-sdk/client-secrets-manager
|
|
18
|
+
npm install -g @azure/identity @azure/keyvault-secrets
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The local backend is built in. No extra package is required.
|
|
22
|
+
|
|
23
|
+
If a provider SDK is missing, the CLI fails with:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
Provider "aws" requires @aws-sdk/client-secrets-manager. Run: npm i -D @aws-sdk/client-secrets-manager
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Quick start
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
msm --init
|
|
33
|
+
msm --upload --service frontend --stg
|
|
34
|
+
msm --download --service frontend --prod --set
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The init wizard asks for a provider per environment. Staging can be `local` while production is `gcp`, `aws`, or `azure`.
|
|
38
|
+
|
|
39
|
+
## Backends
|
|
40
|
+
|
|
41
|
+
| Provider | Store | Auth |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `gcp` | Secret Manager | ADC or a service-account JSON path |
|
|
44
|
+
| `aws` | Secrets Manager | Default credential chain or `AWS_PROFILE` |
|
|
45
|
+
| `azure` | Key Vault secrets | `DefaultAzureCredential` |
|
|
46
|
+
| `local` | Encrypted files under `.msm/store` | `MSM_LOCAL_KEY` or `.msm/key` |
|
|
47
|
+
|
|
48
|
+
The local store uses AES-256-GCM. `msm --init` creates `.msm/key` (mode `0600`) and adds `.msm/` to `.gitignore`. The backend refuses to run if the store is in a git repo and is not ignored.
|
|
49
|
+
|
|
50
|
+
## Secret kinds
|
|
51
|
+
|
|
52
|
+
Each service can have one or more items:
|
|
53
|
+
|
|
54
|
+
- `env-file` — dotenv text. Stored as raw text so existing `*_ENV_FILE` GCP secrets keep working.
|
|
55
|
+
- `ssh-keypair` — private + public key. Private file is written `0600`.
|
|
56
|
+
- `tls-bundle` — cert, key, optional chain. Key is written `0600`.
|
|
57
|
+
- `json` — a JSON object or array.
|
|
58
|
+
- `binary` — an opaque file.
|
|
59
|
+
|
|
60
|
+
Typed kinds are stored as a JSON envelope so every backend can carry them, including Azure (string-only).
|
|
61
|
+
|
|
62
|
+
`msm --peek` prints redacted output. It never prints private keys or env values.
|
|
63
|
+
|
|
64
|
+
## Configuration
|
|
65
|
+
|
|
66
|
+
`.secrets-config` v2:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"version": 2,
|
|
71
|
+
"environments": {
|
|
72
|
+
"staging": {
|
|
73
|
+
"provider": "local",
|
|
74
|
+
"storePath": ".msm/store"
|
|
75
|
+
},
|
|
76
|
+
"production": {
|
|
77
|
+
"provider": "gcp",
|
|
78
|
+
"projectId": "my-project-prod",
|
|
79
|
+
"credentials": { "path": "gcloud/production/sa.json" }
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"services": [
|
|
83
|
+
{
|
|
84
|
+
"name": "api",
|
|
85
|
+
"secrets": [
|
|
86
|
+
{
|
|
87
|
+
"kind": "env-file",
|
|
88
|
+
"sourcePath": ".environments/.api.{env}.env",
|
|
89
|
+
"targetPath": "services/api/.env",
|
|
90
|
+
"remoteName": "api-env-file"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"deletePolicy": {
|
|
96
|
+
"maxVersions": 10,
|
|
97
|
+
"maxAgeDays": 30,
|
|
98
|
+
"enabled": true
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
A v1 GCP-only file (`serviceAccountPaths` + `projectIds` + `secretPrefix`) is still loaded and treated as `provider: "gcp"` with one `env-file` item per service.
|
|
104
|
+
|
|
105
|
+
## CLI
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
msm --init
|
|
109
|
+
msm --list
|
|
110
|
+
msm --upload --service all --prod
|
|
111
|
+
msm --download --service api --stg --set
|
|
112
|
+
msm --peek --service api --prod
|
|
113
|
+
msm --cleanup --service api --prod
|
|
114
|
+
msm --add-service
|
|
115
|
+
msm --remove-service
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`--override-sa` skips local credential files and uses the environment (CI workload identity, instance roles, Azure managed identity).
|
|
119
|
+
|
|
120
|
+
## SDK
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { loadConfig, MonorepoSecretManager } from "monorepo-secret-manager";
|
|
124
|
+
|
|
125
|
+
await loadConfig({
|
|
126
|
+
serviceName: "api-server",
|
|
127
|
+
provider: "gcp",
|
|
128
|
+
projectId: "my-company-prod",
|
|
129
|
+
requiredEnvVars: ["DATABASE_URL", "JWT_SECRET"]
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const manager = new MonorepoSecretManager({
|
|
133
|
+
environment: "production",
|
|
134
|
+
overrideSa: true
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
await manager.downloadEnv("api");
|
|
138
|
+
await manager.setEnv("api");
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`GcpMonorepoSecretManager` remains as a deprecated alias of `MonorepoSecretManager`.
|
|
142
|
+
|
|
143
|
+
## Suggested layout
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
your-monorepo/
|
|
147
|
+
├── .secrets-config
|
|
148
|
+
├── .environments/
|
|
149
|
+
├── .msm/ # local store, gitignored
|
|
150
|
+
├── apps/web/.env
|
|
151
|
+
└── services/api/.env
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## License
|
|
155
|
+
|
|
156
|
+
MIT
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DeletePolicy, Environment, EnvironmentConfig, SecretsConfig, ServiceConfig } from "./types";
|
|
2
|
+
export declare class ConfigManager {
|
|
3
|
+
private config;
|
|
4
|
+
private configPath;
|
|
5
|
+
constructor(configPath?: string);
|
|
6
|
+
private loadConfig;
|
|
7
|
+
private validateConfig;
|
|
8
|
+
private validateDeletePolicy;
|
|
9
|
+
getConfig(): SecretsConfig;
|
|
10
|
+
getEnvironmentConfig(environment: Environment): EnvironmentConfig;
|
|
11
|
+
getServiceAccountPath(environment: Environment): string;
|
|
12
|
+
getProjectId(environment: Environment): string;
|
|
13
|
+
getServices(): ServiceConfig[];
|
|
14
|
+
getServiceByName(name: string): ServiceConfig | undefined;
|
|
15
|
+
getServiceNames(): string[];
|
|
16
|
+
getDeletePolicy(): DeletePolicy;
|
|
17
|
+
writeConfig(config?: SecretsConfig): void;
|
|
18
|
+
static generateTemplate(outputPath?: string): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ConfigManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../src/ConfigManager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,iBAAiB,EAGjB,aAAa,EACb,aAAa,EAEd,MAAM,SAAS,CAAC;AAkKjB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAA0B;IAMlD,OAAO,CAAC,UAAU;IAsClB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,oBAAoB;IAoB5B,SAAS,IAAI,aAAa;IAI1B,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,iBAAiB;IAIjE,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM;IAevD,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM;IAa9C,WAAW,IAAI,aAAa,EAAE;IAI9B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIzD,eAAe,IAAI,MAAM,EAAE;IAI3B,eAAe,IAAI,YAAY;IAU/B,WAAW,CAAC,MAAM,GAAE,aAA2B,GAAG,IAAI;IAKtD,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAE,MAA0B,GAAG,IAAI;CA2BtE"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigManager = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const SECRET_KINDS = [
|
|
9
|
+
"env-file",
|
|
10
|
+
"ssh-keypair",
|
|
11
|
+
"tls-bundle",
|
|
12
|
+
"json",
|
|
13
|
+
"binary",
|
|
14
|
+
];
|
|
15
|
+
const PROVIDERS = ["gcp", "aws", "azure", "local"];
|
|
16
|
+
function isLegacyConfig(raw) {
|
|
17
|
+
return Boolean(raw.serviceAccountPaths &&
|
|
18
|
+
raw.projectIds &&
|
|
19
|
+
!raw.environments);
|
|
20
|
+
}
|
|
21
|
+
function adaptLegacyService(service) {
|
|
22
|
+
if (!service.name) {
|
|
23
|
+
throw new Error("Service is missing required field: name");
|
|
24
|
+
}
|
|
25
|
+
const secrets = service.secrets && service.secrets.length > 0
|
|
26
|
+
? service.secrets
|
|
27
|
+
: service.envPath && service.targetPath && service.secretPrefix
|
|
28
|
+
? [
|
|
29
|
+
{
|
|
30
|
+
kind: "env-file",
|
|
31
|
+
sourcePath: service.envPath,
|
|
32
|
+
targetPath: service.targetPath,
|
|
33
|
+
remoteName: `${service.secretPrefix}_ENV_FILE`,
|
|
34
|
+
},
|
|
35
|
+
]
|
|
36
|
+
: [];
|
|
37
|
+
return {
|
|
38
|
+
name: service.name,
|
|
39
|
+
envPath: service.envPath,
|
|
40
|
+
targetPath: service.targetPath,
|
|
41
|
+
secretPrefix: service.secretPrefix,
|
|
42
|
+
secrets,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function adaptLegacyConfig(raw) {
|
|
46
|
+
if (!raw.serviceAccountPaths?.staging ||
|
|
47
|
+
!raw.serviceAccountPaths.production ||
|
|
48
|
+
!raw.projectIds?.staging ||
|
|
49
|
+
!raw.projectIds.production) {
|
|
50
|
+
throw new Error("Legacy configuration must include serviceAccountPaths and projectIds for both staging and production");
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
version: 2,
|
|
54
|
+
environments: {
|
|
55
|
+
staging: {
|
|
56
|
+
provider: "gcp",
|
|
57
|
+
projectId: raw.projectIds.staging,
|
|
58
|
+
credentials: { path: raw.serviceAccountPaths.staging },
|
|
59
|
+
},
|
|
60
|
+
production: {
|
|
61
|
+
provider: "gcp",
|
|
62
|
+
projectId: raw.projectIds.production,
|
|
63
|
+
credentials: { path: raw.serviceAccountPaths.production },
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
services: (raw.services || []).map(adaptLegacyService),
|
|
67
|
+
deletePolicy: raw.deletePolicy,
|
|
68
|
+
serviceAccountPaths: {
|
|
69
|
+
staging: raw.serviceAccountPaths.staging,
|
|
70
|
+
production: raw.serviceAccountPaths.production,
|
|
71
|
+
},
|
|
72
|
+
projectIds: {
|
|
73
|
+
staging: raw.projectIds.staging,
|
|
74
|
+
production: raw.projectIds.production,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function normalizeService(service, index) {
|
|
79
|
+
if (!service.name) {
|
|
80
|
+
throw new Error(`Service at index ${index} is missing required field: name`);
|
|
81
|
+
}
|
|
82
|
+
const normalized = adaptLegacyService(service);
|
|
83
|
+
if (!normalized.secrets || normalized.secrets.length === 0) {
|
|
84
|
+
throw new Error(`Service '${service.name}' must include secrets or legacy envPath, targetPath, and secretPrefix`);
|
|
85
|
+
}
|
|
86
|
+
normalized.secrets.forEach((secret, secretIndex) => {
|
|
87
|
+
if (!secret.kind || !SECRET_KINDS.includes(secret.kind)) {
|
|
88
|
+
throw new Error(`Service '${service.name}' secret at index ${secretIndex} has an invalid kind`);
|
|
89
|
+
}
|
|
90
|
+
if (!secret.remoteName) {
|
|
91
|
+
throw new Error(`Service '${service.name}' secret at index ${secretIndex} is missing remoteName`);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return normalized;
|
|
95
|
+
}
|
|
96
|
+
function validateEnvironment(label, environment) {
|
|
97
|
+
if (!environment || !PROVIDERS.includes(environment.provider)) {
|
|
98
|
+
throw new Error(`environments.${label}.provider must be one of: ${PROVIDERS.join(", ")}`);
|
|
99
|
+
}
|
|
100
|
+
switch (environment.provider) {
|
|
101
|
+
case "gcp":
|
|
102
|
+
if (!environment.projectId) {
|
|
103
|
+
throw new Error(`environments.${label}.projectId is required for the GCP provider`);
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
case "aws":
|
|
107
|
+
if (!environment.region) {
|
|
108
|
+
throw new Error(`environments.${label}.region is required for the AWS provider`);
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case "azure":
|
|
112
|
+
if (!environment.vaultUrl) {
|
|
113
|
+
throw new Error(`environments.${label}.vaultUrl is required for the Azure provider`);
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
116
|
+
case "local":
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
class ConfigManager {
|
|
123
|
+
constructor(configPath = ".secrets-config") {
|
|
124
|
+
this.configPath = configPath;
|
|
125
|
+
this.config = this.loadConfig();
|
|
126
|
+
this.validateConfig();
|
|
127
|
+
}
|
|
128
|
+
loadConfig() {
|
|
129
|
+
if (!fs_1.default.existsSync(this.configPath)) {
|
|
130
|
+
throw new Error(`Configuration file not found at ${this.configPath}. Please create a .secrets-config file. Run 'msm --init' to generate a template.`);
|
|
131
|
+
}
|
|
132
|
+
let raw;
|
|
133
|
+
try {
|
|
134
|
+
raw = JSON.parse(fs_1.default.readFileSync(this.configPath, "utf8"));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new Error(`Failed to parse configuration file: ${error.message}`);
|
|
138
|
+
}
|
|
139
|
+
if (isLegacyConfig(raw)) {
|
|
140
|
+
return adaptLegacyConfig(raw);
|
|
141
|
+
}
|
|
142
|
+
if (!raw.environments) {
|
|
143
|
+
throw new Error("Configuration must include environments.staging and environments.production");
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
version: 2,
|
|
147
|
+
environments: raw.environments,
|
|
148
|
+
services: (raw.services || []).map((service, index) => normalizeService(service, index)),
|
|
149
|
+
deletePolicy: raw.deletePolicy,
|
|
150
|
+
serviceAccountPaths: raw.serviceAccountPaths,
|
|
151
|
+
projectIds: raw.projectIds,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
validateConfig() {
|
|
155
|
+
validateEnvironment("staging", this.config.environments.staging);
|
|
156
|
+
validateEnvironment("production", this.config.environments.production);
|
|
157
|
+
if (this.config.services && !Array.isArray(this.config.services)) {
|
|
158
|
+
throw new Error("Services must be an array if provided");
|
|
159
|
+
}
|
|
160
|
+
if (this.config.deletePolicy) {
|
|
161
|
+
this.validateDeletePolicy(this.config.deletePolicy);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
validateDeletePolicy(policy) {
|
|
165
|
+
if (policy.maxVersions !== undefined &&
|
|
166
|
+
(policy.maxVersions < 0 || !Number.isInteger(policy.maxVersions))) {
|
|
167
|
+
throw new Error("deletePolicy.maxVersions must be a non-negative integer");
|
|
168
|
+
}
|
|
169
|
+
if (policy.maxAgeDays !== undefined &&
|
|
170
|
+
(policy.maxAgeDays < 0 || !Number.isInteger(policy.maxAgeDays))) {
|
|
171
|
+
throw new Error("deletePolicy.maxAgeDays must be a non-negative integer");
|
|
172
|
+
}
|
|
173
|
+
if (policy.enabled !== undefined && typeof policy.enabled !== "boolean") {
|
|
174
|
+
throw new Error("deletePolicy.enabled must be a boolean");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
getConfig() {
|
|
178
|
+
return this.config;
|
|
179
|
+
}
|
|
180
|
+
getEnvironmentConfig(environment) {
|
|
181
|
+
return this.config.environments[environment];
|
|
182
|
+
}
|
|
183
|
+
getServiceAccountPath(environment) {
|
|
184
|
+
const fromLegacy = this.config.serviceAccountPaths?.[environment];
|
|
185
|
+
if (fromLegacy) {
|
|
186
|
+
return fromLegacy;
|
|
187
|
+
}
|
|
188
|
+
const path = this.config.environments[environment].credentials?.path;
|
|
189
|
+
if (!path) {
|
|
190
|
+
throw new Error(`No service account path configured for ${environment}`);
|
|
191
|
+
}
|
|
192
|
+
return path;
|
|
193
|
+
}
|
|
194
|
+
getProjectId(environment) {
|
|
195
|
+
const fromLegacy = this.config.projectIds?.[environment];
|
|
196
|
+
if (fromLegacy) {
|
|
197
|
+
return fromLegacy;
|
|
198
|
+
}
|
|
199
|
+
const projectId = this.config.environments[environment].projectId;
|
|
200
|
+
if (!projectId) {
|
|
201
|
+
throw new Error(`No project ID configured for ${environment}`);
|
|
202
|
+
}
|
|
203
|
+
return projectId;
|
|
204
|
+
}
|
|
205
|
+
getServices() {
|
|
206
|
+
return this.config.services || [];
|
|
207
|
+
}
|
|
208
|
+
getServiceByName(name) {
|
|
209
|
+
return this.getServices().find((service) => service.name === name);
|
|
210
|
+
}
|
|
211
|
+
getServiceNames() {
|
|
212
|
+
return this.getServices().map((service) => service.name);
|
|
213
|
+
}
|
|
214
|
+
getDeletePolicy() {
|
|
215
|
+
return (this.config.deletePolicy || {
|
|
216
|
+
maxVersions: 10,
|
|
217
|
+
maxAgeDays: 30,
|
|
218
|
+
enabled: true,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
writeConfig(config = this.config) {
|
|
222
|
+
this.config = config;
|
|
223
|
+
fs_1.default.writeFileSync(this.configPath, JSON.stringify(config, null, 2));
|
|
224
|
+
}
|
|
225
|
+
static generateTemplate(outputPath = ".secrets-config") {
|
|
226
|
+
const template = {
|
|
227
|
+
version: 2,
|
|
228
|
+
environments: {
|
|
229
|
+
staging: {
|
|
230
|
+
provider: "gcp",
|
|
231
|
+
projectId: "your-staging-project-id",
|
|
232
|
+
credentials: { path: "gcloud/staging/service-account.json" },
|
|
233
|
+
},
|
|
234
|
+
production: {
|
|
235
|
+
provider: "gcp",
|
|
236
|
+
projectId: "your-production-project-id",
|
|
237
|
+
credentials: { path: "gcloud/production/service-account.json" },
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
services: [],
|
|
241
|
+
deletePolicy: {
|
|
242
|
+
maxVersions: 10,
|
|
243
|
+
maxAgeDays: 30,
|
|
244
|
+
enabled: true,
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
fs_1.default.writeFileSync(outputPath, JSON.stringify(template, null, 2));
|
|
248
|
+
console.log(`Configuration template created at ${outputPath}`);
|
|
249
|
+
console.log("Please update the environments and add services with 'msm --add-service'.");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
exports.ConfigManager = ConfigManager;
|
|
253
|
+
//# sourceMappingURL=ConfigManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../src/ConfigManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GcpMonorepoSecretManager.d.ts","sourceRoot":"","sources":["../src/GcpMonorepoSecretManager.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,qBAAqB,IAAI,wBAAwB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GcpMonorepoSecretManager = void 0;
|
|
4
|
+
/** @deprecated Use MonorepoSecretManager. */
|
|
5
|
+
var MonorepoSecretManager_1 = require("./MonorepoSecretManager");
|
|
6
|
+
Object.defineProperty(exports, "GcpMonorepoSecretManager", { enumerable: true, get: function () { return MonorepoSecretManager_1.MonorepoSecretManager; } });
|
|
7
|
+
//# sourceMappingURL=GcpMonorepoSecretManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GcpMonorepoSecretManager.js","sourceRoot":"","sources":["../src/GcpMonorepoSecretManager.ts"],"names":[],"mappings":";;;AAAA,6CAA6C;AAC7C,iEAA4F;AAAnF,iIAAA,qBAAqB,OAA4B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SecretBackend } from "./backends/types";
|
|
2
|
+
import { MonorepoSecretManagerOptions } from "./types";
|
|
3
|
+
export interface MonorepoSecretManagerTestOptions extends MonorepoSecretManagerOptions {
|
|
4
|
+
backend?: SecretBackend;
|
|
5
|
+
}
|
|
6
|
+
export declare class MonorepoSecretManager {
|
|
7
|
+
private environment;
|
|
8
|
+
private overrideSa;
|
|
9
|
+
private configManager;
|
|
10
|
+
private backendPromise;
|
|
11
|
+
constructor(options: MonorepoSecretManagerTestOptions);
|
|
12
|
+
private validateCredentials;
|
|
13
|
+
private getBackend;
|
|
14
|
+
private requireService;
|
|
15
|
+
private primaryEnvItem;
|
|
16
|
+
private getEnvPath;
|
|
17
|
+
private getSecretName;
|
|
18
|
+
private getTargetPath;
|
|
19
|
+
getAvailableServices(): string[];
|
|
20
|
+
private forEachService;
|
|
21
|
+
uploadEnv(serviceName: string): Promise<void>;
|
|
22
|
+
private uploadSingleService;
|
|
23
|
+
downloadEnv(serviceName: string): Promise<void>;
|
|
24
|
+
setEnv(serviceName: string): Promise<void>;
|
|
25
|
+
private materializeService;
|
|
26
|
+
peekEnv(serviceName: string): Promise<void>;
|
|
27
|
+
private peekSingleService;
|
|
28
|
+
cleanupVersions(serviceName: string): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=MonorepoSecretManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonorepoSecretManager.d.ts","sourceRoot":"","sources":["../src/MonorepoSecretManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,OAAO,EAGL,4BAA4B,EAG7B,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,gCACf,SAAQ,4BAA4B;IACpC,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAyB;gBAEnC,OAAO,EAAE,gCAAgC;IAgBrD,OAAO,CAAC,mBAAmB;YAab,UAAU;IAIxB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;IASrB,oBAAoB,IAAI,MAAM,EAAE;YAIlB,cAAc;IActB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIrC,mBAAmB;IA4B3B,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAMlC,kBAAkB;IA+B1B,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAInC,iBAAiB;IA0BzB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa1D"}
|