@thewhateverapp/platform 0.0.1
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 +223 -0
- package/dist/ai/mock.d.ts +14 -0
- package/dist/ai/mock.d.ts.map +1 -0
- package/dist/ai/mock.js +38 -0
- package/dist/ai/mock.js.map +1 -0
- package/dist/ai/production.d.ts +17 -0
- package/dist/ai/production.d.ts.map +1 -0
- package/dist/ai/production.js +41 -0
- package/dist/ai/production.js.map +1 -0
- package/dist/analytics/client.d.ts +21 -0
- package/dist/analytics/client.d.ts.map +1 -0
- package/dist/analytics/client.js +60 -0
- package/dist/analytics/client.js.map +1 -0
- package/dist/assets/client.d.ts +23 -0
- package/dist/assets/client.d.ts.map +1 -0
- package/dist/assets/client.js +105 -0
- package/dist/assets/client.js.map +1 -0
- package/dist/auth/client.d.ts +20 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +53 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/types.d.ts +50 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +5 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/db/mock.d.ts +43 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +343 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/production.d.ts +16 -0
- package/dist/db/production.d.ts.map +1 -0
- package/dist/db/production.js +77 -0
- package/dist/db/production.js.map +1 -0
- package/dist/edge/database/index.d.ts +46 -0
- package/dist/edge/database/index.d.ts.map +1 -0
- package/dist/edge/database/index.js +82 -0
- package/dist/edge/database/index.js.map +1 -0
- package/dist/edge/database/providers/flex-db.d.ts +22 -0
- package/dist/edge/database/providers/flex-db.d.ts.map +1 -0
- package/dist/edge/database/providers/flex-db.js +351 -0
- package/dist/edge/database/providers/flex-db.js.map +1 -0
- package/dist/edge/database/providers/index.d.ts +7 -0
- package/dist/edge/database/providers/index.d.ts.map +1 -0
- package/dist/edge/database/providers/index.js +11 -0
- package/dist/edge/database/providers/index.js.map +1 -0
- package/dist/edge/database/types.d.ts +148 -0
- package/dist/edge/database/types.d.ts.map +1 -0
- package/dist/edge/database/types.js +8 -0
- package/dist/edge/database/types.js.map +1 -0
- package/dist/edge/index.d.ts +12 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +12 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/kv/index.d.ts +50 -0
- package/dist/edge/kv/index.d.ts.map +1 -0
- package/dist/edge/kv/index.js +83 -0
- package/dist/edge/kv/index.js.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts +31 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.js +115 -0
- package/dist/edge/kv/providers/cloudflare-kv.js.map +1 -0
- package/dist/edge/kv/providers/index.d.ts +7 -0
- package/dist/edge/kv/providers/index.d.ts.map +1 -0
- package/dist/edge/kv/providers/index.js +10 -0
- package/dist/edge/kv/providers/index.js.map +1 -0
- package/dist/edge/kv/types.d.ts +155 -0
- package/dist/edge/kv/types.d.ts.map +1 -0
- package/dist/edge/kv/types.js +8 -0
- package/dist/edge/kv/types.js.map +1 -0
- package/dist/edge/storage/index.d.ts +50 -0
- package/dist/edge/storage/index.d.ts.map +1 -0
- package/dist/edge/storage/index.js +83 -0
- package/dist/edge/storage/index.js.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts +28 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.js +178 -0
- package/dist/edge/storage/providers/cloudflare-r2.js.map +1 -0
- package/dist/edge/storage/providers/index.d.ts +7 -0
- package/dist/edge/storage/providers/index.d.ts.map +1 -0
- package/dist/edge/storage/providers/index.js +10 -0
- package/dist/edge/storage/providers/index.js.map +1 -0
- package/dist/edge/storage/types.d.ts +305 -0
- package/dist/edge/storage/types.d.ts.map +1 -0
- package/dist/edge/storage/types.js +8 -0
- package/dist/edge/storage/types.js.map +1 -0
- package/dist/identity/client.d.ts +20 -0
- package/dist/identity/client.d.ts.map +1 -0
- package/dist/identity/client.js +40 -0
- package/dist/identity/client.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/client.d.ts +20 -0
- package/dist/notifications/client.d.ts.map +1 -0
- package/dist/notifications/client.js +38 -0
- package/dist/notifications/client.js.map +1 -0
- package/dist/payments/client.d.ts +21 -0
- package/dist/payments/client.d.ts.map +1 -0
- package/dist/payments/client.js +52 -0
- package/dist/payments/client.js.map +1 -0
- package/dist/platform.d.ts +65 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +254 -0
- package/dist/platform.js.map +1 -0
- package/dist/social/client.d.ts +29 -0
- package/dist/social/client.d.ts.map +1 -0
- package/dist/social/client.js +83 -0
- package/dist/social/client.js.map +1 -0
- package/dist/storage/mock.d.ts +27 -0
- package/dist/storage/mock.d.ts.map +1 -0
- package/dist/storage/mock.js +102 -0
- package/dist/storage/mock.js.map +1 -0
- package/dist/storage/production.d.ts +28 -0
- package/dist/storage/production.d.ts.map +1 -0
- package/dist/storage/production.js +75 -0
- package/dist/storage/production.js.map +1 -0
- package/dist/types.d.ts +399 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge Database API
|
|
3
|
+
*
|
|
4
|
+
* Provides a MongoDB-like schemaless database interface for user-generated apps.
|
|
5
|
+
* Automatically selects the appropriate provider based on environment configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { getDatabase } from '@thewhateverapp/platform/edge';
|
|
10
|
+
*
|
|
11
|
+
* export async function GET(req: NextRequest) {
|
|
12
|
+
* const db = await getDatabase(req);
|
|
13
|
+
* const todos = db.collection('todos');
|
|
14
|
+
* const result = await todos.find({ completed: false });
|
|
15
|
+
* return NextResponse.json(result);
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { FlexDB } from './providers';
|
|
20
|
+
/**
|
|
21
|
+
* Get a database instance for the current request
|
|
22
|
+
*
|
|
23
|
+
* Automatically selects the appropriate provider based on environment:
|
|
24
|
+
* - 'flex' (default): FlexDB using Cloudflare D1
|
|
25
|
+
* - 'turso': TursoDB for high-scale apps
|
|
26
|
+
* - 'mongo-atlas': MongoDB Atlas for complex queries
|
|
27
|
+
* - 'planetscale': PlanetScale for relational needs
|
|
28
|
+
*
|
|
29
|
+
* @param req - NextRequest or object with env property
|
|
30
|
+
* @returns Database provider instance
|
|
31
|
+
*/
|
|
32
|
+
export async function getDatabase(req) {
|
|
33
|
+
const env = 'env' in req ? req.env : req.env;
|
|
34
|
+
if (!env) {
|
|
35
|
+
throw new Error('No environment found in request. Ensure you are running in edge runtime.');
|
|
36
|
+
}
|
|
37
|
+
// Check for DB binding
|
|
38
|
+
if (!env.DB) {
|
|
39
|
+
throw new Error('No D1 database binding found. Add a D1 database binding named "DB" to your wrangler.jsonc');
|
|
40
|
+
}
|
|
41
|
+
// Get provider from environment (defaults to 'flex')
|
|
42
|
+
const provider = env.DB_PROVIDER || 'flex';
|
|
43
|
+
switch (provider) {
|
|
44
|
+
case 'flex':
|
|
45
|
+
return new FlexDB(env.DB);
|
|
46
|
+
case 'turso':
|
|
47
|
+
// Future: TursoDB implementation
|
|
48
|
+
throw new Error('TursoDB provider not yet implemented. Use DB_PROVIDER=flex or remove DB_PROVIDER.');
|
|
49
|
+
case 'mongo-atlas':
|
|
50
|
+
// Future: MongoDB Atlas implementation
|
|
51
|
+
throw new Error('MongoDB Atlas provider not yet implemented. Use DB_PROVIDER=flex or remove DB_PROVIDER.');
|
|
52
|
+
case 'planetscale':
|
|
53
|
+
// Future: PlanetScale implementation
|
|
54
|
+
throw new Error('PlanetScale provider not yet implemented. Use DB_PROVIDER=flex or remove DB_PROVIDER.');
|
|
55
|
+
default:
|
|
56
|
+
console.warn(`Unknown DB_PROVIDER: ${provider}. Falling back to FlexDB.`);
|
|
57
|
+
return new FlexDB(env.DB);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create a database instance directly (for advanced usage)
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const db = createDatabase({ DB: env.DB });
|
|
66
|
+
* const todos = db.collection('todos');
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export function createDatabase(env) {
|
|
70
|
+
if (!env.DB) {
|
|
71
|
+
throw new Error('No D1 database binding found.');
|
|
72
|
+
}
|
|
73
|
+
const provider = env.DB_PROVIDER || 'flex';
|
|
74
|
+
switch (provider) {
|
|
75
|
+
case 'flex':
|
|
76
|
+
return new FlexDB(env.DB);
|
|
77
|
+
default:
|
|
78
|
+
console.warn(`Unknown DB_PROVIDER: ${provider}. Falling back to FlexDB.`);
|
|
79
|
+
return new FlexDB(env.DB);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/edge/database/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKrC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAA6C;IAE7C,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAW,CAAC,GAAG,CAAC;IAEtD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC;IAE3C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5B,KAAK,OAAO;YACV,iCAAiC;YACjC,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;QAEJ,KAAK,aAAa;YAChB,uCAAuC;YACvC,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;QAEJ,KAAK,aAAa;YAChB,qCAAqC;YACrC,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QAEJ;YACE,OAAO,CAAC,IAAI,CAAC,wBAAwB,QAAQ,2BAA2B,CAAC,CAAC;YAC1E,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,GAAkB;IAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC;IAE3C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5B;YACE,OAAO,CAAC,IAAI,CAAC,wBAAwB,QAAQ,2BAA2B,CAAC,CAAC;YAC1E,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlexDB - MongoDB-like schemaless database over Cloudflare D1
|
|
3
|
+
*
|
|
4
|
+
* Stores documents as JSON in a single table structure.
|
|
5
|
+
* Perfect for small to medium apps (<10k documents per collection).
|
|
6
|
+
* Can be swapped out for more powerful providers as apps scale.
|
|
7
|
+
*/
|
|
8
|
+
import type { DatabaseProvider, Collection, CollectionOptions } from '../types';
|
|
9
|
+
/**
|
|
10
|
+
* FlexDB implementation using Cloudflare D1
|
|
11
|
+
*/
|
|
12
|
+
export declare class FlexDB implements DatabaseProvider {
|
|
13
|
+
private d1;
|
|
14
|
+
private initialized;
|
|
15
|
+
constructor(d1: D1Database);
|
|
16
|
+
/**
|
|
17
|
+
* Ensure the collections table exists
|
|
18
|
+
*/
|
|
19
|
+
private ensureInitialized;
|
|
20
|
+
collection<T = any>(name: string, options?: CollectionOptions): Collection<T>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=flex-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flex-db.d.ts","sourceRoot":"","sources":["../../../../src/edge/database/providers/flex-db.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EAQlB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,qBAAa,MAAO,YAAW,gBAAgB;IAGjC,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,WAAW,CAAS;gBAER,EAAE,EAAE,UAAU;IAElC;;OAEG;YACW,iBAAiB;IAyB/B,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC;CAG9E"}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlexDB - MongoDB-like schemaless database over Cloudflare D1
|
|
3
|
+
*
|
|
4
|
+
* Stores documents as JSON in a single table structure.
|
|
5
|
+
* Perfect for small to medium apps (<10k documents per collection).
|
|
6
|
+
* Can be swapped out for more powerful providers as apps scale.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* FlexDB implementation using Cloudflare D1
|
|
10
|
+
*/
|
|
11
|
+
export class FlexDB {
|
|
12
|
+
d1;
|
|
13
|
+
initialized = false;
|
|
14
|
+
constructor(d1) {
|
|
15
|
+
this.d1 = d1;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Ensure the collections table exists
|
|
19
|
+
*/
|
|
20
|
+
async ensureInitialized() {
|
|
21
|
+
if (this.initialized)
|
|
22
|
+
return;
|
|
23
|
+
await this.d1
|
|
24
|
+
.prepare(`
|
|
25
|
+
CREATE TABLE IF NOT EXISTS collections (
|
|
26
|
+
collection TEXT NOT NULL,
|
|
27
|
+
id TEXT NOT NULL,
|
|
28
|
+
document TEXT NOT NULL,
|
|
29
|
+
created_at INTEGER DEFAULT (strftime('%s', 'now')),
|
|
30
|
+
updated_at INTEGER DEFAULT (strftime('%s', 'now')),
|
|
31
|
+
PRIMARY KEY (collection, id)
|
|
32
|
+
)
|
|
33
|
+
`)
|
|
34
|
+
.run();
|
|
35
|
+
await this.d1
|
|
36
|
+
.prepare('CREATE INDEX IF NOT EXISTS idx_collection ON collections(collection)')
|
|
37
|
+
.run();
|
|
38
|
+
this.initialized = true;
|
|
39
|
+
}
|
|
40
|
+
collection(name, options) {
|
|
41
|
+
return new FlexCollection(this.d1, name, options, () => this.ensureInitialized());
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* FlexDB collection implementation
|
|
46
|
+
*/
|
|
47
|
+
class FlexCollection {
|
|
48
|
+
db;
|
|
49
|
+
name;
|
|
50
|
+
options;
|
|
51
|
+
ensureInit;
|
|
52
|
+
constructor(db, name, options, ensureInit) {
|
|
53
|
+
this.db = db;
|
|
54
|
+
this.name = name;
|
|
55
|
+
this.options = options;
|
|
56
|
+
this.ensureInit = ensureInit;
|
|
57
|
+
this.ensureIndexes();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create indexes for specified fields
|
|
61
|
+
*/
|
|
62
|
+
async ensureIndexes() {
|
|
63
|
+
if (!this.options?.indexes)
|
|
64
|
+
return;
|
|
65
|
+
await this.ensureInit?.();
|
|
66
|
+
for (const field of this.options.indexes) {
|
|
67
|
+
const indexName = `idx_${this.name}_${field.replace(/\./g, '_')}`;
|
|
68
|
+
try {
|
|
69
|
+
await this.db
|
|
70
|
+
.prepare(`
|
|
71
|
+
CREATE INDEX IF NOT EXISTS ${indexName}
|
|
72
|
+
ON collections(json_extract(document, '$.${field}'))
|
|
73
|
+
WHERE collection = ?
|
|
74
|
+
`)
|
|
75
|
+
.bind(this.name)
|
|
76
|
+
.run();
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
console.warn(`Failed to create index on ${field}:`, err);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async insertOne(doc) {
|
|
84
|
+
await this.ensureInit?.();
|
|
85
|
+
const id = crypto.randomUUID();
|
|
86
|
+
const document = { ...doc, _id: id };
|
|
87
|
+
await this.db
|
|
88
|
+
.prepare(`
|
|
89
|
+
INSERT INTO collections (collection, id, document)
|
|
90
|
+
VALUES (?, ?, ?)
|
|
91
|
+
`)
|
|
92
|
+
.bind(this.name, id, JSON.stringify(document))
|
|
93
|
+
.run();
|
|
94
|
+
return { insertedId: id };
|
|
95
|
+
}
|
|
96
|
+
async insertMany(docs) {
|
|
97
|
+
await this.ensureInit?.();
|
|
98
|
+
const insertedIds = [];
|
|
99
|
+
// Batch insert using D1 batch API
|
|
100
|
+
const statements = docs.map((doc) => {
|
|
101
|
+
const id = crypto.randomUUID();
|
|
102
|
+
insertedIds.push(id);
|
|
103
|
+
const document = { ...doc, _id: id };
|
|
104
|
+
return this.db
|
|
105
|
+
.prepare(`
|
|
106
|
+
INSERT INTO collections (collection, id, document)
|
|
107
|
+
VALUES (?, ?, ?)
|
|
108
|
+
`)
|
|
109
|
+
.bind(this.name, id, JSON.stringify(document));
|
|
110
|
+
});
|
|
111
|
+
await this.db.batch(statements);
|
|
112
|
+
return { insertedIds };
|
|
113
|
+
}
|
|
114
|
+
async findOne(query) {
|
|
115
|
+
await this.ensureInit?.();
|
|
116
|
+
const result = await this.find(query, { limit: 1 });
|
|
117
|
+
return result.length > 0 ? result[0] : null;
|
|
118
|
+
}
|
|
119
|
+
async find(query, options) {
|
|
120
|
+
if (!query)
|
|
121
|
+
query = {};
|
|
122
|
+
await this.ensureInit?.();
|
|
123
|
+
let sql = 'SELECT document FROM collections WHERE collection = ?';
|
|
124
|
+
const params = [this.name];
|
|
125
|
+
// Use indexes if available for simple field queries
|
|
126
|
+
const simpleQuery = this.getSimpleQuery(query);
|
|
127
|
+
if (simpleQuery && this.options?.indexes) {
|
|
128
|
+
for (const [key, value] of Object.entries(simpleQuery)) {
|
|
129
|
+
if (this.options.indexes.includes(key)) {
|
|
130
|
+
sql += ` AND json_extract(document, '$.${key}') = ?`;
|
|
131
|
+
params.push(value);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Apply limit
|
|
136
|
+
if (options?.limit) {
|
|
137
|
+
sql += ` LIMIT ${options.limit}`;
|
|
138
|
+
}
|
|
139
|
+
// Apply skip
|
|
140
|
+
if (options?.skip) {
|
|
141
|
+
sql += ` OFFSET ${options.skip}`;
|
|
142
|
+
}
|
|
143
|
+
const result = await this.db.prepare(sql).bind(...params).all();
|
|
144
|
+
// Parse documents
|
|
145
|
+
let documents = result.results.map((row) => JSON.parse(row.document));
|
|
146
|
+
// Filter by query (for complex queries or non-indexed fields)
|
|
147
|
+
documents = documents.filter((doc) => this.matches(doc, query));
|
|
148
|
+
// Apply sorting
|
|
149
|
+
if (options?.sort) {
|
|
150
|
+
documents = this.sortDocuments(documents, options.sort);
|
|
151
|
+
}
|
|
152
|
+
return documents;
|
|
153
|
+
}
|
|
154
|
+
async updateOne(query, update) {
|
|
155
|
+
await this.ensureInit?.();
|
|
156
|
+
const doc = await this.findOne(query);
|
|
157
|
+
if (!doc) {
|
|
158
|
+
return { matchedCount: 0, modifiedCount: 0 };
|
|
159
|
+
}
|
|
160
|
+
const updated = this.applyUpdate(doc, update);
|
|
161
|
+
await this.db
|
|
162
|
+
.prepare(`
|
|
163
|
+
UPDATE collections
|
|
164
|
+
SET document = ?, updated_at = strftime('%s', 'now')
|
|
165
|
+
WHERE collection = ? AND id = ?
|
|
166
|
+
`)
|
|
167
|
+
.bind(JSON.stringify(updated), this.name, doc._id)
|
|
168
|
+
.run();
|
|
169
|
+
return { matchedCount: 1, modifiedCount: 1 };
|
|
170
|
+
}
|
|
171
|
+
async updateMany(query, update) {
|
|
172
|
+
await this.ensureInit?.();
|
|
173
|
+
const docs = await this.find(query);
|
|
174
|
+
if (docs.length === 0) {
|
|
175
|
+
return { matchedCount: 0, modifiedCount: 0 };
|
|
176
|
+
}
|
|
177
|
+
const statements = docs.map((doc) => {
|
|
178
|
+
const updated = this.applyUpdate(doc, update);
|
|
179
|
+
return this.db
|
|
180
|
+
.prepare(`
|
|
181
|
+
UPDATE collections
|
|
182
|
+
SET document = ?, updated_at = strftime('%s', 'now')
|
|
183
|
+
WHERE collection = ? AND id = ?
|
|
184
|
+
`)
|
|
185
|
+
.bind(JSON.stringify(updated), this.name, doc._id);
|
|
186
|
+
});
|
|
187
|
+
await this.db.batch(statements);
|
|
188
|
+
return { matchedCount: docs.length, modifiedCount: docs.length };
|
|
189
|
+
}
|
|
190
|
+
async deleteOne(query) {
|
|
191
|
+
await this.ensureInit?.();
|
|
192
|
+
const doc = await this.findOne(query);
|
|
193
|
+
if (!doc) {
|
|
194
|
+
return { deletedCount: 0 };
|
|
195
|
+
}
|
|
196
|
+
await this.db
|
|
197
|
+
.prepare(`
|
|
198
|
+
DELETE FROM collections
|
|
199
|
+
WHERE collection = ? AND id = ?
|
|
200
|
+
`)
|
|
201
|
+
.bind(this.name, doc._id)
|
|
202
|
+
.run();
|
|
203
|
+
return { deletedCount: 1 };
|
|
204
|
+
}
|
|
205
|
+
async deleteMany(query) {
|
|
206
|
+
await this.ensureInit?.();
|
|
207
|
+
const docs = await this.find(query);
|
|
208
|
+
if (docs.length === 0) {
|
|
209
|
+
return { deletedCount: 0 };
|
|
210
|
+
}
|
|
211
|
+
const statements = docs.map((doc) => this.db
|
|
212
|
+
.prepare(`
|
|
213
|
+
DELETE FROM collections
|
|
214
|
+
WHERE collection = ? AND id = ?
|
|
215
|
+
`)
|
|
216
|
+
.bind(this.name, doc._id));
|
|
217
|
+
await this.db.batch(statements);
|
|
218
|
+
return { deletedCount: docs.length };
|
|
219
|
+
}
|
|
220
|
+
async countDocuments(query) {
|
|
221
|
+
if (!query)
|
|
222
|
+
query = {};
|
|
223
|
+
const docs = await this.find(query);
|
|
224
|
+
return docs.length;
|
|
225
|
+
}
|
|
226
|
+
async createIndex(fields) {
|
|
227
|
+
await this.ensureInit?.();
|
|
228
|
+
for (const field of fields) {
|
|
229
|
+
const indexName = `idx_${this.name}_${field.replace(/\./g, '_')}`;
|
|
230
|
+
await this.db
|
|
231
|
+
.prepare(`
|
|
232
|
+
CREATE INDEX IF NOT EXISTS ${indexName}
|
|
233
|
+
ON collections(json_extract(document, '$.${field}'))
|
|
234
|
+
WHERE collection = ?
|
|
235
|
+
`)
|
|
236
|
+
.bind(this.name)
|
|
237
|
+
.run();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// --- Helper Methods ---
|
|
241
|
+
/**
|
|
242
|
+
* Extract simple field queries for index optimization
|
|
243
|
+
*/
|
|
244
|
+
getSimpleQuery(query) {
|
|
245
|
+
if (typeof query === 'object' && !Array.isArray(query)) {
|
|
246
|
+
const hasOperators = Object.keys(query).some((k) => k.startsWith('$'));
|
|
247
|
+
if (!hasOperators) {
|
|
248
|
+
return query;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Check if a document matches a query
|
|
255
|
+
*/
|
|
256
|
+
matches(doc, query) {
|
|
257
|
+
if (!query || Object.keys(query).length === 0)
|
|
258
|
+
return true;
|
|
259
|
+
// Handle logical operators
|
|
260
|
+
if ('$and' in query && Array.isArray(query.$and)) {
|
|
261
|
+
return query.$and.every((q) => this.matches(doc, q));
|
|
262
|
+
}
|
|
263
|
+
if ('$or' in query && Array.isArray(query.$or)) {
|
|
264
|
+
return query.$or.some((q) => this.matches(doc, q));
|
|
265
|
+
}
|
|
266
|
+
if ('$not' in query) {
|
|
267
|
+
return !this.matches(doc, query.$not);
|
|
268
|
+
}
|
|
269
|
+
// Handle comparison operators
|
|
270
|
+
if ('$gt' in query && query.$gt) {
|
|
271
|
+
return Object.entries(query.$gt).every(([key, value]) => doc[key] > value);
|
|
272
|
+
}
|
|
273
|
+
if ('$gte' in query && query.$gte) {
|
|
274
|
+
return Object.entries(query.$gte).every(([key, value]) => doc[key] >= value);
|
|
275
|
+
}
|
|
276
|
+
if ('$lt' in query && query.$lt) {
|
|
277
|
+
return Object.entries(query.$lt).every(([key, value]) => doc[key] < value);
|
|
278
|
+
}
|
|
279
|
+
if ('$lte' in query && query.$lte) {
|
|
280
|
+
return Object.entries(query.$lte).every(([key, value]) => doc[key] <= value);
|
|
281
|
+
}
|
|
282
|
+
if ('$in' in query && query.$in) {
|
|
283
|
+
return Object.entries(query.$in).every(([key, values]) => Array.isArray(values) ? values.includes(doc[key]) : false);
|
|
284
|
+
}
|
|
285
|
+
if ('$nin' in query && query.$nin) {
|
|
286
|
+
return Object.entries(query.$nin).every(([key, values]) => Array.isArray(values) ? !values.includes(doc[key]) : true);
|
|
287
|
+
}
|
|
288
|
+
// Simple field matching
|
|
289
|
+
return Object.entries(query).every(([key, value]) => {
|
|
290
|
+
if (key.startsWith('$'))
|
|
291
|
+
return true; // Skip operators
|
|
292
|
+
return doc[key] === value;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Apply update operations to a document
|
|
297
|
+
*/
|
|
298
|
+
applyUpdate(doc, update) {
|
|
299
|
+
const result = { ...doc };
|
|
300
|
+
if (update.$set) {
|
|
301
|
+
Object.assign(result, update.$set);
|
|
302
|
+
}
|
|
303
|
+
if (update.$inc) {
|
|
304
|
+
for (const [key, value] of Object.entries(update.$inc)) {
|
|
305
|
+
if (typeof value === 'number') {
|
|
306
|
+
result[key] = (result[key] || 0) + value;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (update.$push) {
|
|
311
|
+
for (const [key, value] of Object.entries(update.$push)) {
|
|
312
|
+
if (!Array.isArray(result[key])) {
|
|
313
|
+
result[key] = [];
|
|
314
|
+
}
|
|
315
|
+
result[key].push(value);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (update.$pull) {
|
|
319
|
+
for (const [key, value] of Object.entries(update.$pull)) {
|
|
320
|
+
if (Array.isArray(result[key])) {
|
|
321
|
+
result[key] = result[key].filter((item) => item !== value);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (update.$unset) {
|
|
326
|
+
for (const [key, shouldUnset] of Object.entries(update.$unset)) {
|
|
327
|
+
if (shouldUnset) {
|
|
328
|
+
delete result[key];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return result;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Sort documents by specified fields
|
|
336
|
+
*/
|
|
337
|
+
sortDocuments(docs, sort) {
|
|
338
|
+
return docs.sort((a, b) => {
|
|
339
|
+
for (const [field, order] of Object.entries(sort)) {
|
|
340
|
+
const aVal = a[field];
|
|
341
|
+
const bVal = b[field];
|
|
342
|
+
if (aVal < bVal)
|
|
343
|
+
return order === 1 ? -1 : 1;
|
|
344
|
+
if (aVal > bVal)
|
|
345
|
+
return order === 1 ? 1 : -1;
|
|
346
|
+
}
|
|
347
|
+
return 0;
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=flex-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flex-db.js","sourceRoot":"","sources":["../../../../src/edge/database/providers/flex-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/edge/database/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database provider registry
|
|
3
|
+
*
|
|
4
|
+
* Export all available database providers
|
|
5
|
+
*/
|
|
6
|
+
export { FlexDB } from './flex-db';
|
|
7
|
+
// Future providers:
|
|
8
|
+
// export { TursoDB } from './turso-db';
|
|
9
|
+
// export { MongoAtlasDB } from './mongo-atlas-db';
|
|
10
|
+
// export { PlanetScaleDB } from './planetscale-db';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/edge/database/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,oBAAoB;AACpB,wCAAwC;AACxC,mDAAmD;AACnD,oDAAoD"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database abstraction types for edge runtime
|
|
3
|
+
*
|
|
4
|
+
* Provides a MongoDB-like interface that can be implemented by various providers
|
|
5
|
+
* (FlexDB/D1, Turso, MongoDB Atlas, etc.) allowing seamless upgrades as apps scale.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Main database provider interface
|
|
9
|
+
*/
|
|
10
|
+
export interface DatabaseProvider {
|
|
11
|
+
/**
|
|
12
|
+
* Get a collection (similar to MongoDB collections)
|
|
13
|
+
* @param name - Collection name
|
|
14
|
+
* @param options - Optional collection configuration
|
|
15
|
+
*/
|
|
16
|
+
collection<T = any>(name: string, options?: CollectionOptions): Collection<T>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Collection interface - MongoDB-like API
|
|
20
|
+
*/
|
|
21
|
+
export interface Collection<T> {
|
|
22
|
+
/**
|
|
23
|
+
* Insert a single document
|
|
24
|
+
*/
|
|
25
|
+
insertOne(doc: Partial<T>): Promise<InsertOneResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Insert multiple documents
|
|
28
|
+
*/
|
|
29
|
+
insertMany(docs: Partial<T>[]): Promise<InsertManyResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Find a single document matching the query
|
|
32
|
+
*/
|
|
33
|
+
findOne(query: Query<T>): Promise<T | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Find all documents matching the query
|
|
36
|
+
*/
|
|
37
|
+
find(query?: Query<T>, options?: FindOptions): Promise<T[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Update a single document
|
|
40
|
+
*/
|
|
41
|
+
updateOne(query: Query<T>, update: Update<T>): Promise<UpdateResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Update multiple documents
|
|
44
|
+
*/
|
|
45
|
+
updateMany(query: Query<T>, update: Update<T>): Promise<UpdateResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Delete a single document
|
|
48
|
+
*/
|
|
49
|
+
deleteOne(query: Query<T>): Promise<DeleteResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Delete multiple documents
|
|
52
|
+
*/
|
|
53
|
+
deleteMany(query: Query<T>): Promise<DeleteResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Count documents matching the query
|
|
56
|
+
*/
|
|
57
|
+
countDocuments(query?: Query<T>): Promise<number>;
|
|
58
|
+
/**
|
|
59
|
+
* Create an index on specified fields for better query performance
|
|
60
|
+
* Not all providers may support this
|
|
61
|
+
*/
|
|
62
|
+
createIndex?(fields: string[]): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Query type - supports simple field matching and logical operators
|
|
66
|
+
*/
|
|
67
|
+
export type Query<T> = Partial<T> | {
|
|
68
|
+
$and?: Query<T>[];
|
|
69
|
+
$or?: Query<T>[];
|
|
70
|
+
$not?: Query<T>;
|
|
71
|
+
$gt?: Partial<Record<keyof T, any>>;
|
|
72
|
+
$gte?: Partial<Record<keyof T, any>>;
|
|
73
|
+
$lt?: Partial<Record<keyof T, any>>;
|
|
74
|
+
$lte?: Partial<Record<keyof T, any>>;
|
|
75
|
+
$in?: Partial<Record<keyof T, any[]>>;
|
|
76
|
+
$nin?: Partial<Record<keyof T, any[]>>;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Update operations
|
|
80
|
+
*/
|
|
81
|
+
export type Update<T> = {
|
|
82
|
+
$set?: Partial<T>;
|
|
83
|
+
$inc?: Partial<Record<keyof T, number>>;
|
|
84
|
+
$push?: Partial<Record<keyof T, any>>;
|
|
85
|
+
$pull?: Partial<Record<keyof T, any>>;
|
|
86
|
+
$unset?: Partial<Record<keyof T, boolean>>;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Find options for sorting, pagination, etc.
|
|
90
|
+
*/
|
|
91
|
+
export interface FindOptions {
|
|
92
|
+
/**
|
|
93
|
+
* Sort order: 1 for ascending, -1 for descending
|
|
94
|
+
*/
|
|
95
|
+
sort?: Record<string, 1 | -1>;
|
|
96
|
+
/**
|
|
97
|
+
* Maximum number of documents to return
|
|
98
|
+
*/
|
|
99
|
+
limit?: number;
|
|
100
|
+
/**
|
|
101
|
+
* Number of documents to skip
|
|
102
|
+
*/
|
|
103
|
+
skip?: number;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Collection configuration options
|
|
107
|
+
*/
|
|
108
|
+
export interface CollectionOptions {
|
|
109
|
+
/**
|
|
110
|
+
* Fields to index for better query performance
|
|
111
|
+
* Provider will attempt to create indexes on these fields
|
|
112
|
+
*/
|
|
113
|
+
indexes?: string[];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Result types
|
|
117
|
+
*/
|
|
118
|
+
export interface InsertOneResult {
|
|
119
|
+
insertedId: string;
|
|
120
|
+
}
|
|
121
|
+
export interface InsertManyResult {
|
|
122
|
+
insertedIds: string[];
|
|
123
|
+
}
|
|
124
|
+
export interface UpdateResult {
|
|
125
|
+
modifiedCount: number;
|
|
126
|
+
matchedCount: number;
|
|
127
|
+
}
|
|
128
|
+
export interface DeleteResult {
|
|
129
|
+
deletedCount: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Cloudflare environment interface
|
|
133
|
+
*/
|
|
134
|
+
export interface CloudflareEnv {
|
|
135
|
+
DB: D1Database;
|
|
136
|
+
DB_PROVIDER?: 'flex' | 'turso' | 'mongo-atlas' | 'planetscale';
|
|
137
|
+
TURSO_URL?: string;
|
|
138
|
+
TURSO_TOKEN?: string;
|
|
139
|
+
MONGO_URL?: string;
|
|
140
|
+
PLANETSCALE_URL?: string;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Request wrapper for NextRequest compatibility
|
|
144
|
+
*/
|
|
145
|
+
export interface DatabaseRequest {
|
|
146
|
+
env: CloudflareEnv;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/edge/database/types.ts"],"names":[],"mappings":"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"}
|