envhub-cli 0.1.2 → 0.2.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/README.md +5 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +47 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +3 -1
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +3 -2
- package/dist/commands/push.js.map +1 -1
- package/dist/config/config.schema.d.ts +2 -2
- package/dist/config/config.schema.d.ts.map +1 -1
- package/dist/config/config.schema.js +19 -0
- package/dist/config/config.schema.js.map +1 -1
- package/dist/providers/azure/azure-key-vault.provider.d.ts +27 -0
- package/dist/providers/azure/azure-key-vault.provider.d.ts.map +1 -0
- package/dist/providers/azure/azure-key-vault.provider.js +190 -0
- package/dist/providers/azure/azure-key-vault.provider.js.map +1 -0
- package/dist/providers/provider.factory.d.ts.map +1 -1
- package/dist/providers/provider.factory.js +6 -2
- package/dist/providers/provider.factory.js.map +1 -1
- package/dist/utils/envhub-header.d.ts +9 -0
- package/dist/utils/envhub-header.d.ts.map +1 -0
- package/dist/utils/envhub-header.js +35 -0
- package/dist/utils/envhub-header.js.map +1 -0
- package/package.json +11 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- No more sending API keys over Teams or Slack
|
|
8
8
|
- Built-in version control prevents accidental overwrites
|
|
9
9
|
- Easy interactive setup — no manual config files needed
|
|
10
|
-
- Extensible provider architecture (AWS
|
|
10
|
+
- Extensible provider architecture (AWS and Azure available, GCP coming soon)
|
|
11
11
|
|
|
12
12
|
## Table of Contents
|
|
13
13
|
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
| [cat](https://github.com/caanyp24/envhub-cli/blob/main/docs/commands/cat.md) | Display the contents of a secret |
|
|
28
28
|
| [list](https://github.com/caanyp24/envhub-cli/blob/main/docs/commands/list.md) | List all managed secrets |
|
|
29
29
|
| [delete](https://github.com/caanyp24/envhub-cli/blob/main/docs/commands/delete.md) | Delete a secret |
|
|
30
|
-
| [grant](https://github.com/caanyp24/envhub-cli/blob/main/docs/commands/grant.md) | Grant a user access to a secret |
|
|
31
|
-
| [revoke](https://github.com/caanyp24/envhub-cli/blob/main/docs/commands/revoke.md) | Revoke a user's access to a secret |
|
|
30
|
+
| [grant](https://github.com/caanyp24/envhub-cli/blob/main/docs/commands/grant.md) | Grant a user access to a secret (AWS only) |
|
|
31
|
+
| [revoke](https://github.com/caanyp24/envhub-cli/blob/main/docs/commands/revoke.md) | Revoke a user's access to a secret (AWS only) |
|
|
32
32
|
|
|
33
33
|
### Architecture
|
|
34
34
|
|
|
@@ -47,7 +47,7 @@ npx envhub push my-app-dev ./.env -m "Initial setup"
|
|
|
47
47
|
# 3. Your teammate pulls it
|
|
48
48
|
npx envhub pull my-app-dev ./.env
|
|
49
49
|
|
|
50
|
-
# 4. Grant access to another developer
|
|
50
|
+
# 4. Grant access to another developer (AWS only)
|
|
51
51
|
npx envhub grant my-app-dev jane.doe
|
|
52
52
|
```
|
|
53
53
|
|
|
@@ -56,5 +56,5 @@ npx envhub grant my-app-dev jane.doe
|
|
|
56
56
|
| Provider | Status |
|
|
57
57
|
| --- | --- |
|
|
58
58
|
| AWS Secrets Manager | Available |
|
|
59
|
-
| Azure Key Vault |
|
|
59
|
+
| Azure Key Vault | Available |
|
|
60
60
|
| GCP Secret Manager | Planned |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA+JA;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAuMjD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -75,6 +75,35 @@ const AWS_REGIONS = [
|
|
|
75
75
|
{ name: "Asia Pacific (Tokyo) - ap-northeast-1", value: "ap-northeast-1" },
|
|
76
76
|
{ name: "Asia Pacific (Singapore) - ap-southeast-1", value: "ap-southeast-1" },
|
|
77
77
|
];
|
|
78
|
+
/**
|
|
79
|
+
* Validate an Azure Key Vault URL.
|
|
80
|
+
*/
|
|
81
|
+
function validateAzureVaultUrl(value) {
|
|
82
|
+
const trimmed = value.trim();
|
|
83
|
+
if (!trimmed) {
|
|
84
|
+
return "Vault URL is required.";
|
|
85
|
+
}
|
|
86
|
+
let parsed;
|
|
87
|
+
try {
|
|
88
|
+
parsed = new URL(trimmed);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return "Enter a valid URL (e.g. https://my-vault.vault.azure.net).";
|
|
92
|
+
}
|
|
93
|
+
if (parsed.protocol !== "https:") {
|
|
94
|
+
return "Vault URL must use https://";
|
|
95
|
+
}
|
|
96
|
+
if (!parsed.hostname.includes(".vault.azure.")) {
|
|
97
|
+
return "Vault URL should look like https://<name>.vault.azure.net";
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Normalize a vault URL by removing trailing slashes.
|
|
103
|
+
*/
|
|
104
|
+
function normalizeVaultUrl(value) {
|
|
105
|
+
return value.trim().replace(/\/+$/, "");
|
|
106
|
+
}
|
|
78
107
|
/**
|
|
79
108
|
* Update .gitignore to include .envhubrc.json if not already present.
|
|
80
109
|
*/
|
|
@@ -93,8 +122,8 @@ async function updateGitignore(dir) {
|
|
|
93
122
|
return false; // Already in .gitignore
|
|
94
123
|
}
|
|
95
124
|
const newContent = content
|
|
96
|
-
? content.trimEnd() + "\n\n# envhub config (contains
|
|
97
|
-
: "# envhub config (contains
|
|
125
|
+
? content.trimEnd() + "\n\n# envhub config (contains cloud provider info)\n" + entry + "\n"
|
|
126
|
+
: "# envhub config (contains cloud provider info)\n" + entry + "\n";
|
|
98
127
|
await fs.writeFile(gitignorePath, newContent, "utf-8");
|
|
99
128
|
return true;
|
|
100
129
|
}
|
|
@@ -228,6 +257,19 @@ export async function initCommand() {
|
|
|
228
257
|
region: finalRegion,
|
|
229
258
|
};
|
|
230
259
|
}
|
|
260
|
+
else if (provider === "azure") {
|
|
261
|
+
logger.dim(" Azure authentication uses DefaultAzureCredential.");
|
|
262
|
+
logger.dim(" For local development, run 'az login' or set AZURE_* env vars.");
|
|
263
|
+
logger.log("");
|
|
264
|
+
const vaultUrlInput = await input({
|
|
265
|
+
message: "Enter your Azure Key Vault URL:",
|
|
266
|
+
default: "https://my-vault.vault.azure.net",
|
|
267
|
+
validate: validateAzureVaultUrl,
|
|
268
|
+
});
|
|
269
|
+
config.azure = {
|
|
270
|
+
vaultUrl: normalizeVaultUrl(vaultUrlInput),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
231
273
|
// Step 3: Configure prefix
|
|
232
274
|
const customPrefix = await confirm({
|
|
233
275
|
message: `Use default secret prefix "${config.prefix}"?`,
|
|
@@ -260,6 +302,9 @@ export async function initCommand() {
|
|
|
260
302
|
logger.dim(` AWS Profile: ${config.aws.profile}`);
|
|
261
303
|
logger.dim(` AWS Region: ${config.aws.region}`);
|
|
262
304
|
}
|
|
305
|
+
if (config.azure) {
|
|
306
|
+
logger.dim(` Vault URL: ${config.azure.vaultUrl}`);
|
|
307
|
+
}
|
|
263
308
|
logger.newline();
|
|
264
309
|
logger.log(" Next steps:");
|
|
265
310
|
logger.log(" Push a secret: envhub push <name> <file>");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
package/dist/commands/pull.js
CHANGED
|
@@ -3,6 +3,7 @@ import { configManager } from "../config/config.js";
|
|
|
3
3
|
import { ProviderFactory } from "../providers/provider.factory.js";
|
|
4
4
|
import { VersionControl } from "../versioning/version-control.js";
|
|
5
5
|
import { writeEnvFileRaw, parseEnvContent } from "../utils/env-parser.js";
|
|
6
|
+
import { addEnvhubHeader } from "../utils/envhub-header.js";
|
|
6
7
|
import { logger } from "../utils/logger.js";
|
|
7
8
|
/**
|
|
8
9
|
* The `envhub pull` command.
|
|
@@ -19,8 +20,9 @@ export async function pullCommand(secretName, filePath) {
|
|
|
19
20
|
try {
|
|
20
21
|
const result = await provider.pull(secretName);
|
|
21
22
|
const keyCount = parseEnvContent(result.content).size;
|
|
23
|
+
const localContent = addEnvhubHeader(secretName, result.content);
|
|
22
24
|
// Write the file
|
|
23
|
-
await writeEnvFileRaw(resolvedPath,
|
|
25
|
+
await writeEnvFileRaw(resolvedPath, localContent);
|
|
24
26
|
await versionControl.recordPull(secretName, result.version, filePath);
|
|
25
27
|
spinner.succeed(`Pulled '${secretName}' (v${result.version}) → ${filePath} (${keyCount} keys)`);
|
|
26
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,QAAgB;IAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAEnE,qBAAqB;IACrB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,QAAgB;IAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAEnE,qBAAqB;IACrB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;QACtD,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjE,iBAAiB;QACjB,MAAM,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEtE,OAAO,CAAC,OAAO,CACb,WAAW,UAAU,OAAO,MAAM,CAAC,OAAO,OAAO,QAAQ,KAAK,QAAQ,QAAQ,CAC/E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,mBAAmB,UAAU,IAAI,CAAC,CAAC;QAChD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAWA,UAAU,kBAAkB;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmBD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuHf"}
|
package/dist/commands/push.js
CHANGED
|
@@ -5,6 +5,7 @@ import { configManager } from "../config/config.js";
|
|
|
5
5
|
import { ProviderFactory } from "../providers/provider.factory.js";
|
|
6
6
|
import { VersionControl } from "../versioning/version-control.js";
|
|
7
7
|
import { readEnvFileRaw, fileExists, parseEnvContent } from "../utils/env-parser.js";
|
|
8
|
+
import { stripEnvhubHeader } from "../utils/envhub-header.js";
|
|
8
9
|
import { diffEnvContents, formatChanges } from "../utils/diff.js";
|
|
9
10
|
import { logger } from "../utils/logger.js";
|
|
10
11
|
/**
|
|
@@ -38,7 +39,7 @@ export async function pushCommand(secretName, filePath, options) {
|
|
|
38
39
|
process.exit(1);
|
|
39
40
|
}
|
|
40
41
|
// Read the local .env file
|
|
41
|
-
const localContent = await readEnvFileRaw(resolvedPath);
|
|
42
|
+
const localContent = stripEnvhubHeader(await readEnvFileRaw(resolvedPath));
|
|
42
43
|
// Version check (unless --force)
|
|
43
44
|
if (!options.force) {
|
|
44
45
|
const versionCheck = await versionControl.checkBeforePush(secretName);
|
|
@@ -58,7 +59,7 @@ export async function pushCommand(secretName, filePath, options) {
|
|
|
58
59
|
// Show diff: compare local file with remote content
|
|
59
60
|
let isNewSecret = false;
|
|
60
61
|
try {
|
|
61
|
-
const remoteContent = await provider.cat(secretName);
|
|
62
|
+
const remoteContent = stripEnvhubHeader(await provider.cat(secretName));
|
|
62
63
|
// Secret exists — compare local vs remote
|
|
63
64
|
const changes = diffEnvContents(remoteContent, localContent);
|
|
64
65
|
if (changes.length === 0 && !options.force) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,wBAAwB,OAAO,CAAC,IAAI,WAAW,CAAC,CAAC;IAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,QAAgB,EAChB,OAA2B;IAE3B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAEnE,uBAAuB;IACvB,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,10 +13,10 @@ export interface AWSConfig {
|
|
|
13
13
|
region: string;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Azure Key Vault-specific configuration.
|
|
17
17
|
*/
|
|
18
18
|
export interface AzureConfig {
|
|
19
|
-
/** Azure Key Vault URL */
|
|
19
|
+
/** Azure Key Vault URL (e.g. "https://my-vault.vault.azure.net") */
|
|
20
20
|
vaultUrl: string;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../src/config/config.schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,
|
|
1
|
+
{"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../src/config/config.schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAC;IACvB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,mEAAmE;IACnE,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,YAAY,CAGhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,EAAE,CA4CtE"}
|
|
@@ -28,6 +28,25 @@ export function validateConfig(config) {
|
|
|
28
28
|
errors.push("'aws.region' is required.");
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
if (config.provider === "azure" && !config.azure) {
|
|
32
|
+
errors.push("Azure configuration ('azure') is required when provider is 'azure'.");
|
|
33
|
+
}
|
|
34
|
+
if (config.provider === "azure" && config.azure) {
|
|
35
|
+
if (!config.azure.vaultUrl) {
|
|
36
|
+
errors.push("'azure.vaultUrl' is required.");
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
try {
|
|
40
|
+
const vaultUrl = new URL(config.azure.vaultUrl);
|
|
41
|
+
if (vaultUrl.protocol !== "https:") {
|
|
42
|
+
errors.push("'azure.vaultUrl' must use HTTPS.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
errors.push("'azure.vaultUrl' must be a valid URL.");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
31
50
|
return errors;
|
|
32
51
|
}
|
|
33
52
|
//# sourceMappingURL=config.schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../../src/config/config.schema.ts"],"names":[],"mappings":"AA8DA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA0B;IACnD,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAA6B;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,+BAA+B,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../../src/config/config.schema.ts"],"names":[],"mappings":"AA8DA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA0B;IACnD,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAA6B;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,+BAA+B,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAChD,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AzureConfig } from "../../config/config.schema.js";
|
|
2
|
+
import type { SecretProvider, PushOptions, PushResult, PullResult, SecretListItem, DeleteOptions } from "../provider.interface.js";
|
|
3
|
+
/**
|
|
4
|
+
* Azure Key Vault implementation of the SecretProvider interface.
|
|
5
|
+
*/
|
|
6
|
+
export declare class AzureKeyVaultProvider implements SecretProvider {
|
|
7
|
+
readonly name = "azure";
|
|
8
|
+
private client;
|
|
9
|
+
private prefix;
|
|
10
|
+
constructor(config: AzureConfig, prefix?: string);
|
|
11
|
+
private fullName;
|
|
12
|
+
private stripPrefix;
|
|
13
|
+
private isNotFoundError;
|
|
14
|
+
private parsePayload;
|
|
15
|
+
private getPayload;
|
|
16
|
+
private secretExists;
|
|
17
|
+
push(secretName: string, content: string, options?: PushOptions): Promise<PushResult>;
|
|
18
|
+
pull(secretName: string): Promise<PullResult>;
|
|
19
|
+
cat(secretName: string): Promise<string>;
|
|
20
|
+
list(): Promise<SecretListItem[]>;
|
|
21
|
+
private mapListItem;
|
|
22
|
+
delete(secretName: string, options?: DeleteOptions): Promise<void>;
|
|
23
|
+
grant(secretName: string, userIdentifier: string): Promise<void>;
|
|
24
|
+
revoke(secretName: string, userIdentifier: string): Promise<void>;
|
|
25
|
+
getVersion(secretName: string): Promise<number>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=azure-key-vault.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-key-vault.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/azure/azure-key-vault.provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACd,MAAM,0BAA0B,CAAC;AAkBlC;;GAEG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,MAAkB;IAK3D,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;YAkCN,UAAU;YAUV,YAAY;IAYpB,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC;IAkChB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAU7C,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKxC,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAczB,WAAW;IAsBnB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjE,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAWtD"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { DefaultAzureCredential } from "@azure/identity";
|
|
2
|
+
import { SecretClient, } from "@azure/keyvault-secrets";
|
|
3
|
+
import { parseEnvContent } from "../../utils/env-parser.js";
|
|
4
|
+
const AZURE_SECRET_NAME_REGEX = /^[0-9a-zA-Z-]+$/;
|
|
5
|
+
const MAX_AZURE_SECRET_NAME_LENGTH = 127;
|
|
6
|
+
/**
|
|
7
|
+
* Azure Key Vault implementation of the SecretProvider interface.
|
|
8
|
+
*/
|
|
9
|
+
export class AzureKeyVaultProvider {
|
|
10
|
+
name = "azure";
|
|
11
|
+
client;
|
|
12
|
+
prefix;
|
|
13
|
+
constructor(config, prefix = "envhub-") {
|
|
14
|
+
this.client = new SecretClient(config.vaultUrl, new DefaultAzureCredential());
|
|
15
|
+
this.prefix = prefix;
|
|
16
|
+
}
|
|
17
|
+
fullName(secretName) {
|
|
18
|
+
const fullName = `${this.prefix}${secretName}`;
|
|
19
|
+
if (fullName.length > MAX_AZURE_SECRET_NAME_LENGTH) {
|
|
20
|
+
throw new Error(`Azure Key Vault secret name is too long (${fullName.length}). ` +
|
|
21
|
+
`Maximum length is ${MAX_AZURE_SECRET_NAME_LENGTH}.`);
|
|
22
|
+
}
|
|
23
|
+
if (!AZURE_SECRET_NAME_REGEX.test(fullName)) {
|
|
24
|
+
throw new Error(`Invalid secret name '${fullName}'. Azure Key Vault allows only letters, numbers, and dashes.`);
|
|
25
|
+
}
|
|
26
|
+
return fullName;
|
|
27
|
+
}
|
|
28
|
+
stripPrefix(fullName) {
|
|
29
|
+
if (fullName.startsWith(this.prefix)) {
|
|
30
|
+
return fullName.substring(this.prefix.length);
|
|
31
|
+
}
|
|
32
|
+
return fullName;
|
|
33
|
+
}
|
|
34
|
+
isNotFoundError(error) {
|
|
35
|
+
if (!error || typeof error !== "object") {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const maybeError = error;
|
|
39
|
+
return (maybeError.statusCode === 404 ||
|
|
40
|
+
maybeError.code === "SecretNotFound" ||
|
|
41
|
+
maybeError.code === "NotFound");
|
|
42
|
+
}
|
|
43
|
+
parsePayload(secretName, value) {
|
|
44
|
+
let payload;
|
|
45
|
+
try {
|
|
46
|
+
payload = JSON.parse(value);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
throw new Error(`Secret '${secretName}' is not in envhub format. It may have been created outside envhub.`);
|
|
50
|
+
}
|
|
51
|
+
if (!payload ||
|
|
52
|
+
typeof payload !== "object" ||
|
|
53
|
+
!("content" in payload) ||
|
|
54
|
+
!("metadata" in payload)) {
|
|
55
|
+
throw new Error(`Secret '${secretName}' is missing envhub metadata. It may have been created outside envhub.`);
|
|
56
|
+
}
|
|
57
|
+
const parsed = payload;
|
|
58
|
+
if (typeof parsed.content !== "string" ||
|
|
59
|
+
typeof parsed.metadata?.version !== "number") {
|
|
60
|
+
throw new Error(`Secret '${secretName}' has an invalid envhub payload format.`);
|
|
61
|
+
}
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
64
|
+
async getPayload(secretName) {
|
|
65
|
+
const result = await this.client.getSecret(this.fullName(secretName));
|
|
66
|
+
if (!result.value) {
|
|
67
|
+
throw new Error(`Secret '${secretName}' has no string content.`);
|
|
68
|
+
}
|
|
69
|
+
return this.parsePayload(secretName, result.value);
|
|
70
|
+
}
|
|
71
|
+
async secretExists(secretName) {
|
|
72
|
+
try {
|
|
73
|
+
await this.client.getSecret(this.fullName(secretName));
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (this.isNotFoundError(error)) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async push(secretName, content, options) {
|
|
84
|
+
const exists = await this.secretExists(secretName);
|
|
85
|
+
let newVersion = 1;
|
|
86
|
+
if (exists) {
|
|
87
|
+
const currentPayload = await this.getPayload(secretName);
|
|
88
|
+
newVersion = currentPayload.metadata.version + 1;
|
|
89
|
+
}
|
|
90
|
+
const payload = {
|
|
91
|
+
content,
|
|
92
|
+
metadata: {
|
|
93
|
+
version: newVersion,
|
|
94
|
+
message: options?.message,
|
|
95
|
+
updatedAt: new Date().toISOString(),
|
|
96
|
+
managedBy: "envhub-cli",
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
const tags = {
|
|
100
|
+
managedBy: "envhub-cli",
|
|
101
|
+
envhubVersion: String(newVersion),
|
|
102
|
+
};
|
|
103
|
+
if (options?.message) {
|
|
104
|
+
tags.envhubMessage = options.message.slice(0, 256);
|
|
105
|
+
}
|
|
106
|
+
await this.client.setSecret(this.fullName(secretName), JSON.stringify(payload), {
|
|
107
|
+
tags,
|
|
108
|
+
});
|
|
109
|
+
return { version: newVersion, name: secretName };
|
|
110
|
+
}
|
|
111
|
+
async pull(secretName) {
|
|
112
|
+
const payload = await this.getPayload(secretName);
|
|
113
|
+
return {
|
|
114
|
+
content: payload.content,
|
|
115
|
+
version: payload.metadata.version,
|
|
116
|
+
name: secretName,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async cat(secretName) {
|
|
120
|
+
const payload = await this.getPayload(secretName);
|
|
121
|
+
return payload.content;
|
|
122
|
+
}
|
|
123
|
+
async list() {
|
|
124
|
+
const items = [];
|
|
125
|
+
for await (const secret of this.client.listPropertiesOfSecrets()) {
|
|
126
|
+
if (!secret.name.startsWith(this.prefix)) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
items.push(await this.mapListItem(secret));
|
|
130
|
+
}
|
|
131
|
+
return items.sort((a, b) => a.name.localeCompare(b.name));
|
|
132
|
+
}
|
|
133
|
+
async mapListItem(secret) {
|
|
134
|
+
const secretName = this.stripPrefix(secret.name);
|
|
135
|
+
let secretsCount = 0;
|
|
136
|
+
let lastMessage = null;
|
|
137
|
+
try {
|
|
138
|
+
const payload = await this.getPayload(secretName);
|
|
139
|
+
const entries = parseEnvContent(payload.content);
|
|
140
|
+
secretsCount = entries.size;
|
|
141
|
+
lastMessage = payload.metadata.message ?? null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// If we cannot parse the payload, still show the secret in list output.
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
name: secretName,
|
|
148
|
+
secretsCount,
|
|
149
|
+
updatedAt: secret.updatedOn ?? null,
|
|
150
|
+
lastMessage,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async delete(secretName, options) {
|
|
154
|
+
const fullName = this.fullName(secretName);
|
|
155
|
+
const poller = await this.client.beginDeleteSecret(fullName);
|
|
156
|
+
await poller.pollUntilDone();
|
|
157
|
+
if (options?.force) {
|
|
158
|
+
try {
|
|
159
|
+
await this.client.purgeDeletedSecret(fullName);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const reason = error instanceof Error ? error.message : "Unknown error.";
|
|
163
|
+
throw new Error(`Failed to force-delete '${secretName}'. Azure Key Vault may block purge (for example due to purge protection). ${reason}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async grant(secretName, userIdentifier) {
|
|
168
|
+
void secretName;
|
|
169
|
+
void userIdentifier;
|
|
170
|
+
throw new Error("Grant is not implemented for Azure Key Vault yet. Use Azure RBAC or access policies in Azure.");
|
|
171
|
+
}
|
|
172
|
+
async revoke(secretName, userIdentifier) {
|
|
173
|
+
void secretName;
|
|
174
|
+
void userIdentifier;
|
|
175
|
+
throw new Error("Revoke is not implemented for Azure Key Vault yet. Use Azure RBAC or access policies in Azure.");
|
|
176
|
+
}
|
|
177
|
+
async getVersion(secretName) {
|
|
178
|
+
try {
|
|
179
|
+
const payload = await this.getPayload(secretName);
|
|
180
|
+
return payload.metadata.version;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
if (this.isNotFoundError(error)) {
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=azure-key-vault.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-key-vault.provider.js","sourceRoot":"","sources":["../../../src/providers/azure/azure-key-vault.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.factory.d.ts","sourceRoot":"","sources":["../../src/providers/provider.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.factory.d.ts","sourceRoot":"","sources":["../../src/providers/provider.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAIxE;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc;IA4B3D;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,EAAE;CAO5F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AWSSecretsProvider } from "./aws/aws-secrets.provider.js";
|
|
2
|
+
import { AzureKeyVaultProvider } from "./azure/azure-key-vault.provider.js";
|
|
2
3
|
/**
|
|
3
4
|
* Factory for creating provider instances based on configuration.
|
|
4
5
|
*
|
|
@@ -19,7 +20,10 @@ export class ProviderFactory {
|
|
|
19
20
|
}
|
|
20
21
|
return new AWSSecretsProvider(config.aws, config.prefix);
|
|
21
22
|
case "azure":
|
|
22
|
-
|
|
23
|
+
if (!config.azure) {
|
|
24
|
+
throw new Error("Azure configuration is missing. Run 'envhub init' first.");
|
|
25
|
+
}
|
|
26
|
+
return new AzureKeyVaultProvider(config.azure, config.prefix);
|
|
23
27
|
case "gcp":
|
|
24
28
|
throw new Error("GCP Secret Manager provider is not yet implemented. Coming soon!");
|
|
25
29
|
default:
|
|
@@ -32,7 +36,7 @@ export class ProviderFactory {
|
|
|
32
36
|
static getAvailableProviders() {
|
|
33
37
|
return [
|
|
34
38
|
{ type: "aws", label: "AWS Secrets Manager", available: true },
|
|
35
|
-
{ type: "azure", label: "Azure Key Vault", available:
|
|
39
|
+
{ type: "azure", label: "Azure Key Vault", available: true },
|
|
36
40
|
{ type: "gcp", label: "GCP Secret Manager", available: false },
|
|
37
41
|
];
|
|
38
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.factory.js","sourceRoot":"","sources":["../../src/providers/provider.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.factory.js","sourceRoot":"","sources":["../../src/providers/provider.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAoB;QACxC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;QAErC,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,KAAK;gBACR,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;gBAC5E,CAAC;gBACD,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAE3D,KAAK,OAAO;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBAC9E,CAAC;gBACD,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAEhE,KAAK,KAAK;gBACR,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;YAEJ;gBACE,MAAM,IAAI,KAAK,CACb,qBAAqB,YAA4B,+BAA+B,CACjF,CAAC;QACN,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB;QAC1B,OAAO;YACL,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE;YAC9D,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE;YAC5D,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,KAAK,EAAE;SAC/D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove an envhub local header from the beginning of .env content.
|
|
3
|
+
*/
|
|
4
|
+
export declare function stripEnvhubHeader(content: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Add (or replace) the envhub local header at the top of .env content.
|
|
7
|
+
*/
|
|
8
|
+
export declare function addEnvhubHeader(secretName: string, content: string): string;
|
|
9
|
+
//# sourceMappingURL=envhub-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envhub-header.d.ts","sourceRoot":"","sources":["../../src/utils/envhub-header.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwBzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG3E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const LEGACY_ENVHUB_HEADER_PREFIX = "# envhub: secret=";
|
|
2
|
+
const ENVHUB_MANAGED_LINE = "# 🔐 Managed by envhub-cli";
|
|
3
|
+
const ENVHUB_ENV_LINE_PREFIX = "# Environment: ";
|
|
4
|
+
/**
|
|
5
|
+
* Remove an envhub local header from the beginning of .env content.
|
|
6
|
+
*/
|
|
7
|
+
export function stripEnvhubHeader(content) {
|
|
8
|
+
const lines = content.split("\n");
|
|
9
|
+
const firstLine = lines[0] ?? "";
|
|
10
|
+
const secondLine = lines[1] ?? "";
|
|
11
|
+
if (firstLine === ENVHUB_MANAGED_LINE &&
|
|
12
|
+
secondLine.startsWith(ENVHUB_ENV_LINE_PREFIX)) {
|
|
13
|
+
lines.splice(0, 2);
|
|
14
|
+
if (lines[0] === "") {
|
|
15
|
+
lines.shift();
|
|
16
|
+
}
|
|
17
|
+
return lines.join("\n");
|
|
18
|
+
}
|
|
19
|
+
if (firstLine.startsWith(LEGACY_ENVHUB_HEADER_PREFIX)) {
|
|
20
|
+
lines.shift();
|
|
21
|
+
if (lines[0] === "") {
|
|
22
|
+
lines.shift();
|
|
23
|
+
}
|
|
24
|
+
return lines.join("\n");
|
|
25
|
+
}
|
|
26
|
+
return content;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Add (or replace) the envhub local header at the top of .env content.
|
|
30
|
+
*/
|
|
31
|
+
export function addEnvhubHeader(secretName, content) {
|
|
32
|
+
const withoutHeader = stripEnvhubHeader(content).replace(/^\n+/, "");
|
|
33
|
+
return `${ENVHUB_MANAGED_LINE}\n${ENVHUB_ENV_LINE_PREFIX}${secretName}\n\n${withoutHeader}`;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=envhub-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envhub-header.js","sourceRoot":"","sources":["../../src/utils/envhub-header.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AACxD,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AACzD,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElC,IACE,SAAS,KAAK,mBAAmB;QACjC,UAAU,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAC7C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,OAAe;IACjE,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,GAAG,mBAAmB,KAAK,sBAAsB,GAAG,UAAU,OAAO,aAAa,EAAE,CAAC;AAC9F,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "envhub-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Securely share .env files between developers using cloud providers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -31,8 +31,18 @@
|
|
|
31
31
|
"name": "Kemal Can Yaprak",
|
|
32
32
|
"email": "kemalcan.yaprak1@gmail.com"
|
|
33
33
|
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/caanyp24/envhub-cli.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/caanyp24/envhub-cli#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/caanyp24/envhub-cli/issues"
|
|
41
|
+
},
|
|
34
42
|
"license": "MIT",
|
|
35
43
|
"dependencies": {
|
|
44
|
+
"@azure/identity": "^4.11.1",
|
|
45
|
+
"@azure/keyvault-secrets": "^4.10.0",
|
|
36
46
|
"@aws-sdk/client-iam": "^3.0.0",
|
|
37
47
|
"@aws-sdk/client-secrets-manager": "^3.0.0",
|
|
38
48
|
"@aws-sdk/credential-providers": "^3.0.0",
|