@secfn/core 0.0.1 → 0.0.2

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 (100) hide show
  1. package/README.md +30 -322
  2. package/dist/encryption.d.ts +8 -0
  3. package/dist/encryption.d.ts.map +1 -0
  4. package/dist/encryption.js +76 -0
  5. package/dist/encryption.js.map +1 -0
  6. package/dist/errors.d.ts +24 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +47 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/id.d.ts +3 -0
  11. package/dist/id.d.ts.map +1 -0
  12. package/dist/id.js +11 -0
  13. package/dist/id.js.map +1 -0
  14. package/dist/index.d.ts +9 -11
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +9 -11
  17. package/dist/index.js.map +1 -1
  18. package/dist/scanner/reporters.d.ts +14 -0
  19. package/dist/scanner/reporters.d.ts.map +1 -0
  20. package/dist/scanner/reporters.js +85 -0
  21. package/dist/scanner/reporters.js.map +1 -0
  22. package/dist/scanner/rules.d.ts +24 -0
  23. package/dist/scanner/rules.d.ts.map +1 -0
  24. package/dist/scanner/rules.js +141 -0
  25. package/dist/scanner/rules.js.map +1 -0
  26. package/dist/scanner/scanner.d.ts +25 -0
  27. package/dist/scanner/scanner.d.ts.map +1 -0
  28. package/dist/scanner/scanner.js +73 -0
  29. package/dist/scanner/scanner.js.map +1 -0
  30. package/dist/scanner/utils.d.ts +15 -0
  31. package/dist/scanner/utils.d.ts.map +1 -0
  32. package/dist/scanner/utils.js +40 -0
  33. package/dist/scanner/utils.js.map +1 -0
  34. package/dist/schema.d.ts +9 -0
  35. package/dist/schema.d.ts.map +1 -0
  36. package/dist/schema.js +246 -0
  37. package/dist/schema.js.map +1 -0
  38. package/dist/types.d.ts +258 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +29 -26
  43. package/dist/access-control/rbac.d.ts +0 -48
  44. package/dist/access-control/rbac.d.ts.map +0 -1
  45. package/dist/access-control/rbac.js +0 -203
  46. package/dist/access-control/rbac.js.map +0 -1
  47. package/dist/core/secfn.d.ts +0 -28
  48. package/dist/core/secfn.d.ts.map +0 -1
  49. package/dist/core/secfn.js +0 -73
  50. package/dist/core/secfn.js.map +0 -1
  51. package/dist/monitoring/security-monitor.d.ts +0 -46
  52. package/dist/monitoring/security-monitor.d.ts.map +0 -1
  53. package/dist/monitoring/security-monitor.js +0 -172
  54. package/dist/monitoring/security-monitor.js.map +0 -1
  55. package/dist/rate-limiting/rate-limiter.d.ts +0 -31
  56. package/dist/rate-limiting/rate-limiter.d.ts.map +0 -1
  57. package/dist/rate-limiting/rate-limiter.js +0 -140
  58. package/dist/rate-limiting/rate-limiter.js.map +0 -1
  59. package/dist/scanning/patterns.d.ts +0 -3
  60. package/dist/scanning/patterns.d.ts.map +0 -1
  61. package/dist/scanning/patterns.js +0 -139
  62. package/dist/scanning/patterns.js.map +0 -1
  63. package/dist/scanning/scanner.d.ts +0 -36
  64. package/dist/scanning/scanner.d.ts.map +0 -1
  65. package/dist/scanning/scanner.js +0 -152
  66. package/dist/scanning/scanner.js.map +0 -1
  67. package/dist/secrets/encryption.d.ts +0 -17
  68. package/dist/secrets/encryption.d.ts.map +0 -1
  69. package/dist/secrets/encryption.js +0 -47
  70. package/dist/secrets/encryption.js.map +0 -1
  71. package/dist/secrets/vault.d.ts +0 -43
  72. package/dist/secrets/vault.d.ts.map +0 -1
  73. package/dist/secrets/vault.js +0 -126
  74. package/dist/secrets/vault.js.map +0 -1
  75. package/dist/storage/indexeddb-storage.d.ts +0 -37
  76. package/dist/storage/indexeddb-storage.d.ts.map +0 -1
  77. package/dist/storage/indexeddb-storage.js +0 -284
  78. package/dist/storage/indexeddb-storage.js.map +0 -1
  79. package/dist/types/index.d.ts +0 -189
  80. package/dist/types/index.d.ts.map +0 -1
  81. package/dist/types/index.js +0 -2
  82. package/dist/types/index.js.map +0 -1
  83. package/dist/utils/helpers.d.ts +0 -8
  84. package/dist/utils/helpers.d.ts.map +0 -1
  85. package/dist/utils/helpers.js +0 -73
  86. package/dist/utils/helpers.js.map +0 -1
  87. package/examples/basic-usage.ts +0 -143
  88. package/src/access-control/rbac.ts +0 -271
  89. package/src/core/secfn.ts +0 -90
  90. package/src/index.ts +0 -27
  91. package/src/monitoring/security-monitor.ts +0 -245
  92. package/src/rate-limiting/rate-limiter.ts +0 -181
  93. package/src/scanning/patterns.ts +0 -140
  94. package/src/scanning/scanner.ts +0 -199
  95. package/src/secrets/encryption.ts +0 -74
  96. package/src/secrets/vault.ts +0 -187
  97. package/src/storage/indexeddb-storage.ts +0 -355
  98. package/src/types/index.ts +0 -213
  99. package/src/utils/helpers.ts +0 -84
  100. package/tsconfig.json +0 -26
package/README.md CHANGED
@@ -1,334 +1,42 @@
1
- # SecFn
1
+ # @secfn/core
2
2
 
3
- > Comprehensive self-hosted security platform for developers
3
+ Core contracts and pure utilities for SecFn V1.
4
4
 
5
- SecFn is a developer-first security solution that combines vulnerability scanning, access control, secrets management, and security monitoring into a single self-hosted platform.
5
+ `@secfn/core` intentionally contains no database adapter, HTTP router, or framework integration. It provides the shared types that `@secfn/server`, `@secfn/runtime`, and `@secfn/cli` build on.
6
6
 
7
- ## Features
7
+ ## Exports
8
8
 
9
- - 🔐 **Secrets Vault** - AES-256-GCM encrypted secret storage with rotation and access logging
10
- - 🔍 **Secret Scanning** - Pattern-based detection of 20+ secret types in code and git history
11
- - 🛡️ **Access Control** - Role-based permissions (RBAC) with caching and inheritance
12
- - ⏱️ **Rate Limiting** - Token bucket algorithm with multi-level limits
13
- - 📊 **Security Monitoring** - Event logging, metrics, and anomaly detection
14
- - 🗄️ **Self-Hosted** - IndexedDB storage, no external dependencies
15
- - 🚀 **Developer-Friendly** - Simple API, TypeScript support, works locally
9
+ - Encryption primitives using AES-256-GCM with per-record IV and salt.
10
+ - `KeyProvider` and `createStaticKeyProvider` for default env/master-key workflows.
11
+ - AAD helpers binding encrypted versions to tenant, namespace, secret id, and version.
12
+ - Scanner interfaces, default secret rule pack, scanner engine, and table/JSON/SARIF reporters.
13
+ - RBAC, audit event, secret, service token, runtime, and server config types.
14
+ - `SecFnError` variants.
15
+ - `getSecFnSchema()` for `@superfunctions/db` schema discovery.
16
16
 
17
- ## Installation
17
+ ## Example
18
18
 
19
- ```bash
20
- npm install secfn
21
- ```
22
-
23
- ## Quick Start
24
-
25
- ```typescript
26
- import { createSecFn } from 'secfn';
27
-
28
- const secFn = createSecFn({
29
- namespace: 'my-app',
30
- masterKey: process.env.MASTER_KEY,
31
- });
32
-
33
- await secFn.initialize();
34
-
35
- const vault = secFn.createSecretsVault();
36
- await vault.set('api_key', 'secret-value', {
37
- tags: ['production'],
38
- environment: 'production',
39
- });
40
-
41
- const secret = await vault.get('api_key');
42
- console.log('Retrieved:', secret);
43
-
44
- await secFn.destroy();
45
- ```
46
-
47
- ## Core Components
48
-
49
- ### 1. Secrets Vault
19
+ ```ts
20
+ import {
21
+ buildSecretAad,
22
+ createStaticKeyProvider,
23
+ decryptSecret,
24
+ encryptSecret,
25
+ getSecFnSchema,
26
+ } from "@secfn/core";
50
27
 
51
- Encrypted storage and management of application secrets.
28
+ const keyProvider = createStaticKeyProvider(process.env.SECFN_MASTER_KEY!, "env:main");
52
29
 
53
- ```typescript
54
- const vault = secFn.createSecretsVault();
55
-
56
- await vault.set('stripe_api_key', 'sk_live_...', {
57
- tags: ['payment', 'production'],
58
- environment: 'production',
59
- expiresAt: Date.now() + 90 * 24 * 60 * 60 * 1000,
60
- rotateEvery: 90 * 24 * 60 * 60 * 1000,
30
+ const aad = buildSecretAad({
31
+ tenantId: "acme",
32
+ namespace: "web",
33
+ secretId: "secret_123",
34
+ version: 1,
61
35
  });
62
36
 
63
- const key = await vault.get('stripe_api_key');
64
-
65
- const secrets = await vault.list({ environment: 'production' });
66
-
67
- await vault.rotate('stripe_api_key', 'sk_live_new...');
68
-
69
- const accessLog = await vault.getAccessLog('stripe_api_key', 100);
37
+ const encrypted = await encryptSecret("plain", keyProvider, aad);
38
+ const plain = await decryptSecret(encrypted, keyProvider, aad);
39
+ const schema = getSecFnSchema();
70
40
  ```
71
41
 
72
- ### 2. Secret Scanner
73
-
74
- Detect hardcoded secrets in source code with 20+ built-in patterns.
75
-
76
- ```typescript
77
- const scanner = secFn.createSecretScanner({
78
- excludePaths: ['node_modules/**', 'dist/**'],
79
- minEntropy: 3.5,
80
- });
81
-
82
- const results = await scanner.scanDirectory('./src');
83
-
84
- results.forEach(result => {
85
- console.log(`${result.severity}: ${result.pattern} in ${result.file}:${result.line}`);
86
- console.log(` Match: ${result.redactedMatch}`);
87
- });
88
-
89
- const gitResults = await scanner.scanGitHistory({
90
- branch: 'main',
91
- commits: 100,
92
- });
93
-
94
- scanner.addPattern({
95
- name: 'Custom Secret',
96
- pattern: /custom_secret_[a-zA-Z0-9]{32}/g,
97
- entropy: 4.0,
98
- description: 'Custom application secret',
99
- severity: 'high',
100
- });
101
- ```
102
-
103
- **Built-in Secret Patterns:**
104
- - AWS Access Keys, Secret Keys
105
- - GitHub Tokens
106
- - Stripe API Keys
107
- - OpenAI & Anthropic API Keys
108
- - Google API Keys
109
- - Slack Tokens
110
- - NPM Tokens
111
- - JWT Tokens
112
- - Database Connection Strings
113
- - Private Keys (RSA, OpenSSH, DSA, EC, PGP)
114
- - And many more...
115
-
116
- ### 3. Access Control (RBAC)
117
-
118
- Fine-grained role-based access control with permission caching.
119
-
120
- ```typescript
121
- const access = secFn.createAccessControl();
122
-
123
- await access.createRole({
124
- name: 'editor',
125
- description: 'Can edit projects and files',
126
- permissions: ['project:read', 'project:write', 'file:read', 'file:write'],
127
- });
128
-
129
- await access.createRole({
130
- name: 'admin',
131
- description: 'Full system access',
132
- permissions: ['*:*'],
133
- });
134
-
135
- await access.assignRole('user_123', 'editor', {
136
- resourceIds: ['project_abc', 'project_def'],
137
- });
138
-
139
- const allowed = await access.check({
140
- userId: 'user_123',
141
- action: 'project:write',
142
- resourceId: 'project_abc',
143
- });
144
-
145
- const permissions = await access.getUserPermissions('user_123');
146
- ```
147
-
148
- ### 4. Rate Limiting
149
-
150
- Protect against brute force and API abuse with token bucket algorithm.
151
-
152
- ```typescript
153
- const limiter = secFn.createRateLimiter({
154
- rules: {
155
- global: { requests: 1000, window: 60000 },
156
- perUser: { requests: 100, window: 60000 },
157
- perIP: { requests: 50, window: 60000, blockDuration: 300000 },
158
- perEndpoint: {
159
- '/api/login': { requests: 5, window: 300000 },
160
- '/api/search': { requests: 100, window: 60000 },
161
- },
162
- },
163
- onLimitExceeded: async (violation) => {
164
- console.warn(`Rate limit exceeded for ${violation.ip}`);
165
- },
166
- });
167
-
168
- const result = await limiter.check({
169
- userId: 'user_123',
170
- ip: '192.168.1.1',
171
- endpoint: '/api/search',
172
- });
173
-
174
- if (!result.allowed) {
175
- throw new Error(`Rate limit exceeded. Retry after ${result.retryAfter}ms`);
176
- }
177
-
178
- await limiter.resetUser('user_123');
179
- await limiter.unblock('ip:192.168.1.1');
180
- ```
181
-
182
- ### 5. Security Monitoring
183
-
184
- Comprehensive event logging with metrics and anomaly detection.
185
-
186
- ```typescript
187
- const monitoring = secFn.createMonitoring({
188
- retention: 90 * 24 * 60 * 60 * 1000,
189
- anomalyDetection: {
190
- enabled: true,
191
- sensitivity: 0.8,
192
- },
193
- });
194
-
195
- await monitoring.logEvent({
196
- type: 'auth_failure',
197
- severity: 'medium',
198
- userId: 'user_123',
199
- ip: '192.168.1.1',
200
- resource: '/api/login',
201
- action: 'login',
202
- metadata: {
203
- reason: 'invalid_password',
204
- attemptCount: 3,
205
- },
206
- });
207
-
208
- const events = await monitoring.queryEvents({
209
- type: 'auth_failure',
210
- severity: ['high', 'critical'],
211
- startDate: Date.now() - 24 * 60 * 60 * 1000,
212
- });
213
-
214
- const metrics = await monitoring.getMetrics({
215
- start: Date.now() - 7 * 24 * 60 * 60 * 1000,
216
- end: Date.now(),
217
- });
218
-
219
- console.log('Total events:', metrics.totalEvents);
220
- console.log('Events by type:', metrics.eventsByType);
221
- console.log('Anomalies:', metrics.anomalies);
222
-
223
- await monitoring.resolveEvent('event_123', {
224
- resolvedBy: 'admin_456',
225
- notes: 'False positive',
226
- });
227
- ```
228
-
229
- ## Storage
230
-
231
- SecFn uses IndexedDB for browser/local storage with no external dependencies.
232
-
233
- ```typescript
234
- const secFn = createSecFn({
235
- storage: {
236
- type: 'indexeddb',
237
- dbName: 'my-app-security',
238
- retentionDays: 90,
239
- },
240
- });
241
- ```
242
-
243
- **Storage Schema:**
244
- - `secfn_secrets` - Encrypted secrets
245
- - `secfn_secret_access` - Access logs
246
- - `secfn_roles` - Role definitions
247
- - `secfn_user_roles` - User-role assignments
248
- - `secfn_security_events` - Security events
249
- - `secfn_rate_limits` - Rate limit tracking
250
- - `secfn_scan_results` - Secret scan results
251
-
252
- ## Performance
253
-
254
- **V0 Benchmarks:**
255
- - Scan 10,000 files for secrets: <10s
256
- - Rate limit check: <5ms
257
- - Access control check: <10ms (with cache)
258
- - Log 1,000 security events: <500ms
259
- - Query 10,000 events: <100ms
260
- - Encrypt/decrypt secret: <10ms
261
-
262
- ## Examples
263
-
264
- See `examples/basic-usage.ts` for a comprehensive demonstration of all features.
265
-
266
- ```bash
267
- npm run build
268
- node dist/examples/basic-usage.js
269
- ```
270
-
271
- ## Development
272
-
273
- ```bash
274
- npm install
275
-
276
- npm run build
277
-
278
- npm run build:watch
279
-
280
- npm test
281
-
282
- npm run test:watch
283
-
284
- npm run test:coverage
285
-
286
- npm run typecheck
287
-
288
- npm run lint
289
- ```
290
-
291
- ## Architecture
292
-
293
- ```
294
- secfn/
295
- ├── storage/ # IndexedDB persistence
296
- ├── secrets/ # Vault & encryption
297
- ├── scanning/ # Secret detection
298
- ├── access-control/ # RBAC system
299
- ├── rate-limiting/ # Request throttling
300
- ├── monitoring/ # Event logging
301
- └── core/ # Main orchestrator
302
- ```
303
-
304
- ## Security Best Practices
305
-
306
- 1. **Master Key**: Always use a strong, randomly generated master key in production
307
- 2. **Rotation**: Enable automatic secret rotation for sensitive credentials
308
- 3. **Monitoring**: Review security events and anomalies regularly
309
- 4. **Access Control**: Apply principle of least privilege
310
- 5. **Rate Limiting**: Configure appropriate limits for your use case
311
- 6. **Scanning**: Integrate secret scanning into your CI/CD pipeline
312
-
313
- ## Roadmap
314
-
315
- - [ ] File system storage backend
316
- - [ ] Database adapter support (@superfunctions/db)
317
- - [ ] Vulnerability scanning (SQL injection, XSS, etc.)
318
- - [ ] Security middleware for Express/Hono/Fastify
319
- - [ ] HTML security dashboard
320
- - [ ] CLI tools
321
- - [ ] Real-time alert notifications
322
- - [ ] Advanced anomaly detection with ML
323
-
324
- ## License
325
-
326
- MIT
327
-
328
- ## Contributing
329
-
330
- Contributions welcome! This is part of the super-functions ecosystem.
331
-
332
- ## Support
333
-
334
- For issues and questions, please open an issue on GitHub.
42
+ Production storage, admin routes, runtime routes, RBAC services, rate limiting, and audit persistence live in `@secfn/server`.
@@ -0,0 +1,8 @@
1
+ import type { EncryptedSecretPayload, KeyProvider, SecretAadInput } from "./types.js";
2
+ export declare function createStaticKeyProvider(secret: string | Uint8Array, keyId?: string): KeyProvider;
3
+ export declare function buildSecretAad(input: SecretAadInput): string;
4
+ export declare function encryptSecret(plaintext: string, keyProvider: KeyProvider, aad: string): Promise<EncryptedSecretPayload>;
5
+ export declare function decryptSecret(payload: EncryptedSecretPayload, keyProvider: KeyProvider, aad: string): Promise<string>;
6
+ export declare function hashToken(token: string): string;
7
+ export declare function verifyTokenHash(token: string, expectedHash: string): boolean;
8
+ //# sourceMappingURL=encryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,sBAAsB,EAEtB,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AAQpB,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,KAAK,SAAY,GAAG,WAAW,CAInG;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAO5D;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,sBAAsB,CAAC,CAqBjC;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAI5E"}
@@ -0,0 +1,76 @@
1
+ import { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes, timingSafeEqual, createHash, } from "node:crypto";
2
+ import { SecFnEncryptionError } from "./errors.js";
3
+ const ALGORITHM = "aes-256-gcm";
4
+ const ITERATIONS = 210_000;
5
+ const KEY_LENGTH = 32;
6
+ const IV_LENGTH = 12;
7
+ const SALT_LENGTH = 16;
8
+ export function createStaticKeyProvider(secret, keyId = "default") {
9
+ return {
10
+ resolveKey: () => ({ keyId, secret }),
11
+ };
12
+ }
13
+ export function buildSecretAad(input) {
14
+ return JSON.stringify({
15
+ tenantId: input.tenantId ?? null,
16
+ namespace: input.namespace ?? null,
17
+ secretId: input.secretId,
18
+ version: input.version,
19
+ });
20
+ }
21
+ export async function encryptSecret(plaintext, keyProvider, aad) {
22
+ const material = await keyProvider.resolveKey({ purpose: "encrypt" });
23
+ const salt = randomBytes(SALT_LENGTH);
24
+ const iv = randomBytes(IV_LENGTH);
25
+ const key = deriveKey(material, salt);
26
+ const cipher = createCipheriv(ALGORITHM, key, iv);
27
+ cipher.setAAD(Buffer.from(aad, "utf8"));
28
+ const ciphertext = Buffer.concat([
29
+ cipher.update(plaintext, "utf8"),
30
+ cipher.final(),
31
+ ]);
32
+ return {
33
+ algorithm: "AES-256-GCM",
34
+ keyId: material.keyId,
35
+ iv: iv.toString("base64url"),
36
+ salt: salt.toString("base64url"),
37
+ authTag: cipher.getAuthTag().toString("base64url"),
38
+ ciphertext: ciphertext.toString("base64url"),
39
+ };
40
+ }
41
+ export async function decryptSecret(payload, keyProvider, aad) {
42
+ try {
43
+ const material = await keyProvider.resolveKey({
44
+ keyId: payload.keyId,
45
+ purpose: "decrypt",
46
+ });
47
+ const key = deriveKey(material, Buffer.from(payload.salt, "base64url"));
48
+ const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(payload.iv, "base64url"));
49
+ decipher.setAAD(Buffer.from(aad, "utf8"));
50
+ decipher.setAuthTag(Buffer.from(payload.authTag, "base64url"));
51
+ return Buffer.concat([
52
+ decipher.update(Buffer.from(payload.ciphertext, "base64url")),
53
+ decipher.final(),
54
+ ]).toString("utf8");
55
+ }
56
+ catch (error) {
57
+ throw new SecFnEncryptionError("Secret decryption failed", {
58
+ cause: error instanceof Error ? error.message : String(error),
59
+ });
60
+ }
61
+ }
62
+ export function hashToken(token) {
63
+ return createHash("sha256").update(token, "utf8").digest("hex");
64
+ }
65
+ export function verifyTokenHash(token, expectedHash) {
66
+ const actual = Buffer.from(hashToken(token), "hex");
67
+ const expected = Buffer.from(expectedHash, "hex");
68
+ return actual.length === expected.length && timingSafeEqual(actual, expected);
69
+ }
70
+ function deriveKey(material, salt) {
71
+ const secret = typeof material.secret === "string"
72
+ ? Buffer.from(material.secret, "utf8")
73
+ : Buffer.from(material.secret);
74
+ return pbkdf2Sync(secret, salt, ITERATIONS, KEY_LENGTH, "sha256");
75
+ }
76
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export declare class SecFnError extends Error {
2
+ readonly code: string;
3
+ readonly details?: Record<string, unknown> | undefined;
4
+ constructor(message: string, code: string, details?: Record<string, unknown> | undefined);
5
+ }
6
+ export declare class SecFnConfigError extends SecFnError {
7
+ constructor(message: string, details?: Record<string, unknown>);
8
+ }
9
+ export declare class SecFnUnauthorizedError extends SecFnError {
10
+ constructor(message?: string, details?: Record<string, unknown>);
11
+ }
12
+ export declare class SecFnForbiddenError extends SecFnError {
13
+ constructor(message?: string, details?: Record<string, unknown>);
14
+ }
15
+ export declare class SecFnNotFoundError extends SecFnError {
16
+ constructor(message?: string, details?: Record<string, unknown>);
17
+ }
18
+ export declare class SecFnValidationError extends SecFnError {
19
+ constructor(message?: string, details?: Record<string, unknown>);
20
+ }
21
+ export declare class SecFnEncryptionError extends SecFnError {
22
+ constructor(message?: string, details?: Record<string, unknown>);
23
+ }
24
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IAGjC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAF1C,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAK7C;AAED,qBAAa,gBAAiB,SAAQ,UAAU;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,sBAAuB,SAAQ,UAAU;gBACxC,OAAO,SAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIxE;AAED,qBAAa,mBAAoB,SAAQ,UAAU;gBACrC,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIrE;AAED,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIrE;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,OAAO,SAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIzE;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,OAAO,SAA6B,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIpF"}
package/dist/errors.js ADDED
@@ -0,0 +1,47 @@
1
+ export class SecFnError extends Error {
2
+ code;
3
+ details;
4
+ constructor(message, code, details) {
5
+ super(message);
6
+ this.code = code;
7
+ this.details = details;
8
+ this.name = "SecFnError";
9
+ }
10
+ }
11
+ export class SecFnConfigError extends SecFnError {
12
+ constructor(message, details) {
13
+ super(message, "SECFN_CONFIG_INVALID", details);
14
+ this.name = "SecFnConfigError";
15
+ }
16
+ }
17
+ export class SecFnUnauthorizedError extends SecFnError {
18
+ constructor(message = "Unauthorized", details) {
19
+ super(message, "SECFN_UNAUTHORIZED", details);
20
+ this.name = "SecFnUnauthorizedError";
21
+ }
22
+ }
23
+ export class SecFnForbiddenError extends SecFnError {
24
+ constructor(message = "Forbidden", details) {
25
+ super(message, "SECFN_FORBIDDEN", details);
26
+ this.name = "SecFnForbiddenError";
27
+ }
28
+ }
29
+ export class SecFnNotFoundError extends SecFnError {
30
+ constructor(message = "Not found", details) {
31
+ super(message, "SECFN_NOT_FOUND", details);
32
+ this.name = "SecFnNotFoundError";
33
+ }
34
+ }
35
+ export class SecFnValidationError extends SecFnError {
36
+ constructor(message = "Invalid input", details) {
37
+ super(message, "SECFN_VALIDATION_FAILED", details);
38
+ this.name = "SecFnValidationError";
39
+ }
40
+ }
41
+ export class SecFnEncryptionError extends SecFnError {
42
+ constructor(message = "Secret encryption failed", details) {
43
+ super(message, "SECFN_ENCRYPTION_FAILED", details);
44
+ this.name = "SecFnEncryptionError";
45
+ }
46
+ }
47
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGxB;IACA;IAHX,YACE,OAAe,EACN,IAAY,EACZ,OAAiC;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAA0B;QAG1C,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAe,EAAE,OAAiC;QAC5D,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,UAAU;IACpD,YAAY,OAAO,GAAG,cAAc,EAAE,OAAiC;QACrE,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IACjD,YAAY,OAAO,GAAG,WAAW,EAAE,OAAiC;QAClE,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,GAAG,WAAW,EAAE,OAAiC;QAClE,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAO,GAAG,eAAe,EAAE,OAAiC;QACtE,KAAK,CAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAO,GAAG,0BAA0B,EAAE,OAAiC;QACjF,KAAK,CAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
package/dist/id.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function generateId(prefix: string): string;
2
+ export declare function nowIso(): string;
3
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B"}
package/dist/id.js ADDED
@@ -0,0 +1,11 @@
1
+ import { randomBytes, randomUUID } from "node:crypto";
2
+ export function generateId(prefix) {
3
+ if (typeof randomUUID === "function") {
4
+ return `${prefix}_${randomUUID().replace(/-/g, "")}`;
5
+ }
6
+ return `${prefix}_${randomBytes(16).toString("hex")}`;
7
+ }
8
+ export function nowIso() {
9
+ return new Date().toISOString();
10
+ }
11
+ //# sourceMappingURL=id.js.map
package/dist/id.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,10 @@
1
- export { SecFn, createSecFn, type SecFnConfig } from './core/secfn.js';
2
- export { SecretsVault, type SecretsVaultConfig, type SetSecretOptions } from './secrets/vault.js';
3
- export { SecretEncryption } from './secrets/encryption.js';
4
- export { SecretScanner, type SecretScannerConfig, type ScanOptions, type GitScanOptions } from './scanning/scanner.js';
5
- export { DEFAULT_PATTERNS } from './scanning/patterns.js';
6
- export { AccessControl, type AccessControlConfig, type CreateRoleOptions, type AssignRoleOptions } from './access-control/rbac.js';
7
- export { RateLimiter, type RateLimiterConfig, type RateLimitCheckRequest } from './rate-limiting/rate-limiter.js';
8
- export { SecurityMonitor, type MonitoringConfig, type LogEventOptions, type ResolveEventOptions } from './monitoring/security-monitor.js';
9
- export { IndexedDBStorage } from './storage/indexeddb-storage.js';
10
- export * from './types/index.js';
11
- export { generateId, calculateEntropy, redactSecret, isExpired, delay, sanitizeForLog, parseTimeWindow, } from './utils/helpers.js';
1
+ export * from "./types.js";
2
+ export * from "./errors.js";
3
+ export * from "./id.js";
4
+ export * from "./encryption.js";
5
+ export * from "./schema.js";
6
+ export * from "./scanner/scanner.js";
7
+ export * from "./scanner/rules.js";
8
+ export * from "./scanner/reporters.js";
9
+ export * from "./scanner/utils.js";
12
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEnI,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAElH,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE1I,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,KAAK,EACL,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,10 @@
1
- export { SecFn, createSecFn } from './core/secfn.js';
2
- export { SecretsVault } from './secrets/vault.js';
3
- export { SecretEncryption } from './secrets/encryption.js';
4
- export { SecretScanner } from './scanning/scanner.js';
5
- export { DEFAULT_PATTERNS } from './scanning/patterns.js';
6
- export { AccessControl } from './access-control/rbac.js';
7
- export { RateLimiter } from './rate-limiting/rate-limiter.js';
8
- export { SecurityMonitor } from './monitoring/security-monitor.js';
9
- export { IndexedDBStorage } from './storage/indexeddb-storage.js';
10
- export * from './types/index.js';
11
- export { generateId, calculateEntropy, redactSecret, isExpired, delay, sanitizeForLog, parseTimeWindow, } from './utils/helpers.js';
1
+ export * from "./types.js";
2
+ export * from "./errors.js";
3
+ export * from "./id.js";
4
+ export * from "./encryption.js";
5
+ export * from "./schema.js";
6
+ export * from "./scanner/scanner.js";
7
+ export * from "./scanner/rules.js";
8
+ export * from "./scanner/reporters.js";
9
+ export * from "./scanner/utils.js";
12
10
  //# 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,EAAE,KAAK,EAAE,WAAW,EAAoB,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAkD,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAmE,MAAM,uBAAuB,CAAC;AACvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAA4E,MAAM,0BAA0B,CAAC;AAEnI,OAAO,EAAE,WAAW,EAAsD,MAAM,iCAAiC,CAAC;AAElH,OAAO,EAAE,eAAe,EAAyE,MAAM,kCAAkC,CAAC;AAE1I,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,KAAK,EACL,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { SecurityFinding } from "../types.js";
2
+ declare const SEVERITY_ORDER: {
3
+ readonly info: 0;
4
+ readonly low: 1;
5
+ readonly medium: 2;
6
+ readonly high: 3;
7
+ readonly critical: 4;
8
+ };
9
+ export declare function findingMeetsSeverity(finding: SecurityFinding, minimum: keyof typeof SEVERITY_ORDER): boolean;
10
+ export declare function formatFindingsTable(findings: SecurityFinding[]): string;
11
+ export declare function formatFindingsJson(findings: SecurityFinding[]): string;
12
+ export declare function formatFindingsSarif(findings: SecurityFinding[]): string;
13
+ export {};
14
+ //# sourceMappingURL=reporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../../src/scanner/reporters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,QAAA,MAAM,cAAc;;;;;;CAMV,CAAC;AAEX,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,OAAO,cAAc,GAAG,OAAO,CAE5G;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAcvE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAkDvE"}