@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.
Files changed (122) hide show
  1. package/README.md +223 -0
  2. package/dist/ai/mock.d.ts +14 -0
  3. package/dist/ai/mock.d.ts.map +1 -0
  4. package/dist/ai/mock.js +38 -0
  5. package/dist/ai/mock.js.map +1 -0
  6. package/dist/ai/production.d.ts +17 -0
  7. package/dist/ai/production.d.ts.map +1 -0
  8. package/dist/ai/production.js +41 -0
  9. package/dist/ai/production.js.map +1 -0
  10. package/dist/analytics/client.d.ts +21 -0
  11. package/dist/analytics/client.d.ts.map +1 -0
  12. package/dist/analytics/client.js +60 -0
  13. package/dist/analytics/client.js.map +1 -0
  14. package/dist/assets/client.d.ts +23 -0
  15. package/dist/assets/client.d.ts.map +1 -0
  16. package/dist/assets/client.js +105 -0
  17. package/dist/assets/client.js.map +1 -0
  18. package/dist/auth/client.d.ts +20 -0
  19. package/dist/auth/client.d.ts.map +1 -0
  20. package/dist/auth/client.js +53 -0
  21. package/dist/auth/client.js.map +1 -0
  22. package/dist/auth/types.d.ts +50 -0
  23. package/dist/auth/types.d.ts.map +1 -0
  24. package/dist/auth/types.js +5 -0
  25. package/dist/auth/types.js.map +1 -0
  26. package/dist/db/mock.d.ts +43 -0
  27. package/dist/db/mock.d.ts.map +1 -0
  28. package/dist/db/mock.js +343 -0
  29. package/dist/db/mock.js.map +1 -0
  30. package/dist/db/production.d.ts +16 -0
  31. package/dist/db/production.d.ts.map +1 -0
  32. package/dist/db/production.js +77 -0
  33. package/dist/db/production.js.map +1 -0
  34. package/dist/edge/database/index.d.ts +46 -0
  35. package/dist/edge/database/index.d.ts.map +1 -0
  36. package/dist/edge/database/index.js +82 -0
  37. package/dist/edge/database/index.js.map +1 -0
  38. package/dist/edge/database/providers/flex-db.d.ts +22 -0
  39. package/dist/edge/database/providers/flex-db.d.ts.map +1 -0
  40. package/dist/edge/database/providers/flex-db.js +351 -0
  41. package/dist/edge/database/providers/flex-db.js.map +1 -0
  42. package/dist/edge/database/providers/index.d.ts +7 -0
  43. package/dist/edge/database/providers/index.d.ts.map +1 -0
  44. package/dist/edge/database/providers/index.js +11 -0
  45. package/dist/edge/database/providers/index.js.map +1 -0
  46. package/dist/edge/database/types.d.ts +148 -0
  47. package/dist/edge/database/types.d.ts.map +1 -0
  48. package/dist/edge/database/types.js +8 -0
  49. package/dist/edge/database/types.js.map +1 -0
  50. package/dist/edge/index.d.ts +12 -0
  51. package/dist/edge/index.d.ts.map +1 -0
  52. package/dist/edge/index.js +12 -0
  53. package/dist/edge/index.js.map +1 -0
  54. package/dist/edge/kv/index.d.ts +50 -0
  55. package/dist/edge/kv/index.d.ts.map +1 -0
  56. package/dist/edge/kv/index.js +83 -0
  57. package/dist/edge/kv/index.js.map +1 -0
  58. package/dist/edge/kv/providers/cloudflare-kv.d.ts +31 -0
  59. package/dist/edge/kv/providers/cloudflare-kv.d.ts.map +1 -0
  60. package/dist/edge/kv/providers/cloudflare-kv.js +115 -0
  61. package/dist/edge/kv/providers/cloudflare-kv.js.map +1 -0
  62. package/dist/edge/kv/providers/index.d.ts +7 -0
  63. package/dist/edge/kv/providers/index.d.ts.map +1 -0
  64. package/dist/edge/kv/providers/index.js +10 -0
  65. package/dist/edge/kv/providers/index.js.map +1 -0
  66. package/dist/edge/kv/types.d.ts +155 -0
  67. package/dist/edge/kv/types.d.ts.map +1 -0
  68. package/dist/edge/kv/types.js +8 -0
  69. package/dist/edge/kv/types.js.map +1 -0
  70. package/dist/edge/storage/index.d.ts +50 -0
  71. package/dist/edge/storage/index.d.ts.map +1 -0
  72. package/dist/edge/storage/index.js +83 -0
  73. package/dist/edge/storage/index.js.map +1 -0
  74. package/dist/edge/storage/providers/cloudflare-r2.d.ts +28 -0
  75. package/dist/edge/storage/providers/cloudflare-r2.d.ts.map +1 -0
  76. package/dist/edge/storage/providers/cloudflare-r2.js +178 -0
  77. package/dist/edge/storage/providers/cloudflare-r2.js.map +1 -0
  78. package/dist/edge/storage/providers/index.d.ts +7 -0
  79. package/dist/edge/storage/providers/index.d.ts.map +1 -0
  80. package/dist/edge/storage/providers/index.js +10 -0
  81. package/dist/edge/storage/providers/index.js.map +1 -0
  82. package/dist/edge/storage/types.d.ts +305 -0
  83. package/dist/edge/storage/types.d.ts.map +1 -0
  84. package/dist/edge/storage/types.js +8 -0
  85. package/dist/edge/storage/types.js.map +1 -0
  86. package/dist/identity/client.d.ts +20 -0
  87. package/dist/identity/client.d.ts.map +1 -0
  88. package/dist/identity/client.js +40 -0
  89. package/dist/identity/client.js.map +1 -0
  90. package/dist/index.d.ts +21 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +25 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/notifications/client.d.ts +20 -0
  95. package/dist/notifications/client.d.ts.map +1 -0
  96. package/dist/notifications/client.js +38 -0
  97. package/dist/notifications/client.js.map +1 -0
  98. package/dist/payments/client.d.ts +21 -0
  99. package/dist/payments/client.d.ts.map +1 -0
  100. package/dist/payments/client.js +52 -0
  101. package/dist/payments/client.js.map +1 -0
  102. package/dist/platform.d.ts +65 -0
  103. package/dist/platform.d.ts.map +1 -0
  104. package/dist/platform.js +254 -0
  105. package/dist/platform.js.map +1 -0
  106. package/dist/social/client.d.ts +29 -0
  107. package/dist/social/client.d.ts.map +1 -0
  108. package/dist/social/client.js +83 -0
  109. package/dist/social/client.js.map +1 -0
  110. package/dist/storage/mock.d.ts +27 -0
  111. package/dist/storage/mock.d.ts.map +1 -0
  112. package/dist/storage/mock.js +102 -0
  113. package/dist/storage/mock.js.map +1 -0
  114. package/dist/storage/production.d.ts +28 -0
  115. package/dist/storage/production.d.ts.map +1 -0
  116. package/dist/storage/production.js +75 -0
  117. package/dist/storage/production.js.map +1 -0
  118. package/dist/types.d.ts +399 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +5 -0
  121. package/dist/types.js.map +1 -0
  122. 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,7 @@
1
+ /**
2
+ * Database provider registry
3
+ *
4
+ * Export all available database providers
5
+ */
6
+ export { FlexDB } from './flex-db';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}