envilder 0.9.3 → 0.9.4

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 (63) hide show
  1. package/README.md +38 -13
  2. package/ROADMAP.md +3 -3
  3. package/docs/CHANGELOG.md +9 -609
  4. package/docs/changelogs/cli.md +498 -0
  5. package/docs/changelogs/gha.md +74 -0
  6. package/docs/changelogs/sdk-dotnet.md +80 -0
  7. package/docs/changelogs/sdk-nodejs.md +22 -0
  8. package/docs/changelogs/sdk-python.md +82 -0
  9. package/lib/envilder/core/application/pushEnvToSecrets/PushEnvToSecretsCommandHandler.js +3 -3
  10. package/lib/envilder/core/application/pushEnvToSecrets/PushEnvToSecretsCommandHandler.js.map +1 -1
  11. package/lib/sdks/nodejs/src/application/envilder-client.d.ts +29 -0
  12. package/lib/sdks/nodejs/src/application/envilder-client.d.ts.map +1 -0
  13. package/lib/sdks/nodejs/src/application/envilder-client.js +60 -0
  14. package/lib/sdks/nodejs/src/application/envilder-client.js.map +1 -0
  15. package/lib/sdks/nodejs/src/application/envilder.d.ts +64 -0
  16. package/lib/sdks/nodejs/src/application/envilder.d.ts.map +1 -0
  17. package/lib/sdks/nodejs/src/application/envilder.js +168 -0
  18. package/lib/sdks/nodejs/src/application/envilder.js.map +1 -0
  19. package/lib/sdks/nodejs/src/application/map-file-parser.d.ts +14 -0
  20. package/lib/sdks/nodejs/src/application/map-file-parser.d.ts.map +1 -0
  21. package/lib/sdks/nodejs/src/application/map-file-parser.js +55 -0
  22. package/lib/sdks/nodejs/src/application/map-file-parser.js.map +1 -0
  23. package/lib/sdks/nodejs/src/application/secret-validation.d.ts +18 -0
  24. package/lib/sdks/nodejs/src/application/secret-validation.d.ts.map +1 -0
  25. package/lib/sdks/nodejs/src/application/secret-validation.js +32 -0
  26. package/lib/sdks/nodejs/src/application/secret-validation.js.map +1 -0
  27. package/lib/sdks/nodejs/src/domain/envilder-options.d.ts +7 -0
  28. package/lib/sdks/nodejs/src/domain/envilder-options.d.ts.map +1 -0
  29. package/lib/sdks/nodejs/src/domain/envilder-options.js +2 -0
  30. package/lib/sdks/nodejs/src/domain/envilder-options.js.map +1 -0
  31. package/lib/sdks/nodejs/src/domain/map-file-config.d.ts +7 -0
  32. package/lib/sdks/nodejs/src/domain/map-file-config.d.ts.map +1 -0
  33. package/lib/sdks/nodejs/src/domain/map-file-config.js +2 -0
  34. package/lib/sdks/nodejs/src/domain/map-file-config.js.map +1 -0
  35. package/lib/sdks/nodejs/src/domain/parsed-map-file.d.ts +6 -0
  36. package/lib/sdks/nodejs/src/domain/parsed-map-file.d.ts.map +1 -0
  37. package/lib/sdks/nodejs/src/domain/parsed-map-file.js +2 -0
  38. package/lib/sdks/nodejs/src/domain/parsed-map-file.js.map +1 -0
  39. package/lib/sdks/nodejs/src/domain/ports/secret-provider.d.ts +18 -0
  40. package/lib/sdks/nodejs/src/domain/ports/secret-provider.d.ts.map +1 -0
  41. package/lib/sdks/nodejs/src/domain/ports/secret-provider.js +2 -0
  42. package/lib/sdks/nodejs/src/domain/ports/secret-provider.js.map +1 -0
  43. package/lib/sdks/nodejs/src/domain/secret-provider-type.d.ts +5 -0
  44. package/lib/sdks/nodejs/src/domain/secret-provider-type.d.ts.map +1 -0
  45. package/lib/sdks/nodejs/src/domain/secret-provider-type.js +6 -0
  46. package/lib/sdks/nodejs/src/domain/secret-provider-type.js.map +1 -0
  47. package/lib/sdks/nodejs/src/index.d.ts +12 -0
  48. package/lib/sdks/nodejs/src/index.d.ts.map +1 -0
  49. package/lib/sdks/nodejs/src/index.js +11 -0
  50. package/lib/sdks/nodejs/src/index.js.map +1 -0
  51. package/lib/sdks/nodejs/src/infrastructure/aws/aws-ssm-secret-provider.d.ts +17 -0
  52. package/lib/sdks/nodejs/src/infrastructure/aws/aws-ssm-secret-provider.d.ts.map +1 -0
  53. package/lib/sdks/nodejs/src/infrastructure/aws/aws-ssm-secret-provider.js +56 -0
  54. package/lib/sdks/nodejs/src/infrastructure/aws/aws-ssm-secret-provider.js.map +1 -0
  55. package/lib/sdks/nodejs/src/infrastructure/azure/azure-key-vault-secret-provider.d.ts +15 -0
  56. package/lib/sdks/nodejs/src/infrastructure/azure/azure-key-vault-secret-provider.d.ts.map +1 -0
  57. package/lib/sdks/nodejs/src/infrastructure/azure/azure-key-vault-secret-provider.js +68 -0
  58. package/lib/sdks/nodejs/src/infrastructure/azure/azure-key-vault-secret-provider.js.map +1 -0
  59. package/lib/sdks/nodejs/src/infrastructure/secret-provider-factory.d.ts +5 -0
  60. package/lib/sdks/nodejs/src/infrastructure/secret-provider-factory.d.ts.map +1 -0
  61. package/lib/sdks/nodejs/src/infrastructure/secret-provider-factory.js +42 -0
  62. package/lib/sdks/nodejs/src/infrastructure/secret-provider-factory.js.map +1 -0
  63. package/package.json +9 -7
@@ -0,0 +1,7 @@
1
+ import type { SecretProviderType } from './secret-provider-type.js';
2
+ export interface MapFileConfig {
3
+ readonly provider?: SecretProviderType;
4
+ readonly vaultUrl?: string;
5
+ readonly profile?: string;
6
+ }
7
+ //# sourceMappingURL=map-file-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-file-config.d.ts","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/domain/map-file-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=map-file-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-file-config.js","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/domain/map-file-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { MapFileConfig } from './map-file-config.js';
2
+ export interface ParsedMapFile {
3
+ readonly config: MapFileConfig;
4
+ readonly mappings: ReadonlyMap<string, string>;
5
+ }
6
+ //# sourceMappingURL=parsed-map-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsed-map-file.d.ts","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/domain/parsed-map-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parsed-map-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsed-map-file.js","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/domain/parsed-map-file.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Abstracts access to a secret store (e.g. AWS SSM Parameter Store, Azure Key Vault).
3
+ * Implement this interface to add support for a new secret provider.
4
+ */
5
+ export interface ISecretProvider {
6
+ /**
7
+ * Retrieves multiple secrets by their provider-specific identifiers.
8
+ *
9
+ * For AWS SSM these are parameter paths (e.g. `/app/db-url`);
10
+ * for Azure Key Vault these are secret names.
11
+ *
12
+ * Secrets that do not exist are silently omitted from the result.
13
+ *
14
+ * @returns A map of name → value for secrets that were found.
15
+ */
16
+ getSecrets(names: string[]): Promise<Map<string, string>>;
17
+ }
18
+ //# sourceMappingURL=secret-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-provider.d.ts","sourceRoot":"","sources":["../../../../../../src/sdks/nodejs/src/domain/ports/secret-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;OASG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=secret-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-provider.js","sourceRoot":"","sources":["../../../../../../src/sdks/nodejs/src/domain/ports/secret-provider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export declare enum SecretProviderType {
2
+ Aws = "aws",
3
+ Azure = "azure"
4
+ }
5
+ //# sourceMappingURL=secret-provider-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-provider-type.d.ts","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/domain/secret-provider-type.ts"],"names":[],"mappings":"AAAA,oBAAY,kBAAkB;IAC5B,GAAG,QAAQ;IACX,KAAK,UAAU;CAChB"}
@@ -0,0 +1,6 @@
1
+ export var SecretProviderType;
2
+ (function (SecretProviderType) {
3
+ SecretProviderType["Aws"] = "aws";
4
+ SecretProviderType["Azure"] = "azure";
5
+ })(SecretProviderType || (SecretProviderType = {}));
6
+ //# sourceMappingURL=secret-provider-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-provider-type.js","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/domain/secret-provider-type.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,iCAAW,CAAA;IACX,qCAAe,CAAA;AACjB,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B"}
@@ -0,0 +1,12 @@
1
+ export { Envilder } from './application/envilder.js';
2
+ export { EnvilderClient } from './application/envilder-client.js';
3
+ export { MapFileParser } from './application/map-file-parser.js';
4
+ export { SecretValidationError, validateSecrets, } from './application/secret-validation.js';
5
+ export type { EnvilderOptions } from './domain/envilder-options.js';
6
+ export type { MapFileConfig } from './domain/map-file-config.js';
7
+ export type { ParsedMapFile } from './domain/parsed-map-file.js';
8
+ export type { ISecretProvider } from './domain/ports/secret-provider.js';
9
+ export { SecretProviderType } from './domain/secret-provider-type.js';
10
+ export { AwsSsmSecretProvider } from './infrastructure/aws/aws-ssm-secret-provider.js';
11
+ export { AzureKeyVaultSecretProvider } from './infrastructure/azure/azure-key-vault-secret-provider.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sdks/nodejs/src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAGtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2DAA2D,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Domain
2
+ // Application
3
+ export { Envilder } from './application/envilder.js';
4
+ export { EnvilderClient } from './application/envilder-client.js';
5
+ export { MapFileParser } from './application/map-file-parser.js';
6
+ export { SecretValidationError, validateSecrets, } from './application/secret-validation.js';
7
+ export { SecretProviderType } from './domain/secret-provider-type.js';
8
+ // Infrastructure (for advanced usage)
9
+ export { AwsSsmSecretProvider } from './infrastructure/aws/aws-ssm-secret-provider.js';
10
+ export { AzureKeyVaultSecretProvider } from './infrastructure/azure/azure-key-vault-secret-provider.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sdks/nodejs/src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AAET,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAK5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,sCAAsC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2DAA2D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type SSMClient } from '@aws-sdk/client-ssm';
2
+ import type { ISecretProvider } from '../../domain/ports/secret-provider.js';
3
+ /**
4
+ * {@link ISecretProvider} backed by AWS SSM Parameter Store.
5
+ *
6
+ * Parameters are retrieved with decryption enabled so that
7
+ * SecureString values are returned in plain text.
8
+ *
9
+ * SSM supports fetching up to 10 parameters per request,
10
+ * so names are chunked into batches automatically.
11
+ */
12
+ export declare class AwsSsmSecretProvider implements ISecretProvider {
13
+ private readonly ssmClient;
14
+ constructor(ssmClient: SSMClient);
15
+ getSecrets(names: string[]): Promise<Map<string, string>>;
16
+ }
17
+ //# sourceMappingURL=aws-ssm-secret-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-ssm-secret-provider.d.ts","sourceRoot":"","sources":["../../../../../../src/sdks/nodejs/src/infrastructure/aws/aws-ssm-secret-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAI7E;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,SAAS,EAAE,SAAS;IAO1B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CA8BhE"}
@@ -0,0 +1,56 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { GetParametersCommand } from '@aws-sdk/client-ssm';
11
+ const SSM_BATCH_SIZE = 10;
12
+ /**
13
+ * {@link ISecretProvider} backed by AWS SSM Parameter Store.
14
+ *
15
+ * Parameters are retrieved with decryption enabled so that
16
+ * SecureString values are returned in plain text.
17
+ *
18
+ * SSM supports fetching up to 10 parameters per request,
19
+ * so names are chunked into batches automatically.
20
+ */
21
+ export class AwsSsmSecretProvider {
22
+ constructor(ssmClient) {
23
+ if (!ssmClient) {
24
+ throw new Error('ssmClient cannot be null');
25
+ }
26
+ this.ssmClient = ssmClient;
27
+ }
28
+ getSecrets(names) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ var _a;
31
+ const result = new Map();
32
+ if (names.length === 0) {
33
+ return result;
34
+ }
35
+ for (const name of names) {
36
+ if (!(name === null || name === void 0 ? void 0 : name.trim())) {
37
+ throw new Error('Secret name cannot be null or whitespace');
38
+ }
39
+ }
40
+ for (let i = 0; i < names.length; i += SSM_BATCH_SIZE) {
41
+ const batch = names.slice(i, i + SSM_BATCH_SIZE);
42
+ const response = yield this.ssmClient.send(new GetParametersCommand({
43
+ Names: batch,
44
+ WithDecryption: true,
45
+ }));
46
+ for (const param of (_a = response.Parameters) !== null && _a !== void 0 ? _a : []) {
47
+ if (param.Name && param.Value != null) {
48
+ result.set(param.Name, param.Value);
49
+ }
50
+ }
51
+ }
52
+ return result;
53
+ });
54
+ }
55
+ }
56
+ //# sourceMappingURL=aws-ssm-secret-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-ssm-secret-provider.js","sourceRoot":"","sources":["../../../../../../src/sdks/nodejs/src/infrastructure/aws/aws-ssm-secret-provider.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,oBAAoB,EAAkB,MAAM,qBAAqB,CAAC;AAG3E,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAG/B,YAAY,SAAoB;QAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEK,UAAU,CAAC,KAAe;;;YAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC;gBACtD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACxC,IAAI,oBAAoB,CAAC;oBACvB,KAAK,EAAE,KAAK;oBACZ,cAAc,EAAE,IAAI;iBACrB,CAAC,CACH,CAAC;gBAEF,KAAK,MAAM,KAAK,IAAI,MAAA,QAAQ,CAAC,UAAU,mCAAI,EAAE,EAAE,CAAC;oBAC9C,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;wBACtC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { SecretClient } from '@azure/keyvault-secrets';
2
+ import type { ISecretProvider } from '../../domain/ports/secret-provider.js';
3
+ /**
4
+ * {@link ISecretProvider} backed by Azure Key Vault.
5
+ *
6
+ * Secrets are fetched in parallel. Secrets that return HTTP 404
7
+ * are treated as missing and silently omitted from the result.
8
+ */
9
+ export declare class AzureKeyVaultSecretProvider implements ISecretProvider {
10
+ private readonly secretClient;
11
+ constructor(secretClient: SecretClient);
12
+ getSecrets(names: string[]): Promise<Map<string, string>>;
13
+ private fetchSecret;
14
+ }
15
+ //# sourceMappingURL=azure-key-vault-secret-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-key-vault-secret-provider.d.ts","sourceRoot":"","sources":["../../../../../../src/sdks/nodejs/src/infrastructure/azure/azure-key-vault-secret-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAE7E;;;;;GAKG;AACH,qBAAa,2BAA4B,YAAW,eAAe;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAEhC,YAAY,EAAE,YAAY;IAOhC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YA4BjD,WAAW;CAW1B"}
@@ -0,0 +1,68 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /**
11
+ * {@link ISecretProvider} backed by Azure Key Vault.
12
+ *
13
+ * Secrets are fetched in parallel. Secrets that return HTTP 404
14
+ * are treated as missing and silently omitted from the result.
15
+ */
16
+ export class AzureKeyVaultSecretProvider {
17
+ constructor(secretClient) {
18
+ if (!secretClient) {
19
+ throw new Error('secretClient cannot be null');
20
+ }
21
+ this.secretClient = secretClient;
22
+ }
23
+ getSecrets(names) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ const result = new Map();
26
+ if (names.length === 0) {
27
+ return result;
28
+ }
29
+ for (const name of names) {
30
+ if (!(name === null || name === void 0 ? void 0 : name.trim())) {
31
+ throw new Error('Secret name cannot be null or empty');
32
+ }
33
+ }
34
+ const entries = yield Promise.all(names.map((name) => __awaiter(this, void 0, void 0, function* () {
35
+ const value = yield this.fetchSecret(name);
36
+ return [name, value];
37
+ })));
38
+ for (const [name, value] of entries) {
39
+ if (value !== null) {
40
+ result.set(name, value);
41
+ }
42
+ }
43
+ return result;
44
+ });
45
+ }
46
+ fetchSecret(name) {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ var _a;
49
+ try {
50
+ const response = yield this.secretClient.getSecret(name);
51
+ return (_a = response.value) !== null && _a !== void 0 ? _a : null;
52
+ }
53
+ catch (error) {
54
+ if (isNotFound(error)) {
55
+ return null;
56
+ }
57
+ throw error;
58
+ }
59
+ });
60
+ }
61
+ }
62
+ function isNotFound(error) {
63
+ return (typeof error === 'object' &&
64
+ error !== null &&
65
+ 'statusCode' in error &&
66
+ error.statusCode === 404);
67
+ }
68
+ //# sourceMappingURL=azure-key-vault-secret-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-key-vault-secret-provider.js","sourceRoot":"","sources":["../../../../../../src/sdks/nodejs/src/infrastructure/azure/azure-key-vault-secret-provider.ts"],"names":[],"mappings":";;;;;;;;;AAGA;;;;;GAKG;AACH,MAAM,OAAO,2BAA2B;IAGtC,YAAY,YAA0B;QACpC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEK,UAAU,CAAC,KAAe;;YAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,CAAO,IAAI,EAAE,EAAE;gBACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAI,EAAE,KAAK,CAAU,CAAC;YAChC,CAAC,CAAA,CAAC,CACH,CAAC;YAEF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEa,WAAW,CAAC,IAAY;;;YACpC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACzD,OAAO,MAAA,QAAQ,CAAC,KAAK,mCAAI,IAAI,CAAC;YAChC,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KAAA;CACF;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,YAAY,IAAI,KAAK;QACpB,KAAgC,CAAC,UAAU,KAAK,GAAG,CACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EnvilderOptions } from '../domain/envilder-options.js';
2
+ import type { MapFileConfig } from '../domain/map-file-config.js';
3
+ import type { ISecretProvider } from '../domain/ports/secret-provider.js';
4
+ export declare function createSecretProvider(config: MapFileConfig, options?: EnvilderOptions): ISecretProvider;
5
+ //# sourceMappingURL=secret-provider-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-provider-factory.d.ts","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/infrastructure/secret-provider-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAK1E,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAmBjB"}
@@ -0,0 +1,42 @@
1
+ import { SSMClient } from '@aws-sdk/client-ssm';
2
+ import { fromIni } from '@aws-sdk/credential-providers';
3
+ import { DefaultAzureCredential } from '@azure/identity';
4
+ import { SecretClient } from '@azure/keyvault-secrets';
5
+ import { SecretProviderType } from '../domain/secret-provider-type.js';
6
+ import { AwsSsmSecretProvider } from './aws/aws-ssm-secret-provider.js';
7
+ import { AzureKeyVaultSecretProvider } from './azure/azure-key-vault-secret-provider.js';
8
+ export function createSecretProvider(config, options) {
9
+ var _a, _b, _c;
10
+ const provider = (_a = options === null || options === void 0 ? void 0 : options.provider) !== null && _a !== void 0 ? _a : config.provider;
11
+ const profile = normalize((_b = options === null || options === void 0 ? void 0 : options.profile) !== null && _b !== void 0 ? _b : config.profile);
12
+ const vaultUrl = normalize((_c = options === null || options === void 0 ? void 0 : options.vaultUrl) !== null && _c !== void 0 ? _c : config.vaultUrl);
13
+ const isAzure = provider === SecretProviderType.Azure;
14
+ if (isAzure && profile) {
15
+ throw new Error('AWS profile cannot be used with Azure Key Vault provider');
16
+ }
17
+ if (!isAzure && vaultUrl) {
18
+ throw new Error('Vault URL cannot be used with AWS SSM provider');
19
+ }
20
+ if (isAzure) {
21
+ return createAzureProvider(vaultUrl);
22
+ }
23
+ return createAwsProvider(profile);
24
+ }
25
+ function createAzureProvider(vaultUrl) {
26
+ if (!(vaultUrl === null || vaultUrl === void 0 ? void 0 : vaultUrl.trim())) {
27
+ throw new Error('Vault URL must be provided for Azure Key Vault provider');
28
+ }
29
+ const credential = new DefaultAzureCredential();
30
+ const client = new SecretClient(vaultUrl, credential);
31
+ return new AzureKeyVaultSecretProvider(client);
32
+ }
33
+ function createAwsProvider(profile) {
34
+ const clientOptions = profile ? { credentials: fromIni({ profile }) } : {};
35
+ const client = new SSMClient(clientOptions);
36
+ return new AwsSsmSecretProvider(client);
37
+ }
38
+ function normalize(value) {
39
+ const trimmed = value === null || value === void 0 ? void 0 : value.trim();
40
+ return trimmed || undefined;
41
+ }
42
+ //# sourceMappingURL=secret-provider-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-provider-factory.js","sourceRoot":"","sources":["../../../../../src/sdks/nodejs/src/infrastructure/secret-provider-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AAEzF,MAAM,UAAU,oBAAoB,CAClC,MAAqB,EACrB,OAAyB;;IAEzB,MAAM,QAAQ,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,MAAM,CAAC,QAAQ,CAAC;IACtD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC;IAEtD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAA4B;IAE5B,IAAI,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,OAAO,IAAI,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA2B;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;IAC5C,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,MAAM,OAAO,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "envilder",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "A CLI and GitHub Action that securely centralizes your environment variables from AWS SSM or Azure Key Vault as a single source of truth",
5
5
  "homepage": "https://envilder.com",
6
6
  "author": {
@@ -25,9 +25,9 @@
25
25
  "verify:gha": "pnpm build:gha && git diff --exit-code github-action/dist/index.js || (echo '❌ github-action/dist/index.js is not up to date. Run pnpm build:gha' && exit 1)",
26
26
  "local:install": "pnpm build && node --loader ts-node/esm scripts/pack-and-install.ts",
27
27
  "local:test-run": "pnpm build && node lib/envilder/apps/cli/Index.js --map=tests/sample/param-map.json --envfile=tests/sample/autogenerated.env",
28
- "format": "biome format",
29
- "format:write": "biome format --write",
30
- "lint": "secretlint \"**/*\" && biome check --write && tsc --noEmit",
28
+ "format": "biome check --write --unsafe && biome format --write",
29
+ "format:check": "biome check && biome format",
30
+ "lint": "secretlint \"**/*\" && biome check && tsc --noEmit",
31
31
  "lint:fix": "biome lint --fix",
32
32
  "test": "vitest run --reporter=verbose --coverage",
33
33
  "test:ci": "vitest run --reporter=verbose --reporter=junit --coverage --outputFile=coverage/junit/test-results.xml",
@@ -81,6 +81,7 @@
81
81
  "LICENSE",
82
82
  "ROADMAP.md",
83
83
  "docs/CHANGELOG.md",
84
+ "docs/changelogs/**",
84
85
  "docs/SECURITY.md"
85
86
  ],
86
87
  "type": "module",
@@ -100,14 +101,14 @@
100
101
  "@biomejs/biome": "catalog:",
101
102
  "@commitlint/cli": "^20.5.0",
102
103
  "@commitlint/config-conventional": "^20.5.0",
103
- "@secretlint/secretlint-rule-preset-recommend": "^11.4.0",
104
+ "@secretlint/secretlint-rule-preset-recommend": "^12.3.1",
104
105
  "@testcontainers/localstack": "^11.13.0",
105
106
  "@types/node": "catalog:",
106
107
  "@vercel/ncc": "^0.38.4",
107
108
  "@vitest/coverage-v8": "catalog:",
108
109
  "glob": "^13.0.6",
109
110
  "lefthook": "^2.1.4",
110
- "secretlint": "^11.4.0",
111
+ "secretlint": "^12.3.1",
111
112
  "testcontainers": "^11.13.0",
112
113
  "ts-node": "catalog:",
113
114
  "tsx": "^4.21.0",
@@ -129,7 +130,8 @@
129
130
  "overrides": {
130
131
  "defu": ">=6.1.5",
131
132
  "lodash": ">=4.18.0",
132
- "vite": ">=7.3.2"
133
+ "vite": "^7.3.2",
134
+ "yaml": ">=2.8.3"
133
135
  }
134
136
  }
135
137
  }