@edge-base/admin 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.
@@ -0,0 +1,134 @@
1
+ import { HttpClientAdapter, DefaultDbApi } from '@edge-base/core';
2
+ import { DefaultAdminApi } from './generated/admin-api-core.js';
3
+ // ─── AnalyticsClient ───
4
+ export class AnalyticsClient {
5
+ core;
6
+ adminCore;
7
+ constructor(httpClient) {
8
+ const adapter = new HttpClientAdapter(httpClient);
9
+ this.core = new DefaultDbApi(adapter);
10
+ this.adminCore = new DefaultAdminApi(adapter);
11
+ }
12
+ // ── Feature 1: Request Log Metrics ──
13
+ /**
14
+ * Get a full analytics overview (time series + summary + breakdown + top endpoints).
15
+ *
16
+ * @example
17
+ * const overview = await admin.analytics.overview({ range: '7d' });
18
+ * console.log(overview.summary.totalRequests);
19
+ */
20
+ async overview(options) {
21
+ const query = this.buildQuery({ ...options, metric: 'overview' });
22
+ return this.adminCore.queryAnalytics(query);
23
+ }
24
+ /**
25
+ * Get time series data only.
26
+ *
27
+ * @example
28
+ * const ts = await admin.analytics.timeSeries({ range: '24h', category: 'db' });
29
+ */
30
+ async timeSeries(options) {
31
+ const query = this.buildQuery({ ...options, metric: 'timeSeries' });
32
+ const res = await this.adminCore.queryAnalytics(query);
33
+ return res.timeSeries;
34
+ }
35
+ /**
36
+ * Get breakdown data (by category, status code, etc.).
37
+ *
38
+ * @example
39
+ * const breakdown = await admin.analytics.breakdown({ range: '30d' });
40
+ */
41
+ async breakdown(options) {
42
+ const query = this.buildQuery({ ...options, metric: 'breakdown' });
43
+ const res = await this.adminCore.queryAnalytics(query);
44
+ return res.breakdown;
45
+ }
46
+ /**
47
+ * Get top endpoints by request count.
48
+ *
49
+ * @example
50
+ * const top = await admin.analytics.topEndpoints({ range: '7d', category: 'auth' });
51
+ */
52
+ async topEndpoints(options) {
53
+ const query = this.buildQuery({ ...options, metric: 'topEndpoints' });
54
+ const res = await this.adminCore.queryAnalytics(query);
55
+ return res.topItems;
56
+ }
57
+ // ── Feature 2: Custom Events ──
58
+ /**
59
+ * Track a single custom event.
60
+ *
61
+ * @param name Event name (e.g. 'user_upgraded')
62
+ * @param properties Arbitrary key-value data (max 50 keys, max 4KB)
63
+ * @param userId User ID to associate (Service Key callers only)
64
+ *
65
+ * @example
66
+ * await admin.analytics.track('user_upgraded', { plan: 'pro', amount: 29.99 }, 'user-123');
67
+ */
68
+ async track(name, properties, userId) {
69
+ const event = { name };
70
+ if (properties)
71
+ event.properties = properties;
72
+ if (userId)
73
+ event.userId = userId;
74
+ await this.core.trackEvents({ events: [event] });
75
+ }
76
+ /**
77
+ * Track multiple custom events in a single request (max 100).
78
+ *
79
+ * @example
80
+ * await admin.analytics.trackBatch([
81
+ * { name: 'page_view', properties: { path: '/pricing' } },
82
+ * { name: 'page_view', properties: { path: '/docs' } },
83
+ * ]);
84
+ */
85
+ async trackBatch(events) {
86
+ await this.core.trackEvents({ events });
87
+ }
88
+ /**
89
+ * Query custom events. Returns different shapes based on `metric`.
90
+ *
91
+ * @example
92
+ * // List events
93
+ * const list = await admin.analytics.queryEvents({ event: 'purchase', metric: 'list', limit: 20 });
94
+ *
95
+ * // Count
96
+ * const count = await admin.analytics.queryEvents({ event: 'purchase', metric: 'count' });
97
+ *
98
+ * // Time series
99
+ * const ts = await admin.analytics.queryEvents({ metric: 'timeSeries', groupBy: 'day' });
100
+ *
101
+ * // Top events
102
+ * const top = await admin.analytics.queryEvents({ metric: 'topEvents' });
103
+ */
104
+ async queryEvents(options) {
105
+ const query = {};
106
+ if (options?.range)
107
+ query.range = options.range;
108
+ if (options?.event)
109
+ query.event = options.event;
110
+ if (options?.userId)
111
+ query.userId = options.userId;
112
+ if (options?.metric)
113
+ query.metric = options.metric;
114
+ if (options?.groupBy)
115
+ query.groupBy = options.groupBy;
116
+ if (options?.limit)
117
+ query.limit = String(options.limit);
118
+ if (options?.cursor)
119
+ query.cursor = options.cursor;
120
+ return this.adminCore.queryCustomEvents(query);
121
+ }
122
+ // ── Internal ──
123
+ buildQuery(opts) {
124
+ const q = { metric: opts.metric };
125
+ if (opts.range)
126
+ q.range = opts.range;
127
+ if (opts.category)
128
+ q.category = opts.category;
129
+ if (opts.groupBy)
130
+ q.groupBy = opts.groupBy;
131
+ return q;
132
+ }
133
+ }
134
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @edge-base/admin — Admin/Server-side EdgeBase SDK (Node.js / Edge Functions / Dart Frog)
3
+ *
4
+ * @example External server (url + serviceKey required):
5
+ * import { createAdminClient } from '@edge-base/admin';
6
+ * const admin = createAdminClient('https://my-app.edgebase.fun', {
7
+ * serviceKey: process.env.EDGEBASE_SERVICE_KEY,
8
+ * });
9
+ * const post = await admin.db('shared').table('posts').insert({ title: 'Hello' });
10
+ *
11
+ * @example App Functions (auto-detects url + serviceKey from env):
12
+ * import { createAdminClient } from '@edge-base/admin';
13
+ * const admin = createAdminClient();
14
+ */
15
+ import { DbRef } from '@edge-base/core';
16
+ import { StorageClient } from '@edge-base/core';
17
+ import { FunctionsClient } from '@edge-base/core';
18
+ import { AdminAuthClient } from './admin-auth.js';
19
+ import { KvClient } from './kv.js';
20
+ import { D1Client } from './d1.js';
21
+ import { VectorizeClient } from './vectorize.js';
22
+ import { PushClient } from './push.js';
23
+ import { AnalyticsClient } from './analytics.js';
24
+ /** Options for createAdminClient() */
25
+ export interface JuneAdminClientOptions {
26
+ /**
27
+ * Service Key for admin operations.
28
+ * Optional when called with no args from App Functions — falls back to EDGEBASE_SERVICE_KEY env var.
29
+ */
30
+ serviceKey?: string;
31
+ /** Schema from typegen (build-time metadata) */
32
+ schema?: Record<string, unknown>;
33
+ }
34
+ /**
35
+ * Admin-side EdgeBase SDK.
36
+ * Exposes: auth, db, storage, sql, kv, d1, vector, broadcast, destroy.
37
+ * Does NOT expose: auth, database-live, presence, channel (client-only).
38
+ *
39
+ * @example
40
+ * const posts = await admin.db('shared').table('posts').get();
41
+ * const docs = await admin.db('workspace', 'ws-456').table('documents').get();
42
+ */
43
+ export declare class AdminEdgeBase {
44
+ /** Admin user management. */
45
+ readonly auth: AdminAuthClient;
46
+ readonly storage: StorageClient;
47
+ readonly push: PushClient;
48
+ readonly analytics: AnalyticsClient;
49
+ readonly functions: FunctionsClient;
50
+ private httpClient;
51
+ private contextManager;
52
+ private baseUrl;
53
+ private core;
54
+ private adminCore;
55
+ constructor(url: string, options: JuneAdminClientOptions);
56
+ /**
57
+ * Access a DB block by namespace + optional instance ID. (§2)
58
+ *
59
+ * @example
60
+ * // Static shared DB (id omitted)
61
+ * const posts = await admin.db('shared').table('posts').get();
62
+ *
63
+ * // Dynamic workspace DB
64
+ * const docs = await admin.db('workspace', 'ws-456').table('documents').get();
65
+ *
66
+ * // Per-user DB
67
+ * const notes = await admin.db('user', 'user-123').table('notes').get();
68
+ */
69
+ db(namespace: string, id?: string): DbRef;
70
+ /**
71
+ * Execute raw SQL on a DB table's DO.
72
+ *
73
+ * @param namespace DB namespace ('shared' | 'workspace' | ...)
74
+ * @param id DB instance ID for dynamic DOs. Omit for static DBs.
75
+ * @param query SQL query string (use '?' for bind params)
76
+ * @param params Bind parameters matching '?' placeholders
77
+ */
78
+ sql(namespace: string, id: string | undefined, query: string, params?: unknown[]): Promise<unknown[]>;
79
+ /**
80
+ * Simple form: sql(query) — executes against default 'shared' namespace.
81
+ */
82
+ sql(query: string): Promise<unknown[]>;
83
+ /**
84
+ * Broadcast a message to a database-live channel from the server.
85
+ */
86
+ broadcast(channel: string, event: string, payload?: Record<string, unknown>): Promise<void>;
87
+ kv(namespace: string): KvClient;
88
+ d1(database: string): D1Client;
89
+ vector(index: string): VectorizeClient;
90
+ destroy(): void;
91
+ }
92
+ /**
93
+ * Create an admin-side EdgeBase SDK instance.
94
+ */
95
+ export declare function createAdminClient(url?: string, options?: JuneAdminClientOptions): AdminEdgeBase;
96
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIjD,sCAAsC;AACtC,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAID;;;;;;;;GAQG;AACH,qBAAa,aAAa;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IAEpC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,SAAS,CAAkB;gBAEvB,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB;IAmBxD;;;;;;;;;;;;OAYG;IACH,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK;IAIzC;;;;;;;OAOG;IACG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3G;;OAEG;IACG,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA+B5C;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ;IAI/B,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ;IAI9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAItC,OAAO,IAAI,IAAI;CAChB;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,CAAC,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,sBAAsB,GAC/B,aAAa,CA4Bf"}
package/dist/client.js ADDED
@@ -0,0 +1,153 @@
1
+ /**
2
+ * @edge-base/admin — Admin/Server-side EdgeBase SDK (Node.js / Edge Functions / Dart Frog)
3
+ *
4
+ * @example External server (url + serviceKey required):
5
+ * import { createAdminClient } from '@edge-base/admin';
6
+ * const admin = createAdminClient('https://my-app.edgebase.fun', {
7
+ * serviceKey: process.env.EDGEBASE_SERVICE_KEY,
8
+ * });
9
+ * const post = await admin.db('shared').table('posts').insert({ title: 'Hello' });
10
+ *
11
+ * @example App Functions (auto-detects url + serviceKey from env):
12
+ * import { createAdminClient } from '@edge-base/admin';
13
+ * const admin = createAdminClient();
14
+ */
15
+ import { HttpClient } from '@edge-base/core';
16
+ import { ContextManager } from '@edge-base/core';
17
+ import { DbRef } from '@edge-base/core';
18
+ import { StorageClient } from '@edge-base/core';
19
+ import { FunctionsClient } from '@edge-base/core';
20
+ import { DefaultDbApi, HttpClientAdapter } from '@edge-base/core';
21
+ import { DefaultAdminApi } from './generated/admin-api-core.js';
22
+ import { AdminAuthClient } from './admin-auth.js';
23
+ import { KvClient } from './kv.js';
24
+ import { D1Client } from './d1.js';
25
+ import { VectorizeClient } from './vectorize.js';
26
+ import { PushClient } from './push.js';
27
+ import { AnalyticsClient } from './analytics.js';
28
+ // ─── Admin SDK ───
29
+ /**
30
+ * Admin-side EdgeBase SDK.
31
+ * Exposes: auth, db, storage, sql, kv, d1, vector, broadcast, destroy.
32
+ * Does NOT expose: auth, database-live, presence, channel (client-only).
33
+ *
34
+ * @example
35
+ * const posts = await admin.db('shared').table('posts').get();
36
+ * const docs = await admin.db('workspace', 'ws-456').table('documents').get();
37
+ */
38
+ export class AdminEdgeBase {
39
+ /** Admin user management. */
40
+ auth;
41
+ storage;
42
+ push;
43
+ analytics;
44
+ functions;
45
+ httpClient;
46
+ contextManager;
47
+ baseUrl;
48
+ core;
49
+ adminCore;
50
+ constructor(url, options) {
51
+ this.baseUrl = url.replace(/\/$/, '');
52
+ this.contextManager = new ContextManager();
53
+ this.httpClient = new HttpClient({
54
+ baseUrl: this.baseUrl,
55
+ serviceKey: options.serviceKey,
56
+ contextManager: this.contextManager,
57
+ });
58
+ const adapter = new HttpClientAdapter(this.httpClient);
59
+ this.core = new DefaultDbApi(adapter);
60
+ this.adminCore = new DefaultAdminApi(adapter);
61
+ const authClient = new AdminAuthClient(this.httpClient, true);
62
+ this.auth = authClient;
63
+ this.storage = new StorageClient(this.httpClient, this.core);
64
+ this.push = new PushClient(this.httpClient);
65
+ this.analytics = new AnalyticsClient(this.httpClient);
66
+ this.functions = new FunctionsClient(this.httpClient);
67
+ }
68
+ /**
69
+ * Access a DB block by namespace + optional instance ID. (§2)
70
+ *
71
+ * @example
72
+ * // Static shared DB (id omitted)
73
+ * const posts = await admin.db('shared').table('posts').get();
74
+ *
75
+ * // Dynamic workspace DB
76
+ * const docs = await admin.db('workspace', 'ws-456').table('documents').get();
77
+ *
78
+ * // Per-user DB
79
+ * const notes = await admin.db('user', 'user-123').table('notes').get();
80
+ */
81
+ db(namespace, id) {
82
+ return new DbRef(this.core, namespace, id, undefined, undefined, this.httpClient);
83
+ }
84
+ async sql(namespaceOrTable, idOrQuery, queryOrParams, params) {
85
+ // Detect overload: if 3rd arg is string it's the new (namespace, id, query, params) form
86
+ if (typeof queryOrParams === 'string') {
87
+ // New form: sql(namespace, id, sql, params)
88
+ const res = await this.adminCore.executeSql({
89
+ namespace: namespaceOrTable,
90
+ id: idOrQuery,
91
+ sql: queryOrParams,
92
+ params: params ?? [],
93
+ });
94
+ return res.items ?? [];
95
+ }
96
+ if (idOrQuery === undefined) {
97
+ // Simple form: sql(query)
98
+ const res = await this.adminCore.executeSql({
99
+ namespace: 'shared',
100
+ id: undefined,
101
+ sql: namespaceOrTable,
102
+ params: [],
103
+ });
104
+ return res.items ?? [];
105
+ }
106
+ throw new Error('Invalid sql() signature. Use sql(namespace, id, query, params) or sql(query).');
107
+ }
108
+ /**
109
+ * Broadcast a message to a database-live channel from the server.
110
+ */
111
+ async broadcast(channel, event, payload) {
112
+ await this.adminCore.databaseLiveBroadcast({ channel, event, payload });
113
+ }
114
+ kv(namespace) {
115
+ return new KvClient(this.httpClient, namespace);
116
+ }
117
+ d1(database) {
118
+ return new D1Client(this.httpClient, database);
119
+ }
120
+ vector(index) {
121
+ return new VectorizeClient(this.httpClient, index);
122
+ }
123
+ destroy() { }
124
+ }
125
+ // ─── Factory ───
126
+ /**
127
+ * Create an admin-side EdgeBase SDK instance.
128
+ */
129
+ export function createAdminClient(url, options) {
130
+ const getEnv = (key) => {
131
+ const processValue = typeof process !== 'undefined' && process.env
132
+ ? process.env[key]
133
+ : undefined;
134
+ if (typeof processValue === 'string' && processValue.length > 0) {
135
+ return processValue;
136
+ }
137
+ if (typeof globalThis === 'undefined')
138
+ return undefined;
139
+ const globalValue = globalThis[key];
140
+ return typeof globalValue === 'string' ? globalValue : undefined;
141
+ };
142
+ const resolvedUrl = url ?? getEnv('EDGEBASE_URL') ?? 'http://localhost';
143
+ const resolvedServiceKey = options?.serviceKey ?? getEnv('EDGEBASE_SERVICE_KEY');
144
+ if (!resolvedServiceKey) {
145
+ console.warn('[EdgeBase] createAdminClient(): no serviceKey provided and EDGEBASE_SERVICE_KEY env var not set. ' +
146
+ 'Admin operations (auth, sql, broadcast) will fail.');
147
+ }
148
+ return new AdminEdgeBase(resolvedUrl, {
149
+ ...options,
150
+ serviceKey: resolvedServiceKey ?? '',
151
+ });
152
+ }
153
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/d1.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * D1Client — SDK client for user-defined D1 databases
3
+ *
4
+ * Usage:
5
+ * const admin = createAdminClient(url, { serviceKey });
6
+ * const rows = await admin.d1('analytics').exec('SELECT * FROM events WHERE type = ?', ['pageview']);
7
+ */
8
+ import type { HttpClient } from '@edge-base/core';
9
+ export declare class D1Client {
10
+ private adminCore;
11
+ private database;
12
+ constructor(httpClient: HttpClient, database: string);
13
+ /**
14
+ * Execute a SQL query on the D1 database.
15
+ * All SQL is allowed (DDL included) — Service Key holders are admin-level trusted.
16
+ * Use ? placeholders for bind parameters (SQL injection prevention).
17
+ *
18
+ * @param query SQL query string with ? placeholders
19
+ * @param params Bind parameters
20
+ * @returns Array of result rows
21
+ */
22
+ exec<T = Record<string, unknown>>(query: string, params?: unknown[]): Promise<T[]>;
23
+ /**
24
+ * Alias for `exec()` — execute a SQL query on the D1 database.
25
+ */
26
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<T[]>;
27
+ }
28
+ //# sourceMappingURL=d1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1.d.ts","sourceRoot":"","sources":["../src/d1.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAS;gBAEb,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM;IAKpD;;;;;;;;OAQG;IACG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAQxF;;OAEG;IACH,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAGlF"}
package/dist/d1.js ADDED
@@ -0,0 +1,33 @@
1
+ import { HttpClientAdapter } from '@edge-base/core';
2
+ import { DefaultAdminApi } from './generated/admin-api-core.js';
3
+ export class D1Client {
4
+ adminCore;
5
+ database;
6
+ constructor(httpClient, database) {
7
+ this.adminCore = new DefaultAdminApi(new HttpClientAdapter(httpClient));
8
+ this.database = database;
9
+ }
10
+ /**
11
+ * Execute a SQL query on the D1 database.
12
+ * All SQL is allowed (DDL included) — Service Key holders are admin-level trusted.
13
+ * Use ? placeholders for bind parameters (SQL injection prevention).
14
+ *
15
+ * @param query SQL query string with ? placeholders
16
+ * @param params Bind parameters
17
+ * @returns Array of result rows
18
+ */
19
+ async exec(query, params) {
20
+ const res = await this.adminCore.executeD1Query(this.database, {
21
+ query,
22
+ params,
23
+ });
24
+ return res.results;
25
+ }
26
+ /**
27
+ * Alias for `exec()` — execute a SQL query on the D1 database.
28
+ */
29
+ query(sql, params) {
30
+ return this.exec(sql, params);
31
+ }
32
+ }
33
+ //# sourceMappingURL=d1.js.map
package/dist/d1.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1.js","sourceRoot":"","sources":["../src/d1.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,OAAO,QAAQ;IACX,SAAS,CAAkB;IAC3B,QAAQ,CAAS;IAEzB,YAAY,UAAsB,EAAE,QAAgB;QAClD,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAA8B,KAAa,EAAE,MAAkB;QACvE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC7D,KAAK;YACL,MAAM;SACP,CAAqB,CAAC;QACvB,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAA8B,GAAW,EAAE,MAAkB;QAChE,OAAO,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;CACF"}