@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.
- package/README.md +341 -0
- package/dist/adapter/capabilities.d.ts +51 -0
- package/dist/adapter/capabilities.d.ts.map +1 -0
- package/dist/adapter/capabilities.js +56 -0
- package/dist/adapter/capabilities.js.map +1 -0
- package/dist/adapter/errors.d.ts +111 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +172 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/factory.d.ts +10 -0
- package/dist/adapter/factory.d.ts.map +1 -0
- package/dist/adapter/factory.js +232 -0
- package/dist/adapter/factory.js.map +1 -0
- package/dist/adapter/types.d.ts +255 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +5 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/adapters/drizzle/index.d.ts +20 -0
- package/dist/adapters/drizzle/index.d.ts.map +1 -0
- package/dist/adapters/drizzle/index.js +346 -0
- package/dist/adapters/drizzle/index.js.map +1 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/kysely/index.d.ts +18 -0
- package/dist/adapters/kysely/index.d.ts.map +1 -0
- package/dist/adapters/kysely/index.js +305 -0
- package/dist/adapters/kysely/index.js.map +1 -0
- package/dist/adapters/memory/index.d.ts +17 -0
- package/dist/adapters/memory/index.d.ts.map +1 -0
- package/dist/adapters/memory/index.js +362 -0
- package/dist/adapters/memory/index.js.map +1 -0
- package/dist/adapters/prisma/index.d.ts +16 -0
- package/dist/adapters/prisma/index.d.ts.map +1 -0
- package/dist/adapters/prisma/index.js +247 -0
- package/dist/adapters/prisma/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/runtime-validation.d.ts +7 -0
- package/dist/migrations/runtime-validation.d.ts.map +1 -0
- package/dist/migrations/runtime-validation.js +40 -0
- package/dist/migrations/runtime-validation.js.map +1 -0
- package/dist/migrations/schema-tracker.d.ts +56 -0
- package/dist/migrations/schema-tracker.d.ts.map +1 -0
- package/dist/migrations/schema-tracker.js +121 -0
- package/dist/migrations/schema-tracker.js.map +1 -0
- package/dist/testing/contract-tests.d.ts +64 -0
- package/dist/testing/contract-tests.d.ts.map +1 -0
- package/dist/testing/contract-tests.js +391 -0
- package/dist/testing/contract-tests.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mocks.d.ts +92 -0
- package/dist/testing/mocks.d.ts.map +1 -0
- package/dist/testing/mocks.js +197 -0
- package/dist/testing/mocks.js.map +1 -0
- package/dist/utils/namespace.d.ts +49 -0
- package/dist/utils/namespace.d.ts.map +1 -0
- package/dist/utils/namespace.js +85 -0
- package/dist/utils/namespace.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock adapter for testing with call tracking
|
|
3
|
+
*/
|
|
4
|
+
import { DEFAULT_CAPABILITIES } from '../adapter/capabilities.js';
|
|
5
|
+
import { OperationNotSupportedError } from '../adapter/errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Mock adapter for testing
|
|
8
|
+
* Records all method calls and allows inspection
|
|
9
|
+
*/
|
|
10
|
+
export class MockAdapter {
|
|
11
|
+
calls = [];
|
|
12
|
+
responses = new Map();
|
|
13
|
+
errors = new Map();
|
|
14
|
+
id = 'mock';
|
|
15
|
+
name = 'Mock Adapter';
|
|
16
|
+
version = '1.0.0';
|
|
17
|
+
capabilities = DEFAULT_CAPABILITIES;
|
|
18
|
+
/**
|
|
19
|
+
* Set a mock response for a specific method
|
|
20
|
+
*/
|
|
21
|
+
setResponse(method, response) {
|
|
22
|
+
this.responses.set(method, response);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set an error to throw for a specific method
|
|
26
|
+
*/
|
|
27
|
+
setError(method, error) {
|
|
28
|
+
this.errors.set(method, error);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Record a method call
|
|
32
|
+
*/
|
|
33
|
+
recordCall(method, params) {
|
|
34
|
+
this.calls.push({
|
|
35
|
+
method,
|
|
36
|
+
params,
|
|
37
|
+
timestamp: new Date(),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get a mock response or throw error if configured
|
|
42
|
+
*/
|
|
43
|
+
getResponse(method, defaultValue) {
|
|
44
|
+
if (this.errors.has(method)) {
|
|
45
|
+
throw this.errors.get(method);
|
|
46
|
+
}
|
|
47
|
+
if (this.responses.has(method)) {
|
|
48
|
+
return this.responses.get(method);
|
|
49
|
+
}
|
|
50
|
+
return defaultValue;
|
|
51
|
+
}
|
|
52
|
+
// CRUD operations
|
|
53
|
+
async create(params) {
|
|
54
|
+
this.recordCall('create', params);
|
|
55
|
+
return this.getResponse('create', { id: 'mock-id', ...params.data });
|
|
56
|
+
}
|
|
57
|
+
async findOne(params) {
|
|
58
|
+
this.recordCall('findOne', params);
|
|
59
|
+
return this.getResponse('findOne', null);
|
|
60
|
+
}
|
|
61
|
+
async findMany(params) {
|
|
62
|
+
this.recordCall('findMany', params);
|
|
63
|
+
return this.getResponse('findMany', []);
|
|
64
|
+
}
|
|
65
|
+
async update(params) {
|
|
66
|
+
this.recordCall('update', params);
|
|
67
|
+
return this.getResponse('update', { ...params.data });
|
|
68
|
+
}
|
|
69
|
+
async delete(params) {
|
|
70
|
+
this.recordCall('delete', params);
|
|
71
|
+
this.getResponse('delete', undefined);
|
|
72
|
+
}
|
|
73
|
+
// Batch operations
|
|
74
|
+
async createMany(params) {
|
|
75
|
+
this.recordCall('createMany', params);
|
|
76
|
+
return this.getResponse('createMany', params.data.map((d, i) => ({ id: `mock-id-${i}`, ...d })));
|
|
77
|
+
}
|
|
78
|
+
async updateMany(params) {
|
|
79
|
+
this.recordCall('updateMany', params);
|
|
80
|
+
return this.getResponse('updateMany', 0);
|
|
81
|
+
}
|
|
82
|
+
async deleteMany(params) {
|
|
83
|
+
this.recordCall('deleteMany', params);
|
|
84
|
+
return this.getResponse('deleteMany', 0);
|
|
85
|
+
}
|
|
86
|
+
// Advanced operations
|
|
87
|
+
async upsert(params) {
|
|
88
|
+
this.recordCall('upsert', params);
|
|
89
|
+
return this.getResponse('upsert', { id: 'mock-id', ...params.create });
|
|
90
|
+
}
|
|
91
|
+
async count(params) {
|
|
92
|
+
this.recordCall('count', params);
|
|
93
|
+
return this.getResponse('count', 0);
|
|
94
|
+
}
|
|
95
|
+
// Transaction support
|
|
96
|
+
async transaction(_callback) {
|
|
97
|
+
this.recordCall('transaction', {});
|
|
98
|
+
throw new OperationNotSupportedError('transaction', 'Mock Adapter');
|
|
99
|
+
}
|
|
100
|
+
// Lifecycle
|
|
101
|
+
async initialize() {
|
|
102
|
+
this.recordCall('initialize', {});
|
|
103
|
+
}
|
|
104
|
+
async isHealthy() {
|
|
105
|
+
this.recordCall('isHealthy', {});
|
|
106
|
+
return this.getResponse('isHealthy', {
|
|
107
|
+
healthy: true,
|
|
108
|
+
uptime: 0,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async close() {
|
|
112
|
+
this.recordCall('close', {});
|
|
113
|
+
}
|
|
114
|
+
// Schema management
|
|
115
|
+
async getSchemaVersion(namespace) {
|
|
116
|
+
this.recordCall('getSchemaVersion', { namespace });
|
|
117
|
+
return this.getResponse('getSchemaVersion', 0);
|
|
118
|
+
}
|
|
119
|
+
async setSchemaVersion(namespace, version) {
|
|
120
|
+
this.recordCall('setSchemaVersion', { namespace, version });
|
|
121
|
+
}
|
|
122
|
+
async validateSchema(_schema) {
|
|
123
|
+
this.recordCall('validateSchema', { schema: _schema });
|
|
124
|
+
return this.getResponse('validateSchema', { valid: true });
|
|
125
|
+
}
|
|
126
|
+
// Test helpers
|
|
127
|
+
/**
|
|
128
|
+
* Get all calls for a specific method
|
|
129
|
+
*/
|
|
130
|
+
getCalls(method) {
|
|
131
|
+
return method ? this.calls.filter((c) => c.method === method) : this.calls;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get the last call for a specific method
|
|
135
|
+
*/
|
|
136
|
+
getLastCall(method) {
|
|
137
|
+
const calls = this.getCalls(method);
|
|
138
|
+
return calls[calls.length - 1];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Check if a method was called
|
|
142
|
+
*/
|
|
143
|
+
wasCalled(method) {
|
|
144
|
+
return this.calls.some((c) => c.method === method);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check how many times a method was called
|
|
148
|
+
*/
|
|
149
|
+
getCallCount(method) {
|
|
150
|
+
return this.getCalls(method).length;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Clear all recorded calls
|
|
154
|
+
*/
|
|
155
|
+
clearCalls() {
|
|
156
|
+
this.calls = [];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Clear all mock responses and errors
|
|
160
|
+
*/
|
|
161
|
+
clearMocks() {
|
|
162
|
+
this.responses.clear();
|
|
163
|
+
this.errors.clear();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Reset the mock adapter completely
|
|
167
|
+
*/
|
|
168
|
+
reset() {
|
|
169
|
+
this.clearCalls();
|
|
170
|
+
this.clearMocks();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Verify that a method was called with specific parameters
|
|
174
|
+
*/
|
|
175
|
+
verifyCall(method, params) {
|
|
176
|
+
const calls = this.getCalls(method);
|
|
177
|
+
if (calls.length === 0)
|
|
178
|
+
return false;
|
|
179
|
+
if (!params)
|
|
180
|
+
return true;
|
|
181
|
+
return calls.some((call) => {
|
|
182
|
+
for (const [key, value] of Object.entries(params)) {
|
|
183
|
+
if (JSON.stringify(call.params[key]) !== JSON.stringify(value)) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return true;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Create a mock adapter instance
|
|
193
|
+
*/
|
|
194
|
+
export function createMockAdapter() {
|
|
195
|
+
return new MockAdapter();
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=mocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/testing/mocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Namespace manager for table name isolation
|
|
3
|
+
*/
|
|
4
|
+
export interface NamespaceConfig {
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
separator: string;
|
|
7
|
+
prefix?: string;
|
|
8
|
+
schemaSupport?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class NamespaceManager {
|
|
11
|
+
private readonly config;
|
|
12
|
+
constructor(config: NamespaceConfig);
|
|
13
|
+
/**
|
|
14
|
+
* Apply namespace to table name
|
|
15
|
+
*
|
|
16
|
+
* Examples:
|
|
17
|
+
* - apply('sendFn', 'email_log') → 'sendFn_email_log'
|
|
18
|
+
* - apply('webFn', 'jobs') → 'webFn_jobs'
|
|
19
|
+
*/
|
|
20
|
+
apply(libraryName: string, tableName: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get PostgreSQL schema name
|
|
23
|
+
*/
|
|
24
|
+
getSchema(libraryName: string): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Parse namespaced table name
|
|
27
|
+
*/
|
|
28
|
+
parse(namespacedName: string): {
|
|
29
|
+
namespace?: string;
|
|
30
|
+
table: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Check if namespace is enabled
|
|
34
|
+
*/
|
|
35
|
+
isEnabled(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Get configuration
|
|
38
|
+
*/
|
|
39
|
+
getConfig(): Readonly<NamespaceConfig>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create a default namespace manager with no namespacing
|
|
43
|
+
*/
|
|
44
|
+
export declare function createDefaultNamespaceManager(): NamespaceManager;
|
|
45
|
+
/**
|
|
46
|
+
* Create a namespace manager with common configuration
|
|
47
|
+
*/
|
|
48
|
+
export declare function createNamespaceManager(enabled: boolean, options?: Partial<Omit<NamespaceConfig, 'enabled'>>): NamespaceManager;
|
|
49
|
+
//# sourceMappingURL=namespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/utils/namespace.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,eAAe;IAOnC;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAiBrD;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQlD;;OAEG;IACH,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAYpE;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAC;CAGvC;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,gBAAgB,CAKhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,GAClD,gBAAgB,CAOlB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Namespace manager for table name isolation
|
|
3
|
+
*/
|
|
4
|
+
export class NamespaceManager {
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = {
|
|
8
|
+
...config,
|
|
9
|
+
separator: config.separator || '_',
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Apply namespace to table name
|
|
14
|
+
*
|
|
15
|
+
* Examples:
|
|
16
|
+
* - apply('sendFn', 'email_log') → 'sendFn_email_log'
|
|
17
|
+
* - apply('webFn', 'jobs') → 'webFn_jobs'
|
|
18
|
+
*/
|
|
19
|
+
apply(libraryName, tableName) {
|
|
20
|
+
if (!this.config.enabled) {
|
|
21
|
+
return tableName;
|
|
22
|
+
}
|
|
23
|
+
const parts = [];
|
|
24
|
+
if (this.config.prefix) {
|
|
25
|
+
parts.push(this.config.prefix);
|
|
26
|
+
}
|
|
27
|
+
parts.push(libraryName);
|
|
28
|
+
parts.push(tableName);
|
|
29
|
+
return parts.join(this.config.separator);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get PostgreSQL schema name
|
|
33
|
+
*/
|
|
34
|
+
getSchema(libraryName) {
|
|
35
|
+
if (!this.config.schemaSupport) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
return this.config.prefix ? `${this.config.prefix}_${libraryName}` : libraryName;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse namespaced table name
|
|
42
|
+
*/
|
|
43
|
+
parse(namespacedName) {
|
|
44
|
+
if (!this.config.enabled) {
|
|
45
|
+
return { table: namespacedName };
|
|
46
|
+
}
|
|
47
|
+
const parts = namespacedName.split(this.config.separator);
|
|
48
|
+
const table = parts.pop();
|
|
49
|
+
const namespace = parts.join(this.config.separator);
|
|
50
|
+
return { namespace, table };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if namespace is enabled
|
|
54
|
+
*/
|
|
55
|
+
isEnabled() {
|
|
56
|
+
return this.config.enabled;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get configuration
|
|
60
|
+
*/
|
|
61
|
+
getConfig() {
|
|
62
|
+
return this.config;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a default namespace manager with no namespacing
|
|
67
|
+
*/
|
|
68
|
+
export function createDefaultNamespaceManager() {
|
|
69
|
+
return new NamespaceManager({
|
|
70
|
+
enabled: false,
|
|
71
|
+
separator: '_',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a namespace manager with common configuration
|
|
76
|
+
*/
|
|
77
|
+
export function createNamespaceManager(enabled, options) {
|
|
78
|
+
return new NamespaceManager({
|
|
79
|
+
enabled,
|
|
80
|
+
separator: options?.separator ?? '_',
|
|
81
|
+
prefix: options?.prefix,
|
|
82
|
+
schemaSupport: options?.schemaSupport,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/utils/namespace.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,gBAAgB;IACV,MAAM,CAAkB;IAEzC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG;SACnC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAmB,EAAE,SAAiB;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,WAAmB;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IACnF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAsB;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO,IAAI,gBAAgB,CAAC;QAC1B,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAgB,EAChB,OAAmD;IAEnD,OAAO,IAAI,gBAAgB,CAAC;QAC1B,OAAO;QACP,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,GAAG;QACpC,MAAM,EAAE,OAAO,EAAE,MAAM;QACvB,aAAa,EAAE,OAAO,EAAE,aAAa;KACtC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@superfunctions/db",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Shared database adapter system for building useful backend libraries",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./adapters": {
|
|
14
|
+
"types": "./dist/adapters/index.d.ts",
|
|
15
|
+
"default": "./dist/adapters/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./testing": {
|
|
18
|
+
"types": "./dist/testing/index.d.ts",
|
|
19
|
+
"default": "./dist/testing/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./types": {
|
|
22
|
+
"types": "./dist/adapter/types.d.ts"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"test": "vitest",
|
|
31
|
+
"test:watch": "vitest --watch",
|
|
32
|
+
"lint": "echo 'lint not configured'",
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"clean": "rm -rf dist"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"@prisma/client": ">=6.0.0",
|
|
38
|
+
"drizzle-orm": ">=0.35.0",
|
|
39
|
+
"kysely": ">=0.28.0",
|
|
40
|
+
"mongodb": ">=6.0.0"
|
|
41
|
+
},
|
|
42
|
+
"peerDependenciesMeta": {
|
|
43
|
+
"drizzle-orm": {
|
|
44
|
+
"optional": true
|
|
45
|
+
},
|
|
46
|
+
"kysely": {
|
|
47
|
+
"optional": true
|
|
48
|
+
},
|
|
49
|
+
"@prisma/client": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"mongodb": {
|
|
53
|
+
"optional": true
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
58
|
+
"@types/node": "^22.0.0",
|
|
59
|
+
"better-sqlite3": "^12.5.0",
|
|
60
|
+
"drizzle-orm": "^0.35.0",
|
|
61
|
+
"typescript": "^5.6.0",
|
|
62
|
+
"vitest": "^3.2.4"
|
|
63
|
+
},
|
|
64
|
+
"keywords": [
|
|
65
|
+
"database",
|
|
66
|
+
"adapter",
|
|
67
|
+
"orm",
|
|
68
|
+
"drizzle",
|
|
69
|
+
"prisma",
|
|
70
|
+
"kysely",
|
|
71
|
+
"mongodb",
|
|
72
|
+
"superfunctions"
|
|
73
|
+
],
|
|
74
|
+
"author": "21nCo",
|
|
75
|
+
"license": "MIT",
|
|
76
|
+
"bugs": {
|
|
77
|
+
"url": "https://github.com/21nCo/conduct/issues"
|
|
78
|
+
},
|
|
79
|
+
"repository": {
|
|
80
|
+
"type": "git",
|
|
81
|
+
"url": "git+https://github.com/21nCo/super-functions.git",
|
|
82
|
+
"directory": "packages/db"
|
|
83
|
+
},
|
|
84
|
+
"publishConfig": {
|
|
85
|
+
"access": "public"
|
|
86
|
+
}
|
|
87
|
+
}
|