@nexus_js/security 0.9.1 → 0.9.3

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 CHANGED
@@ -1,3 +1,4 @@
1
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';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -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,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"}
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;AACrB,OAAO,EACL,aAAa,EACb,aAAa,EACb,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
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';
3
4
  //# 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,GAEnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,EAExB,mBAAmB,EACnB,0BAA0B,EAC1B,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,aAAa,CAAC"}
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;AACrB,OAAO,EACL,aAAa,EACb,aAAa,GAEd,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,111 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,180 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-import.js","sourceRoot":"","sources":["../src/vault-import.ts"],"names":[],"mappings":"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"}
package/dist/vault.d.ts CHANGED
@@ -12,6 +12,11 @@ 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;
15
20
  /**
16
21
  * Merge keys. Use empty string to remove a key from the vault (not from `process.env` on disk).
17
22
  */
@@ -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;;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"}
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;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKrC;;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,6 +21,14 @@ 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
+ }
24
32
  /**
25
33
  * Merge keys. Use empty string to remove a key from the vault (not from `process.env` on disk).
26
34
  */
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;;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"}
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;;;OAGG;IACH,GAAG,CAAC,GAAW,EAAE,KAAa;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,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.1",
3
+ "version": "0.9.3",
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",
@@ -11,6 +11,12 @@
11
11
  "types": "./dist/index.d.ts"
12
12
  }
13
13
  },
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "dev": "tsc -p tsconfig.json --watch",
17
+ "test": "vitest run",
18
+ "clean": "rm -rf dist"
19
+ },
14
20
  "devDependencies": {
15
21
  "@types/node": "^22.0.0",
16
22
  "typescript": "^5.5.0",
@@ -29,11 +35,5 @@
29
35
  "funding": {
30
36
  "type": "individual",
31
37
  "url": "https://buymeacoffee.com/bierfor084"
32
- },
33
- "scripts": {
34
- "build": "tsc -p tsconfig.json",
35
- "dev": "tsc -p tsconfig.json --watch",
36
- "test": "vitest run",
37
- "clean": "rm -rf dist"
38
38
  }
39
- }
39
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Nexus Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.