@lunora/bindings 1.0.0-alpha.1 → 1.0.0-alpha.3
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/dist/kv/index.d.mts +95 -1
- package/dist/kv/index.d.ts +95 -1
- package/dist/kv/index.mjs +1 -0
- package/dist/packem_shared/{R2SqlError-DkQZ4Omg.mjs → R2SqlError-DlDd_SrE.mjs} +6 -4
- package/dist/packem_shared/{SelectBuilder-BGXfCF0J.mjs → SelectBuilder-DHaXZwn_.mjs} +5 -5
- package/dist/packem_shared/{SetOperation-CGRu681M.mjs → SetOperation-RDHcxccj.mjs} +2 -2
- package/dist/packem_shared/{Sql-CkDyJ_Sc.mjs → Sql-DceGtcUd.mjs} +15 -1
- package/dist/packem_shared/{WindowExpression-C2vj7oNX.mjs → WindowExpression-Cg9s2xcr.mjs} +1 -1
- package/dist/packem_shared/{WindowFunction-CuKHfZX3.mjs → WindowFunction-DA3pGC3N.mjs} +3 -3
- package/dist/packem_shared/{asc-C6Jbaa6R.mjs → asc-Cur-xO8v.mjs} +1 -1
- package/dist/packem_shared/createKvIntrospector-BThrJVhP.mjs +75 -0
- package/dist/r2sql/index.mjs +7 -7
- package/package.json +1 -1
package/dist/kv/index.d.mts
CHANGED
|
@@ -174,4 +174,98 @@ interface Kv {
|
|
|
174
174
|
*/
|
|
175
175
|
declare const scopeKey: (prefix: string, key: string) => string;
|
|
176
176
|
declare const createKv: (options: LunoraKvOptions) => Kv;
|
|
177
|
-
|
|
177
|
+
/** One KV namespace as the studio's KV browser surfaces it (mirrors the runtime's KvNamespaceSummary). */
|
|
178
|
+
interface KvNamespaceSummaryLike {
|
|
179
|
+
binding: string;
|
|
180
|
+
}
|
|
181
|
+
/** One key entry as surfaced by the KV admin browser (mirrors the runtime's KvKeyEntry). */
|
|
182
|
+
interface KvKeyEntryLike {
|
|
183
|
+
expiration?: number;
|
|
184
|
+
metadata?: unknown;
|
|
185
|
+
name: string;
|
|
186
|
+
}
|
|
187
|
+
/** A paginated page of KV keys (mirrors the runtime's KvKeyListResult). */
|
|
188
|
+
interface KvKeyListResultLike {
|
|
189
|
+
cursor?: string;
|
|
190
|
+
keys: KvKeyEntryLike[];
|
|
191
|
+
listComplete: boolean;
|
|
192
|
+
}
|
|
193
|
+
/** A value together with its metadata (mirrors the runtime's KvValueResult). */
|
|
194
|
+
interface KvValueResultLike {
|
|
195
|
+
metadata: unknown;
|
|
196
|
+
value: null | string;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The structural shape of a KV introspector — mirrors `KvIntrospector` from
|
|
200
|
+
* `@lunora/runtime` without importing it, keeping the dependency graph clean.
|
|
201
|
+
*/
|
|
202
|
+
interface KvIntrospectorLike {
|
|
203
|
+
deleteKey: (options: {
|
|
204
|
+
key: string;
|
|
205
|
+
namespace: string;
|
|
206
|
+
}) => Promise<void>;
|
|
207
|
+
getValue: (options: {
|
|
208
|
+
key: string;
|
|
209
|
+
namespace: string;
|
|
210
|
+
}) => Promise<KvValueResultLike>;
|
|
211
|
+
listKeys: (options: {
|
|
212
|
+
cursor?: string;
|
|
213
|
+
limit?: number;
|
|
214
|
+
namespace: string;
|
|
215
|
+
prefix?: string;
|
|
216
|
+
}) => Promise<KvKeyListResultLike>;
|
|
217
|
+
listNamespaces: () => Promise<KvNamespaceSummaryLike[]>;
|
|
218
|
+
putValue: (options: {
|
|
219
|
+
expiration?: number;
|
|
220
|
+
expirationTtl?: number;
|
|
221
|
+
key: string;
|
|
222
|
+
metadata?: unknown;
|
|
223
|
+
namespace: string;
|
|
224
|
+
value: string;
|
|
225
|
+
}) => Promise<void>;
|
|
226
|
+
}
|
|
227
|
+
/** Construction options for {@link createKvIntrospector}. */
|
|
228
|
+
interface CreateKvIntrospectorOptions {
|
|
229
|
+
/**
|
|
230
|
+
* Map of binding name → bound KV namespace. Each entry becomes one
|
|
231
|
+
* namespace the studio can browse. Example:
|
|
232
|
+
* ```ts
|
|
233
|
+
* createKvIntrospector({ namespaces: { MY_KV: env.MY_KV } })
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
namespaces: Record<string, KVNamespaceLike>;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Build a `KvIntrospector`-compatible object from a map of bound KV namespaces.
|
|
240
|
+
* Pass the result as `kvIntrospector` on `WorkerOptions` to enable the studio's
|
|
241
|
+
* KV browser (`/_lunora/admin/kv/*` endpoints).
|
|
242
|
+
* @example
|
|
243
|
+
* ```ts
|
|
244
|
+
* createWorker({
|
|
245
|
+
* // …
|
|
246
|
+
* kvIntrospector: createKvIntrospector({ namespaces: { MY_KV: env.MY_KV } }),
|
|
247
|
+
* });
|
|
248
|
+
* ```
|
|
249
|
+
*/
|
|
250
|
+
declare const createKvIntrospector: (options: CreateKvIntrospectorOptions) => KvIntrospectorLike;
|
|
251
|
+
/**
|
|
252
|
+
* Zero-config KV introspector: scan a worker `env` for every bound Workers KV
|
|
253
|
+
* namespace and register each under its binding name. Every `kv_namespaces` entry
|
|
254
|
+
* in `wrangler.jsonc` then appears in the studio's KV browser automatically — no
|
|
255
|
+
* hand-written `createKvIntrospector({ namespaces: … })` call, and any binding
|
|
256
|
+
* name (not just `KV`) and any number of namespaces light up. Non-KV bindings
|
|
257
|
+
* (R2, Durable Objects, queues, secrets, …) are skipped via {@link isKvNamespace}.
|
|
258
|
+
*
|
|
259
|
+
* Returns an introspector even when `env` holds no KV namespaces — its
|
|
260
|
+
* `listNamespaces()` resolves to `[]`, so the studio renders an empty state
|
|
261
|
+
* rather than a "not configured" error.
|
|
262
|
+
* @example
|
|
263
|
+
* ```ts
|
|
264
|
+
* createWorker({
|
|
265
|
+
* // …
|
|
266
|
+
* kvIntrospector: createKvIntrospectorFromEnv(env),
|
|
267
|
+
* });
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
declare const createKvIntrospectorFromEnv: (env: unknown) => KvIntrospectorLike;
|
|
271
|
+
export { type CreateKvIntrospectorOptions, type KVNamespaceLike, type Kv, type KvGetOptions, type KvIntrospectorLike, type KvListKey, type KvListOptions, type KvListResult, type KvNamespaceListResult, type KvNamespacePutOptions, type KvPutOptions, type KvValue, type KvValueType, type KvValueWithMetadata, type LunoraKvOptions, createKv, createKvIntrospector, createKvIntrospectorFromEnv, scopeKey };
|
package/dist/kv/index.d.ts
CHANGED
|
@@ -174,4 +174,98 @@ interface Kv {
|
|
|
174
174
|
*/
|
|
175
175
|
declare const scopeKey: (prefix: string, key: string) => string;
|
|
176
176
|
declare const createKv: (options: LunoraKvOptions) => Kv;
|
|
177
|
-
|
|
177
|
+
/** One KV namespace as the studio's KV browser surfaces it (mirrors the runtime's KvNamespaceSummary). */
|
|
178
|
+
interface KvNamespaceSummaryLike {
|
|
179
|
+
binding: string;
|
|
180
|
+
}
|
|
181
|
+
/** One key entry as surfaced by the KV admin browser (mirrors the runtime's KvKeyEntry). */
|
|
182
|
+
interface KvKeyEntryLike {
|
|
183
|
+
expiration?: number;
|
|
184
|
+
metadata?: unknown;
|
|
185
|
+
name: string;
|
|
186
|
+
}
|
|
187
|
+
/** A paginated page of KV keys (mirrors the runtime's KvKeyListResult). */
|
|
188
|
+
interface KvKeyListResultLike {
|
|
189
|
+
cursor?: string;
|
|
190
|
+
keys: KvKeyEntryLike[];
|
|
191
|
+
listComplete: boolean;
|
|
192
|
+
}
|
|
193
|
+
/** A value together with its metadata (mirrors the runtime's KvValueResult). */
|
|
194
|
+
interface KvValueResultLike {
|
|
195
|
+
metadata: unknown;
|
|
196
|
+
value: null | string;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The structural shape of a KV introspector — mirrors `KvIntrospector` from
|
|
200
|
+
* `@lunora/runtime` without importing it, keeping the dependency graph clean.
|
|
201
|
+
*/
|
|
202
|
+
interface KvIntrospectorLike {
|
|
203
|
+
deleteKey: (options: {
|
|
204
|
+
key: string;
|
|
205
|
+
namespace: string;
|
|
206
|
+
}) => Promise<void>;
|
|
207
|
+
getValue: (options: {
|
|
208
|
+
key: string;
|
|
209
|
+
namespace: string;
|
|
210
|
+
}) => Promise<KvValueResultLike>;
|
|
211
|
+
listKeys: (options: {
|
|
212
|
+
cursor?: string;
|
|
213
|
+
limit?: number;
|
|
214
|
+
namespace: string;
|
|
215
|
+
prefix?: string;
|
|
216
|
+
}) => Promise<KvKeyListResultLike>;
|
|
217
|
+
listNamespaces: () => Promise<KvNamespaceSummaryLike[]>;
|
|
218
|
+
putValue: (options: {
|
|
219
|
+
expiration?: number;
|
|
220
|
+
expirationTtl?: number;
|
|
221
|
+
key: string;
|
|
222
|
+
metadata?: unknown;
|
|
223
|
+
namespace: string;
|
|
224
|
+
value: string;
|
|
225
|
+
}) => Promise<void>;
|
|
226
|
+
}
|
|
227
|
+
/** Construction options for {@link createKvIntrospector}. */
|
|
228
|
+
interface CreateKvIntrospectorOptions {
|
|
229
|
+
/**
|
|
230
|
+
* Map of binding name → bound KV namespace. Each entry becomes one
|
|
231
|
+
* namespace the studio can browse. Example:
|
|
232
|
+
* ```ts
|
|
233
|
+
* createKvIntrospector({ namespaces: { MY_KV: env.MY_KV } })
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
namespaces: Record<string, KVNamespaceLike>;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Build a `KvIntrospector`-compatible object from a map of bound KV namespaces.
|
|
240
|
+
* Pass the result as `kvIntrospector` on `WorkerOptions` to enable the studio's
|
|
241
|
+
* KV browser (`/_lunora/admin/kv/*` endpoints).
|
|
242
|
+
* @example
|
|
243
|
+
* ```ts
|
|
244
|
+
* createWorker({
|
|
245
|
+
* // …
|
|
246
|
+
* kvIntrospector: createKvIntrospector({ namespaces: { MY_KV: env.MY_KV } }),
|
|
247
|
+
* });
|
|
248
|
+
* ```
|
|
249
|
+
*/
|
|
250
|
+
declare const createKvIntrospector: (options: CreateKvIntrospectorOptions) => KvIntrospectorLike;
|
|
251
|
+
/**
|
|
252
|
+
* Zero-config KV introspector: scan a worker `env` for every bound Workers KV
|
|
253
|
+
* namespace and register each under its binding name. Every `kv_namespaces` entry
|
|
254
|
+
* in `wrangler.jsonc` then appears in the studio's KV browser automatically — no
|
|
255
|
+
* hand-written `createKvIntrospector({ namespaces: … })` call, and any binding
|
|
256
|
+
* name (not just `KV`) and any number of namespaces light up. Non-KV bindings
|
|
257
|
+
* (R2, Durable Objects, queues, secrets, …) are skipped via {@link isKvNamespace}.
|
|
258
|
+
*
|
|
259
|
+
* Returns an introspector even when `env` holds no KV namespaces — its
|
|
260
|
+
* `listNamespaces()` resolves to `[]`, so the studio renders an empty state
|
|
261
|
+
* rather than a "not configured" error.
|
|
262
|
+
* @example
|
|
263
|
+
* ```ts
|
|
264
|
+
* createWorker({
|
|
265
|
+
* // …
|
|
266
|
+
* kvIntrospector: createKvIntrospectorFromEnv(env),
|
|
267
|
+
* });
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
declare const createKvIntrospectorFromEnv: (env: unknown) => KvIntrospectorLike;
|
|
271
|
+
export { type CreateKvIntrospectorOptions, type KVNamespaceLike, type Kv, type KvGetOptions, type KvIntrospectorLike, type KvListKey, type KvListOptions, type KvListResult, type KvNamespaceListResult, type KvNamespacePutOptions, type KvPutOptions, type KvValue, type KvValueType, type KvValueWithMetadata, type LunoraKvOptions, createKv, createKvIntrospector, createKvIntrospectorFromEnv, scopeKey };
|
package/dist/kv/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import SelectBuilder from './SelectBuilder-
|
|
2
|
-
import { toText } from './Sql-
|
|
1
|
+
import SelectBuilder from './SelectBuilder-DHaXZwn_.mjs';
|
|
2
|
+
import { ident, toText } from './Sql-DceGtcUd.mjs';
|
|
3
3
|
|
|
4
4
|
const API_BASE = "https://api.sql.cloudflarestorage.com/api/v1/accounts";
|
|
5
5
|
const inferColumns = (rows) => {
|
|
@@ -53,12 +53,14 @@ const createR2Sql = (config) => {
|
|
|
53
53
|
};
|
|
54
54
|
};
|
|
55
55
|
return {
|
|
56
|
-
describe: async (table) => exec(`DESCRIBE ${table}`),
|
|
56
|
+
describe: async (table) => exec(`DESCRIBE ${ident(table)}`),
|
|
57
57
|
explain: async (statement, options) => exec(`EXPLAIN ${options?.format === "json" ? "FORMAT JSON " : ""}${toText(statement)}`),
|
|
58
|
+
// `SelectBuilder`'s constructor validates the table reference (allowing an
|
|
59
|
+
// optional `[AS] alias`), so no pre-validation here.
|
|
58
60
|
from: (table) => new SelectBuilder(exec, table),
|
|
59
61
|
query: async (statement) => exec(toText(statement)),
|
|
60
62
|
showDatabases: async () => exec("SHOW DATABASES"),
|
|
61
|
-
showTables: async (namespace) => exec(`SHOW TABLES IN ${namespace}`)
|
|
63
|
+
showTables: async (namespace) => exec(`SHOW TABLES IN ${ident(namespace)}`)
|
|
62
64
|
};
|
|
63
65
|
};
|
|
64
66
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { renderOrderTerm } from './asc-
|
|
2
|
-
import SetOperation from './SetOperation-
|
|
3
|
-
import { toText, lit } from './Sql-
|
|
1
|
+
import { renderOrderTerm } from './asc-Cur-xO8v.mjs';
|
|
2
|
+
import SetOperation from './SetOperation-RDHcxccj.mjs';
|
|
3
|
+
import { tableRef, toText, lit } from './Sql-DceGtcUd.mjs';
|
|
4
4
|
|
|
5
5
|
const JOIN_KEYWORDS = {
|
|
6
6
|
cross: "CROSS JOIN",
|
|
@@ -24,7 +24,7 @@ class SelectBuilder {
|
|
|
24
24
|
limitValue;
|
|
25
25
|
constructor(exec, table) {
|
|
26
26
|
this.exec = exec;
|
|
27
|
-
this.table = table;
|
|
27
|
+
this.table = tableRef(table);
|
|
28
28
|
}
|
|
29
29
|
/** The `SELECT` list. Omit/empty for `SELECT *`. Items are columns, expressions, or aliased window fragments (`fn.rowNumber().over(...).as("rk")`). */
|
|
30
30
|
select(...items) {
|
|
@@ -156,7 +156,7 @@ class SelectBuilder {
|
|
|
156
156
|
return this.distinctFlag ? "SELECT DISTINCT" : "SELECT";
|
|
157
157
|
}
|
|
158
158
|
addJoin(kind, table, on) {
|
|
159
|
-
this.joins.push({ kind, on, table });
|
|
159
|
+
this.joins.push({ kind, on, table: tableRef(table) });
|
|
160
160
|
return this;
|
|
161
161
|
}
|
|
162
162
|
setOperation(operator, other) {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const quoteString = (value) => `'${value.replaceAll("'", "''")}'`;
|
|
2
|
+
const IDENTIFIER_RE = /^\w+(?:\.\w+)*$/;
|
|
3
|
+
const TABLE_REF_RE = /^\w+(?:\.\w+)*(?:\s+(?:as\s+)?\w+)?$/i;
|
|
2
4
|
class Sql {
|
|
3
5
|
text;
|
|
4
6
|
constructor(text) {
|
|
@@ -11,6 +13,18 @@ class Sql {
|
|
|
11
13
|
const isSql = (value) => value instanceof Sql;
|
|
12
14
|
const raw = (text) => new Sql(text);
|
|
13
15
|
const toText = (value) => isSql(value) ? value.text : value;
|
|
16
|
+
const ident = (name) => {
|
|
17
|
+
if (typeof name !== "string" || !IDENTIFIER_RE.test(name)) {
|
|
18
|
+
throw new TypeError(`r2sql: invalid identifier ${JSON.stringify(name)} — expected dotted [A-Za-z0-9_] segments (e.g. "namespace.table").`);
|
|
19
|
+
}
|
|
20
|
+
return name;
|
|
21
|
+
};
|
|
22
|
+
const tableRef = (ref) => {
|
|
23
|
+
if (typeof ref !== "string" || !TABLE_REF_RE.test(ref)) {
|
|
24
|
+
throw new TypeError(`r2sql: invalid table reference ${JSON.stringify(ref)} — expected "namespace.table" with an optional "[AS] alias".`);
|
|
25
|
+
}
|
|
26
|
+
return ref;
|
|
27
|
+
};
|
|
14
28
|
const lit = (value) => {
|
|
15
29
|
if (value === null || value === void 0) {
|
|
16
30
|
return "NULL";
|
|
@@ -51,4 +65,4 @@ const sql = (strings, ...values) => {
|
|
|
51
65
|
};
|
|
52
66
|
const joinSql = (parts, separator) => new Sql(parts.map((part) => toText(part)).join(separator));
|
|
53
67
|
|
|
54
|
-
export { Sql, isSql, joinSql, lit, raw, sql, toText };
|
|
68
|
+
export { Sql, ident, isSql, joinSql, lit, raw, sql, tableRef, toText };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { renderOrderTerm } from './asc-
|
|
2
|
-
import { lit, toText } from './Sql-
|
|
3
|
-
import WindowExpression from './WindowExpression-
|
|
1
|
+
import { renderOrderTerm } from './asc-Cur-xO8v.mjs';
|
|
2
|
+
import { lit, toText } from './Sql-DceGtcUd.mjs';
|
|
3
|
+
import WindowExpression from './WindowExpression-Cg9s2xcr.mjs';
|
|
4
4
|
|
|
5
5
|
const toArray = (value) => {
|
|
6
6
|
if (value === void 0) {
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const createKvIntrospector = (options) => {
|
|
2
|
+
const { namespaces } = options;
|
|
3
|
+
const resolveNamespace = (binding) => {
|
|
4
|
+
const ns = namespaces[binding];
|
|
5
|
+
if (ns === void 0) {
|
|
6
|
+
throw new Error(`@lunora/bindings/kv: no namespace registered under binding "${binding}"`);
|
|
7
|
+
}
|
|
8
|
+
return ns;
|
|
9
|
+
};
|
|
10
|
+
const listNamespaces = () => Promise.resolve(
|
|
11
|
+
Object.keys(namespaces).map((binding) => {
|
|
12
|
+
return { binding };
|
|
13
|
+
})
|
|
14
|
+
);
|
|
15
|
+
const listKeys = async (listOptions) => {
|
|
16
|
+
const ns = resolveNamespace(listOptions.namespace);
|
|
17
|
+
const result = await ns.list({ cursor: listOptions.cursor, limit: listOptions.limit, prefix: listOptions.prefix });
|
|
18
|
+
const keys = result.keys.map((entry) => {
|
|
19
|
+
return {
|
|
20
|
+
expiration: entry.expiration,
|
|
21
|
+
metadata: entry.metadata,
|
|
22
|
+
name: entry.name
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
cursor: result.list_complete ? void 0 : result.cursor,
|
|
27
|
+
keys,
|
|
28
|
+
listComplete: result.list_complete
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
const getValue = async (getOptions) => {
|
|
32
|
+
const ns = resolveNamespace(getOptions.namespace);
|
|
33
|
+
const result = await ns.getWithMetadata(getOptions.key, "text");
|
|
34
|
+
return { metadata: result.metadata ?? null, value: result.value ?? null };
|
|
35
|
+
};
|
|
36
|
+
const putValue = async (putOptions) => {
|
|
37
|
+
const ns = resolveNamespace(putOptions.namespace);
|
|
38
|
+
await ns.put(putOptions.key, putOptions.value, {
|
|
39
|
+
expiration: putOptions.expiration,
|
|
40
|
+
expirationTtl: putOptions.expirationTtl,
|
|
41
|
+
metadata: putOptions.metadata
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const deleteKey = async (deleteOptions) => {
|
|
45
|
+
const ns = resolveNamespace(deleteOptions.namespace);
|
|
46
|
+
await ns.delete(deleteOptions.key);
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
deleteKey,
|
|
50
|
+
getValue,
|
|
51
|
+
listKeys,
|
|
52
|
+
listNamespaces,
|
|
53
|
+
putValue
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
const isKvNamespace = (value) => {
|
|
57
|
+
if (typeof value !== "object" || value === null) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const candidate = value;
|
|
61
|
+
return typeof candidate.getWithMetadata === "function" && typeof candidate.list === "function" && typeof candidate.put === "function" && typeof candidate.delete === "function";
|
|
62
|
+
};
|
|
63
|
+
const createKvIntrospectorFromEnv = (env) => {
|
|
64
|
+
const namespaces = {};
|
|
65
|
+
if (typeof env === "object" && env !== null) {
|
|
66
|
+
for (const [binding, value] of Object.entries(env)) {
|
|
67
|
+
if (isKvNamespace(value)) {
|
|
68
|
+
namespaces[binding] = value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return createKvIntrospector({ namespaces });
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export { createKvIntrospector, createKvIntrospectorFromEnv };
|
package/dist/r2sql/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { default as SelectBuilder } from '../packem_shared/SelectBuilder-
|
|
2
|
-
export { R2SqlError, createR2Sql } from '../packem_shared/R2SqlError-
|
|
3
|
-
export { asc, desc, renderOrderTerm } from '../packem_shared/asc-
|
|
4
|
-
export { default as SetOperation } from '../packem_shared/SetOperation-
|
|
5
|
-
export { Sql, isSql, joinSql, lit, raw, sql, toText } from '../packem_shared/Sql-
|
|
6
|
-
export { WindowFunction, fn } from '../packem_shared/WindowFunction-
|
|
7
|
-
export { default as WindowExpression } from '../packem_shared/WindowExpression-
|
|
1
|
+
export { default as SelectBuilder } from '../packem_shared/SelectBuilder-DHaXZwn_.mjs';
|
|
2
|
+
export { R2SqlError, createR2Sql } from '../packem_shared/R2SqlError-DlDd_SrE.mjs';
|
|
3
|
+
export { asc, desc, renderOrderTerm } from '../packem_shared/asc-Cur-xO8v.mjs';
|
|
4
|
+
export { default as SetOperation } from '../packem_shared/SetOperation-RDHcxccj.mjs';
|
|
5
|
+
export { Sql, isSql, joinSql, lit, raw, sql, toText } from '../packem_shared/Sql-DceGtcUd.mjs';
|
|
6
|
+
export { WindowFunction, fn } from '../packem_shared/WindowFunction-DA3pGC3N.mjs';
|
|
7
|
+
export { default as WindowExpression } from '../packem_shared/WindowExpression-Cg9s2xcr.mjs';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/bindings",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.3",
|
|
4
4
|
"description": "Lightweight Cloudflare binding helpers for Lunora — ctx.kv, ctx.images, ctx.analytics, ctx.pipelines, ctx.vectors, ctx.r2sql — one install, per-binding subpaths",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"analytics",
|