@usecontextlayer/cli 0.16.2 → 0.17.0
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 +4 -4
- package/dist/auth-BL9AxZGb.mjs +1214 -0
- package/dist/auth-BL9AxZGb.mjs.map +1 -0
- package/dist/auth.d.mts +17 -2
- package/dist/auth.d.mts.map +1 -1
- package/dist/auth.mjs +1 -2
- package/dist/cli.mjs +151 -195
- package/dist/cli.mjs.map +1 -1
- package/dist/database-codegen-C5TEhR5_.mjs +24 -0
- package/dist/database-codegen-C5TEhR5_.mjs.map +1 -0
- package/dist/database-dialect-BLWWgYGo.mjs +56 -0
- package/dist/database-dialect-BLWWgYGo.mjs.map +1 -0
- package/dist/database.d.mts +35 -0
- package/dist/database.d.mts.map +1 -0
- package/dist/database.mjs +32 -0
- package/dist/database.mjs.map +1 -0
- package/dist/databases-SvX3IgqC.mjs +23 -0
- package/dist/databases-SvX3IgqC.mjs.map +1 -0
- package/dist/env-C_tllJ4u.mjs +98 -0
- package/dist/env-C_tllJ4u.mjs.map +1 -0
- package/dist/local-databases-ChvVgJH6.mjs +1 -0
- package/dist/local-databases-DVI3ngFq.mjs +53 -0
- package/dist/local-databases-DVI3ngFq.mjs.map +1 -0
- package/dist/{resources--XCCMeP6.mjs → resources-BhJbHzU0.mjs} +23 -175
- package/dist/resources-BhJbHzU0.mjs.map +1 -0
- package/dist/{auth-DOsE8GwJ.mjs → schemas-D9UReYiT.mjs} +37 -1212
- package/dist/schemas-D9UReYiT.mjs.map +1 -0
- package/dist/schemas-DeaNWrS-.d.mts +2213 -0
- package/dist/schemas-DeaNWrS-.d.mts.map +1 -0
- package/dist/template.tar.gz +0 -0
- package/dist/vite.d.mts +5 -4330
- package/dist/vite.d.mts.map +1 -1
- package/dist/vite.mjs +16 -67
- package/dist/vite.mjs.map +1 -1
- package/package.json +12 -7
- package/dist/auth-DOsE8GwJ.mjs.map +0 -1
- package/dist/resources--XCCMeP6.mjs.map +0 -1
- package/dist/rolldown-runtime-EAsCxrDo.mjs +0 -14
- package/dist/template/AGENTS.md +0 -13
- package/dist/template/README.md +0 -46
- package/dist/template/app/root.tsx +0 -66
- package/dist/template/app/routes/home.tsx +0 -25
- package/dist/template/databases/updates/drizzle.config.ts +0 -8
- package/dist/template/databases/updates/migrations/0000_create_updates.sql +0 -6
- package/dist/template/databases/updates/migrations/meta/0000_snapshot.json +0 -14
- package/dist/template/databases/updates/migrations/meta/_journal.json +0 -13
- package/dist/template/databases/updates/migrations/migrations.js +0 -10
- package/dist/template/databases/updates/schema.ts +0 -8
- package/dist/template/public/slate.json +0 -4
- package/dist/template/vite.config.ts +0 -9
- package/dist/template/workers/app.ts +0 -8
- package/dist/template/workers/local-resources/index.ts +0 -6
- package/dist/template/workers/local-resources/wrangler.jsonc +0 -19
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { t as DatabaseDialect } from "./database-dialect-BLWWgYGo.mjs";
|
|
2
|
+
import { t as openLocalDatabase } from "./local-databases-DVI3ngFq.mjs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { Kysely } from "kysely";
|
|
5
|
+
import { Logger, SqliteDialect, generate } from "kysely-codegen";
|
|
6
|
+
//#region database-codegen.ts
|
|
7
|
+
async function generateDatabaseTypes(slug) {
|
|
8
|
+
const db = new Kysely({ dialect: new DatabaseDialect(() => openLocalDatabase(slug)) });
|
|
9
|
+
try {
|
|
10
|
+
await generate({
|
|
11
|
+
db,
|
|
12
|
+
dialect: new SqliteDialect(),
|
|
13
|
+
excludePattern: "__miniflare_do_name",
|
|
14
|
+
logger: new Logger(),
|
|
15
|
+
outFile: resolve("databases", slug, "types.ts")
|
|
16
|
+
});
|
|
17
|
+
} finally {
|
|
18
|
+
await db.destroy();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { generateDatabaseTypes };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=database-codegen-C5TEhR5_.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-codegen-C5TEhR5_.mjs","names":[],"sources":["../database-codegen.ts"],"sourcesContent":["import { resolve } from \"node:path\"\nimport { DatabaseDialect } from \"@usecontextlayer/shared/database-dialect\"\nimport { Kysely } from \"kysely\"\nimport { generate, Logger, SqliteDialect } from \"kysely-codegen\"\nimport { openLocalDatabase } from \"@/local-databases\"\n\nexport async function generateDatabaseTypes(slug: string) {\n\tconst db = new Kysely({ dialect: new DatabaseDialect(() => openLocalDatabase(slug)) })\n\ttry {\n\t\tawait generate({\n\t\t\tdb,\n\t\t\tdialect: new SqliteDialect(),\n\t\t\texcludePattern: \"__miniflare_do_name\",\n\t\t\tlogger: new Logger(),\n\t\t\toutFile: resolve(\"databases\", slug, \"types.ts\"),\n\t\t})\n\t} finally {\n\t\tawait db.destroy()\n\t}\n}\n"],"mappings":";;;;;;AAMA,eAAsB,sBAAsB,MAAc;CACzD,MAAM,KAAK,IAAI,OAAO,EAAE,SAAS,IAAI,sBAAsB,kBAAkB,IAAI,CAAC,EAAE,CAAC;CACrF,IAAI;EACH,MAAM,SAAS;GACd;GACA,SAAS,IAAI,cAAc;GAC3B,gBAAgB;GAChB,QAAQ,IAAI,OAAO;GACnB,SAAS,QAAQ,aAAa,MAAM,UAAU;EAC/C,CAAC;CACF,UAAU;EACT,MAAM,GAAG,QAAQ;CAClB;AACD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { r as sqlValueSchema } from "./databases-SvX3IgqC.mjs";
|
|
2
|
+
import { SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler } from "kysely";
|
|
3
|
+
//#region ../shared/dist/database-dialect.mjs
|
|
4
|
+
var DatabaseDialect = class {
|
|
5
|
+
open;
|
|
6
|
+
constructor(open) {
|
|
7
|
+
this.open = open;
|
|
8
|
+
}
|
|
9
|
+
createAdapter() {
|
|
10
|
+
return new SqliteAdapter();
|
|
11
|
+
}
|
|
12
|
+
createQueryCompiler() {
|
|
13
|
+
return new SqliteQueryCompiler();
|
|
14
|
+
}
|
|
15
|
+
createIntrospector(db) {
|
|
16
|
+
return new SqliteIntrospector(db);
|
|
17
|
+
}
|
|
18
|
+
createDriver() {
|
|
19
|
+
const open = this.open;
|
|
20
|
+
let session;
|
|
21
|
+
const connection = {
|
|
22
|
+
async executeQuery({ sql, parameters }) {
|
|
23
|
+
const result = await session.query(sql, parameters.map((value) => sqlValueSchema.parse(value)));
|
|
24
|
+
return { rows: result.rows.map((row) => Object.fromEntries(result.columns.map((column, index) => [column, row[index]]))) };
|
|
25
|
+
},
|
|
26
|
+
async *streamQuery(query) {
|
|
27
|
+
yield await connection.executeQuery(query);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
async acquireConnection() {
|
|
32
|
+
return connection;
|
|
33
|
+
},
|
|
34
|
+
async beginTransaction() {
|
|
35
|
+
throw new Error("Slate databases do not support SQL transactions");
|
|
36
|
+
},
|
|
37
|
+
async commitTransaction() {
|
|
38
|
+
throw new Error("Slate databases do not support SQL transactions");
|
|
39
|
+
},
|
|
40
|
+
async destroy() {
|
|
41
|
+
await session?.destroy?.();
|
|
42
|
+
},
|
|
43
|
+
async init() {
|
|
44
|
+
session = await open();
|
|
45
|
+
},
|
|
46
|
+
async releaseConnection() {},
|
|
47
|
+
async rollbackTransaction() {
|
|
48
|
+
throw new Error("Slate databases do not support SQL transactions");
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
//#endregion
|
|
54
|
+
export { DatabaseDialect as t };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=database-dialect-BLWWgYGo.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-dialect-BLWWgYGo.mjs","names":[],"sources":["../../shared/dist/database-dialect.mjs"],"sourcesContent":["import { sqlValueSchema } from \"./databases.mjs\";\nimport { SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler } from \"kysely\";\n\n//#region lib/database-dialect.ts\nvar DatabaseDialect = class {\n\topen;\n\tconstructor(open) {\n\t\tthis.open = open;\n\t}\n\tcreateAdapter() {\n\t\treturn new SqliteAdapter();\n\t}\n\tcreateQueryCompiler() {\n\t\treturn new SqliteQueryCompiler();\n\t}\n\tcreateIntrospector(db) {\n\t\treturn new SqliteIntrospector(db);\n\t}\n\tcreateDriver() {\n\t\tconst open = this.open;\n\t\tlet session;\n\t\tconst connection = {\n\t\t\tasync executeQuery({ sql, parameters }) {\n\t\t\t\tconst result = await session.query(sql, parameters.map((value) => sqlValueSchema.parse(value)));\n\t\t\t\treturn { rows: result.rows.map((row) => Object.fromEntries(result.columns.map((column, index) => [column, row[index]]))) };\n\t\t\t},\n\t\t\tasync *streamQuery(query) {\n\t\t\t\tyield await connection.executeQuery(query);\n\t\t\t}\n\t\t};\n\t\treturn {\n\t\t\tasync acquireConnection() {\n\t\t\t\treturn connection;\n\t\t\t},\n\t\t\tasync beginTransaction() {\n\t\t\t\tthrow new Error(\"Slate databases do not support SQL transactions\");\n\t\t\t},\n\t\t\tasync commitTransaction() {\n\t\t\t\tthrow new Error(\"Slate databases do not support SQL transactions\");\n\t\t\t},\n\t\t\tasync destroy() {\n\t\t\t\tawait session?.destroy?.();\n\t\t\t},\n\t\t\tasync init() {\n\t\t\t\tsession = await open();\n\t\t\t},\n\t\t\tasync releaseConnection() {},\n\t\t\tasync rollbackTransaction() {\n\t\t\t\tthrow new Error(\"Slate databases do not support SQL transactions\");\n\t\t\t}\n\t\t};\n\t}\n};\n\n//#endregion\nexport { DatabaseDialect };"],"mappings":";;;AAIA,IAAI,kBAAkB,MAAM;CAC3B;CACA,YAAY,MAAM;EACjB,KAAK,OAAO;CACb;CACA,gBAAgB;EACf,OAAO,IAAI,cAAc;CAC1B;CACA,sBAAsB;EACrB,OAAO,IAAI,oBAAoB;CAChC;CACA,mBAAmB,IAAI;EACtB,OAAO,IAAI,mBAAmB,EAAE;CACjC;CACA,eAAe;EACd,MAAM,OAAO,KAAK;EAClB,IAAI;EACJ,MAAM,aAAa;GAClB,MAAM,aAAa,EAAE,KAAK,cAAc;IACvC,MAAM,SAAS,MAAM,QAAQ,MAAM,KAAK,WAAW,KAAK,UAAU,eAAe,MAAM,KAAK,CAAC,CAAC;IAC9F,OAAO,EAAE,MAAM,OAAO,KAAK,KAAK,QAAQ,OAAO,YAAY,OAAO,QAAQ,KAAK,QAAQ,UAAU,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;GAC1H;GACA,OAAO,YAAY,OAAO;IACzB,MAAM,MAAM,WAAW,aAAa,KAAK;GAC1C;EACD;EACA,OAAO;GACN,MAAM,oBAAoB;IACzB,OAAO;GACR;GACA,MAAM,mBAAmB;IACxB,MAAM,IAAI,MAAM,iDAAiD;GAClE;GACA,MAAM,oBAAoB;IACzB,MAAM,IAAI,MAAM,iDAAiD;GAClE;GACA,MAAM,UAAU;IACf,MAAM,SAAS,UAAU;GAC1B;GACA,MAAM,OAAO;IACZ,UAAU,MAAM,KAAK;GACtB;GACA,MAAM,oBAAoB,CAAC;GAC3B,MAAM,sBAAsB;IAC3B,MAAM,IAAI,MAAM,iDAAiD;GAClE;EACD;CACD;AACD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { a as ZodNull, c as ZodObject, d as ZodString, g as $strip, m as output, p as ZodUnion, s as ZodNumber, t as ZodArray } from "./schemas-DeaNWrS-.mjs";
|
|
2
|
+
import { Dialect, Driver, Kysely, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler } from "kysely";
|
|
3
|
+
//#region ../shared/dist/databases.d.mts
|
|
4
|
+
//#region lib/databases.d.ts
|
|
5
|
+
declare const sqlValueSchema: ZodUnion<readonly [ZodString, ZodNumber, ZodNull]>;
|
|
6
|
+
type SqlValue = output<typeof sqlValueSchema>;
|
|
7
|
+
declare const databaseResultSchema: ZodObject<{
|
|
8
|
+
columns: ZodArray<ZodString>;
|
|
9
|
+
rows: ZodArray<ZodArray<ZodUnion<readonly [ZodString, ZodNumber, ZodNull]>>>;
|
|
10
|
+
rowsRead: ZodNumber;
|
|
11
|
+
rowsWritten: ZodNumber;
|
|
12
|
+
}, $strip>;
|
|
13
|
+
type DatabaseResult = output<typeof databaseResultSchema>;
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region ../shared/dist/database-dialect.d.mts
|
|
16
|
+
//#region lib/database-dialect.d.ts
|
|
17
|
+
type DatabaseSession = {
|
|
18
|
+
query(sql: string, params: SqlValue[]): Promise<DatabaseResult>;
|
|
19
|
+
destroy?(): Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
declare class DatabaseDialect implements Dialect {
|
|
22
|
+
private readonly open;
|
|
23
|
+
constructor(open: () => Promise<DatabaseSession>);
|
|
24
|
+
createAdapter(): SqliteAdapter;
|
|
25
|
+
createQueryCompiler(): SqliteQueryCompiler;
|
|
26
|
+
createIntrospector(db: Kysely<unknown>): SqliteIntrospector;
|
|
27
|
+
createDriver(): Driver;
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region database.d.ts
|
|
32
|
+
export declare function databaseDialect(slug: string): DatabaseDialect;
|
|
33
|
+
//#endregion
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=database.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.mts","names":["z.ZodString","z.ZodNumber","z.ZodNull","z.ZodUnion","z.infer","z.ZodArray","z.core.$strip","z.ZodObject"],"sources":["../../shared/dist/databases.d.mts","../../shared/dist/database-dialect.d.mts","../database.ts"],"mappings":";;;;cAEqB,gBAAgBG,mBAAqBH,WAAaC,WAAaC;KAWxE,WAAWE,cAAe;cACjB,sBAAsBG;EACzC,SAASF,SAAWL;EACpB,MAAMK,SAAWA,SAAWF,mBAAqBH,WAAaC,WAAaC;EAC3E,UAAUD;EACV,aAAaA;GACZK;KACS,iBAAiBF,cAAe;;;;KCjBhC;EACV,MAAM,aAAa,QAAQ,aAAa,QAAQ;EAChD,YAAY;;cAEO,2BAA2B;mBAC7B;EACjB,YAAY,YAAY,QAAQ;EAChC,iBAAiB;EACjB,uBAAuB;EACvB,mBAAmB,IAAI,kBAAkB;EACzC,gBAAgB;;;;;wBCPF,gBAAgB,eAAY"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { p as string, u as object } from "./schemas-D9UReYiT.mjs";
|
|
2
|
+
import { a as databaseSlugSchema, t as databaseEnv } from "./env-C_tllJ4u.mjs";
|
|
3
|
+
import { n as databaseResultSchema } from "./databases-SvX3IgqC.mjs";
|
|
4
|
+
import { t as DatabaseDialect } from "./database-dialect-BLWWgYGo.mjs";
|
|
5
|
+
//#region database.ts
|
|
6
|
+
function databaseDialect(slug) {
|
|
7
|
+
const selected = databaseSlugSchema.parse(slug);
|
|
8
|
+
return new DatabaseDialect(async () => {
|
|
9
|
+
const url = databaseEnv.CTX_DATABASE_URL;
|
|
10
|
+
if (!url) {
|
|
11
|
+
const { openLocalDatabase } = await import("./local-databases-ChvVgJH6.mjs");
|
|
12
|
+
return openLocalDatabase(selected);
|
|
13
|
+
}
|
|
14
|
+
return { async query(sql, params) {
|
|
15
|
+
const response = await fetch(url, {
|
|
16
|
+
body: JSON.stringify({
|
|
17
|
+
params,
|
|
18
|
+
sql
|
|
19
|
+
}),
|
|
20
|
+
headers: { "content-type": "application/json" },
|
|
21
|
+
method: "POST"
|
|
22
|
+
});
|
|
23
|
+
const body = await response.json();
|
|
24
|
+
if (!response.ok) throw new Error(object({ error: string() }).parse(body).error);
|
|
25
|
+
return databaseResultSchema.parse(body);
|
|
26
|
+
} };
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { databaseDialect };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=database.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.mjs","names":["z.object","z.string"],"sources":["../database.ts"],"sourcesContent":["import { DatabaseDialect } from \"@usecontextlayer/shared/database-dialect\"\nimport { databaseResultSchema } from \"@usecontextlayer/shared/databases\"\nimport { databaseSlugSchema } from \"@usecontextlayer/shared/declaration\"\nimport { z } from \"zod\"\nimport { databaseEnv } from \"@/env\"\n\nexport function databaseDialect(slug: string) {\n\tconst selected = databaseSlugSchema.parse(slug)\n\treturn new DatabaseDialect(async () => {\n\t\tconst url = databaseEnv.CTX_DATABASE_URL\n\t\tif (!url) {\n\t\t\tconst { openLocalDatabase } = await import(\"@/local-databases\")\n\t\t\treturn openLocalDatabase(selected)\n\t\t}\n\t\treturn {\n\t\t\tasync query(sql, params) {\n\t\t\t\tconst response = await fetch(url, {\n\t\t\t\t\tbody: JSON.stringify({ params, sql }),\n\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t})\n\t\t\t\tconst body: unknown = await response.json()\n\t\t\t\tif (!response.ok)\n\t\t\t\t\tthrow new Error(z.object({ error: z.string() }).parse(body).error)\n\t\t\t\treturn databaseResultSchema.parse(body)\n\t\t\t},\n\t\t}\n\t})\n}\n"],"mappings":";;;;;AAMA,SAAgB,gBAAgB,MAAc;CAC7C,MAAM,WAAW,mBAAmB,MAAM,IAAI;CAC9C,OAAO,IAAI,gBAAgB,YAAY;EACtC,MAAM,MAAM,YAAY;EACxB,IAAI,CAAC,KAAK;GACT,MAAM,EAAE,sBAAsB,MAAM,OAAO;GAC3C,OAAO,kBAAkB,QAAQ;EAClC;EACA,OAAO,EACN,MAAM,MAAM,KAAK,QAAQ;GACxB,MAAM,WAAW,MAAM,MAAM,KAAK;IACjC,MAAM,KAAK,UAAU;KAAE;KAAQ;IAAI,CAAC;IACpC,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,QAAQ;GACT,CAAC;GACD,MAAM,OAAgB,MAAM,SAAS,KAAK;GAC1C,IAAI,CAAC,SAAS,IACb,MAAM,IAAI,MAAMA,OAAS,EAAE,OAAOC,OAAS,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK;GAClE,OAAO,qBAAqB,MAAM,IAAI;EACvC,EACD;CACD,CAAC;AACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { f as strictObject, i as array, l as number, m as union, n as _null, p as string, u as object } from "./schemas-D9UReYiT.mjs";
|
|
2
|
+
//#region ../shared/dist/databases.mjs
|
|
3
|
+
const sqlValueSchema = union([
|
|
4
|
+
string(),
|
|
5
|
+
number(),
|
|
6
|
+
_null()
|
|
7
|
+
]);
|
|
8
|
+
const databaseQuerySchema = strictObject({
|
|
9
|
+
params: array(sqlValueSchema).default([]),
|
|
10
|
+
slug: string().min(1),
|
|
11
|
+
sql: string().min(1)
|
|
12
|
+
});
|
|
13
|
+
databaseQuerySchema.omit({ slug: true });
|
|
14
|
+
const databaseResultSchema = object({
|
|
15
|
+
columns: array(string()),
|
|
16
|
+
rows: array(array(sqlValueSchema)),
|
|
17
|
+
rowsRead: number(),
|
|
18
|
+
rowsWritten: number()
|
|
19
|
+
});
|
|
20
|
+
//#endregion
|
|
21
|
+
export { databaseResultSchema as n, sqlValueSchema as r, databaseQuerySchema as t };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=databases-SvX3IgqC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databases-SvX3IgqC.mjs","names":["z.union","z.string","z.number","z.null","z.strictObject","z.array","z.object"],"sources":["../../shared/dist/databases.mjs"],"sourcesContent":["import { z } from \"zod\";\n\n//#region lib/databases.ts\nconst sqlValueSchema = z.union([\n\tz.string(),\n\tz.number(),\n\tz.null()\n]);\nconst databaseQuerySchema = z.strictObject({\n\tparams: z.array(sqlValueSchema).default([]),\n\tslug: z.string().min(1),\n\tsql: z.string().min(1)\n});\nconst DATABASE_HOST = \"database.contextlayer\";\nconst databaseStatementSchema = databaseQuerySchema.omit({ slug: true });\nconst databaseResultSchema = z.object({\n\tcolumns: z.array(z.string()),\n\trows: z.array(z.array(sqlValueSchema)),\n\trowsRead: z.number(),\n\trowsWritten: z.number()\n});\n\n//#endregion\nexport { DATABASE_HOST, databaseQuerySchema, databaseResultSchema, databaseStatementSchema, sqlValueSchema };"],"mappings":";;AAGA,MAAM,iBAAiBA,MAAQ;CAC9BC,OAAS;CACTC,OAAS;CACTC,MAAO;AACR,CAAC;AACD,MAAM,sBAAsBC,aAAe;CAC1C,QAAQC,MAAQ,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC;CAC1C,MAAMJ,OAAS,CAAC,CAAC,IAAI,CAAC;CACtB,KAAKA,OAAS,CAAC,CAAC,IAAI,CAAC;AACtB,CAAC;AAE+B,oBAAoB,KAAK,EAAE,MAAM,KAAK,CAAC;AACvE,MAAM,uBAAuBK,OAAS;CACrC,SAASD,MAAQJ,OAAS,CAAC;CAC3B,MAAMI,MAAQA,MAAQ,cAAc,CAAC;CACrC,UAAUH,OAAS;CACnB,aAAaA,OAAS;AACvB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { _ as ZodError, c as literal, d as record, f as strictObject, h as url, i as array, o as discriminatedUnion, p as string, t as _enum, u as object } from "./schemas-D9UReYiT.mjs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
//#region ../shared/dist/declaration.mjs
|
|
5
|
+
const credentialModeSchema = _enum(["viewer", "owner"]);
|
|
6
|
+
const connectionRequirementSchema = strictObject({
|
|
7
|
+
mode: credentialModeSchema,
|
|
8
|
+
toolkit: string().min(1)
|
|
9
|
+
});
|
|
10
|
+
const secretNameSchema = string().regex(/^[A-Z_][A-Z0-9_]*$/);
|
|
11
|
+
const secretRequirementSchema = strictObject({ mode: credentialModeSchema });
|
|
12
|
+
const databaseRequirementSchema = strictObject({ mode: credentialModeSchema });
|
|
13
|
+
const databaseSlugSchema = string().min(1).regex(/^(?!\.{1,2}$)[^/\\]+$/);
|
|
14
|
+
const declarationSchema = strictObject({
|
|
15
|
+
connections: record(string().min(1), connectionRequirementSchema),
|
|
16
|
+
databases: record(databaseSlugSchema, databaseRequirementSchema).default({}),
|
|
17
|
+
secrets: record(secretNameSchema, secretRequirementSchema).default({})
|
|
18
|
+
});
|
|
19
|
+
strictObject({
|
|
20
|
+
agents: record(string().min(1), declarationSchema),
|
|
21
|
+
app: declarationSchema
|
|
22
|
+
});
|
|
23
|
+
const resourceConsumerSchema = discriminatedUnion("type", [strictObject({ type: literal("app") }), strictObject({
|
|
24
|
+
name: string().min(1),
|
|
25
|
+
type: literal("agent")
|
|
26
|
+
})]);
|
|
27
|
+
const resourcesSchema = declarationSchema.extend({
|
|
28
|
+
connections: record(string().min(1), connectionRequirementSchema.extend({ consumers: array(resourceConsumerSchema) })),
|
|
29
|
+
databases: record(databaseSlugSchema, databaseRequirementSchema.extend({ consumers: array(resourceConsumerSchema) })),
|
|
30
|
+
secrets: record(secretNameSchema, secretRequirementSchema.extend({ consumers: array(resourceConsumerSchema) }))
|
|
31
|
+
});
|
|
32
|
+
function collectSlateResources(slateDeclarations) {
|
|
33
|
+
const declarations = [{
|
|
34
|
+
consumer: { type: "app" },
|
|
35
|
+
declaration: slateDeclarations.app
|
|
36
|
+
}, ...Object.entries(slateDeclarations.agents).map(([name, declaration]) => ({
|
|
37
|
+
consumer: {
|
|
38
|
+
name,
|
|
39
|
+
type: "agent"
|
|
40
|
+
},
|
|
41
|
+
declaration
|
|
42
|
+
}))];
|
|
43
|
+
return {
|
|
44
|
+
connections: collectRequirements("connections", declarations, (declaration) => declaration.connections),
|
|
45
|
+
databases: collectRequirements("databases", declarations, (declaration) => declaration.databases),
|
|
46
|
+
secrets: collectRequirements("secrets", declarations, (declaration) => declaration.secrets)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function resourcesForConsumer(resources, consumer) {
|
|
50
|
+
return {
|
|
51
|
+
connections: filterRequirements(resources.connections, consumer),
|
|
52
|
+
databases: filterRequirements(resources.databases, consumer),
|
|
53
|
+
secrets: filterRequirements(resources.secrets, consumer)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function filterRequirements(requirements, consumer) {
|
|
57
|
+
return Object.fromEntries(Object.entries(requirements).filter(([, requirement]) => requirement.consumers.some((declared) => declared.type === consumer.type && (consumer.type === "app" || declared.type === "agent" && declared.name === consumer.name))));
|
|
58
|
+
}
|
|
59
|
+
function collectRequirements(category, declarations, select) {
|
|
60
|
+
const resources = /* @__PURE__ */ new Map();
|
|
61
|
+
for (const { consumer, declaration } of declarations) for (const [key, requirement] of Object.entries(select(declaration))) {
|
|
62
|
+
const existing = resources.get(key);
|
|
63
|
+
if (!existing) {
|
|
64
|
+
resources.set(key, {
|
|
65
|
+
...requirement,
|
|
66
|
+
consumers: [consumer]
|
|
67
|
+
});
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (existing.mode !== requirement.mode || existing.toolkit !== requirement.toolkit) throw new ZodError([{
|
|
71
|
+
code: "custom",
|
|
72
|
+
message: `Conflicting ${category} requirement "${key}": declarations must agree on mode${category === "connections" ? " and toolkit" : ""}`,
|
|
73
|
+
path: [
|
|
74
|
+
...consumer.type === "app" ? ["app"] : ["agents", consumer.name],
|
|
75
|
+
category,
|
|
76
|
+
key
|
|
77
|
+
]
|
|
78
|
+
}]);
|
|
79
|
+
existing.consumers.push(consumer);
|
|
80
|
+
}
|
|
81
|
+
return Object.fromEntries(resources);
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region env.ts
|
|
85
|
+
function readLocalSecret(name) {
|
|
86
|
+
return process.env[name] ?? null;
|
|
87
|
+
}
|
|
88
|
+
const databaseEnv = object({ CTX_DATABASE_URL: url().optional() }).parse(process.env);
|
|
89
|
+
const env = object({
|
|
90
|
+
CTX_AUTH_CLIENT_ID: string().min(1).default("QBFOYTTCdjpEiXwgDNnovDPoJBYAfRpF"),
|
|
91
|
+
CTX_AUTH_ISSUER: url().default("https://www.usecontextlayer.com/api/auth"),
|
|
92
|
+
CTX_CONFIG_DIR: string().min(1).default(join(homedir(), ".contextlayer")),
|
|
93
|
+
CTX_PLATFORM_URL: url().default("https://platform.usecontextlayer.com")
|
|
94
|
+
}).parse(process.env);
|
|
95
|
+
//#endregion
|
|
96
|
+
export { databaseSlugSchema as a, resourcesSchema as c, collectSlateResources as i, secretNameSchema as l, env as n, declarationSchema as o, readLocalSecret as r, resourcesForConsumer as s, databaseEnv as t };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=env-C_tllJ4u.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-C_tllJ4u.mjs","names":["z.enum","z.strictObject","z.string","z.record","z.discriminatedUnion","z.literal","z.array","z.ZodError","z\n\t.object","z.url","z.string"],"sources":["../../shared/dist/declaration.mjs","../env.ts"],"sourcesContent":["import { z } from \"zod\";\n\n//#region lib/declaration.ts\nconst credentialModeSchema = z.enum([\"viewer\", \"owner\"]);\nconst connectionRequirementSchema = z.strictObject({\n\tmode: credentialModeSchema,\n\ttoolkit: z.string().min(1)\n});\nconst secretNameSchema = z.string().regex(/^[A-Z_][A-Z0-9_]*$/);\nconst secretRequirementSchema = z.strictObject({ mode: credentialModeSchema });\nconst databaseRequirementSchema = z.strictObject({ mode: credentialModeSchema });\nconst databaseSlugSchema = z.string().min(1).regex(/^(?!\\.{1,2}$)[^/\\\\]+$/);\nconst declarationSchema = z.strictObject({\n\tconnections: z.record(z.string().min(1), connectionRequirementSchema),\n\tdatabases: z.record(databaseSlugSchema, databaseRequirementSchema).default({}),\n\tsecrets: z.record(secretNameSchema, secretRequirementSchema).default({})\n});\nconst slateDeclarationsSchema = z.strictObject({\n\tagents: z.record(z.string().min(1), declarationSchema),\n\tapp: declarationSchema\n});\nconst resourceConsumerSchema = z.discriminatedUnion(\"type\", [z.strictObject({ type: z.literal(\"app\") }), z.strictObject({\n\tname: z.string().min(1),\n\ttype: z.literal(\"agent\")\n})]);\nconst resourcesSchema = declarationSchema.extend({\n\tconnections: z.record(z.string().min(1), connectionRequirementSchema.extend({ consumers: z.array(resourceConsumerSchema) })),\n\tdatabases: z.record(databaseSlugSchema, databaseRequirementSchema.extend({ consumers: z.array(resourceConsumerSchema) })),\n\tsecrets: z.record(secretNameSchema, secretRequirementSchema.extend({ consumers: z.array(resourceConsumerSchema) }))\n});\nfunction hasViewerResources(resources) {\n\treturn Object.values(resources).some((requirements) => Object.values(requirements).some(({ mode }) => mode === \"viewer\"));\n}\nfunction collectSlateResources(slateDeclarations) {\n\tconst declarations = [{\n\t\tconsumer: { type: \"app\" },\n\t\tdeclaration: slateDeclarations.app\n\t}, ...Object.entries(slateDeclarations.agents).map(([name, declaration]) => ({\n\t\tconsumer: {\n\t\t\tname,\n\t\t\ttype: \"agent\"\n\t\t},\n\t\tdeclaration\n\t}))];\n\treturn {\n\t\tconnections: collectRequirements(\"connections\", declarations, (declaration) => declaration.connections),\n\t\tdatabases: collectRequirements(\"databases\", declarations, (declaration) => declaration.databases),\n\t\tsecrets: collectRequirements(\"secrets\", declarations, (declaration) => declaration.secrets)\n\t};\n}\nfunction resourcesForConsumer(resources, consumer) {\n\treturn {\n\t\tconnections: filterRequirements(resources.connections, consumer),\n\t\tdatabases: filterRequirements(resources.databases, consumer),\n\t\tsecrets: filterRequirements(resources.secrets, consumer)\n\t};\n}\nfunction filterRequirements(requirements, consumer) {\n\treturn Object.fromEntries(Object.entries(requirements).filter(([, requirement]) => requirement.consumers.some((declared) => declared.type === consumer.type && (consumer.type === \"app\" || declared.type === \"agent\" && declared.name === consumer.name))));\n}\nfunction collectRequirements(category, declarations, select) {\n\tconst resources = /* @__PURE__ */ new Map();\n\tfor (const { consumer, declaration } of declarations) for (const [key, requirement] of Object.entries(select(declaration))) {\n\t\tconst existing = resources.get(key);\n\t\tif (!existing) {\n\t\t\tresources.set(key, {\n\t\t\t\t...requirement,\n\t\t\t\tconsumers: [consumer]\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (existing.mode !== requirement.mode || existing.toolkit !== requirement.toolkit) throw new z.ZodError([{\n\t\t\tcode: \"custom\",\n\t\t\tmessage: `Conflicting ${category} requirement \"${key}\": declarations must agree on mode${category === \"connections\" ? \" and toolkit\" : \"\"}`,\n\t\t\tpath: [\n\t\t\t\t...consumer.type === \"app\" ? [\"app\"] : [\"agents\", consumer.name],\n\t\t\t\tcategory,\n\t\t\t\tkey\n\t\t\t]\n\t\t}]);\n\t\texisting.consumers.push(consumer);\n\t}\n\treturn Object.fromEntries(resources);\n}\n\n//#endregion\nexport { collectSlateResources, connectionRequirementSchema, credentialModeSchema, databaseRequirementSchema, databaseSlugSchema, declarationSchema, hasViewerResources, resourceConsumerSchema, resourcesForConsumer, resourcesSchema, secretNameSchema, secretRequirementSchema, slateDeclarationsSchema };","import { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { z } from \"zod\"\n\nexport function readLocalSecret(name: string) {\n\treturn process.env[name] ?? null\n}\n\nexport const databaseEnv = z\n\t.object({ CTX_DATABASE_URL: z.url().optional() })\n\t.parse(process.env)\n\nexport const env = z\n\t.object({\n\t\tCTX_AUTH_CLIENT_ID: z.string().min(1).default(\"QBFOYTTCdjpEiXwgDNnovDPoJBYAfRpF\"),\n\t\tCTX_AUTH_ISSUER: z.url().default(\"https://www.usecontextlayer.com/api/auth\"),\n\t\tCTX_CONFIG_DIR: z.string().min(1).default(join(homedir(), \".contextlayer\")),\n\t\tCTX_PLATFORM_URL: z.url().default(\"https://platform.usecontextlayer.com\"),\n\t})\n\t.parse(process.env)\n"],"mappings":";;;;AAGA,MAAM,uBAAuBA,MAAO,CAAC,UAAU,OAAO,CAAC;AACvD,MAAM,8BAA8BC,aAAe;CAClD,MAAM;CACN,SAASC,OAAS,CAAC,CAAC,IAAI,CAAC;AAC1B,CAAC;AACD,MAAM,mBAAmBA,OAAS,CAAC,CAAC,MAAM,oBAAoB;AAC9D,MAAM,0BAA0BD,aAAe,EAAE,MAAM,qBAAqB,CAAC;AAC7E,MAAM,4BAA4BA,aAAe,EAAE,MAAM,qBAAqB,CAAC;AAC/E,MAAM,qBAAqBC,OAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,uBAAuB;AAC1E,MAAM,oBAAoBD,aAAe;CACxC,aAAaE,OAASD,OAAS,CAAC,CAAC,IAAI,CAAC,GAAG,2BAA2B;CACpE,WAAWC,OAAS,oBAAoB,yBAAyB,CAAC,CAAC,QAAQ,CAAC,CAAC;CAC7E,SAASA,OAAS,kBAAkB,uBAAuB,CAAC,CAAC,QAAQ,CAAC,CAAC;AACxE,CAAC;AAC+BF,aAAe;CAC9C,QAAQE,OAASD,OAAS,CAAC,CAAC,IAAI,CAAC,GAAG,iBAAiB;CACrD,KAAK;AACN,CAAC;AACD,MAAM,yBAAyBE,mBAAqB,QAAQ,CAACH,aAAe,EAAE,MAAMI,QAAU,KAAK,EAAE,CAAC,GAAGJ,aAAe;CACvH,MAAMC,OAAS,CAAC,CAAC,IAAI,CAAC;CACtB,MAAMG,QAAU,OAAO;AACxB,CAAC,CAAC,CAAC;AACH,MAAM,kBAAkB,kBAAkB,OAAO;CAChD,aAAaF,OAASD,OAAS,CAAC,CAAC,IAAI,CAAC,GAAG,4BAA4B,OAAO,EAAE,WAAWI,MAAQ,sBAAsB,EAAE,CAAC,CAAC;CAC3H,WAAWH,OAAS,oBAAoB,0BAA0B,OAAO,EAAE,WAAWG,MAAQ,sBAAsB,EAAE,CAAC,CAAC;CACxH,SAASH,OAAS,kBAAkB,wBAAwB,OAAO,EAAE,WAAWG,MAAQ,sBAAsB,EAAE,CAAC,CAAC;AACnH,CAAC;AAID,SAAS,sBAAsB,mBAAmB;CACjD,MAAM,eAAe,CAAC;EACrB,UAAU,EAAE,MAAM,MAAM;EACxB,aAAa,kBAAkB;CAChC,GAAG,GAAG,OAAO,QAAQ,kBAAkB,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,kBAAkB;EAC5E,UAAU;GACT;GACA,MAAM;EACP;EACA;CACD,EAAE,CAAC;CACH,OAAO;EACN,aAAa,oBAAoB,eAAe,eAAe,gBAAgB,YAAY,WAAW;EACtG,WAAW,oBAAoB,aAAa,eAAe,gBAAgB,YAAY,SAAS;EAChG,SAAS,oBAAoB,WAAW,eAAe,gBAAgB,YAAY,OAAO;CAC3F;AACD;AACA,SAAS,qBAAqB,WAAW,UAAU;CAClD,OAAO;EACN,aAAa,mBAAmB,UAAU,aAAa,QAAQ;EAC/D,WAAW,mBAAmB,UAAU,WAAW,QAAQ;EAC3D,SAAS,mBAAmB,UAAU,SAAS,QAAQ;CACxD;AACD;AACA,SAAS,mBAAmB,cAAc,UAAU;CACnD,OAAO,OAAO,YAAY,OAAO,QAAQ,YAAY,CAAC,CAAC,QAAQ,GAAG,iBAAiB,YAAY,UAAU,MAAM,aAAa,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,WAAW,SAAS,SAAS,SAAS,KAAK,CAAC,CAAC;AAC3P;AACA,SAAS,oBAAoB,UAAU,cAAc,QAAQ;CAC5D,MAAM,4BAA4B,IAAI,IAAI;CAC1C,KAAK,MAAM,EAAE,UAAU,iBAAiB,cAAc,KAAK,MAAM,CAAC,KAAK,gBAAgB,OAAO,QAAQ,OAAO,WAAW,CAAC,GAAG;EAC3H,MAAM,WAAW,UAAU,IAAI,GAAG;EAClC,IAAI,CAAC,UAAU;GACd,UAAU,IAAI,KAAK;IAClB,GAAG;IACH,WAAW,CAAC,QAAQ;GACrB,CAAC;GACD;EACD;EACA,IAAI,SAAS,SAAS,YAAY,QAAQ,SAAS,YAAY,YAAY,SAAS,MAAM,IAAIC,SAAW,CAAC;GACzG,MAAM;GACN,SAAS,eAAe,SAAS,gBAAgB,IAAI,oCAAoC,aAAa,gBAAgB,iBAAiB;GACvI,MAAM;IACL,GAAG,SAAS,SAAS,QAAQ,CAAC,KAAK,IAAI,CAAC,UAAU,SAAS,IAAI;IAC/D;IACA;GACD;EACD,CAAC,CAAC;EACF,SAAS,UAAU,KAAK,QAAQ;CACjC;CACA,OAAO,OAAO,YAAY,SAAS;AACpC;;;AC/EA,SAAgB,gBAAgB,MAAc;CAC7C,OAAO,QAAQ,IAAI,SAAS;AAC7B;AAEA,MAAa,cAAcC,OAClB,EAAE,kBAAkBC,IAAM,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAChD,MAAM,QAAQ,GAAG;AAEnB,MAAa,MAAMD,OACV;CACP,oBAAoBE,OAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,kCAAkC;CAChF,iBAAiBD,IAAM,CAAC,CAAC,QAAQ,0CAA0C;CAC3E,gBAAgBC,OAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,GAAG,eAAe,CAAC;CAC1E,kBAAkBD,IAAM,CAAC,CAAC,QAAQ,sCAAsC;AACzE,CAAC,CAAC,CACD,MAAM,QAAQ,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { t as openLocalDatabase, n as openLocalDatabases } from "./local-databases-DVI3ngFq.mjs";
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { n as prepareLocalResourceConfiguration, t as getLocalResourcesWorkerName } from "./resources-BhJbHzU0.mjs";
|
|
2
|
+
import { n as databaseResultSchema } from "./databases-SvX3IgqC.mjs";
|
|
3
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
//#region local-databases.ts
|
|
6
|
+
async function openLocalDatabases(workerName, databases) {
|
|
7
|
+
const configPath = resolve(".contextlayer/database-proxy.json");
|
|
8
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
9
|
+
await writeFile(configPath, JSON.stringify({
|
|
10
|
+
compatibility_date: "2026-10-02",
|
|
11
|
+
name: `${workerName}-database-proxy`,
|
|
12
|
+
services: [{
|
|
13
|
+
binding: "DATABASES",
|
|
14
|
+
entrypoint: "Databases",
|
|
15
|
+
props: { databases },
|
|
16
|
+
service: workerName
|
|
17
|
+
}]
|
|
18
|
+
}));
|
|
19
|
+
const { getPlatformProxy } = await import("wrangler");
|
|
20
|
+
const proxy = await getPlatformProxy({
|
|
21
|
+
configPath,
|
|
22
|
+
persist: false,
|
|
23
|
+
remoteBindings: false
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
databases: { async query(slug, sql, params = []) {
|
|
27
|
+
const response = await proxy.env.DATABASES.fetch(new Request("http://local/databases/query", {
|
|
28
|
+
body: JSON.stringify({
|
|
29
|
+
params,
|
|
30
|
+
slug,
|
|
31
|
+
sql
|
|
32
|
+
}),
|
|
33
|
+
headers: { "content-type": "application/json" },
|
|
34
|
+
method: "POST"
|
|
35
|
+
}));
|
|
36
|
+
if (!response.ok) throw new Error(`Local database query failed: ${await response.text()}`);
|
|
37
|
+
return databaseResultSchema.parse(await response.json());
|
|
38
|
+
} },
|
|
39
|
+
dispose: proxy.dispose
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async function openLocalDatabase(slug) {
|
|
43
|
+
const configuration = await prepareLocalResourceConfiguration();
|
|
44
|
+
const connection = await openLocalDatabases(getLocalResourcesWorkerName(), configuration.databases);
|
|
45
|
+
return {
|
|
46
|
+
destroy: connection.dispose,
|
|
47
|
+
query: (sql, params) => connection.databases.query(slug, sql, params)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { openLocalDatabases as n, openLocalDatabase as t };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=local-databases-DVI3ngFq.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-databases-DVI3ngFq.mjs","names":[],"sources":["../local-databases.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\"\nimport { dirname, resolve } from \"node:path\"\nimport type { DatabaseSession } from \"@usecontextlayer/shared/database-dialect\"\nimport { type Databases, databaseResultSchema } from \"@usecontextlayer/shared/databases\"\nimport type { LocalResourceConfiguration } from \"@usecontextlayer/shared/slate-resources\"\nimport type { PlatformProxy } from \"wrangler\"\nimport {\n\tgetLocalResourcesWorkerName,\n\tprepareLocalResourceConfiguration,\n} from \"@/resources\"\n\nexport async function openLocalDatabases(\n\tworkerName: string,\n\tdatabases: LocalResourceConfiguration[\"databases\"],\n): Promise<{ databases: Databases; dispose: PlatformProxy[\"dispose\"] }> {\n\tconst configPath = resolve(\".contextlayer/database-proxy.json\")\n\tawait mkdir(dirname(configPath), { recursive: true })\n\tawait writeFile(\n\t\tconfigPath,\n\t\tJSON.stringify({\n\t\t\tcompatibility_date: \"2026-10-02\",\n\t\t\tname: `${workerName}-database-proxy`,\n\t\t\tservices: [\n\t\t\t\t{\n\t\t\t\t\tbinding: \"DATABASES\",\n\t\t\t\t\tentrypoint: \"Databases\",\n\t\t\t\t\tprops: { databases },\n\t\t\t\t\tservice: workerName,\n\t\t\t\t},\n\t\t\t],\n\t\t}),\n\t)\n\tconst { getPlatformProxy } = await import(\"wrangler\")\n\tconst proxy = await getPlatformProxy<{ DATABASES: Fetcher }>({\n\t\tconfigPath,\n\t\tpersist: false,\n\t\tremoteBindings: false,\n\t})\n\treturn {\n\t\tdatabases: {\n\t\t\tasync query(slug, sql, params = []) {\n\t\t\t\tconst response = await proxy.env.DATABASES.fetch(\n\t\t\t\t\tnew Request(\"http://local/databases/query\", {\n\t\t\t\t\t\tbody: JSON.stringify({ params, slug, sql }),\n\t\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tif (!response.ok)\n\t\t\t\t\tthrow new Error(`Local database query failed: ${await response.text()}`)\n\t\t\t\treturn databaseResultSchema.parse(await response.json())\n\t\t\t},\n\t\t},\n\t\tdispose: proxy.dispose,\n\t}\n}\n\nexport async function openLocalDatabase(slug: string): Promise<DatabaseSession> {\n\tconst configuration = await prepareLocalResourceConfiguration()\n\tconst connection = await openLocalDatabases(\n\t\tgetLocalResourcesWorkerName(),\n\t\tconfiguration.databases,\n\t)\n\treturn {\n\t\tdestroy: connection.dispose,\n\t\tquery: (sql, params) => connection.databases.query(slug, sql, params),\n\t}\n}\n"],"mappings":";;;;;AAWA,eAAsB,mBACrB,YACA,WACuE;CACvE,MAAM,aAAa,QAAQ,mCAAmC;CAC9D,MAAM,MAAM,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;CACpD,MAAM,UACL,YACA,KAAK,UAAU;EACd,oBAAoB;EACpB,MAAM,GAAG,WAAW;EACpB,UAAU,CACT;GACC,SAAS;GACT,YAAY;GACZ,OAAO,EAAE,UAAU;GACnB,SAAS;EACV,CACD;CACD,CAAC,CACF;CACA,MAAM,EAAE,qBAAqB,MAAM,OAAO;CAC1C,MAAM,QAAQ,MAAM,iBAAyC;EAC5D;EACA,SAAS;EACT,gBAAgB;CACjB,CAAC;CACD,OAAO;EACN,WAAW,EACV,MAAM,MAAM,MAAM,KAAK,SAAS,CAAC,GAAG;GACnC,MAAM,WAAW,MAAM,MAAM,IAAI,UAAU,MAC1C,IAAI,QAAQ,gCAAgC;IAC3C,MAAM,KAAK,UAAU;KAAE;KAAQ;KAAM;IAAI,CAAC;IAC1C,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,QAAQ;GACT,CAAC,CACF;GACA,IAAI,CAAC,SAAS,IACb,MAAM,IAAI,MAAM,gCAAgC,MAAM,SAAS,KAAK,GAAG;GACxE,OAAO,qBAAqB,MAAM,MAAM,SAAS,KAAK,CAAC;EACxD,EACD;EACA,SAAS,MAAM;CAChB;AACD;AAEA,eAAsB,kBAAkB,MAAwC;CAC/E,MAAM,gBAAgB,MAAM,kCAAkC;CAC9D,MAAM,aAAa,MAAM,mBACxB,4BAA4B,GAC5B,cAAc,SACf;CACA,OAAO;EACN,SAAS,WAAW;EACpB,QAAQ,KAAK,WAAW,WAAW,UAAU,MAAM,MAAM,KAAK,MAAM;CACrE;AACD"}
|