@superfunctions/db 0.1.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 (66) hide show
  1. package/README.md +341 -0
  2. package/dist/adapter/capabilities.d.ts +51 -0
  3. package/dist/adapter/capabilities.d.ts.map +1 -0
  4. package/dist/adapter/capabilities.js +56 -0
  5. package/dist/adapter/capabilities.js.map +1 -0
  6. package/dist/adapter/errors.d.ts +111 -0
  7. package/dist/adapter/errors.d.ts.map +1 -0
  8. package/dist/adapter/errors.js +172 -0
  9. package/dist/adapter/errors.js.map +1 -0
  10. package/dist/adapter/factory.d.ts +10 -0
  11. package/dist/adapter/factory.d.ts.map +1 -0
  12. package/dist/adapter/factory.js +232 -0
  13. package/dist/adapter/factory.js.map +1 -0
  14. package/dist/adapter/types.d.ts +255 -0
  15. package/dist/adapter/types.d.ts.map +1 -0
  16. package/dist/adapter/types.js +5 -0
  17. package/dist/adapter/types.js.map +1 -0
  18. package/dist/adapters/drizzle/index.d.ts +20 -0
  19. package/dist/adapters/drizzle/index.d.ts.map +1 -0
  20. package/dist/adapters/drizzle/index.js +346 -0
  21. package/dist/adapters/drizzle/index.js.map +1 -0
  22. package/dist/adapters/index.d.ts +12 -0
  23. package/dist/adapters/index.d.ts.map +1 -0
  24. package/dist/adapters/index.js +12 -0
  25. package/dist/adapters/index.js.map +1 -0
  26. package/dist/adapters/kysely/index.d.ts +18 -0
  27. package/dist/adapters/kysely/index.d.ts.map +1 -0
  28. package/dist/adapters/kysely/index.js +305 -0
  29. package/dist/adapters/kysely/index.js.map +1 -0
  30. package/dist/adapters/memory/index.d.ts +17 -0
  31. package/dist/adapters/memory/index.d.ts.map +1 -0
  32. package/dist/adapters/memory/index.js +362 -0
  33. package/dist/adapters/memory/index.js.map +1 -0
  34. package/dist/adapters/prisma/index.d.ts +16 -0
  35. package/dist/adapters/prisma/index.d.ts.map +1 -0
  36. package/dist/adapters/prisma/index.js +247 -0
  37. package/dist/adapters/prisma/index.js.map +1 -0
  38. package/dist/index.d.ts +15 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/migrations/runtime-validation.d.ts +7 -0
  43. package/dist/migrations/runtime-validation.d.ts.map +1 -0
  44. package/dist/migrations/runtime-validation.js +40 -0
  45. package/dist/migrations/runtime-validation.js.map +1 -0
  46. package/dist/migrations/schema-tracker.d.ts +56 -0
  47. package/dist/migrations/schema-tracker.d.ts.map +1 -0
  48. package/dist/migrations/schema-tracker.js +121 -0
  49. package/dist/migrations/schema-tracker.js.map +1 -0
  50. package/dist/testing/contract-tests.d.ts +64 -0
  51. package/dist/testing/contract-tests.d.ts.map +1 -0
  52. package/dist/testing/contract-tests.js +391 -0
  53. package/dist/testing/contract-tests.js.map +1 -0
  54. package/dist/testing/index.d.ts +10 -0
  55. package/dist/testing/index.d.ts.map +1 -0
  56. package/dist/testing/index.js +10 -0
  57. package/dist/testing/index.js.map +1 -0
  58. package/dist/testing/mocks.d.ts +92 -0
  59. package/dist/testing/mocks.d.ts.map +1 -0
  60. package/dist/testing/mocks.js +197 -0
  61. package/dist/testing/mocks.js.map +1 -0
  62. package/dist/utils/namespace.d.ts +49 -0
  63. package/dist/utils/namespace.d.ts.map +1 -0
  64. package/dist/utils/namespace.js +85 -0
  65. package/dist/utils/namespace.js.map +1 -0
  66. package/package.json +87 -0
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Error system for adapters
3
+ */
4
+ export var AdapterErrorCode;
5
+ (function (AdapterErrorCode) {
6
+ // Connection errors
7
+ AdapterErrorCode["CONNECTION_FAILED"] = "ADAPTER_CONNECTION_FAILED";
8
+ AdapterErrorCode["CONNECTION_TIMEOUT"] = "ADAPTER_CONNECTION_TIMEOUT";
9
+ AdapterErrorCode["CONNECTION_CLOSED"] = "ADAPTER_CONNECTION_CLOSED";
10
+ // Query errors
11
+ AdapterErrorCode["QUERY_FAILED"] = "ADAPTER_QUERY_FAILED";
12
+ AdapterErrorCode["QUERY_TIMEOUT"] = "ADAPTER_QUERY_TIMEOUT";
13
+ AdapterErrorCode["INVALID_QUERY"] = "ADAPTER_INVALID_QUERY";
14
+ // Data errors
15
+ AdapterErrorCode["CONSTRAINT_VIOLATION"] = "ADAPTER_CONSTRAINT_VIOLATION";
16
+ AdapterErrorCode["NOT_FOUND"] = "ADAPTER_NOT_FOUND";
17
+ AdapterErrorCode["DUPLICATE_KEY"] = "ADAPTER_DUPLICATE_KEY";
18
+ AdapterErrorCode["INVALID_DATA"] = "ADAPTER_INVALID_DATA";
19
+ // Transaction errors
20
+ AdapterErrorCode["TRANSACTION_FAILED"] = "ADAPTER_TRANSACTION_FAILED";
21
+ AdapterErrorCode["TRANSACTION_DEADLOCK"] = "ADAPTER_TRANSACTION_DEADLOCK";
22
+ // Schema errors
23
+ AdapterErrorCode["SCHEMA_INVALID"] = "ADAPTER_SCHEMA_INVALID";
24
+ AdapterErrorCode["SCHEMA_CONFLICT"] = "ADAPTER_SCHEMA_CONFLICT";
25
+ AdapterErrorCode["MIGRATION_FAILED"] = "ADAPTER_MIGRATION_FAILED";
26
+ // Operation errors
27
+ AdapterErrorCode["OPERATION_NOT_SUPPORTED"] = "ADAPTER_OPERATION_NOT_SUPPORTED";
28
+ AdapterErrorCode["BATCH_SIZE_EXCEEDED"] = "ADAPTER_BATCH_SIZE_EXCEEDED";
29
+ // Unknown
30
+ AdapterErrorCode["UNKNOWN_ERROR"] = "ADAPTER_UNKNOWN_ERROR";
31
+ })(AdapterErrorCode || (AdapterErrorCode = {}));
32
+ /**
33
+ * Base adapter error class
34
+ */
35
+ export class AdapterError extends Error {
36
+ code;
37
+ options;
38
+ name = 'AdapterError';
39
+ timestamp;
40
+ constructor(code, message, options) {
41
+ super(message);
42
+ this.code = code;
43
+ this.options = options;
44
+ this.timestamp = new Date();
45
+ // Maintain proper stack trace for where error was thrown (V8 only)
46
+ if (Error.captureStackTrace) {
47
+ Error.captureStackTrace(this, this.constructor);
48
+ }
49
+ }
50
+ isRetryable() {
51
+ return this.options?.retryable ?? false;
52
+ }
53
+ toJSON() {
54
+ return {
55
+ name: this.name,
56
+ code: this.code,
57
+ message: this.message,
58
+ timestamp: this.timestamp.toISOString(),
59
+ context: this.options?.context,
60
+ retryable: this.isRetryable(),
61
+ severity: this.options?.severity ?? 'error',
62
+ };
63
+ }
64
+ static from(error, code = AdapterErrorCode.UNKNOWN_ERROR) {
65
+ if (error instanceof AdapterError) {
66
+ return error;
67
+ }
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ return new AdapterError(code, message, { cause: error });
70
+ }
71
+ }
72
+ /**
73
+ * Connection error - fatal, retryable
74
+ */
75
+ export class ConnectionError extends AdapterError {
76
+ name = 'ConnectionError';
77
+ constructor(message, options) {
78
+ super(AdapterErrorCode.CONNECTION_FAILED, message, {
79
+ ...options,
80
+ severity: 'fatal',
81
+ retryable: true,
82
+ });
83
+ }
84
+ }
85
+ /**
86
+ * Constraint violation error - not retryable
87
+ */
88
+ export class ConstraintViolationError extends AdapterError {
89
+ constraint;
90
+ name = 'ConstraintViolationError';
91
+ constructor(message, constraint) {
92
+ super(AdapterErrorCode.CONSTRAINT_VIOLATION, message, {
93
+ context: { constraint },
94
+ retryable: false,
95
+ });
96
+ this.constraint = constraint;
97
+ }
98
+ }
99
+ /**
100
+ * Not found error - not retryable
101
+ */
102
+ export class NotFoundError extends AdapterError {
103
+ name = 'NotFoundError';
104
+ constructor(model, where) {
105
+ super(AdapterErrorCode.NOT_FOUND, `Record not found in ${model}`, {
106
+ context: { model, where },
107
+ retryable: false,
108
+ });
109
+ }
110
+ }
111
+ /**
112
+ * Duplicate key error - not retryable
113
+ */
114
+ export class DuplicateKeyError extends AdapterError {
115
+ key;
116
+ name = 'DuplicateKeyError';
117
+ constructor(message, key) {
118
+ super(AdapterErrorCode.DUPLICATE_KEY, message, {
119
+ context: { key },
120
+ retryable: false,
121
+ });
122
+ this.key = key;
123
+ }
124
+ }
125
+ /**
126
+ * Query failed error - may be retryable
127
+ */
128
+ export class QueryFailedError extends AdapterError {
129
+ name = 'QueryFailedError';
130
+ constructor(message, options) {
131
+ super(AdapterErrorCode.QUERY_FAILED, message, options);
132
+ }
133
+ }
134
+ /**
135
+ * Transaction failed error - may be retryable
136
+ */
137
+ export class TransactionError extends AdapterError {
138
+ name = 'TransactionError';
139
+ constructor(message, options) {
140
+ super(AdapterErrorCode.TRANSACTION_FAILED, message, {
141
+ ...options,
142
+ retryable: options?.retryable ?? true,
143
+ });
144
+ }
145
+ }
146
+ /**
147
+ * Schema validation error - not retryable
148
+ */
149
+ export class SchemaValidationError extends AdapterError {
150
+ errors;
151
+ name = 'SchemaValidationError';
152
+ constructor(message, errors) {
153
+ super(AdapterErrorCode.SCHEMA_INVALID, message, {
154
+ context: { errors },
155
+ retryable: false,
156
+ });
157
+ this.errors = errors;
158
+ }
159
+ }
160
+ /**
161
+ * Operation not supported error - not retryable
162
+ */
163
+ export class OperationNotSupportedError extends AdapterError {
164
+ name = 'OperationNotSupportedError';
165
+ constructor(operation, adapterName) {
166
+ super(AdapterErrorCode.OPERATION_NOT_SUPPORTED, `Operation '${operation}' is not supported by ${adapterName}`, {
167
+ context: { operation, adapterName },
168
+ retryable: false,
169
+ });
170
+ }
171
+ }
172
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/adapter/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Adapter factory for creating and wrapping adapters
3
+ */
4
+ import type { Adapter, AdapterFactoryOptions, LibraryOptions } from './types.js';
5
+ /**
6
+ * Create an adapter factory that wraps adapter implementations with
7
+ * automatic features like namespacing, transformations, and logging
8
+ */
9
+ export declare function createAdapterFactory(options: AdapterFactoryOptions): (libraryOptions: LibraryOptions) => Adapter;
10
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/adapter/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,OAAO,EAEP,qBAAqB,EAGrB,cAAc,EAEf,MAAM,YAAY,CAAC;AAGpB;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,CAAC,cAAc,EAAE,cAAc,KAAK,OAAO,CAa7C"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Adapter factory for creating and wrapping adapters
3
+ */
4
+ import { mergeCapabilities } from './capabilities.js';
5
+ import { NamespaceManager } from '../utils/namespace.js';
6
+ /**
7
+ * Create an adapter factory that wraps adapter implementations with
8
+ * automatic features like namespacing, transformations, and logging
9
+ */
10
+ export function createAdapterFactory(options) {
11
+ const { config, adapter: createAdapter } = options;
12
+ return (libraryOptions) => {
13
+ // Build context for the adapter
14
+ const context = buildAdapterContext(config, libraryOptions);
15
+ // Create the implementation
16
+ const implementation = createAdapter(context);
17
+ // Wrap with factory enhancements
18
+ return wrapAdapter(implementation, context, config);
19
+ };
20
+ }
21
+ /**
22
+ * Build adapter context with helper functions and configuration
23
+ */
24
+ function buildAdapterContext(config, libraryOptions) {
25
+ const namespace = libraryOptions.namespace ?? 'default';
26
+ const schema = libraryOptions.schema ?? {};
27
+ // Create namespace manager
28
+ const namespaceManager = new NamespaceManager({
29
+ enabled: config.namespace?.enabled ?? false,
30
+ separator: config.namespace?.separator ?? '_',
31
+ prefix: config.namespace?.prefix,
32
+ schemaSupport: config.namespace?.schemaSupport ?? false,
33
+ });
34
+ // Logger setup
35
+ const logger = createLogger(config.debug);
36
+ return {
37
+ options: libraryOptions,
38
+ schema,
39
+ // Model name helpers
40
+ getModelName: (model) => {
41
+ const tableName = config.usePlural ? pluralize(model) : model;
42
+ return namespaceManager.isEnabled()
43
+ ? namespaceManager.apply(namespace, tableName)
44
+ : tableName;
45
+ },
46
+ getDefaultModelName: (model) => {
47
+ return config.usePlural ? pluralize(model) : model;
48
+ },
49
+ // Field name helpers
50
+ getFieldName: ({ model, field }) => {
51
+ const fieldSchema = schema[model]?.fields[field];
52
+ return fieldSchema?.fieldName ?? field;
53
+ },
54
+ getDefaultFieldName: ({ field }) => {
55
+ return field;
56
+ },
57
+ // Data transformers
58
+ transformInput: async (data, _model, action) => {
59
+ let transformed = { ...data };
60
+ // Apply key mapping (e.g., id -> _id for MongoDB)
61
+ if (config.mapKeysInput) {
62
+ for (const [from, to] of Object.entries(config.mapKeysInput)) {
63
+ if (from in transformed) {
64
+ transformed[to] = transformed[from];
65
+ delete transformed[from];
66
+ }
67
+ }
68
+ }
69
+ // Custom ID generation
70
+ if (action === 'create' &&
71
+ config.customIdGenerator &&
72
+ !config.disableIdGeneration &&
73
+ !transformed.id) {
74
+ transformed.id = config.customIdGenerator();
75
+ }
76
+ return transformed;
77
+ },
78
+ transformOutput: async (data, _model) => {
79
+ if (!data)
80
+ return data;
81
+ let transformed = { ...data };
82
+ // Apply key mapping (e.g., _id -> id for MongoDB)
83
+ if (config.mapKeysOutput) {
84
+ for (const [from, to] of Object.entries(config.mapKeysOutput)) {
85
+ if (from in transformed) {
86
+ transformed[to] = transformed[from];
87
+ delete transformed[from];
88
+ }
89
+ }
90
+ }
91
+ return transformed;
92
+ },
93
+ log: logger,
94
+ };
95
+ }
96
+ /**
97
+ * Wrap adapter implementation with factory enhancements
98
+ */
99
+ function wrapAdapter(implementation, context, config) {
100
+ const capabilities = mergeCapabilities(config.capabilities ?? {});
101
+ return {
102
+ // Metadata
103
+ id: config.adapterId,
104
+ name: config.adapterName ?? config.adapterId,
105
+ version: '1.0.0',
106
+ capabilities,
107
+ // CRUD operations with transformation
108
+ async create(params) {
109
+ context.log.debug('create', params);
110
+ const transformed = await context.transformInput(params.data, params.model, 'create');
111
+ const result = await implementation.create({ ...params, data: transformed });
112
+ return context.transformOutput(result, params.model);
113
+ },
114
+ async findOne(params) {
115
+ context.log.debug('findOne', params);
116
+ const result = await implementation.findOne(params);
117
+ return result ? context.transformOutput(result, params.model) : null;
118
+ },
119
+ async findMany(params) {
120
+ context.log.debug('findMany', params);
121
+ const results = await implementation.findMany(params);
122
+ return Promise.all(results.map((r) => context.transformOutput(r, params.model)));
123
+ },
124
+ async update(params) {
125
+ context.log.debug('update', params);
126
+ const transformed = await context.transformInput(params.data, params.model, 'update');
127
+ const result = await implementation.update({ ...params, data: transformed });
128
+ return context.transformOutput(result, params.model);
129
+ },
130
+ async delete(params) {
131
+ context.log.debug('delete', params);
132
+ return implementation.delete(params);
133
+ },
134
+ // Batch operations
135
+ async createMany(params) {
136
+ context.log.debug('createMany', params);
137
+ const transformed = await Promise.all(params.data.map((d) => context.transformInput(d, params.model, 'create')));
138
+ const results = await implementation.createMany({ ...params, data: transformed });
139
+ return Promise.all(results.map((r) => context.transformOutput(r, params.model)));
140
+ },
141
+ async updateMany(params) {
142
+ context.log.debug('updateMany', params);
143
+ const transformed = await context.transformInput(params.data, params.model, 'update');
144
+ return implementation.updateMany({ ...params, data: transformed });
145
+ },
146
+ async deleteMany(params) {
147
+ context.log.debug('deleteMany', params);
148
+ return implementation.deleteMany(params);
149
+ },
150
+ // Advanced operations
151
+ async upsert(params) {
152
+ context.log.debug('upsert', params);
153
+ const transformedCreate = await context.transformInput(params.create, params.model, 'create');
154
+ const transformedUpdate = await context.transformInput(params.update, params.model, 'update');
155
+ const result = await implementation.upsert({
156
+ ...params,
157
+ create: transformedCreate,
158
+ update: transformedUpdate,
159
+ });
160
+ return context.transformOutput(result, params.model);
161
+ },
162
+ async count(params) {
163
+ context.log.debug('count', params);
164
+ return implementation.count(params);
165
+ },
166
+ // Transaction support
167
+ async transaction(callback) {
168
+ context.log.debug('transaction');
169
+ return implementation.transaction(callback);
170
+ },
171
+ // Lifecycle
172
+ async initialize() {
173
+ context.log.info('Initializing adapter');
174
+ return implementation.initialize();
175
+ },
176
+ async isHealthy() {
177
+ return implementation.isHealthy();
178
+ },
179
+ async close() {
180
+ context.log.info('Closing adapter');
181
+ return implementation.close();
182
+ },
183
+ // Schema management
184
+ async getSchemaVersion(namespace) {
185
+ return implementation.getSchemaVersion(namespace);
186
+ },
187
+ async setSchemaVersion(namespace, version) {
188
+ return implementation.setSchemaVersion(namespace, version);
189
+ },
190
+ async validateSchema(schema) {
191
+ return implementation.validateSchema(schema);
192
+ },
193
+ // Optional schema creation
194
+ createSchema: implementation.createSchema
195
+ ? async (params) => implementation.createSchema(params)
196
+ : undefined,
197
+ };
198
+ }
199
+ /**
200
+ * Create logger based on debug configuration
201
+ */
202
+ function createLogger(debug) {
203
+ const isDebug = typeof debug === 'boolean' ? debug : debug?.logQueries ?? false;
204
+ const noop = () => { };
205
+ if (!isDebug) {
206
+ return {
207
+ debug: noop,
208
+ info: noop,
209
+ warn: console.warn.bind(console),
210
+ error: console.error.bind(console),
211
+ };
212
+ }
213
+ return {
214
+ debug: console.debug.bind(console),
215
+ info: console.info.bind(console),
216
+ warn: console.warn.bind(console),
217
+ error: console.error.bind(console),
218
+ };
219
+ }
220
+ /**
221
+ * Simple pluralize helper
222
+ */
223
+ function pluralize(word) {
224
+ if (word.endsWith('y') && !word.endsWith('ay') && !word.endsWith('ey') && !word.endsWith('oy') && !word.endsWith('uy')) {
225
+ return word.slice(0, -1) + 'ies';
226
+ }
227
+ if (word.endsWith('s') || word.endsWith('x') || word.endsWith('z') || word.endsWith('ch') || word.endsWith('sh')) {
228
+ return word + 'es';
229
+ }
230
+ return word + 's';
231
+ }
232
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/adapter/factory.ts"],"names":[],"mappings":"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"}