@truto/ginger 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +597 -0
  3. package/dist/adapters/bun-sqlite.d.ts +37 -0
  4. package/dist/adapters/bun-sqlite.d.ts.map +1 -0
  5. package/dist/adapters/bun-sqlite.js +136 -0
  6. package/dist/adapters/bun-sqlite.js.map +1 -0
  7. package/dist/adapters/durable-object.d.ts +40 -0
  8. package/dist/adapters/durable-object.d.ts.map +1 -0
  9. package/dist/adapters/durable-object.js +142 -0
  10. package/dist/adapters/durable-object.js.map +1 -0
  11. package/dist/adapters/index.d.ts +5 -0
  12. package/dist/adapters/index.d.ts.map +1 -0
  13. package/dist/adapters/index.js +3 -0
  14. package/dist/adapters/index.js.map +1 -0
  15. package/dist/crypto.d.ts +40 -0
  16. package/dist/crypto.d.ts.map +1 -0
  17. package/dist/crypto.js +148 -0
  18. package/dist/crypto.js.map +1 -0
  19. package/dist/errors.d.ts +64 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +90 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/example.d.ts +119 -0
  24. package/dist/example.d.ts.map +1 -0
  25. package/dist/example.js +297 -0
  26. package/dist/example.js.map +1 -0
  27. package/dist/index.d.ts +54 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +62 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/pagination.d.ts +31 -0
  32. package/dist/pagination.d.ts.map +1 -0
  33. package/dist/pagination.js +173 -0
  34. package/dist/pagination.js.map +1 -0
  35. package/dist/service.d.ts +81 -0
  36. package/dist/service.d.ts.map +1 -0
  37. package/dist/service.js +615 -0
  38. package/dist/service.js.map +1 -0
  39. package/dist/sql-builder.d.ts +48 -0
  40. package/dist/sql-builder.d.ts.map +1 -0
  41. package/dist/sql-builder.js +230 -0
  42. package/dist/sql-builder.js.map +1 -0
  43. package/dist/types.d.ts +266 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +2 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +94 -0
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Wrap a Bun `Database` (from `bun:sqlite`) so it satisfies the
3
+ * generic {@link Database} interface used by Ginger services.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { Database } from 'bun:sqlite'
8
+ * import { createService, fromBunSqlite } from 'ginger'
9
+ *
10
+ * const bunDb = new Database(':memory:')
11
+ * const db = fromBunSqlite(bunDb)
12
+ * const service = createService({ db, ... })
13
+ * ```
14
+ */
15
+ export function fromBunSqlite(bunDb) {
16
+ return {
17
+ prepare(query) {
18
+ const stmt = bunDb.prepare(query);
19
+ function makebound(values) {
20
+ return {
21
+ bind(...more) {
22
+ return makebound([...values, ...more]);
23
+ },
24
+ first() {
25
+ try {
26
+ const row = stmt.get(...values);
27
+ return Promise.resolve(row ?? null);
28
+ }
29
+ catch {
30
+ return Promise.resolve(null);
31
+ }
32
+ },
33
+ all() {
34
+ try {
35
+ const rows = stmt.all(...values);
36
+ return Promise.resolve({
37
+ success: true,
38
+ results: rows,
39
+ meta: {
40
+ duration: 0,
41
+ size_after: 0,
42
+ rows_read: rows.length,
43
+ rows_written: 0,
44
+ last_row_id: 0,
45
+ changed_db: false,
46
+ changes: 0,
47
+ },
48
+ });
49
+ }
50
+ catch {
51
+ return Promise.resolve({
52
+ success: false,
53
+ results: [],
54
+ meta: {
55
+ duration: 0,
56
+ size_after: 0,
57
+ rows_read: 0,
58
+ rows_written: 0,
59
+ last_row_id: 0,
60
+ changed_db: false,
61
+ changes: 0,
62
+ },
63
+ });
64
+ }
65
+ },
66
+ run() {
67
+ try {
68
+ const result = stmt.run(...values);
69
+ const changes = result.changes ?? 0;
70
+ return Promise.resolve({
71
+ success: true,
72
+ meta: {
73
+ duration: 0,
74
+ size_after: 0,
75
+ rows_read: 0,
76
+ rows_written: changes,
77
+ last_row_id: Number(result.lastInsertRowid ?? 0),
78
+ changed_db: changes > 0,
79
+ changes,
80
+ },
81
+ });
82
+ }
83
+ catch {
84
+ return Promise.resolve({
85
+ success: false,
86
+ meta: {
87
+ duration: 0,
88
+ size_after: 0,
89
+ rows_read: 0,
90
+ rows_written: 0,
91
+ last_row_id: 0,
92
+ changed_db: false,
93
+ changes: 0,
94
+ },
95
+ });
96
+ }
97
+ },
98
+ raw() {
99
+ return Promise.resolve(stmt.all(...values));
100
+ },
101
+ };
102
+ }
103
+ return {
104
+ bind(...values) {
105
+ return makebound(values);
106
+ },
107
+ first() {
108
+ return makebound([]).first();
109
+ },
110
+ all() {
111
+ return makebound([]).all();
112
+ },
113
+ run() {
114
+ return makebound([]).run();
115
+ },
116
+ raw() {
117
+ return makebound([]).raw();
118
+ },
119
+ };
120
+ },
121
+ batch(statements) {
122
+ return Promise.resolve(statements.map((s) => {
123
+ const r = s.run();
124
+ return r;
125
+ }));
126
+ },
127
+ exec(query) {
128
+ bunDb.exec(query);
129
+ return Promise.resolve({ count: 1, duration: 0 });
130
+ },
131
+ dump() {
132
+ return Promise.resolve(new ArrayBuffer(0));
133
+ },
134
+ };
135
+ }
136
+ //# sourceMappingURL=bun-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun-sqlite.js","sourceRoot":"","sources":["../../src/adapters/bun-sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Database } from '../types.js';
2
+ /**
3
+ * Structural interface matching the cursor returned by
4
+ * Cloudflare Durable Object `SqlStorage.exec()`.
5
+ */
6
+ export interface SqlStorageCursor<T = Record<string, unknown>> {
7
+ toArray(): T[];
8
+ one(): T;
9
+ readonly columnNames: string[];
10
+ readonly rowsRead: number;
11
+ readonly rowsWritten: number;
12
+ }
13
+ /**
14
+ * Structural interface matching Cloudflare Durable Object's `SqlStorage`
15
+ * (available as `ctx.storage.sql` inside a Durable Object).
16
+ *
17
+ * No runtime import of `@cloudflare/workers-types` is needed — TypeScript's
18
+ * structural typing lets the real `SqlStorage` satisfy this automatically.
19
+ */
20
+ export interface DurableObjectSqlStorage {
21
+ exec<T = Record<string, unknown>>(query: string, ...bindings: unknown[]): SqlStorageCursor<T>;
22
+ }
23
+ /**
24
+ * Wrap a Durable Object `SqlStorage` instance so it satisfies the
25
+ * generic {@link Database} interface used by Ginger services.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { createService, fromDurableObjectStorage } from 'ginger'
30
+ *
31
+ * export class MyDO extends DurableObject {
32
+ * service = createService({
33
+ * db: fromDurableObjectStorage(this.ctx.storage.sql),
34
+ * ...
35
+ * })
36
+ * }
37
+ * ```
38
+ */
39
+ export declare function fromDurableObjectStorage(sql: DurableObjectSqlStorage): Database;
40
+ //# sourceMappingURL=durable-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-object.d.ts","sourceRoot":"","sources":["../../src/adapters/durable-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,aAAa,CAAA;AAEpB;;;GAGG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3D,OAAO,IAAI,CAAC,EAAE,CAAA;IACd,GAAG,IAAI,CAAC,CAAA;IACR,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,GAAG,QAAQ,EAAE,OAAO,EAAE,GACrB,gBAAgB,CAAC,CAAC,CAAC,CAAA;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,uBAAuB,GAC3B,QAAQ,CA+HV"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Wrap a Durable Object `SqlStorage` instance so it satisfies the
3
+ * generic {@link Database} interface used by Ginger services.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { createService, fromDurableObjectStorage } from 'ginger'
8
+ *
9
+ * export class MyDO extends DurableObject {
10
+ * service = createService({
11
+ * db: fromDurableObjectStorage(this.ctx.storage.sql),
12
+ * ...
13
+ * })
14
+ * }
15
+ * ```
16
+ */
17
+ export function fromDurableObjectStorage(sql) {
18
+ return {
19
+ prepare(query) {
20
+ function makeBound(values) {
21
+ return {
22
+ bind(...more) {
23
+ return makeBound([...values, ...more]);
24
+ },
25
+ first() {
26
+ try {
27
+ const cursor = sql.exec(query, ...values);
28
+ const rows = cursor.toArray();
29
+ return Promise.resolve(rows[0] ?? null);
30
+ }
31
+ catch {
32
+ return Promise.resolve(null);
33
+ }
34
+ },
35
+ all() {
36
+ try {
37
+ const cursor = sql.exec(query, ...values);
38
+ const rows = cursor.toArray();
39
+ return Promise.resolve({
40
+ success: true,
41
+ results: rows,
42
+ meta: {
43
+ duration: 0,
44
+ size_after: 0,
45
+ rows_read: cursor.rowsRead,
46
+ rows_written: cursor.rowsWritten,
47
+ last_row_id: 0,
48
+ changed_db: cursor.rowsWritten > 0,
49
+ changes: cursor.rowsWritten,
50
+ },
51
+ });
52
+ }
53
+ catch {
54
+ return Promise.resolve({
55
+ success: false,
56
+ results: [],
57
+ meta: {
58
+ duration: 0,
59
+ size_after: 0,
60
+ rows_read: 0,
61
+ rows_written: 0,
62
+ last_row_id: 0,
63
+ changed_db: false,
64
+ changes: 0,
65
+ },
66
+ });
67
+ }
68
+ },
69
+ run() {
70
+ try {
71
+ const cursor = sql.exec(query, ...values);
72
+ const lastRowId = sql
73
+ .exec('SELECT last_insert_rowid() AS lid')
74
+ .one().lid;
75
+ return Promise.resolve({
76
+ success: true,
77
+ meta: {
78
+ duration: 0,
79
+ size_after: 0,
80
+ rows_read: cursor.rowsRead,
81
+ rows_written: cursor.rowsWritten,
82
+ last_row_id: lastRowId,
83
+ changed_db: cursor.rowsWritten > 0,
84
+ changes: cursor.rowsWritten,
85
+ },
86
+ });
87
+ }
88
+ catch {
89
+ return Promise.resolve({
90
+ success: false,
91
+ meta: {
92
+ duration: 0,
93
+ size_after: 0,
94
+ rows_read: 0,
95
+ rows_written: 0,
96
+ last_row_id: 0,
97
+ changed_db: false,
98
+ changes: 0,
99
+ },
100
+ });
101
+ }
102
+ },
103
+ raw() {
104
+ const cursor = sql.exec(query, ...values);
105
+ return Promise.resolve(cursor.toArray());
106
+ },
107
+ };
108
+ }
109
+ return {
110
+ bind(...values) {
111
+ return makeBound(values);
112
+ },
113
+ first() {
114
+ return makeBound([]).first();
115
+ },
116
+ all() {
117
+ return makeBound([]).all();
118
+ },
119
+ run() {
120
+ return makeBound([]).run();
121
+ },
122
+ raw() {
123
+ return makeBound([]).raw();
124
+ },
125
+ };
126
+ },
127
+ batch(statements) {
128
+ return Promise.resolve(statements.map((s) => {
129
+ const r = s.run();
130
+ return r;
131
+ }));
132
+ },
133
+ exec(query) {
134
+ sql.exec(query);
135
+ return Promise.resolve({ count: 1, duration: 0 });
136
+ },
137
+ dump() {
138
+ return Promise.resolve(new ArrayBuffer(0));
139
+ },
140
+ };
141
+ }
142
+ //# sourceMappingURL=durable-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-object.js","sourceRoot":"","sources":["../../src/adapters/durable-object.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { fromBunSqlite } from './bun-sqlite.js';
2
+ export type { BunSqliteDatabase, BunSqliteStatement } from './bun-sqlite.js';
3
+ export { fromDurableObjectStorage } from './durable-object.js';
4
+ export type { DurableObjectSqlStorage, SqlStorageCursor, } from './durable-object.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,YAAY,EACV,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { fromBunSqlite } from './bun-sqlite.js';
2
+ export { fromDurableObjectStorage } from './durable-object.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { KeyProvider, SecretFieldDef } from './types.js';
2
+ /**
3
+ * Default key provider that accepts keys as constructor parameters
4
+ */
5
+ export declare class DefaultKeyProvider implements KeyProvider {
6
+ private keyCache;
7
+ private keys;
8
+ constructor(keys?: Record<string, string>);
9
+ getKey(keyId?: string): Promise<CryptoKey>;
10
+ }
11
+ /**
12
+ * Generate a new encryption key (utility function for setup)
13
+ */
14
+ export declare function generateSecretKey(): Promise<string>;
15
+ /**
16
+ * Encrypt a plaintext value using AES-256-GCM
17
+ * Returns a packed string in format "kid:iv:cipher" (base64 segments)
18
+ */
19
+ export declare function encrypt(plaintext: string, keyProvider: KeyProvider, keyId?: string): Promise<string>;
20
+ /**
21
+ * Decrypt a packed ciphertext string
22
+ */
23
+ export declare function decrypt(packed: string, keyProvider: KeyProvider): Promise<string>;
24
+ /**
25
+ * Encrypt secret fields in a data object
26
+ */
27
+ export declare function encryptSecrets<T extends Record<string, unknown>>(data: T, secrets: readonly SecretFieldDef[], keyProvider: KeyProvider): Promise<Record<string, unknown>>;
28
+ /**
29
+ * Decrypt secret fields in a data object
30
+ */
31
+ export declare function decryptSecrets<T extends Record<string, unknown>>(data: T, secrets: readonly SecretFieldDef[], keyProvider: KeyProvider): Promise<Record<string, unknown>>;
32
+ /**
33
+ * Get secret column names for SQL queries
34
+ */
35
+ export declare function getSecretColumns(secrets: readonly SecretFieldDef[]): string[];
36
+ /**
37
+ * Get secret logical names for schema validation
38
+ */
39
+ export declare function getSecretLogicalNames(secrets: readonly SecretFieldDef[]): string[];
40
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE7D;;GAEG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IAYvC,MAAM,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;CAoC5D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CASzD;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,KAAK,GAAE,MAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,MAAM,CAAC,CAyCjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqBlC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqBlC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,EAAE,CAE7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,cAAc,EAAE,GACjC,MAAM,EAAE,CAEV"}
package/dist/crypto.js ADDED
@@ -0,0 +1,148 @@
1
+ import { EncryptionError } from './errors.js';
2
+ /**
3
+ * Default key provider that accepts keys as constructor parameters
4
+ */
5
+ export class DefaultKeyProvider {
6
+ keyCache = new Map();
7
+ keys;
8
+ constructor(keys = {}) {
9
+ this.keys = new Map(Object.entries(keys));
10
+ // If no keys provided but a default key exists, use it
11
+ if (this.keys.size === 0 &&
12
+ typeof process !== 'undefined' &&
13
+ process.env?.SECRET_KEY) {
14
+ this.keys.set('default', process.env.SECRET_KEY);
15
+ }
16
+ }
17
+ async getKey(keyId = 'default') {
18
+ const cached = this.keyCache.get(keyId);
19
+ if (cached) {
20
+ return cached;
21
+ }
22
+ const secretKey = this.keys.get(keyId);
23
+ if (!secretKey) {
24
+ throw new EncryptionError(`Encryption key not found for keyId: ${keyId}`);
25
+ }
26
+ try {
27
+ // Convert base64 secret to ArrayBuffer
28
+ const keyData = new Uint8Array(atob(secretKey)
29
+ .split('')
30
+ .map((char) => char.charCodeAt(0)));
31
+ const cryptoKey = await crypto.subtle.importKey('raw', keyData, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']);
32
+ this.keyCache.set(keyId, cryptoKey);
33
+ return cryptoKey;
34
+ }
35
+ catch (error) {
36
+ throw new EncryptionError(`Failed to import encryption key: ${error instanceof Error ? error.message : 'Unknown error'}`, { keyId, error });
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * Generate a new encryption key (utility function for setup)
42
+ */
43
+ export async function generateSecretKey() {
44
+ const key = await crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);
45
+ const exported = await crypto.subtle.exportKey('raw', key);
46
+ return btoa(String.fromCharCode(...new Uint8Array(exported)));
47
+ }
48
+ /**
49
+ * Encrypt a plaintext value using AES-256-GCM
50
+ * Returns a packed string in format "kid:iv:cipher" (base64 segments)
51
+ */
52
+ export async function encrypt(plaintext, keyProvider, keyId = 'default') {
53
+ try {
54
+ const key = await keyProvider.getKey(keyId);
55
+ const iv = crypto.getRandomValues(new Uint8Array(12)); // 96-bit IV for GCM
56
+ const encoder = new TextEncoder();
57
+ const data = encoder.encode(plaintext);
58
+ const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, data);
59
+ // Pack as "kid:iv:cipher" with base64 encoding
60
+ const kidB64 = btoa(keyId);
61
+ const ivB64 = btoa(String.fromCharCode(...iv));
62
+ const cipherB64 = btoa(String.fromCharCode(...new Uint8Array(ciphertext)));
63
+ return `${kidB64}:${ivB64}:${cipherB64}`;
64
+ }
65
+ catch (error) {
66
+ throw new EncryptionError(`Failed to encrypt data: ${error instanceof Error ? error.message : 'Unknown error'}`, { keyId, error });
67
+ }
68
+ }
69
+ /**
70
+ * Decrypt a packed ciphertext string
71
+ */
72
+ export async function decrypt(packed, keyProvider) {
73
+ try {
74
+ const parts = packed.split(':');
75
+ if (parts.length !== 3) {
76
+ throw new EncryptionError('Invalid packed ciphertext format');
77
+ }
78
+ const [kidB64, ivB64, cipherB64] = parts;
79
+ if (!kidB64 || !ivB64 || !cipherB64) {
80
+ throw new EncryptionError('Invalid packed ciphertext format: missing parts');
81
+ }
82
+ const keyId = atob(kidB64);
83
+ const iv = new Uint8Array(atob(ivB64)
84
+ .split('')
85
+ .map((char) => char.charCodeAt(0)));
86
+ const ciphertext = new Uint8Array(atob(cipherB64)
87
+ .split('')
88
+ .map((char) => char.charCodeAt(0)));
89
+ const key = await keyProvider.getKey(keyId);
90
+ const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);
91
+ const decoder = new TextDecoder();
92
+ return decoder.decode(decrypted);
93
+ }
94
+ catch (error) {
95
+ throw new EncryptionError(`Failed to decrypt data: ${error instanceof Error ? error.message : 'Unknown error'}`, { error });
96
+ }
97
+ }
98
+ /**
99
+ * Encrypt secret fields in a data object
100
+ */
101
+ export async function encryptSecrets(data, secrets, keyProvider) {
102
+ const result = { ...data };
103
+ for (const secret of secrets) {
104
+ const { logicalName, columnName, keyId = 'default' } = secret;
105
+ const value = data[logicalName];
106
+ if (value !== undefined && value !== null) {
107
+ if (typeof value !== 'string') {
108
+ throw new EncryptionError(`Secret field "${logicalName}" must be a string`, { logicalName, value });
109
+ }
110
+ // Replace logical field with encrypted column
111
+ delete result[logicalName];
112
+ result[columnName] = await encrypt(value, keyProvider, keyId);
113
+ }
114
+ }
115
+ return result;
116
+ }
117
+ /**
118
+ * Decrypt secret fields in a data object
119
+ */
120
+ export async function decryptSecrets(data, secrets, keyProvider) {
121
+ const result = { ...data };
122
+ for (const secret of secrets) {
123
+ const { logicalName, columnName } = secret;
124
+ const encryptedValue = data[columnName];
125
+ if (encryptedValue !== undefined && encryptedValue !== null) {
126
+ if (typeof encryptedValue !== 'string') {
127
+ throw new EncryptionError(`Encrypted field "${columnName}" must be a string`, { columnName, encryptedValue });
128
+ }
129
+ // Replace encrypted column with decrypted logical field
130
+ delete result[columnName];
131
+ result[logicalName] = await decrypt(encryptedValue, keyProvider);
132
+ }
133
+ }
134
+ return result;
135
+ }
136
+ /**
137
+ * Get secret column names for SQL queries
138
+ */
139
+ export function getSecretColumns(secrets) {
140
+ return secrets.map((s) => s.columnName);
141
+ }
142
+ /**
143
+ * Get secret logical names for schema validation
144
+ */
145
+ export function getSecretLogicalNames(secrets) {
146
+ return secrets.map((s) => s.logicalName);
147
+ }
148
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Base service error class
3
+ */
4
+ export declare class ServiceError extends Error {
5
+ readonly code: string;
6
+ readonly statusCode: number;
7
+ readonly details?: unknown;
8
+ constructor(message: string, code: string, statusCode?: number, details?: unknown);
9
+ }
10
+ /**
11
+ * Resource not found error
12
+ */
13
+ export declare class NotFoundError extends ServiceError {
14
+ constructor(resource: string, id: string | number, details?: unknown);
15
+ }
16
+ /**
17
+ * Validation error for schema validation failures
18
+ */
19
+ export declare class ValidationError extends ServiceError {
20
+ constructor(message: string, details?: unknown);
21
+ }
22
+ /**
23
+ * Authorization error for access control failures
24
+ */
25
+ export declare class AuthError extends ServiceError {
26
+ constructor(message?: string, details?: unknown);
27
+ }
28
+ /**
29
+ * Database operation error
30
+ */
31
+ export declare class DatabaseError extends ServiceError {
32
+ constructor(message: string, details?: unknown);
33
+ }
34
+ /**
35
+ * Encryption/decryption error
36
+ */
37
+ export declare class EncryptionError extends ServiceError {
38
+ constructor(message: string, details?: unknown);
39
+ }
40
+ /**
41
+ * Hook execution error
42
+ */
43
+ export declare class HookError extends ServiceError {
44
+ constructor(hookPhase: string, methodName: string, originalError: Error, details?: unknown);
45
+ }
46
+ /**
47
+ * Pagination cursor error
48
+ */
49
+ export declare class CursorError extends ServiceError {
50
+ constructor(message: string, details?: unknown);
51
+ }
52
+ /**
53
+ * SQL builder error
54
+ */
55
+ export declare class SqlBuilderError extends ServiceError {
56
+ constructor(message: string, details?: unknown);
57
+ }
58
+ /**
59
+ * Dependency injection error
60
+ */
61
+ export declare class DependencyError extends ServiceError {
62
+ constructor(message: string, details?: unknown);
63
+ }
64
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,UAAU,EAAE,MAAM,CAAA;IAClC,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAA;gBAG/B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAY,EACxB,OAAO,CAAC,EAAE,OAAO;CAWpB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;gBACjC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAGrE;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAG/C;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,YAAY;gBAC7B,OAAO,GAAE,MAAwB,EAAE,OAAO,CAAC,EAAE,OAAO;CAGjE;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAG/C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAG/C;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,YAAY;gBAEvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,KAAK,EACpB,OAAO,CAAC,EAAE,OAAO;CASpB;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,YAAY;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAG/C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAG/C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAG/C"}