@nexus_js/security 0.9.28 → 0.9.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/vault.d.ts +0 -8
- package/dist/vault.d.ts.map +1 -1
- package/dist/vault.js +1 -59
- package/dist/vault.js.map +1 -1
- package/package.json +2 -7
- package/dist/vault-import.d.ts +0 -111
- package/dist/vault-import.d.ts.map +0 -1
- package/dist/vault-import.js +0 -180
- package/dist/vault-import.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { NexusVault, nexusVault, getVaultSecretsMap,
|
|
1
|
+
export { NexusVault, nexusVault, getVaultSecretsMap, type VaultListener, } from './vault.js';
|
|
2
2
|
export { SHIELD_MANIFEST_FILENAME, type ShieldManifestV1, parseShieldManifest, loadShieldManifestFromRoot, extractActionNamesFromActionsSource, collectActionNamesFromOutputDir, } from './shield.js';
|
|
3
|
-
export { importToVault, autoImportEnv, type VaultImportOptions, } from './vault-import.js';
|
|
4
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,0BAA0B,EAC1B,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { NexusVault, nexusVault, getVaultSecretsMap,
|
|
1
|
+
export { NexusVault, nexusVault, getVaultSecretsMap, } from './vault.js';
|
|
2
2
|
export { SHIELD_MANIFEST_FILENAME, parseShieldManifest, loadShieldManifestFromRoot, extractActionNamesFromActionsSource, collectActionNamesFromOutputDir, } from './shield.js';
|
|
3
|
-
export { importToVault, autoImportEnv, } from './vault-import.js';
|
|
4
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,kBAAkB,GAEnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,EAExB,mBAAmB,EACnB,0BAA0B,EAC1B,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,aAAa,CAAC"}
|
package/dist/vault.d.ts
CHANGED
|
@@ -12,11 +12,6 @@ export declare class NexusVault {
|
|
|
12
12
|
seedFromProcessEnv(): void;
|
|
13
13
|
get(key: string): string | undefined;
|
|
14
14
|
has(key: string): boolean;
|
|
15
|
-
/**
|
|
16
|
-
* Set a single key-value pair.
|
|
17
|
-
* This method is used by the vault-import utility.
|
|
18
|
-
*/
|
|
19
|
-
set(key: string, value: string): void;
|
|
20
15
|
/**
|
|
21
16
|
* Merge keys. Use empty string to remove a key from the vault (not from `process.env` on disk).
|
|
22
17
|
*/
|
|
@@ -34,7 +29,4 @@ export declare class NexusVault {
|
|
|
34
29
|
/** Process-wide vault instance — use this from server code. */
|
|
35
30
|
export declare const nexusVault: NexusVault;
|
|
36
31
|
export declare function getVaultSecretsMap(): ReadonlyMap<string, string>;
|
|
37
|
-
export declare function getGlobalVaultSecretsMap(mode?: 'strict' | 'fallback'): ReadonlyMap<string, string>;
|
|
38
|
-
export declare function getTenantVaultSecretsMap(tenantId: string, mode?: 'strict' | 'fallback'): ReadonlyMap<string, string>;
|
|
39
|
-
export declare function getEncryptedVaultSecretsMap(): ReadonlyMap<string, string>;
|
|
40
32
|
//# sourceMappingURL=vault.d.ts.map
|
package/dist/vault.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC;AAIvC,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEnD;;;OAGG;IACH,kBAAkB,IAAI,IAAI;IAM1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC;AAIvC,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEnD;;;OAGG;IACH,kBAAkB,IAAI,IAAI;IAM1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQ5C;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAUjD,wEAAwE;IACxE,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAIvC,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,IAAI;IAOxC,OAAO,CAAC,MAAM;CASf;AAED,+DAA+D;AAC/D,eAAO,MAAM,UAAU,YAAmB,CAAC;AAE3C,wBAAgB,kBAAkB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAEhE"}
|
package/dist/vault.js
CHANGED
|
@@ -21,14 +21,6 @@ export class NexusVault {
|
|
|
21
21
|
has(key) {
|
|
22
22
|
return this.store.has(key);
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Set a single key-value pair.
|
|
26
|
-
* This method is used by the vault-import utility.
|
|
27
|
-
*/
|
|
28
|
-
set(key, value) {
|
|
29
|
-
this.store.set(key, value);
|
|
30
|
-
this.notify();
|
|
31
|
-
}
|
|
32
24
|
/**
|
|
33
25
|
* Merge keys. Use empty string to remove a key from the vault (not from `process.env` on disk).
|
|
34
26
|
*/
|
|
@@ -80,56 +72,6 @@ export class NexusVault {
|
|
|
80
72
|
/** Process-wide vault instance — use this from server code. */
|
|
81
73
|
export const nexusVault = new NexusVault();
|
|
82
74
|
export function getVaultSecretsMap() {
|
|
83
|
-
return
|
|
84
|
-
}
|
|
85
|
-
export function getGlobalVaultSecretsMap(mode = 'fallback') {
|
|
86
|
-
const snap = nexusVault.snapshot();
|
|
87
|
-
const out = new Map();
|
|
88
|
-
for (const [k, v] of snap) {
|
|
89
|
-
if (k.startsWith('GLOBAL/')) {
|
|
90
|
-
out.set(k.slice('GLOBAL/'.length), v);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (mode === 'fallback') {
|
|
94
|
-
for (const [k, v] of snap) {
|
|
95
|
-
if (k.startsWith('TENANT/'))
|
|
96
|
-
continue;
|
|
97
|
-
if (k.startsWith('GLOBAL/'))
|
|
98
|
-
continue;
|
|
99
|
-
if (k.startsWith('ENCRYPTED/'))
|
|
100
|
-
continue;
|
|
101
|
-
if (!out.has(k))
|
|
102
|
-
out.set(k, v);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return out;
|
|
106
|
-
}
|
|
107
|
-
export function getTenantVaultSecretsMap(tenantId, mode = 'strict') {
|
|
108
|
-
const snap = nexusVault.snapshot();
|
|
109
|
-
const prefix = `TENANT/${tenantId}/`;
|
|
110
|
-
const out = new Map();
|
|
111
|
-
for (const [k, v] of snap) {
|
|
112
|
-
if (k.startsWith(prefix)) {
|
|
113
|
-
out.set(k.slice(prefix.length), v);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (mode === 'fallback') {
|
|
117
|
-
const global = getGlobalVaultSecretsMap('fallback');
|
|
118
|
-
for (const [k, v] of global) {
|
|
119
|
-
if (!out.has(k))
|
|
120
|
-
out.set(k, v);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return out;
|
|
124
|
-
}
|
|
125
|
-
export function getEncryptedVaultSecretsMap() {
|
|
126
|
-
const snap = nexusVault.snapshot();
|
|
127
|
-
const out = new Map();
|
|
128
|
-
for (const [k, v] of snap) {
|
|
129
|
-
if (k.startsWith('ENCRYPTED/')) {
|
|
130
|
-
out.set(k.slice('ENCRYPTED/'.length), v);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return out;
|
|
75
|
+
return nexusVault.snapshot();
|
|
134
76
|
}
|
|
135
77
|
//# sourceMappingURL=vault.js.map
|
package/dist/vault.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;AAEhD,MAAM,OAAO,UAAU;IACJ,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD;;;OAGG;IACH,kBAAkB;QAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;AAEhD,MAAM,OAAO,UAAU;IACJ,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD;;;OAGG;IACH,kBAAkB;QAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAA+B;QACnC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;gBAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAA+B;QACxC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;gBAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,wEAAwE;IACxE,QAAQ;QACN,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,EAAiB;QACzB,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAEO,MAAM;QACZ,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,EAAE,EAAE,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,+DAA+D;AAC/D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;AAE3C,MAAM,UAAU,kBAAkB;IAChC,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexus_js/security",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.29",
|
|
4
4
|
"description": "Nexus Hardened Core — Vault-lite (hot secrets) and Shield-lite (build manifest helpers)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"@types/node": "^22.0.0",
|
|
16
16
|
"typescript": "^5.5.0",
|
|
17
|
-
"vitest": "^
|
|
17
|
+
"vitest": "^2.0.0"
|
|
18
18
|
},
|
|
19
19
|
"license": "MIT",
|
|
20
20
|
"repository": {
|
|
@@ -26,14 +26,9 @@
|
|
|
26
26
|
"dist",
|
|
27
27
|
"README.md"
|
|
28
28
|
],
|
|
29
|
-
"funding": {
|
|
30
|
-
"type": "individual",
|
|
31
|
-
"url": "https://buymeacoffee.com/bierfor084"
|
|
32
|
-
},
|
|
33
29
|
"scripts": {
|
|
34
30
|
"build": "tsc -p tsconfig.json",
|
|
35
31
|
"dev": "tsc -p tsconfig.json --watch",
|
|
36
|
-
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
37
32
|
"test": "vitest run",
|
|
38
33
|
"clean": "rm -rf dist"
|
|
39
34
|
}
|
package/dist/vault-import.d.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @nexus_js/security - Vault Import Utility
|
|
3
|
-
*
|
|
4
|
-
* Import secrets from .env files, JSON config, or external vaults (AWS Secrets Manager, etc.)
|
|
5
|
-
* into the Nexus Vault for unified secret management.
|
|
6
|
-
*/
|
|
7
|
-
export interface VaultImportOptions {
|
|
8
|
-
/**
|
|
9
|
-
* Source type: .env file, JSON config, or raw key-value object.
|
|
10
|
-
*/
|
|
11
|
-
source: 'env-file' | 'json-file' | 'object' | 'aws-secrets' | 'gcp-secrets';
|
|
12
|
-
/**
|
|
13
|
-
* Path to the source file (for env-file or json-file).
|
|
14
|
-
*/
|
|
15
|
-
filePath?: string;
|
|
16
|
-
/**
|
|
17
|
-
* Raw key-value object to import (for 'object' source).
|
|
18
|
-
*/
|
|
19
|
-
secrets?: Record<string, string>;
|
|
20
|
-
/**
|
|
21
|
-
* Filter: only import keys matching this regex.
|
|
22
|
-
* @example /^DB_|^API_KEY/ imports DB_* and API_KEY*
|
|
23
|
-
*/
|
|
24
|
-
filter?: RegExp;
|
|
25
|
-
/**
|
|
26
|
-
* Prefix to add to all imported keys.
|
|
27
|
-
* @example prefix: 'LEGACY_' imports DATABASE_URL as LEGACY_DATABASE_URL
|
|
28
|
-
*/
|
|
29
|
-
prefix?: string;
|
|
30
|
-
/**
|
|
31
|
-
* Whether to overwrite existing keys in the Vault.
|
|
32
|
-
* @default false
|
|
33
|
-
*/
|
|
34
|
-
overwrite?: boolean;
|
|
35
|
-
/**
|
|
36
|
-
* AWS Secrets Manager config (for aws-secrets source).
|
|
37
|
-
*/
|
|
38
|
-
aws?: {
|
|
39
|
-
region: string;
|
|
40
|
-
secretName: string;
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* GCP Secret Manager config (for gcp-secrets source).
|
|
44
|
-
*/
|
|
45
|
-
gcp?: {
|
|
46
|
-
projectId: string;
|
|
47
|
-
secretName: string;
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Import secrets from various sources into the Nexus Vault.
|
|
52
|
-
*
|
|
53
|
-
* This is critical for legacy migration:
|
|
54
|
-
* - Read the old .env file
|
|
55
|
-
* - Import all secrets into the Vault
|
|
56
|
-
* - Enable hot-reload rotation for sensitive keys
|
|
57
|
-
* - The old backend can now be decommissioned
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* ```ts
|
|
61
|
-
* // Import from .env file
|
|
62
|
-
* await importToVault({
|
|
63
|
-
* source: 'env-file',
|
|
64
|
-
* filePath: '.env.production',
|
|
65
|
-
* filter: /^DB_|^API_KEY/,
|
|
66
|
-
* prefix: 'LEGACY_',
|
|
67
|
-
* });
|
|
68
|
-
*
|
|
69
|
-
* // Now accessible via:
|
|
70
|
-
* nexusVault.get('LEGACY_DB_HOST');
|
|
71
|
-
* nexusVault.get('LEGACY_API_KEY_STRIPE');
|
|
72
|
-
*
|
|
73
|
-
* // Import from AWS Secrets Manager
|
|
74
|
-
* await importToVault({
|
|
75
|
-
* source: 'aws-secrets',
|
|
76
|
-
* aws: { region: 'us-east-1', secretName: 'prod/api' },
|
|
77
|
-
* });
|
|
78
|
-
* ```
|
|
79
|
-
*/
|
|
80
|
-
export declare function importToVault(opts: VaultImportOptions): Promise<{
|
|
81
|
-
imported: number;
|
|
82
|
-
skipped: number;
|
|
83
|
-
errors: Array<{
|
|
84
|
-
key: string;
|
|
85
|
-
error: string;
|
|
86
|
-
}>;
|
|
87
|
-
}>;
|
|
88
|
-
/**
|
|
89
|
-
* Auto-import from .env file if it exists in the project root.
|
|
90
|
-
* Call this in your server startup to seamlessly migrate legacy secrets.
|
|
91
|
-
*
|
|
92
|
-
* @example
|
|
93
|
-
* ```ts
|
|
94
|
-
* // server.ts
|
|
95
|
-
* import { autoImportEnv } from '@nexus_js/security';
|
|
96
|
-
*
|
|
97
|
-
* await autoImportEnv({ root: process.cwd(), prefix: 'LEGACY_' });
|
|
98
|
-
*
|
|
99
|
-
* // Now all .env keys are available with LEGACY_ prefix
|
|
100
|
-
* ```
|
|
101
|
-
*/
|
|
102
|
-
export declare function autoImportEnv(opts?: {
|
|
103
|
-
root?: string;
|
|
104
|
-
prefix?: string;
|
|
105
|
-
filter?: RegExp;
|
|
106
|
-
overwrite?: boolean;
|
|
107
|
-
}): Promise<{
|
|
108
|
-
imported: number;
|
|
109
|
-
skipped: number;
|
|
110
|
-
}>;
|
|
111
|
-
//# sourceMappingURL=vault-import.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vault-import.d.ts","sourceRoot":"","sources":["../src/vault-import.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,GAAG,aAAa,CAAC;IAE5E;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF;;OAEG;IACH,GAAG,CAAC,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAgCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,CAAC,CAqFD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBjD"}
|
package/dist/vault-import.js
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @nexus_js/security - Vault Import Utility
|
|
3
|
-
*
|
|
4
|
-
* Import secrets from .env files, JSON config, or external vaults (AWS Secrets Manager, etc.)
|
|
5
|
-
* into the Nexus Vault for unified secret management.
|
|
6
|
-
*/
|
|
7
|
-
import { nexusVault } from './vault.js';
|
|
8
|
-
import { readFile } from 'node:fs/promises';
|
|
9
|
-
import { existsSync } from 'node:fs';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
/**
|
|
12
|
-
* Parse .env file content into key-value pairs.
|
|
13
|
-
* Supports basic syntax: KEY=value, ignores comments (#), handles quotes.
|
|
14
|
-
*/
|
|
15
|
-
function parseEnvFile(content) {
|
|
16
|
-
const result = {};
|
|
17
|
-
const lines = content.split('\n');
|
|
18
|
-
for (let line of lines) {
|
|
19
|
-
line = line.trim();
|
|
20
|
-
if (!line || line.startsWith('#'))
|
|
21
|
-
continue; // Skip empty or comment lines
|
|
22
|
-
const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/i);
|
|
23
|
-
if (!match)
|
|
24
|
-
continue;
|
|
25
|
-
let [, key, value] = match;
|
|
26
|
-
if (!key || value === undefined)
|
|
27
|
-
continue;
|
|
28
|
-
// Remove quotes if present
|
|
29
|
-
value = value.trim();
|
|
30
|
-
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
31
|
-
value = value.slice(1, -1);
|
|
32
|
-
}
|
|
33
|
-
result[key] = value;
|
|
34
|
-
}
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Import secrets from various sources into the Nexus Vault.
|
|
39
|
-
*
|
|
40
|
-
* This is critical for legacy migration:
|
|
41
|
-
* - Read the old .env file
|
|
42
|
-
* - Import all secrets into the Vault
|
|
43
|
-
* - Enable hot-reload rotation for sensitive keys
|
|
44
|
-
* - The old backend can now be decommissioned
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```ts
|
|
48
|
-
* // Import from .env file
|
|
49
|
-
* await importToVault({
|
|
50
|
-
* source: 'env-file',
|
|
51
|
-
* filePath: '.env.production',
|
|
52
|
-
* filter: /^DB_|^API_KEY/,
|
|
53
|
-
* prefix: 'LEGACY_',
|
|
54
|
-
* });
|
|
55
|
-
*
|
|
56
|
-
* // Now accessible via:
|
|
57
|
-
* nexusVault.get('LEGACY_DB_HOST');
|
|
58
|
-
* nexusVault.get('LEGACY_API_KEY_STRIPE');
|
|
59
|
-
*
|
|
60
|
-
* // Import from AWS Secrets Manager
|
|
61
|
-
* await importToVault({
|
|
62
|
-
* source: 'aws-secrets',
|
|
63
|
-
* aws: { region: 'us-east-1', secretName: 'prod/api' },
|
|
64
|
-
* });
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
export async function importToVault(opts) {
|
|
68
|
-
const { source, filePath, secrets: rawSecrets, filter, prefix, overwrite = false } = opts;
|
|
69
|
-
let secretsToImport = {};
|
|
70
|
-
// ── Step 1: Load secrets from source ──────────────────────────────────────
|
|
71
|
-
switch (source) {
|
|
72
|
-
case 'env-file': {
|
|
73
|
-
if (!filePath)
|
|
74
|
-
throw new Error('filePath required for env-file source');
|
|
75
|
-
if (!existsSync(filePath))
|
|
76
|
-
throw new Error(`File not found: ${filePath}`);
|
|
77
|
-
const content = await readFile(filePath, 'utf-8');
|
|
78
|
-
secretsToImport = parseEnvFile(content);
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
case 'json-file': {
|
|
82
|
-
if (!filePath)
|
|
83
|
-
throw new Error('filePath required for json-file source');
|
|
84
|
-
if (!existsSync(filePath))
|
|
85
|
-
throw new Error(`File not found: ${filePath}`);
|
|
86
|
-
const content = await readFile(filePath, 'utf-8');
|
|
87
|
-
try {
|
|
88
|
-
secretsToImport = JSON.parse(content);
|
|
89
|
-
}
|
|
90
|
-
catch (err) {
|
|
91
|
-
throw new Error(`Invalid JSON in ${filePath}: ${err}`);
|
|
92
|
-
}
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
case 'object': {
|
|
96
|
-
if (!rawSecrets)
|
|
97
|
-
throw new Error('secrets object required for object source');
|
|
98
|
-
secretsToImport = rawSecrets;
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
case 'aws-secrets': {
|
|
102
|
-
if (!opts.aws)
|
|
103
|
-
throw new Error('aws config required for aws-secrets source');
|
|
104
|
-
// Placeholder: requires AWS SDK
|
|
105
|
-
throw new Error('aws-secrets source requires @aws-sdk/client-secrets-manager (not included in @nexus_js/security)');
|
|
106
|
-
}
|
|
107
|
-
case 'gcp-secrets': {
|
|
108
|
-
if (!opts.gcp)
|
|
109
|
-
throw new Error('gcp config required for gcp-secrets source');
|
|
110
|
-
// Placeholder: requires GCP SDK
|
|
111
|
-
throw new Error('gcp-secrets source requires @google-cloud/secret-manager (not included in @nexus_js/security)');
|
|
112
|
-
}
|
|
113
|
-
default:
|
|
114
|
-
throw new Error(`Unknown source type: ${source}`);
|
|
115
|
-
}
|
|
116
|
-
// ── Step 2: Filter and prefix keys ────────────────────────────────────────
|
|
117
|
-
const filteredSecrets = {};
|
|
118
|
-
for (const [key, value] of Object.entries(secretsToImport)) {
|
|
119
|
-
if (filter && !filter.test(key))
|
|
120
|
-
continue;
|
|
121
|
-
const finalKey = prefix ? `${prefix}${key}` : key;
|
|
122
|
-
filteredSecrets[finalKey] = value;
|
|
123
|
-
}
|
|
124
|
-
// ── Step 3: Import into Vault ─────────────────────────────────────────────
|
|
125
|
-
let imported = 0;
|
|
126
|
-
let skipped = 0;
|
|
127
|
-
const errors = [];
|
|
128
|
-
for (const [key, value] of Object.entries(filteredSecrets)) {
|
|
129
|
-
try {
|
|
130
|
-
const existing = nexusVault.get(key);
|
|
131
|
-
if (existing && !overwrite) {
|
|
132
|
-
skipped++;
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
nexusVault.set(key, value);
|
|
136
|
-
imported++;
|
|
137
|
-
}
|
|
138
|
-
catch (err) {
|
|
139
|
-
errors.push({
|
|
140
|
-
key,
|
|
141
|
-
error: err instanceof Error ? err.message : String(err),
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return { imported, skipped, errors };
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Auto-import from .env file if it exists in the project root.
|
|
149
|
-
* Call this in your server startup to seamlessly migrate legacy secrets.
|
|
150
|
-
*
|
|
151
|
-
* @example
|
|
152
|
-
* ```ts
|
|
153
|
-
* // server.ts
|
|
154
|
-
* import { autoImportEnv } from '@nexus_js/security';
|
|
155
|
-
*
|
|
156
|
-
* await autoImportEnv({ root: process.cwd(), prefix: 'LEGACY_' });
|
|
157
|
-
*
|
|
158
|
-
* // Now all .env keys are available with LEGACY_ prefix
|
|
159
|
-
* ```
|
|
160
|
-
*/
|
|
161
|
-
export async function autoImportEnv(opts) {
|
|
162
|
-
const root = opts?.root ?? process.cwd();
|
|
163
|
-
const envPath = join(root, '.env');
|
|
164
|
-
if (!existsSync(envPath)) {
|
|
165
|
-
return { imported: 0, skipped: 0 };
|
|
166
|
-
}
|
|
167
|
-
const importOpts = {
|
|
168
|
-
source: 'env-file',
|
|
169
|
-
filePath: envPath,
|
|
170
|
-
};
|
|
171
|
-
if (opts?.prefix !== undefined)
|
|
172
|
-
importOpts.prefix = opts.prefix;
|
|
173
|
-
if (opts?.filter !== undefined)
|
|
174
|
-
importOpts.filter = opts.filter;
|
|
175
|
-
if (opts?.overwrite !== undefined)
|
|
176
|
-
importOpts.overwrite = opts.overwrite;
|
|
177
|
-
const result = await importToVault(importOpts);
|
|
178
|
-
return { imported: result.imported, skipped: result.skipped };
|
|
179
|
-
}
|
|
180
|
-
//# sourceMappingURL=vault-import.js.map
|
package/dist/vault-import.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vault-import.js","sourceRoot":"","sources":["../src/vault-import.ts"],"names":[],"mappings":"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"}
|