@edge-base/core 0.1.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 (53) hide show
  1. package/dist/context.d.ts +36 -0
  2. package/dist/context.d.ts.map +1 -0
  3. package/dist/context.js +60 -0
  4. package/dist/context.js.map +1 -0
  5. package/dist/errors.d.ts +16 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +26 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/field-ops.d.ts +43 -0
  10. package/dist/field-ops.d.ts.map +1 -0
  11. package/dist/field-ops.js +61 -0
  12. package/dist/field-ops.js.map +1 -0
  13. package/dist/functions.d.ts +50 -0
  14. package/dist/functions.d.ts.map +1 -0
  15. package/dist/functions.js +56 -0
  16. package/dist/functions.js.map +1 -0
  17. package/dist/generated/api-core.d.ts +503 -0
  18. package/dist/generated/api-core.d.ts.map +1 -0
  19. package/dist/generated/api-core.js +496 -0
  20. package/dist/generated/api-core.js.map +1 -0
  21. package/dist/generated/client-wrappers.d.ts +120 -0
  22. package/dist/generated/client-wrappers.d.ts.map +1 -0
  23. package/dist/generated/client-wrappers.js +219 -0
  24. package/dist/generated/client-wrappers.js.map +1 -0
  25. package/dist/http.d.ts +57 -0
  26. package/dist/http.d.ts.map +1 -0
  27. package/dist/http.js +198 -0
  28. package/dist/http.js.map +1 -0
  29. package/dist/index.d.ts +19 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +28 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mime.d.ts +15 -0
  34. package/dist/mime.d.ts.map +1 -0
  35. package/dist/mime.js +84 -0
  36. package/dist/mime.js.map +1 -0
  37. package/dist/storage.d.ts +246 -0
  38. package/dist/storage.d.ts.map +1 -0
  39. package/dist/storage.js +460 -0
  40. package/dist/storage.js.map +1 -0
  41. package/dist/table.d.ts +322 -0
  42. package/dist/table.d.ts.map +1 -0
  43. package/dist/table.js +734 -0
  44. package/dist/table.js.map +1 -0
  45. package/dist/transport-adapter.d.ts +37 -0
  46. package/dist/transport-adapter.d.ts.map +1 -0
  47. package/dist/transport-adapter.js +70 -0
  48. package/dist/transport-adapter.js.map +1 -0
  49. package/dist/types.d.ts +39 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +9 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +49 -0
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Collection client with query builder and CRUD operations
3
+ *: filter tuple format
4
+ *: OR filter (.or() chaining)
5
+ *: increment, deleteField
6
+ *: upsert
7
+ *: count
8
+ *: batch-by-filter
9
+ *: batch operations
10
+ * #136: /api/db/{namespace}/tables/{name} URL scheme
11
+ *
12
+ * All HTTP calls delegate to Generated Core (api-core.ts).
13
+ * No hardcoded API paths — the core is the single source of truth.
14
+ */
15
+ import type { HttpClient } from './http.js';
16
+ import { type GeneratedDbApi } from './generated/api-core.js';
17
+ import { EdgeBaseError } from './errors.js';
18
+ import type { IDatabaseLiveSubscriber, IDbChange, FilterMatchFn } from './types.js';
19
+ /** Filter tuple: [field, operator, value] */
20
+ export type FilterTuple = [string, string, unknown];
21
+ /**
22
+ * Query result — unified type for both offset and cursor pagination.
23
+ *: SDK ListResult unification + cursor pagination support.
24
+ *
25
+ * Offset mode (default): total/page/perPage are populated, hasMore/cursor are null.
26
+ * Cursor mode (.after/.before): hasMore/cursor are populated, total/page/perPage are null.
27
+ * Rules-filtered mode: total is null, hasMore/cursor are populated.
28
+ */
29
+ export interface ListResult<T> {
30
+ items: T[];
31
+ total: number | null;
32
+ page: number | null;
33
+ perPage: number | null;
34
+ hasMore: boolean | null;
35
+ cursor: string | null;
36
+ }
37
+ /** Upsert result */
38
+ export interface UpsertResult<T> {
39
+ item: T;
40
+ action: 'inserted' | 'updated';
41
+ }
42
+ /** Batch-by-filter result */
43
+ export interface BatchByFilterResult {
44
+ totalProcessed: number;
45
+ totalSucceeded: number;
46
+ errors: Array<{
47
+ chunkIndex: number;
48
+ chunkSize: number;
49
+ error: EdgeBaseError;
50
+ }>;
51
+ }
52
+ /**
53
+ * Document reference for single-record operations.
54
+ * Created via `client.db('shared').table('posts').doc('post-1')`
55
+ */
56
+ export declare class DocRef<T = Record<string, unknown>> {
57
+ private core;
58
+ private namespace;
59
+ private instanceId;
60
+ private tableName;
61
+ private id;
62
+ private databaseLiveClient?;
63
+ private filterMatchFn?;
64
+ constructor(core: GeneratedDbApi, namespace: string, instanceId: string | undefined, tableName: string, id: string, databaseLiveClient?: IDatabaseLiveSubscriber | undefined, filterMatchFn?: FilterMatchFn | undefined);
65
+ /** Get a single record */
66
+ get(): Promise<T>;
67
+ /** Update a record (supports increment, deleteField) */
68
+ update(data: Partial<T>): Promise<T>;
69
+ /** Delete a record */
70
+ delete(): Promise<void>;
71
+ /**
72
+ * Subscribe to database-live changes for this document.
73
+ * Returns an unsubscribe function.
74
+ *
75
+ * @example
76
+ * const unsub = client.db('shared').table('posts').doc('post-1').onSnapshot((post) => {
77
+ * console.log('Post updated:', post);
78
+ * });
79
+ */
80
+ onSnapshot(callback: (data: T | null, change: IDbChange<T>) => void): () => void;
81
+ }
82
+ /**
83
+ * Collection reference with query builder (immutable chaining).
84
+ * Created via `client.db('shared').table('posts')`
85
+ *
86
+ * @example
87
+ * const result = await client.db('shared').table('posts')
88
+ * .where('status', '==', 'published')
89
+ * .orderBy('createdAt', 'desc')
90
+ * .limit(20)
91
+ * .getList();
92
+ */
93
+ export declare class TableRef<T = Record<string, unknown>> {
94
+ private core;
95
+ /** Table name within the DB block */
96
+ private name;
97
+ private databaseLiveClient?;
98
+ private filterMatchFn?;
99
+ /** DB namespace: 'shared' | 'workspace' | 'user' | ... (§2) */
100
+ private namespace;
101
+ /** DB instance ID for dynamic DOs (e.g. 'ws-456'). Omit for static DBs. */
102
+ private instanceId?;
103
+ /**
104
+ * Raw HttpClient — only used for sql() which is admin-only and not in client core.
105
+ * TODO: remove once admin core is wired.
106
+ */
107
+ private _httpClient?;
108
+ private filters;
109
+ private orFilters;
110
+ private sorts;
111
+ private limitValue?;
112
+ private offsetValue?;
113
+ private pageValue?;
114
+ private searchQuery?;
115
+ private afterCursor?;
116
+ private beforeCursor?;
117
+ constructor(core: GeneratedDbApi,
118
+ /** Table name within the DB block */
119
+ name: string, databaseLiveClient?: IDatabaseLiveSubscriber | undefined, filterMatchFn?: FilterMatchFn | undefined,
120
+ /** DB namespace: 'shared' | 'workspace' | 'user' | ... (§2) */
121
+ namespace?: string,
122
+ /** DB instance ID for dynamic DOs (e.g. 'ws-456'). Omit for static DBs. */
123
+ instanceId?: string | undefined,
124
+ /**
125
+ * Raw HttpClient — only used for sql() which is admin-only and not in client core.
126
+ * TODO: remove once admin core is wired.
127
+ */
128
+ _httpClient?: HttpClient | undefined);
129
+ /** Create a clone with current state (for immutable chaining) */
130
+ private clone;
131
+ /** Add a filter condition */
132
+ where(field: string, operator: string, value: unknown): TableRef<T>;
133
+ /**
134
+ * Add OR conditions.
135
+ * Conditions inside the builder are joined with OR.
136
+ *
137
+ * @example
138
+ * client.db('shared').table('posts')
139
+ * .where('createdAt', '>', '2025-01-01') // AND
140
+ * .or(q => q.where('status', '==', 'draft').where('status', '==', 'archived')) // OR
141
+ * .getList()
142
+ */
143
+ or(builder: (q: OrBuilder) => OrBuilder): TableRef<T>;
144
+ /** Add sort order (supports multiple — chained calls accumulate) */
145
+ orderBy(field: string, direction?: 'asc' | 'desc'): TableRef<T>;
146
+ /** Set result limit */
147
+ limit(n: number): TableRef<T>;
148
+ /** Set result offset */
149
+ offset(n: number): TableRef<T>;
150
+ /** Set page number for offset pagination (1-based) */
151
+ page(n: number): TableRef<T>;
152
+ /** Set full-text search query */
153
+ search(query: string): TableRef<T>;
154
+ /**
155
+ * Set cursor for forward pagination.
156
+ * Fetches records with id > cursor. Mutually exclusive with page()/offset().
157
+ */
158
+ after(cursor: string): TableRef<T>;
159
+ /**
160
+ * Set cursor for backward pagination.
161
+ * Fetches records with id < cursor. Mutually exclusive with page()/offset().
162
+ */
163
+ before(cursor: string): TableRef<T>;
164
+ /** Build query parameters from current state */
165
+ private buildQueryParams;
166
+ /** Get a document reference for single-record operations */
167
+ doc(id: string): DocRef<T>;
168
+ /**
169
+ * List records with filters, sorting, and pagination.
170
+ * Parses server response into unified ListResult with both offset and cursor fields.
171
+ */
172
+ getList(): Promise<ListResult<T>>;
173
+ /** Alias for getList() to match existing docs and SDK usage. */
174
+ get(): Promise<ListResult<T>>;
175
+ /** Get a single record by ID */
176
+ getOne(id: string): Promise<T>;
177
+ /**
178
+ * Get the first record matching the current query conditions.
179
+ * Returns null if no records match.
180
+ *
181
+ * @example
182
+ * const user = await client.db('shared').table('users')
183
+ * .where('email', '==', 'june@example.com')
184
+ * .getFirst();
185
+ */
186
+ getFirst(): Promise<T | null>;
187
+ /** Insert a new record */
188
+ insert(data: Partial<T>): Promise<T>;
189
+ /** Update a record by ID (supports increment, deleteField) */
190
+ update(id: string, data: Partial<T>): Promise<T>;
191
+ /** Delete a record by ID */
192
+ delete(id: string): Promise<void>;
193
+ /** Upsert: insert or update */
194
+ upsert(data: Partial<T>, options?: {
195
+ conflictTarget?: string;
196
+ }): Promise<T & {
197
+ action: 'inserted' | 'updated';
198
+ }>;
199
+ /** Batch upsert */
200
+ upsertMany(items: Array<Partial<T>>, options?: {
201
+ conflictTarget?: string;
202
+ }): Promise<T[]>;
203
+ /** Count records matching filters */
204
+ count(): Promise<number>;
205
+ /**
206
+ * Batch insert.
207
+ * Auto-chunks into 500-item batches.
208
+ * Each chunk is an independent transaction — partial failure possible across chunks.
209
+ */
210
+ insertMany(items: Array<Partial<T>>): Promise<T[]>;
211
+ /**
212
+ * Batch update matching records.
213
+ * Processes 500 records per call, max 100 iterations.
214
+ */
215
+ updateMany(data: Partial<T>): Promise<BatchByFilterResult>;
216
+ /**
217
+ * Batch delete matching records.
218
+ * Processes 500 records per call, max 100 iterations.
219
+ */
220
+ deleteMany(): Promise<BatchByFilterResult>;
221
+ /** Internal: batch-by-filter calls */
222
+ private batchByFilter;
223
+ /**
224
+ * Subscribe to table changes via database-live.
225
+ * By default, client-side filtering is applied for where() conditions.
226
+ * With `{ serverFilter: true }`, filters are evaluated server-side for bandwidth savings.
227
+ * Returns an unsubscribe function.
228
+ *
229
+ * @example
230
+ * // Client-side filtering (default)
231
+ * const unsub = client.db('shared').table('posts')
232
+ * .where('status', '==', 'published')
233
+ * .onSnapshot((snapshot) => {
234
+ * console.log('Updated posts:', snapshot.items);
235
+ * });
236
+ */
237
+ onSnapshot(callback: (snapshot: {
238
+ items: T[];
239
+ changes: {
240
+ added: T[];
241
+ modified: T[];
242
+ removed: T[];
243
+ };
244
+ }) => void, options?: {
245
+ serverFilter?: boolean;
246
+ }): () => void;
247
+ /**
248
+ * Execute raw SQL on this table's DO.
249
+ * Tagged template — interpolated values are automatically extracted as bind params,
250
+ * preventing SQL injection.
251
+ *
252
+ * NOTE: Admin-only (/api/sql). Uses raw HttpClient since this endpoint is
253
+ * in the admin core, not the client core. Requires Service Key auth.
254
+ *
255
+ * @example
256
+ * // In App Functions or server-side code
257
+ * const results = await context.admin.db('shared').table('posts').sql`
258
+ * SELECT p.*, COUNT(c.id) as commentCount
259
+ * FROM posts p LEFT JOIN comments c ON c.postId = p.id
260
+ * WHERE p.status = ${'published'}
261
+ * GROUP BY p.id
262
+ * `;
263
+ */
264
+ sql(strings: TemplateStringsArray, ...values: unknown[]): Promise<unknown[]>;
265
+ }
266
+ /**
267
+ * DB block reference. Returned by `client.db(namespace, id?)`.
268
+ * Provides `.table(name)` to get a TableRef for a specific table.
269
+ *
270
+ * @example
271
+ * // Static shared DB
272
+ * const postsRef = client.db('shared').table('posts');
273
+ *
274
+ * // Dynamic workspace DB
275
+ * const docsRef = client.db('workspace', 'ws-456').table('documents');
276
+ */
277
+ export declare class DbRef {
278
+ private core;
279
+ /** DB namespace: 'shared' | 'workspace' | 'user' | ... */
280
+ private namespace;
281
+ /** DB instance ID for dynamic DOs (e.g. 'ws-456'). Omit for static DBs. */
282
+ private instanceId?;
283
+ private databaseLiveClient?;
284
+ private filterMatchFn?;
285
+ /**
286
+ * Raw HttpClient — only passed through to TableRef for sql().
287
+ * TODO: remove once admin core is wired.
288
+ */
289
+ private _httpClient?;
290
+ constructor(core: GeneratedDbApi,
291
+ /** DB namespace: 'shared' | 'workspace' | 'user' | ... */
292
+ namespace: string,
293
+ /** DB instance ID for dynamic DOs (e.g. 'ws-456'). Omit for static DBs. */
294
+ instanceId?: string | undefined, databaseLiveClient?: IDatabaseLiveSubscriber | undefined, filterMatchFn?: FilterMatchFn | undefined,
295
+ /**
296
+ * Raw HttpClient — only passed through to TableRef for sql().
297
+ * TODO: remove once admin core is wired.
298
+ */
299
+ _httpClient?: HttpClient | undefined);
300
+ /**
301
+ * Select a table within this DB block.
302
+ * Returns a TableRef configured with the correct namespace/instanceId.
303
+ *
304
+ * @param name — Table name (as defined in config.databases[namespace].tables)
305
+ */
306
+ table<T = Record<string, unknown>>(name: string): TableRef<T>;
307
+ }
308
+ /**
309
+ * Builder for OR conditions.
310
+ * Used with .or() method on TableRef.
311
+ *
312
+ * @example
313
+ * client.db('shared').table('posts')
314
+ * .or(q => q.where('status', '==', 'draft').where('authorId', '==', 'user-123'))
315
+ * .getList()
316
+ */
317
+ export declare class OrBuilder {
318
+ private filters;
319
+ where(field: string, operator: string, value: unknown): OrBuilder;
320
+ getFilters(): FilterTuple[];
321
+ }
322
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}