appflare 0.2.41 → 0.2.43
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/Documentation.md +898 -758
- package/cli/commands/index.ts +247 -247
- package/cli/generate.ts +360 -360
- package/cli/index.ts +120 -120
- package/cli/load-config.ts +184 -184
- package/cli/schema-compiler.ts +1363 -1361
- package/cli/templates/auth/README.md +156 -156
- package/cli/templates/auth/config.ts +61 -61
- package/cli/templates/auth/route-config.ts +1 -1
- package/cli/templates/auth/route-handler.ts +1 -1
- package/cli/templates/auth/route-request-utils.ts +5 -5
- package/cli/templates/auth/route.config.ts +18 -18
- package/cli/templates/auth/route.handler.ts +18 -18
- package/cli/templates/auth/route.request-utils.ts +55 -55
- package/cli/templates/auth/route.ts +14 -14
- package/cli/templates/core/README.md +266 -266
- package/cli/templates/core/app-creation.ts +19 -19
- package/cli/templates/core/client/appflare.ts +112 -112
- package/cli/templates/core/client/handlers/index.ts +763 -755
- package/cli/templates/core/client/handlers.ts +1 -1
- package/cli/templates/core/client/index.ts +7 -7
- package/cli/templates/core/client/storage.ts +195 -195
- package/cli/templates/core/client/types.ts +187 -186
- package/cli/templates/core/client-modules/appflare.ts +1 -1
- package/cli/templates/core/client-modules/handlers.ts +1 -1
- package/cli/templates/core/client-modules/index.ts +1 -1
- package/cli/templates/core/client-modules/storage.ts +1 -1
- package/cli/templates/core/client-modules/types.ts +1 -1
- package/cli/templates/core/client.artifacts.ts +39 -39
- package/cli/templates/core/client.ts +4 -4
- package/cli/templates/core/drizzle.ts +15 -15
- package/cli/templates/core/export.ts +14 -14
- package/cli/templates/core/handlers.route.ts +24 -24
- package/cli/templates/core/handlers.ts +1 -1
- package/cli/templates/core/imports.ts +9 -9
- package/cli/templates/core/server.ts +38 -38
- package/cli/templates/core/types.ts +6 -6
- package/cli/templates/core/wrangler.ts +109 -109
- package/cli/templates/dashboard/builders/functions/index.ts +17 -17
- package/cli/templates/dashboard/builders/functions/render-page/header.ts +20 -20
- package/cli/templates/dashboard/builders/functions/render-page/index.ts +33 -33
- package/cli/templates/dashboard/builders/functions/render-page/request-panel.ts +171 -171
- package/cli/templates/dashboard/builders/functions/render-page/result-panel.ts +85 -85
- package/cli/templates/dashboard/builders/functions/render-page/scripts.ts +554 -554
- package/cli/templates/dashboard/builders/functions/tree-builder.ts +47 -47
- package/cli/templates/dashboard/builders/navigation.ts +155 -155
- package/cli/templates/dashboard/builders/storage/index.ts +13 -13
- package/cli/templates/dashboard/builders/storage/routes/create-directory-route.ts +29 -29
- package/cli/templates/dashboard/builders/storage/routes/delete-route.ts +18 -18
- package/cli/templates/dashboard/builders/storage/routes/download-route.ts +23 -23
- package/cli/templates/dashboard/builders/storage/routes/index.ts +22 -22
- package/cli/templates/dashboard/builders/storage/routes/list-route.ts +25 -25
- package/cli/templates/dashboard/builders/storage/routes/preview-route.ts +21 -21
- package/cli/templates/dashboard/builders/storage/routes/upload-route.ts +21 -21
- package/cli/templates/dashboard/builders/storage/runtime/helpers.ts +72 -72
- package/cli/templates/dashboard/builders/storage/runtime/storage-page.ts +130 -130
- package/cli/templates/dashboard/builders/table-routes/common/drawer-panel.ts +27 -27
- package/cli/templates/dashboard/builders/table-routes/common/pagination.ts +30 -30
- package/cli/templates/dashboard/builders/table-routes/common/search-bar.ts +23 -23
- package/cli/templates/dashboard/builders/table-routes/fragments.ts +217 -217
- package/cli/templates/dashboard/builders/table-routes/helpers.ts +45 -45
- package/cli/templates/dashboard/builders/table-routes/index.ts +8 -8
- package/cli/templates/dashboard/builders/table-routes/table/actions-cell.ts +71 -71
- package/cli/templates/dashboard/builders/table-routes/table/get-route.ts +291 -291
- package/cli/templates/dashboard/builders/table-routes/table/index.ts +80 -80
- package/cli/templates/dashboard/builders/table-routes/table/post-routes.ts +163 -163
- package/cli/templates/dashboard/builders/table-routes/table-route.ts +7 -7
- package/cli/templates/dashboard/builders/table-routes/users/get-route.ts +69 -69
- package/cli/templates/dashboard/builders/table-routes/users/html/modals.ts +57 -57
- package/cli/templates/dashboard/builders/table-routes/users/html/page.ts +27 -27
- package/cli/templates/dashboard/builders/table-routes/users/html/table.ts +128 -128
- package/cli/templates/dashboard/builders/table-routes/users/index.ts +32 -32
- package/cli/templates/dashboard/builders/table-routes/users/post-routes.ts +150 -150
- package/cli/templates/dashboard/builders/table-routes/users/redirect.ts +14 -14
- package/cli/templates/dashboard/builders/table-routes/users-route.ts +10 -10
- package/cli/templates/dashboard/components/dashboard-home.ts +23 -23
- package/cli/templates/dashboard/components/layout.ts +420 -420
- package/cli/templates/dashboard/components/login-page.ts +65 -65
- package/cli/templates/dashboard/index.ts +61 -61
- package/cli/templates/dashboard/types.ts +9 -9
- package/cli/templates/handlers/README.md +353 -353
- package/cli/templates/handlers/auth.ts +37 -37
- package/cli/templates/handlers/execution.ts +42 -42
- package/cli/templates/handlers/generators/context/context-creation.ts +101 -101
- package/cli/templates/handlers/generators/context/error-helpers.ts +11 -11
- package/cli/templates/handlers/generators/context/scheduler.ts +24 -24
- package/cli/templates/handlers/generators/context/storage-api.ts +82 -82
- package/cli/templates/handlers/generators/context/storage-helpers.ts +59 -59
- package/cli/templates/handlers/generators/context/types.ts +40 -40
- package/cli/templates/handlers/generators/context.ts +43 -43
- package/cli/templates/handlers/generators/execution.ts +15 -15
- package/cli/templates/handlers/generators/handlers.ts +14 -14
- package/cli/templates/handlers/generators/registration/modules/cron.ts +26 -26
- package/cli/templates/handlers/generators/registration/modules/realtime/auth.ts +75 -75
- package/cli/templates/handlers/generators/registration/modules/realtime/durable-object.ts +144 -144
- package/cli/templates/handlers/generators/registration/modules/realtime/index.ts +14 -14
- package/cli/templates/handlers/generators/registration/modules/realtime/publisher.ts +102 -102
- package/cli/templates/handlers/generators/registration/modules/realtime/routes.ts +164 -164
- package/cli/templates/handlers/generators/registration/modules/realtime/types.ts +30 -30
- package/cli/templates/handlers/generators/registration/modules/realtime/utils.ts +510 -510
- package/cli/templates/handlers/generators/registration/modules/scheduler.ts +56 -56
- package/cli/templates/handlers/generators/registration/modules/storage.ts +199 -199
- package/cli/templates/handlers/generators/registration/sections.ts +210 -210
- package/cli/templates/handlers/generators/types/context.ts +121 -121
- package/cli/templates/handlers/generators/types/core.ts +106 -106
- package/cli/templates/handlers/generators/types/operations.ts +135 -135
- package/cli/templates/handlers/generators/types/query-definitions/filter-and-where-types.ts +291 -271
- package/cli/templates/handlers/generators/types/query-definitions/query-api-types.ts +135 -135
- package/cli/templates/handlers/generators/types/query-definitions/query-helper-functions.ts +1382 -1382
- package/cli/templates/handlers/generators/types/query-definitions/schema-and-table-types.ts +278 -278
- package/cli/templates/handlers/generators/types/query-definitions.ts +13 -13
- package/cli/templates/handlers/generators/types/query-runtime/handled-error.ts +13 -13
- package/cli/templates/handlers/generators/types/query-runtime/runtime-aggregate-and-footer.ts +174 -174
- package/cli/templates/handlers/generators/types/query-runtime/runtime-read.ts +157 -157
- package/cli/templates/handlers/generators/types/query-runtime/runtime-setup.ts +45 -45
- package/cli/templates/handlers/generators/types/query-runtime/runtime-write.ts +958 -697
- package/cli/templates/handlers/generators/types/query-runtime.ts +15 -15
- package/cli/templates/handlers/index.ts +47 -47
- package/cli/templates/handlers/operations.ts +116 -116
- package/cli/templates/handlers/registration.ts +91 -91
- package/cli/templates/handlers/types.ts +17 -17
- package/cli/templates/handlers/utils.ts +48 -48
- package/cli/types.ts +110 -110
- package/cli/utils/handler-discovery.ts +466 -466
- package/cli/utils/json-utils.ts +24 -24
- package/cli/utils/path-utils.ts +19 -19
- package/cli/utils/schema-discovery.ts +399 -399
- package/dist/cli/index.js +320 -31
- package/dist/cli/index.mjs +320 -31
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/react/index.d.mts +2 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +1 -1
- package/dist/react/index.mjs +1 -1
- package/index.ts +18 -18
- package/package.json +58 -58
- package/react/index.ts +5 -5
- package/react/use-infinite-query.ts +255 -252
- package/react/use-mutation.ts +89 -89
- package/react/use-query.ts +210 -207
- package/schema.ts +641 -641
- package/test-better-auth-hash.ts +2 -2
- package/tsconfig.json +6 -6
- package/tsup.config.ts +82 -82
package/dist/cli/index.js
CHANGED
|
@@ -166,7 +166,7 @@ export function createAppflare<Options extends BetterAuthClientOptions = Inferre
|
|
|
166
166
|
): Appflare<Options> {
|
|
167
167
|
return new Appflare(options);
|
|
168
168
|
}
|
|
169
|
-
`}function rr(e){let n=e.replace(/[^A-Za-z0-9_]/g,"_");return /^[0-9]/.test(n)?`_${n}`:n||"_route"}function ve(e){return e.split(/[^A-Za-z0-9]+/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}function ar(e){return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)?e:JSON.stringify(e)}function Re(e){let n={children:new Map};for(let t of e){let r=n;for(let a of t.segments){let o=r.children.get(a);o||(o={children:new Map},r.children.set(a,o)),r=o;}r.operation=t;}return n}function J(e,n=1){let t=" ".repeat(n),r=" ".repeat(n+1),a=Array.from(e.children.entries()).sort(([i],[s])=>i.localeCompare(s));if(a.length===0)return e.operation?`${e.operation.alias}Route(runtime)`:"{}";let o=["{"];for(let[i,s]of a)o.push(`${r}${ar(i)}: ${J(s,n+1)},`);return e.operation&&(o.push(`${r}run: ${e.operation.alias}Route(runtime).run,`),o.push(`${r}schema: ${e.operation.alias}Route(runtime).schema,`),e.operation.kind==="query"&&o.push(`${r}subscribe: ${e.operation.alias}Route(runtime).subscribe,`)),o.push(`${t}}`),o.join(`
|
|
169
|
+
`}function rr(e){let n=e.replace(/[^A-Za-z0-9_]/g,"_");return /^[0-9]/.test(n)?`_${n}`:n||"_route"}function ve(e){return e.split(/[^A-Za-z0-9]+/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}function ar(e){return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)?e:JSON.stringify(e)}function Re(e){let n={children:new Map};for(let t of e){let r=n;for(let a of t.segments){let o=r.children.get(a);o||(o={children:new Map},r.children.set(a,o)),r=o;}r.operation=t;}return n}function J(e,n=1){let t=" ".repeat(n),r=" ".repeat(n+1),a=Array.from(e.children.entries()).sort(([i],[s])=>i.localeCompare(s));if(a.length===0)return e.operation?`${e.operation.alias}Route(runtime)`:"{}";let o=["{"];for(let[i,s]of a)o.push(`${r}${ar(i)}: ${J(s,n+1)},`);return e.operation&&(o.push(`${r}run: ${e.operation.alias}Route(runtime).run,`),o.push(`${r}schema: ${e.operation.alias}Route(runtime).schema,`),e.operation.kind==="query"&&(o.push(`${r}subscribe: ${e.operation.alias}Route(runtime).subscribe,`),o.push(`${r}queryKey: ${e.operation.alias}Route(runtime).queryKey,`))),o.push(`${t}}`),o.join(`
|
|
170
170
|
`)}function or(e,n){if(e.kind!=="query"&&e.kind!=="mutation")return null;let t=e.clientSegments&&e.clientSegments.length>0?e.clientSegments:e.routePath.replace(/^\//,"").split("/").filter(Boolean).slice(1);if(t.length>=2&&t[t.length-1]===t[t.length-2]&&t.pop(),t.length===0)return null;let r=rr(`op_${n}_${e.kind}_${t.join("_")}`);return {kind:e.kind,routePath:e.routePath,queryName:e.handlerName??t.join("/"),segments:t,importPath:e.clientImportPath,exportName:e.exportName,alias:r,schemaConst:`${r}Schema`,typeBase:`${ve(e.kind)}${ve(t.join("_"))}`}}function ir(e){let n=`${e.typeBase}Input`,t=`${e.typeBase}Output`,r=`${e.typeBase}Schema`,a=e.kind==="query"?"GET":"POST";return e.kind==="query"?`const ${e.alias}Route = (
|
|
171
171
|
runtime: RequestRuntime,
|
|
172
172
|
): AppflareQueryRouteClient<typeof ${e.schemaConst}, ${t}> => {
|
|
@@ -322,10 +322,15 @@ export function createAppflare<Options extends BetterAuthClientOptions = Inferre
|
|
|
322
322
|
};
|
|
323
323
|
};
|
|
324
324
|
|
|
325
|
+
const queryKey = (args?: ${n}): [string, string, string, ${n}] => {
|
|
326
|
+
return ["appflare", "query", ${JSON.stringify(e.routePath)}, (args ?? {}) as ${n}];
|
|
327
|
+
};
|
|
328
|
+
|
|
325
329
|
return {
|
|
326
330
|
schema: ${r},
|
|
327
331
|
run,
|
|
328
332
|
subscribe,
|
|
333
|
+
queryKey,
|
|
329
334
|
};
|
|
330
335
|
};`:`const ${e.alias}Route = (
|
|
331
336
|
runtime: RequestRuntime,
|
|
@@ -1041,6 +1046,7 @@ export type AppflareQueryRouteClient<
|
|
|
1041
1046
|
subscribe: (
|
|
1042
1047
|
options: AppflareQuerySubscribeOptions<import("zod").input<TSchema>, TOutput>,
|
|
1043
1048
|
) => AppflareRealtimeSubscription;
|
|
1049
|
+
queryKey: (args?: import("zod").input<TSchema>) => [string, string, string, import("zod").input<TSchema>];
|
|
1044
1050
|
};
|
|
1045
1051
|
|
|
1046
1052
|
export type InferRouteSchema<TRoute> = TRoute extends {
|
|
@@ -1461,7 +1467,7 @@ export async function createExecutionContext(
|
|
|
1461
1467
|
ctx.storage = createStorageApi(ctx, storageBucket);
|
|
1462
1468
|
return ctx;
|
|
1463
1469
|
}
|
|
1464
|
-
`}function
|
|
1470
|
+
`}function je(e){return `import type { Context } from "hono";
|
|
1465
1471
|
import type { D1Database, IncomingRequestCfProperties, KVNamespace } from "@cloudflare/workers-types";
|
|
1466
1472
|
import { createAuth } from "./auth.config";
|
|
1467
1473
|
import {
|
|
@@ -1493,7 +1499,7 @@ ${Ie()}
|
|
|
1493
1499
|
${Ee()}
|
|
1494
1500
|
|
|
1495
1501
|
${Pe(e)}
|
|
1496
|
-
`}function
|
|
1502
|
+
`}function Oe(){return `
|
|
1497
1503
|
export async function executeOperation<
|
|
1498
1504
|
TShape extends ZodRawShape,
|
|
1499
1505
|
TResult,
|
|
@@ -1541,7 +1547,7 @@ import {
|
|
|
1541
1547
|
type WorkerEnv,
|
|
1542
1548
|
} from "./handlers";
|
|
1543
1549
|
|
|
1544
|
-
${
|
|
1550
|
+
${Oe()}
|
|
1545
1551
|
`}function Ve(){return `import { betterAuth } from "better-auth";
|
|
1546
1552
|
import { auth } from "./auth.config";
|
|
1547
1553
|
import {
|
|
@@ -1692,7 +1698,7 @@ type FieldOperators<T, TFieldKey extends string = string> = {
|
|
|
1692
1698
|
lte?: Comparable<T>;
|
|
1693
1699
|
exists?: boolean;
|
|
1694
1700
|
regex?: RegexOperand<T>;
|
|
1695
|
-
options?: string;
|
|
1701
|
+
$options?: string;
|
|
1696
1702
|
geoWithin?: GeoWithinOperandForField<TFieldKey>;
|
|
1697
1703
|
includes?: T extends ReadonlyArray<infer E> ? ReadonlyArray<E> : never;
|
|
1698
1704
|
includesAny?: T extends ReadonlyArray<infer E> ? ReadonlyArray<E> : never;
|
|
@@ -1904,11 +1910,31 @@ export type QueryInsertArgs<TName extends TableName> = {
|
|
|
1904
1910
|
};
|
|
1905
1911
|
|
|
1906
1912
|
export type QueryUpdateArgs<TName extends TableName> = {
|
|
1907
|
-
set: Partial<TableInsertModel<TName
|
|
1913
|
+
set: Partial<TableInsertModel<TName>> & ManyToManyUpdateSetFields<TName>;
|
|
1908
1914
|
where?: WhereInput<TableModel<TName>, TName>;
|
|
1909
1915
|
limit?: number;
|
|
1910
1916
|
};
|
|
1911
1917
|
|
|
1918
|
+
type ManyToManyUpdateSetFields<TName extends TableName> = {
|
|
1919
|
+
[TRelationName in RuntimeRelationName<TName>]?: RuntimeRelationKind<TName, TRelationName> extends "manyToMany"
|
|
1920
|
+
? ManyToManyUpdateInput<TName, TRelationName>
|
|
1921
|
+
: never;
|
|
1922
|
+
};
|
|
1923
|
+
|
|
1924
|
+
type ManyToManyUpdateInput<
|
|
1925
|
+
TSourceTable extends TableName,
|
|
1926
|
+
TRelationName extends RuntimeRelationName<TSourceTable>,
|
|
1927
|
+
> = {
|
|
1928
|
+
items: Array<ManyToManyUpdateItem<TargetTableForRelation<TSourceTable, TRelationName>>>;
|
|
1929
|
+
mode?: "merge" | "overwrite";
|
|
1930
|
+
};
|
|
1931
|
+
|
|
1932
|
+
type ManyToManyUpdateItem<TTargetTable extends TableName> =
|
|
1933
|
+
| ("id" extends keyof TableModel<TTargetTable>
|
|
1934
|
+
? TableModel<TTargetTable>["id"]
|
|
1935
|
+
: never)
|
|
1936
|
+
| Partial<TableInsertModel<TTargetTable>>;
|
|
1937
|
+
|
|
1912
1938
|
export type QueryDeleteArgs<TName extends TableName> = {
|
|
1913
1939
|
where?: WhereInput<TableModel<TName>, TName>;
|
|
1914
1940
|
limit?: number;
|
|
@@ -4640,6 +4666,8 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
4640
4666
|
return rows;
|
|
4641
4667
|
},
|
|
4642
4668
|
update: async (args: QueryUpdateArgs<TableName>) => {
|
|
4669
|
+
const transaction = ($db as any).transaction;
|
|
4670
|
+
|
|
4643
4671
|
const whereFilter = buildWhereFilter(
|
|
4644
4672
|
table,
|
|
4645
4673
|
args.where as Record<string, unknown> | undefined,
|
|
@@ -4648,27 +4676,286 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
4648
4676
|
|
|
4649
4677
|
const setPayload = args.set as Record<string, unknown>;
|
|
4650
4678
|
const cleanSetPayload: Record<string, unknown> = {};
|
|
4679
|
+
const relationPayloads: Array<{
|
|
4680
|
+
relationName: string;
|
|
4681
|
+
relation: RuntimeRelation;
|
|
4682
|
+
value: unknown;
|
|
4683
|
+
}> = [];
|
|
4684
|
+
|
|
4651
4685
|
for (const [key, value] of Object.entries(setPayload)) {
|
|
4652
|
-
if (value
|
|
4653
|
-
|
|
4686
|
+
if (value === undefined) continue;
|
|
4687
|
+
const runtimeRelation = getRuntimeRelation(tableName, key);
|
|
4688
|
+
if (runtimeRelation && runtimeRelation.kind === "manyToMany") {
|
|
4689
|
+
relationPayloads.push({
|
|
4690
|
+
relationName: key,
|
|
4691
|
+
relation: runtimeRelation,
|
|
4692
|
+
value,
|
|
4693
|
+
});
|
|
4694
|
+
continue;
|
|
4654
4695
|
}
|
|
4696
|
+
cleanSetPayload[key] = value;
|
|
4655
4697
|
}
|
|
4656
4698
|
|
|
4657
|
-
|
|
4658
|
-
|
|
4659
|
-
|
|
4699
|
+
const normalizeRelationValue = (
|
|
4700
|
+
value: unknown,
|
|
4701
|
+
): { items: unknown[]; mode: "merge" | "overwrite" } => {
|
|
4702
|
+
if (Array.isArray(value)) {
|
|
4703
|
+
return { items: value, mode: "merge" };
|
|
4704
|
+
}
|
|
4705
|
+
if (value && typeof value === "object") {
|
|
4706
|
+
const record = value as Record<string, unknown>;
|
|
4707
|
+
const items = Array.isArray(record.items) ? record.items : [];
|
|
4708
|
+
const mode = record.mode === "overwrite" ? "overwrite" : "merge";
|
|
4709
|
+
return { items, mode };
|
|
4710
|
+
}
|
|
4711
|
+
return { items: [], mode: "merge" };
|
|
4712
|
+
};
|
|
4660
4713
|
|
|
4661
|
-
|
|
4662
|
-
|
|
4663
|
-
|
|
4664
|
-
|
|
4665
|
-
|
|
4666
|
-
|
|
4667
|
-
|
|
4668
|
-
|
|
4714
|
+
const executeUpdateWithRelations = async (
|
|
4715
|
+
tx: any,
|
|
4716
|
+
): Promise<Array<TableModel<TableName>>> => {
|
|
4717
|
+
let updateQuery: any = tx
|
|
4718
|
+
.update(table as any)
|
|
4719
|
+
.set(cleanSetPayload as any);
|
|
4720
|
+
|
|
4721
|
+
if (whereFilter) {
|
|
4722
|
+
updateQuery = updateQuery.where(whereFilter);
|
|
4723
|
+
}
|
|
4724
|
+
if (
|
|
4725
|
+
typeof args.limit === "number" &&
|
|
4726
|
+
typeof updateQuery.limit === "function"
|
|
4727
|
+
) {
|
|
4728
|
+
updateQuery = updateQuery.limit(args.limit);
|
|
4729
|
+
}
|
|
4730
|
+
if (typeof updateQuery.returning === "function") {
|
|
4731
|
+
updateQuery = updateQuery.returning();
|
|
4732
|
+
}
|
|
4733
|
+
|
|
4734
|
+
const rows = (await updateQuery) as Array<TableModel<TableName>>;
|
|
4735
|
+
if (rows.length === 0) return rows;
|
|
4736
|
+
|
|
4737
|
+
for (const row of rows) {
|
|
4738
|
+
const parentId = (row as Record<string, unknown>)["id"];
|
|
4739
|
+
if (parentId === undefined || parentId === null) continue;
|
|
4740
|
+
|
|
4741
|
+
for (const { relationName, relation, value } of relationPayloads) {
|
|
4742
|
+
const { items, mode } = normalizeRelationValue(value);
|
|
4743
|
+
|
|
4744
|
+
const junctionTable = (mergedSchema as Record<string, unknown>)[
|
|
4745
|
+
relation.junctionTable
|
|
4746
|
+
];
|
|
4747
|
+
if (!junctionTable) {
|
|
4748
|
+
throw new Error(
|
|
4749
|
+
"Unknown junction table '" +
|
|
4750
|
+
relation.junctionTable +
|
|
4751
|
+
"' for relation '" +
|
|
4752
|
+
tableName +
|
|
4753
|
+
"." +
|
|
4754
|
+
relationName +
|
|
4755
|
+
"'.",
|
|
4756
|
+
);
|
|
4757
|
+
}
|
|
4758
|
+
|
|
4759
|
+
const sourceField = relation.sourceField;
|
|
4760
|
+
const targetField = relation.targetField;
|
|
4761
|
+
if (!sourceField || !targetField) {
|
|
4762
|
+
throw new Error(
|
|
4763
|
+
"Relation '" +
|
|
4764
|
+
tableName +
|
|
4765
|
+
"." +
|
|
4766
|
+
relationName +
|
|
4767
|
+
"' is missing junction metadata fields.",
|
|
4768
|
+
);
|
|
4769
|
+
}
|
|
4770
|
+
|
|
4771
|
+
const parentReferenceField = relation.referenceField ?? "id";
|
|
4772
|
+
const parentReferenceColumn = (table as Record<string, unknown>)[parentReferenceField];
|
|
4773
|
+
if (!parentReferenceColumn) {
|
|
4774
|
+
throw new Error(
|
|
4775
|
+
"Table '" +
|
|
4776
|
+
tableName +
|
|
4777
|
+
"' is missing column '" +
|
|
4778
|
+
parentReferenceField +
|
|
4779
|
+
"' for relation '" +
|
|
4780
|
+
relationName +
|
|
4781
|
+
"'.",
|
|
4782
|
+
);
|
|
4783
|
+
}
|
|
4784
|
+
|
|
4785
|
+
const junctionSourceColumn = (junctionTable as Record<string, unknown>)[sourceField];
|
|
4786
|
+
if (!junctionSourceColumn) {
|
|
4787
|
+
throw new Error(
|
|
4788
|
+
"Junction table '" +
|
|
4789
|
+
relation.junctionTable +
|
|
4790
|
+
"' is missing column '" +
|
|
4791
|
+
sourceField +
|
|
4792
|
+
"' for relation '" +
|
|
4793
|
+
relationName +
|
|
4794
|
+
"'.",
|
|
4795
|
+
);
|
|
4796
|
+
}
|
|
4797
|
+
|
|
4798
|
+
if (mode === "overwrite") {
|
|
4799
|
+
await tx
|
|
4800
|
+
.delete(junctionTable as any)
|
|
4801
|
+
.where(eq(junctionSourceColumn as any, (row as Record<string, unknown>)[parentReferenceField] as any));
|
|
4802
|
+
}
|
|
4803
|
+
|
|
4804
|
+
const referenceField = relation.targetReferenceField ?? "id";
|
|
4805
|
+
const targetTable = (mergedSchema as Record<string, unknown>)[
|
|
4806
|
+
relation.targetTable
|
|
4807
|
+
];
|
|
4808
|
+
|
|
4809
|
+
const junctionTargetColumn =
|
|
4810
|
+
(junctionTable as Record<string, unknown>)[targetField];
|
|
4811
|
+
if (!junctionTargetColumn) {
|
|
4812
|
+
throw new Error(
|
|
4813
|
+
"Junction table '" +
|
|
4814
|
+
relation.junctionTable +
|
|
4815
|
+
"' is missing column '" +
|
|
4816
|
+
targetField +
|
|
4817
|
+
"'.",
|
|
4818
|
+
);
|
|
4819
|
+
}
|
|
4820
|
+
|
|
4821
|
+
for (const item of items) {
|
|
4822
|
+
let targetId: unknown;
|
|
4823
|
+
|
|
4824
|
+
if (
|
|
4825
|
+
typeof item === "string" ||
|
|
4826
|
+
typeof item === "number" ||
|
|
4827
|
+
typeof item === "bigint"
|
|
4828
|
+
) {
|
|
4829
|
+
targetId = item;
|
|
4830
|
+
} else if (item && typeof item === "object") {
|
|
4831
|
+
const record = item as Record<string, unknown>;
|
|
4832
|
+
const existingId = record[referenceField];
|
|
4833
|
+
if (existingId !== undefined && existingId !== null) {
|
|
4834
|
+
targetId = existingId;
|
|
4835
|
+
} else {
|
|
4836
|
+
if (!targetTable) {
|
|
4837
|
+
throw new Error(
|
|
4838
|
+
"Unknown target table '" +
|
|
4839
|
+
relation.targetTable +
|
|
4840
|
+
"' for relation '" +
|
|
4841
|
+
tableName +
|
|
4842
|
+
"." +
|
|
4843
|
+
relationName +
|
|
4844
|
+
"'.",
|
|
4845
|
+
);
|
|
4846
|
+
}
|
|
4847
|
+
let createQuery: any = tx
|
|
4848
|
+
.insert(targetTable as any)
|
|
4849
|
+
.values(record as any);
|
|
4850
|
+
if (typeof createQuery.returning === "function") {
|
|
4851
|
+
createQuery = createQuery.returning();
|
|
4852
|
+
}
|
|
4853
|
+
const createdRows =
|
|
4854
|
+
(await createQuery) as Array<Record<string, unknown>>;
|
|
4855
|
+
const created = createdRows[0];
|
|
4856
|
+
if (!created) {
|
|
4857
|
+
throw new Error(
|
|
4858
|
+
"Failed to create relation target for '" +
|
|
4859
|
+
tableName +
|
|
4860
|
+
"." +
|
|
4861
|
+
relationName +
|
|
4862
|
+
"'.",
|
|
4863
|
+
);
|
|
4864
|
+
}
|
|
4865
|
+
targetId = created[referenceField];
|
|
4866
|
+
if (targetId === undefined || targetId === null) {
|
|
4867
|
+
throw new Error(
|
|
4868
|
+
"Created relation target for '" +
|
|
4869
|
+
tableName +
|
|
4870
|
+
"." +
|
|
4871
|
+
relationName +
|
|
4872
|
+
"' is missing '" +
|
|
4873
|
+
referenceField +
|
|
4874
|
+
"'.",
|
|
4875
|
+
);
|
|
4876
|
+
}
|
|
4877
|
+
}
|
|
4878
|
+
} else {
|
|
4879
|
+
throw new Error(
|
|
4880
|
+
"Relation '" +
|
|
4881
|
+
tableName +
|
|
4882
|
+
"." +
|
|
4883
|
+
relationName +
|
|
4884
|
+
"' expects an id or object payload.",
|
|
4885
|
+
);
|
|
4886
|
+
}
|
|
4887
|
+
|
|
4888
|
+
if (mode === "merge") {
|
|
4889
|
+
const parentRefValue = (row as Record<string, unknown>)[parentReferenceField];
|
|
4890
|
+
const existingLinks = await tx
|
|
4891
|
+
.select()
|
|
4892
|
+
.from(junctionTable as any)
|
|
4893
|
+
.where(
|
|
4894
|
+
and(
|
|
4895
|
+
eq(junctionSourceColumn as any, parentRefValue as any),
|
|
4896
|
+
eq(junctionTargetColumn as any, targetId as any),
|
|
4897
|
+
),
|
|
4898
|
+
);
|
|
4899
|
+
if (existingLinks.length > 0) continue;
|
|
4900
|
+
}
|
|
4901
|
+
|
|
4902
|
+
const parentRefValue = (row as Record<string, unknown>)[parentReferenceField];
|
|
4903
|
+
await tx.insert(junctionTable as any).values({
|
|
4904
|
+
[sourceField]: parentRefValue,
|
|
4905
|
+
[targetField]: targetId,
|
|
4906
|
+
} as any);
|
|
4907
|
+
}
|
|
4908
|
+
}
|
|
4909
|
+
}
|
|
4910
|
+
|
|
4911
|
+
return rows;
|
|
4912
|
+
};
|
|
4913
|
+
|
|
4914
|
+
let rows: Array<TableModel<TableName>>;
|
|
4915
|
+
if (relationPayloads.length > 0) {
|
|
4916
|
+
if (typeof transaction === "function") {
|
|
4917
|
+
try {
|
|
4918
|
+
rows = await transaction.call($db, (tx: any) =>
|
|
4919
|
+
executeUpdateWithRelations(tx),
|
|
4920
|
+
);
|
|
4921
|
+
} catch (error) {
|
|
4922
|
+
const message =
|
|
4923
|
+
error instanceof Error ? error.message : String(error);
|
|
4924
|
+
const lowered = message.toLowerCase();
|
|
4925
|
+
if (
|
|
4926
|
+
lowered.includes("failed query: begin") ||
|
|
4927
|
+
lowered.includes('near "begin"') ||
|
|
4928
|
+
lowered.includes("cannot start a transaction")
|
|
4929
|
+
) {
|
|
4930
|
+
rows = await executeUpdateWithRelations($db as any);
|
|
4931
|
+
} else {
|
|
4932
|
+
throw error;
|
|
4933
|
+
}
|
|
4934
|
+
}
|
|
4935
|
+
} else {
|
|
4936
|
+
rows = await executeUpdateWithRelations($db as any);
|
|
4937
|
+
}
|
|
4938
|
+
} else {
|
|
4939
|
+
let updateQuery: any = ($db as any)
|
|
4940
|
+
.update(table as any)
|
|
4941
|
+
.set(cleanSetPayload as any);
|
|
4942
|
+
|
|
4943
|
+
if (whereFilter) {
|
|
4944
|
+
updateQuery = updateQuery.where(whereFilter);
|
|
4945
|
+
}
|
|
4946
|
+
if (
|
|
4947
|
+
typeof args.limit === "number" &&
|
|
4948
|
+
typeof updateQuery.limit === "function"
|
|
4949
|
+
) {
|
|
4950
|
+
updateQuery = updateQuery.limit(args.limit);
|
|
4951
|
+
}
|
|
4952
|
+
if (typeof updateQuery.returning === "function") {
|
|
4953
|
+
updateQuery = updateQuery.returning();
|
|
4954
|
+
}
|
|
4955
|
+
|
|
4956
|
+
rows = (await updateQuery) as Array<TableModel<TableName>>;
|
|
4669
4957
|
}
|
|
4670
4958
|
|
|
4671
|
-
const rows = (await updateQuery) as Array<TableModel<TableName>>;
|
|
4672
4959
|
emitMutation(
|
|
4673
4960
|
"update",
|
|
4674
4961
|
{
|
|
@@ -6437,7 +6724,7 @@ export function registerGeneratedHandlers(
|
|
|
6437
6724
|
${ut}
|
|
6438
6725
|
|
|
6439
6726
|
${dt}
|
|
6440
|
-
`}function Z(e,n,t,r=[],a=[]){let o=et(e,r,a),i=
|
|
6727
|
+
`}function Z(e,n,t,r=[],a=[]){let o=et(e,r,a),i=je(t),s=De(),u=pt(n);return [{relativePath:"handlers.ts",source:o},{relativePath:"handlers.context.ts",source:i},{relativePath:"handlers.execution.ts",source:s},{relativePath:"handlers.routes.ts",source:u}]}function xr(e){return e?`,
|
|
6441
6728
|
KV: c.env["${e}"] as KVNamespace`:""}function mt(e,n){return `{
|
|
6442
6729
|
DATABASE: c.env["${e}"] as D1Database${xr(n)}
|
|
6443
6730
|
}`}function ft(e,n,t){return `app.on(["GET", "POST"], "${e}/*", async (c) => {
|
|
@@ -6791,7 +7078,7 @@ ${t}</li>`;}return i}function Nt(e){let n=e.filter(s=>s.kind==="query"),t=e.filt
|
|
|
6791
7078
|
hx-trigger="keyup changed delay:500ms, search"
|
|
6792
7079
|
hx-target="#main-content"
|
|
6793
7080
|
class="input input-sm md:input-md input-bordered pl-9 w-full md:w-72 bg-base-200/50 border-base-200 focus:bg-base-100 focus:border-primary transition-all text-sm" />
|
|
6794
|
-
</div>`}function
|
|
7081
|
+
</div>`}function jt(e,n,t,r,a,o,i,s,u,l){let c=B(`/admin/table/${e.exportName}`),p=W(`/admin/table/${e.exportName}`,"Search term or filter..."),d=r?`<th class="w-10"><input id="select-all-${e.exportName}" type="checkbox" class="checkbox checkbox-xs" /></th>`:'<th class="w-10"><input type="checkbox" class="checkbox checkbox-xs opacity-30" disabled /></th>',y=r?`<td><input type="checkbox" class="checkbox checkbox-xs row-select-checkbox" value="\${String((row as any).${t} ?? '')}" /></td>`:'<td><input type="checkbox" class="checkbox checkbox-xs opacity-30" disabled /></td>',v=r?`
|
|
6795
7082
|
<div id="bulk-delete-bar-${e.exportName}" class="fixed bottom-4 left-1/2 -translate-x-1/2 z-40 hidden">
|
|
6796
7083
|
<div class="bg-base-100 border border-base-200 rounded-xl shadow-lg px-3 py-2 flex items-center gap-3">
|
|
6797
7084
|
<div class="text-xs text-base-content/70">
|
|
@@ -7043,7 +7330,7 @@ ${t}</li>`;}return i}function Nt(e){let n=e.filter(s=>s.kind==="query"),t=e.filt
|
|
|
7043
7330
|
title: "${e.tableName} - Admin Dashboard",
|
|
7044
7331
|
children: content
|
|
7045
7332
|
}));
|
|
7046
|
-
});`}function
|
|
7333
|
+
});`}function Ot(e,n,t,r,a,o,i,s){let u=r==="number"?`
|
|
7047
7334
|
const parsedId = Number(rawId);
|
|
7048
7335
|
if (Number.isNaN(parsedId)) return c.text('${t} must be a valid number', 400);
|
|
7049
7336
|
idValue = parsedId;
|
|
@@ -7176,8 +7463,8 @@ ${t}</li>`;}return i}function Nt(e){let n=e.filter(s=>s.kind==="query"),t=e.filt
|
|
|
7176
7463
|
return c.redirect('/admin/table/${e}?' + query.toString());
|
|
7177
7464
|
});
|
|
7178
7465
|
${c}
|
|
7179
|
-
`}function re(e){let n=Mt(e),t=!!n,r=e.columns.map(w=>w.name),a=r.filter(w=>It(e,w)),o=r.filter(w=>Et(e,w)),i=Ct(e),s=qt(e,r),u=Ft(r,n),l=a.map(w=>te(e,w,"create")).join(""),c=o.map(w=>te(e,w,"edit")).join(""),p=ne(e,a),d=ne(e,o),y=t?n:r[0]||"id",v=e.columns.find(w=>w.name===n)?.type,A=Pt(e,t,n,c);return
|
|
7180
|
-
`+
|
|
7466
|
+
`}function re(e){let n=Mt(e),t=!!n,r=e.columns.map(w=>w.name),a=r.filter(w=>It(e,w)),o=r.filter(w=>Et(e,w)),i=Ct(e),s=qt(e,r),u=Ft(r,n),l=a.map(w=>te(e,w,"create")).join(""),c=o.map(w=>te(e,w,"edit")).join(""),p=ne(e,a),d=ne(e,o),y=t?n:r[0]||"id",v=e.columns.find(w=>w.name===n)?.type,A=Pt(e,t,n,c);return jt(e,y,n,t,r,i,s,u,A,l)+`
|
|
7467
|
+
`+Ot(e.exportName,y,n,v,t,i,p,d)}function Dt(){return `
|
|
7181
7468
|
const buildUsersRedirect = (params: { page?: string; sort?: string; order?: string; search?: string }) => {
|
|
7182
7469
|
const page = params.page && params.page.trim() ? params.page : '1';
|
|
7183
7470
|
const sort = params.sort && params.sort.trim() ? params.sort : 'createdAt';
|
|
@@ -9180,7 +9467,7 @@ ${p}
|
|
|
9180
9467
|
app.route('/admin', adminApp);
|
|
9181
9468
|
app.get('/admin/', (c) => c.redirect('/admin'));
|
|
9182
9469
|
}
|
|
9183
|
-
`}function oe(e){if(typeof e!="object"||e===null)return false;let n=e;return n.kind==="schema"&&typeof n.tables=="object"&&(typeof n.enums=="object"||n.enums===void 0)}function
|
|
9470
|
+
`}function oe(e){if(typeof e!="object"||e===null)return false;let n=e;return n.kind==="schema"&&typeof n.tables=="object"&&(typeof n.enums=="object"||n.enums===void 0)}function j(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase()}function F(e){return e.replace(/[_-]+/g," ").replace(/\s+(.)/g,(n,t)=>t.toUpperCase()).replace(/\s/g,"").replace(/^(.)/,(n,t)=>t.toUpperCase())}function le(e){return e.endsWith("ies")?`${e.slice(0,-3)}y`:e.endsWith("ses")?e.slice(0,-2):e.endsWith("s")&&e.length>1?e.slice(0,-1):e}function f(e){return JSON.stringify(e)}function Er(e){if(typeof e=="string")return f(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(e===null)return "null";if(e instanceof Date)return f(e.toISOString());throw new Error(`Unsupported SQL default value '${String(e)}'. Use string, number, boolean, null, or Date.`)}function Pr(e){return {kind:"schema",tables:Object.fromEntries(Object.entries(e.tables).map(([n,t])=>[n,{kind:"table",sqlName:t.sqlName,columns:Object.fromEntries(Object.entries(t.columns).map(([r,a])=>[r,{...a}])),relations:Object.fromEntries(Object.entries(t.relations).map(([r,a])=>[r,{...a}]))}])),enums:Object.fromEntries(Object.entries(e.enums??{}).map(([n,t])=>[n,{...t}]))}}function H(e,n,t){let r=e.tables[n];return r?r.columns[t]?.type:void 0}function mn(e,n,t,r,a,o,i){let s=n.columns[t];if(s){if(s.references&&(s.references.table!==r||s.references.column!==a))throw new Error(`Inferred relation '${e}.${t}' conflicts with explicit references(${s.references.table}.${s.references.column}).`);n.columns[t]={...s,notNull:s.notNull??(s.nullable===true?false:o.notNull),nullable:s.nullable??(o.notNull===false?true:void 0),references:{table:r,column:a,onDelete:s.references?.onDelete??o.onDelete,onUpdate:s.references?.onUpdate??o.onUpdate}};return}n.columns[t]={kind:"column",type:o.fkType??i,sqlName:o.sqlName,notNull:o.notNull??true,nullable:o.notNull===false?true:void 0,references:{table:r,column:a,onDelete:o.onDelete,onUpdate:o.onUpdate}};}function fn(e,n,t){if(n.notNull===true&&n.nullable===true)throw new Error(`Invalid nullable configuration on '${e}': cannot set both notNull and nullable to true.`);return n.notNull===true?true:n.nullable===true||n.notNull===false?false:t}function gn(e,n){return `${e}:${n}`}function jr(e,n,t,r){let a=gn(e,n),o=gn(t,r);return a<=o?{key:`${a}|${o}`,leftTable:e,leftReferenceField:n,rightTable:t,rightReferenceField:r,sourceIsLeft:true}:{key:`${o}|${a}`,leftTable:t,leftReferenceField:r,rightTable:e,rightReferenceField:n,sourceIsLeft:false}}function Or(e,n){return `${e}${F(n)}Links`}function hn(e,n,t){let r=le(e),a=le(n);return r===a?`${t}${F(r)}Id`:`${r}Id`}function Dr(e,n,t){if(e.junctionTable!==n.junctionTable)throw new Error(`manyToMany pair '${t}' has conflicting junctionTable values ('${e.junctionTable}' vs '${n.junctionTable}').`);if(e.leftField!==n.leftField)throw new Error(`manyToMany pair '${t}' has conflicting left field values ('${e.leftField}' vs '${n.leftField}').`);if(e.rightField!==n.rightField)throw new Error(`manyToMany pair '${t}' has conflicting right field values ('${e.rightField}' vs '${n.rightField}').`);if(e.leftSqlName!==n.leftSqlName)throw new Error(`manyToMany pair '${t}' has conflicting left sql name values ('${e.leftSqlName}' vs '${n.leftSqlName}').`);if(e.rightSqlName!==n.rightSqlName)throw new Error(`manyToMany pair '${t}' has conflicting right sql name values ('${e.rightSqlName}' vs '${n.rightSqlName}').`);if(e.onDelete!==n.onDelete)throw new Error(`manyToMany pair '${t}' has conflicting onDelete values ('${e.onDelete}' vs '${n.onDelete}').`);if(e.onUpdate!==n.onUpdate)throw new Error(`manyToMany pair '${t}' has conflicting onUpdate values ('${e.onUpdate}' vs '${n.onUpdate}').`);return e}function Vr(e){let n=new Map;for(let[t,r]of Object.entries(e.tables))for(let a of Object.values(r.relations)){if(a.relation!=="manyToMany")continue;let o=a.referenceField??"id",i=a.targetReferenceField??"id",s=jr(t,o,a.targetTable,i),u=hn(s.leftTable,s.rightTable,"source"),l=hn(s.rightTable,s.leftTable,"target"),c={leftTable:s.leftTable,leftReferenceField:s.leftReferenceField,rightTable:s.rightTable,rightReferenceField:s.rightReferenceField,junctionTable:a.junctionTable??Or(s.leftTable,s.rightTable),leftField:s.sourceIsLeft?a.sourceField??u:a.targetField??u,rightField:s.sourceIsLeft?a.targetField??l:a.sourceField??l,leftSqlName:s.sourceIsLeft?a.sourceSqlName:a.targetSqlName,rightSqlName:s.sourceIsLeft?a.targetSqlName:a.sourceSqlName,onDelete:a.onDelete,onUpdate:a.onUpdate};if(c.leftField===c.rightField)throw new Error(`manyToMany pair '${s.key}' resolves to duplicate junction fields '${c.leftField}'. Set sourceField/targetField explicitly.`);let p=n.get(s.key);p?Dr(p,c,s.key):n.set(s.key,c),a.referenceField=o,a.targetReferenceField=i,a.junctionTable=c.junctionTable,a.sourceField=s.sourceIsLeft?c.leftField:c.rightField,a.targetField=s.sourceIsLeft?c.rightField:c.leftField,a.sourceSqlName=s.sourceIsLeft?c.leftSqlName:c.rightSqlName,a.targetSqlName=s.sourceIsLeft?c.rightSqlName:c.leftSqlName;}for(let t of n.values()){if(t.junctionTable in e.tables)throw new Error(`manyToMany auto junction table '${t.junctionTable}' conflicts with an existing table. Set a different junctionTable name.`);let r=H(e,t.leftTable,t.leftReferenceField)??"string",a=H(e,t.rightTable,t.rightReferenceField)??"string";e.tables[t.junctionTable]={kind:"table",columns:{[t.leftField]:{kind:"column",type:r,sqlName:t.leftSqlName,notNull:true,nullable:false,references:{table:t.leftTable,column:t.leftReferenceField,onDelete:t.onDelete,onUpdate:t.onUpdate},index:true},[t.rightField]:{kind:"column",type:a,sqlName:t.rightSqlName,notNull:true,nullable:false,references:{table:t.rightTable,column:t.rightReferenceField,onDelete:t.onDelete,onUpdate:t.onUpdate},index:true}},relations:{[t.leftTable]:{kind:"relation",relation:"one",targetTable:t.leftTable,field:t.leftField,referenceField:t.leftReferenceField},[t.rightTable]:{kind:"relation",relation:"one",targetTable:t.rightTable,field:t.rightField,referenceField:t.rightReferenceField}}};}}function Br(e){for(let[n,t]of Object.entries(e.tables)){for(let[r,a]of Object.entries(t.columns))if(a.notNull===true&&a.nullable===true)throw new Error(`Invalid nullable configuration on '${n}.${r}': cannot set both notNull and nullable to true.`);for(let[r,a]of Object.entries(t.relations))if(a.relation!=="manyToMany"&&a.notNull===true&&a.nullable===true)throw new Error(`Invalid nullable configuration on '${n}.${r}': cannot set both notNull and nullable to true.`)}}function Wr(e){Br(e);let n=Pr(e);for(let[t,r]of Object.entries(n.tables))for(let[a,o]of Object.entries(r.relations)){if(o.relation!=="one")continue;let i=o.referenceField??"id",s=o.field??`${a}Id`;o.field=s;let u=H(n,o.targetTable,i)??o.fkType??"string";mn(t,r,s,o.targetTable,i,{fkType:o.fkType,sqlName:o.sqlName,notNull:fn(`${t}.${a}`,o,true),onDelete:o.onDelete,onUpdate:o.onUpdate},u);}for(let[t,r]of Object.entries(n.tables))for(let a of Object.values(r.relations)){if(a.relation!=="many")continue;let o=n.tables[a.targetTable];if(!o)continue;let i=a.referenceField??"id",s=a.field??`${le(t)}Id`;a.field=s;let u=H(n,t,i)??a.fkType??"string";mn(a.targetTable,o,s,t,i,{fkType:a.fkType,sqlName:a.sqlName,notNull:fn(`${t}.${a.targetTable}`,a,true),onDelete:a.onDelete,onUpdate:a.onUpdate},u);}return Vr(n),n}function bn(e){return e.primaryKey===true||e.notNull!==true||e.autoIncrement===true||e.sqlDefault!==void 0||e.runtimeDefaultFn!==void 0}function O(e){return e.notNull!==true}function Hr(e,n,t){let r=n.sqlName??j(e),a=r!==e;if(n.type==="int")return a?`t.int(${f(r)})`:"t.int()";if(n.type==="string")return n.length!==void 0?a?`t.text(${f(r)}, { length: ${n.length} })`:`t.text({ length: ${n.length} })`:a?`t.text(${f(r)})`:"t.text()";if(n.type==="boolean")return a?`t.int(${f(r)}, { mode: "boolean" })`:'t.int({ mode: "boolean" })';if(n.type==="date")return a?`t.int(${f(r)}, { mode: "timestamp_ms" })`:'t.int({ mode: "timestamp_ms" })';if(n.type==="enum"&&n.enumValues&&n.enumValues.length>0)return n.isArray?a?`t.text(${f(r)}).array()`:"t.text().array()":a?`t.text(${f(r)})`:"t.text()";if(n.type==="json"&&n.jsonShape){let o=L(n.jsonShape);return `${a?`t.text(${f(r)}, { mode: "json" })`:'t.text({ mode: "json" })'}.$type<${o}>()`}return t==="camelToSnake"&&a?`t.text(${f(r)})`:"t.text()"}function Lr(e,n,t){let r=t.field,a=t.referenceField??"id";if(!r)throw new Error(`Relation on '${e}' targeting '${t.targetTable}' is missing a local field.`);if(!(r in n.columns))throw new Error(`Relation '${e}.${r}' references missing local field '${r}'.`);return {sourceField:r,targetField:a}}function zr(e){return e.size===0?"":`import { ${Array.from(e).sort().join(", ")} } from "./auth.schema";
|
|
9184
9471
|
`}function Ur(e){return Object.values(e.relations).filter(n=>n.relation==="one").map(n=>n.targetTable)}function Qr(e,n,t){if(n.references)return {tableName:n.references.table,fieldName:n.references.column};let r=Object.values(t.relations).find(a=>a.relation==="one"&&a.field===e);if(r)return {tableName:r.targetTable,fieldName:r.referenceField??"id"}}function _r(e){let n=[];for(let[t,r]of Object.entries(e.tables)){let a=[];for(let[o,i]of Object.entries(r.columns)){if(i.type!=="json"||!i.jsonShape)continue;let s=ue(i.jsonShape);a.push(`${f(o)}: { shape: ${s} },`);}a.length!==0&&n.push(`${f(t)}: {
|
|
9185
9472
|
${a.map(o=>` ${o}`).join(`
|
|
9186
9473
|
`)}
|
|
@@ -9194,6 +9481,8 @@ ${n.map(t=>` ${t}`).join(`
|
|
|
9194
9481
|
junctionTable: ${f(i.junctionTable)},
|
|
9195
9482
|
sourceField: ${f(i.sourceField??"")},
|
|
9196
9483
|
targetField: ${f(i.targetField??"")},
|
|
9484
|
+
referenceField: ${f(i.referenceField??"id")},
|
|
9485
|
+
targetReferenceField: ${f(i.targetReferenceField??"id")},
|
|
9197
9486
|
},`);a.length!==0&&n.push(`${f(t)}: {
|
|
9198
9487
|
${a.map(o=>` ${o}`).join(`
|
|
9199
9488
|
`)}
|
|
@@ -9228,7 +9517,7 @@ ${a.map(o=>` ${o}`).join(`
|
|
|
9228
9517
|
${n.map(t=>` ${t}`).join(`
|
|
9229
9518
|
`)}
|
|
9230
9519
|
} as const;
|
|
9231
|
-
`}function Gr(e,n){let t=new Set(Object.keys(e.tables)),r=new Set;for(let l of Object.values(e.tables)){for(let c of Ur(l))t.has(c)||r.add(c);for(let c of Object.values(l.columns))c.references&&!t.has(c.references.table)&&r.add(c.references.table);}let a=new Map;for(let l of Object.values(e.tables))for(let[c,p]of Object.entries(l.columns))if(p.type==="enum"&&p.enumValues&&p.enumValues.length>0){let d=p.enumRef??`${c}`;a.has(d)||a.set(d,p);}let o=[],i=[];for(let[l,c]of a.entries()){let p=F(l),d=c.enumValues.map(y=>`"${y}"`).join(" | ");o.push(`export type ${p} = ${d};`),i.push(`export const ${p}Column = t.customType<{ data: ${p}; dataNotNull: ${p} }>({ dataType: () => "text" });`);}let s=[],u=[];for(let[l,c]of Object.entries(e.tables)){let p=c.sqlName??
|
|
9520
|
+
`}function Gr(e,n){let t=new Set(Object.keys(e.tables)),r=new Set;for(let l of Object.values(e.tables)){for(let c of Ur(l))t.has(c)||r.add(c);for(let c of Object.values(l.columns))c.references&&!t.has(c.references.table)&&r.add(c.references.table);}let a=new Map;for(let l of Object.values(e.tables))for(let[c,p]of Object.entries(l.columns))if(p.type==="enum"&&p.enumValues&&p.enumValues.length>0){let d=p.enumRef??`${c}`;a.has(d)||a.set(d,p);}let o=[],i=[];for(let[l,c]of a.entries()){let p=F(l),d=c.enumValues.map(y=>`"${y}"`).join(" | ");o.push(`export type ${p} = ${d};`),i.push(`export const ${p}Column = t.customType<{ data: ${p}; dataNotNull: ${p} }>({ dataType: () => "text" });`);}let s=[],u=[];for(let[l,c]of Object.entries(e.tables)){let p=c.sqlName??j(l),d=[],y=[];for(let[b,h]of Object.entries(c.columns)){let T;if(h.type==="enum"&&h.enumValues&&h.enumValues.length>0){let R=h.enumRef??b,E=F(R),V=h.sqlName??j(b);T=V!==b?`${E}Column(${f(V)})`:`${E}Column()`,h.isArray&&(T+=".array()");}else T=Hr(b,h,n);h.uuidPrimaryKey&&(T+=".$defaultFn(() => crypto.randomUUID())"),h.primaryKey&&(T+=h.autoIncrement?".primaryKey({ autoIncrement: true })":".primaryKey()"),h.notNull&&(T+=".notNull()"),h.sqlDefault!==void 0&&(T+=`.default(${Er(h.sqlDefault)})`);let C=Qr(b,h,c);if(C)if(h.references?.onDelete||h.references?.onUpdate){let R=[];h.references.onDelete&&R.push(`onDelete: ${f(h.references.onDelete)}`),h.references.onUpdate&&R.push(`onUpdate: ${f(h.references.onUpdate)}`),T+=`.references(() => ${C.tableName}.${C.fieldName}, { ${R.join(", ")} })`;}else T+=`.references(() => ${C.tableName}.${C.fieldName})`;if(h.unique){let R=typeof h.unique=="object"&&h.unique.name?h.unique.name:`${p}_${j(b)}_unique_idx`;y.push(` t.uniqueIndex(${f(R)}).on(table.${b})`);}if(h.index){let R=typeof h.index=="object"&&h.index.name?h.index.name:`${p}_${j(b)}_idx`;y.push(` t.index(${f(R)}).on(table.${b})`);}d.push(` ${b}: ${T},`);}y.length>0?s.push(`export const ${l} = table(
|
|
9232
9521
|
${f(p)},
|
|
9233
9522
|
{
|
|
9234
9523
|
${d.join(`
|
|
@@ -9269,7 +9558,7 @@ ${_r(e)}
|
|
|
9269
9558
|
${Kr(e)}
|
|
9270
9559
|
|
|
9271
9560
|
${Jr(e)}
|
|
9272
|
-
`}function ce(e){return e.kind==="array"?`z.array(${ce(e.element)})`:e.kind==="object"?`z.object({ ${Object.entries(e.shape).map(([t,r])=>`${f(t)}: ${ce(r)}`).join(", ")} })`:e.kind==="string"?"z.string()":e.kind==="number"?"z.number()":e.kind==="boolean"?"z.boolean()":e.kind==="date"?"z.date()":"z.unknown()"}function yn(e,n,t){let r="z.unknown()";if(e.type==="int")r="z.number().int()";else if(e.type==="string")r="z.string()",e.length!==void 0&&(r+=`.max(${e.length})`);else if(e.type==="boolean")r="z.boolean()";else if(e.type==="date")r="z.date()";else if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0){let o=`z.enum([${e.enumValues.map(i=>`"${i}"`).join(", ")}])`;r=e.isArray?`z.array(${o})`:o;}else e.type==="json"&&e.jsonShape&&(r=ce(e.jsonShape));return n&&(r+=".optional()"),t&&(r+=".nullable()"),r}function Zr(e){let n=[];for(let[t,r]of Object.entries(e.tables)){let a=F(t),o=[],i=[];for(let[s,u]of Object.entries(r.columns))o.push(` ${s}: ${yn(u,bn(u),
|
|
9561
|
+
`}function ce(e){return e.kind==="array"?`z.array(${ce(e.element)})`:e.kind==="object"?`z.object({ ${Object.entries(e.shape).map(([t,r])=>`${f(t)}: ${ce(r)}`).join(", ")} })`:e.kind==="string"?"z.string()":e.kind==="number"?"z.number()":e.kind==="boolean"?"z.boolean()":e.kind==="date"?"z.date()":"z.unknown()"}function yn(e,n,t){let r="z.unknown()";if(e.type==="int")r="z.number().int()";else if(e.type==="string")r="z.string()",e.length!==void 0&&(r+=`.max(${e.length})`);else if(e.type==="boolean")r="z.boolean()";else if(e.type==="date")r="z.date()";else if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0){let o=`z.enum([${e.enumValues.map(i=>`"${i}"`).join(", ")}])`;r=e.isArray?`z.array(${o})`:o;}else e.type==="json"&&e.jsonShape&&(r=ce(e.jsonShape));return n&&(r+=".optional()"),t&&(r+=".nullable()"),r}function Zr(e){let n=[];for(let[t,r]of Object.entries(e.tables)){let a=F(t),o=[],i=[];for(let[s,u]of Object.entries(r.columns))o.push(` ${s}: ${yn(u,bn(u),O(u))},`),i.push(` ${s}: ${yn(u,O(u),O(u))},`);n.push(`export const ${t}InsertSchema = z.object({
|
|
9273
9562
|
${o.join(`
|
|
9274
9563
|
`)}
|
|
9275
9564
|
});
|
|
@@ -9283,7 +9572,7 @@ export type ${a}Select = z.infer<typeof ${t}SelectSchema>;
|
|
|
9283
9572
|
`);}return `import { z } from "zod";
|
|
9284
9573
|
|
|
9285
9574
|
${n.join(`
|
|
9286
|
-
`)}`}function L(e){return e.kind==="array"?`Array<${L(e.element)}>`:e.kind==="object"?`{ ${Object.entries(e.shape).map(([t,r])=>`${t}: ${L(r)}`).join("; ")} }`:e.kind==="string"?"string":e.kind==="number"?"number":e.kind==="boolean"?"boolean":e.kind==="date"?"Date":"unknown"}function Xr(e){if(e.type==="int")return "number";if(e.type==="string")return "string";if(e.type==="boolean")return "boolean";if(e.type==="date")return "Date";if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0){let n=e.enumValues.map(t=>`"${t}"`).join(" | ");return e.isArray?`Array<${n}>`:n}return e.type==="json"&&e.jsonShape?L(e.jsonShape):"unknown"}function Yr(e){let n=[];for(let[r,a]of Object.entries(e.enums??{})){let o=F(r),i=a.values.map(s=>`"${s}"`).join(" | ");n.push(`export type ${o} = ${i};`);}let t=[];for(let[r,a]of Object.entries(e.tables)){let o=F(r),i=[],s=[];for(let[u,l]of Object.entries(a.columns)){let c=Xr(l),p=
|
|
9575
|
+
`)}`}function L(e){return e.kind==="array"?`Array<${L(e.element)}>`:e.kind==="object"?`{ ${Object.entries(e.shape).map(([t,r])=>`${t}: ${L(r)}`).join("; ")} }`:e.kind==="string"?"string":e.kind==="number"?"number":e.kind==="boolean"?"boolean":e.kind==="date"?"Date":"unknown"}function Xr(e){if(e.type==="int")return "number";if(e.type==="string")return "string";if(e.type==="boolean")return "boolean";if(e.type==="date")return "Date";if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0){let n=e.enumValues.map(t=>`"${t}"`).join(" | ");return e.isArray?`Array<${n}>`:n}return e.type==="json"&&e.jsonShape?L(e.jsonShape):"unknown"}function Yr(e){let n=[];for(let[r,a]of Object.entries(e.enums??{})){let o=F(r),i=a.values.map(s=>`"${s}"`).join(" | ");n.push(`export type ${o} = ${i};`);}let t=[];for(let[r,a]of Object.entries(e.tables)){let o=F(r),i=[],s=[];for(let[u,l]of Object.entries(a.columns)){let c=Xr(l),p=O(l)?" | null":"";i.push(` ${u}${O(l)?"?":""}: ${c}${p};`),s.push(` ${u}${bn(l)?"?":""}: ${c}${p};`);}t.push(`export type ${o} = {
|
|
9287
9576
|
${i.join(`
|
|
9288
9577
|
`)}
|
|
9289
9578
|
};
|
|
@@ -9312,9 +9601,9 @@ import { customType } from "drizzle-orm/sqlite-core"`).replace(/role:\s*text\(["
|
|
|
9312
9601
|
`);let tr=n+"/";async function we(x){let $=await promises.readdir(x,{withFileTypes:true});for(let k of $){let N=path.join(x,k.name);if(k.isDirectory()){if(k.name==="node_modules"||k.name.startsWith(".")||N===n)continue;await we(N);}else !N.startsWith(tr)&&(k.name.endsWith(".d.ts")||k.name.endsWith(".js"))&&await promises.rm(N);}}await we(o),process.stdout.write(`\u{1F9F9} Cleanup (${(performance.now()-l).toFixed(0)}ms)
|
|
9313
9602
|
`);let nr=path.resolve(o,"tsconfig.json");if(e.config.build&&fs.existsSync(nr)){process.stdout.write(`\u2699\uFE0F Building project... (${(performance.now()-l).toFixed(0)}ms)
|
|
9314
9603
|
`);let $=await Bun.spawn([process.execPath,p,"--build"],{cwd:o,stdout:"inherit",stderr:"inherit"}).exited;if($!==0)throw new Error(`TypeScript build failed with exit code ${$}`);process.stdout.write(`\u2705 Build complete (${(performance.now()-l).toFixed(0)}ms)
|
|
9315
|
-
`);}}var Mn=zod.z.object({binding:zod.z.string().min(1),databaseName:zod.z.string().min(1),databaseId:zod.z.string().min(1),previewDatabaseId:zod.z.string().min(1).optional(),migrationsDir:zod.z.string().min(1).optional()}).strict(),In=zod.z.object({binding:zod.z.string().min(1),id:zod.z.string().min(1),previewId:zod.z.string().min(1).optional()}).strict(),En=zod.z.object({binding:zod.z.string().min(1),bucketName:zod.z.string().min(1),previewBucketName:zod.z.string().min(1).optional(),jurisdiction:zod.z.string().min(1).optional()}).strict(),Pn=zod.z.object({enabled:zod.z.boolean().optional(),binding:zod.z.string().min(1).optional(),queue:zod.z.string().min(1).optional()}).strict(),$a=zod.z.object({enabled:zod.z.boolean().optional(),binding:zod.z.string().min(1).optional(),className:zod.z.string().min(1).optional(),objectName:zod.z.string().min(1).optional(),subscribePath:zod.z.string().min(1).optional(),websocketPath:zod.z.string().min(1).optional(),protocol:zod.z.string().min(1).optional()}).strict(),Ca=zod.z.object({scanDir:zod.z.string().min(1),outDir:zod.z.string().min(1),wranglerOutDir:zod.z.string().min(1).optional(),wranglerOutPath:zod.z.string().min(1).optional(),schema:zod.z.array(zod.z.string()).min(1),schemaDsl:zod.z.object({entry:zod.z.string().min(1),exportName:zod.z.string().min(1).optional(),outFile:zod.z.string().min(1).optional(),typesOutFile:zod.z.string().min(1).optional(),zodOutFile:zod.z.string().min(1).optional(),namingStrategy:zod.z.literal("camelToSnake").optional()}).strict().optional(),database:zod.z.union([Mn,zod.z.array(Mn).min(1)]),kv:zod.z.union([In,zod.z.array(In)]).optional(),r2:zod.z.union([En,zod.z.array(En)]).optional(),auth:zod.z.object({enabled:zod.z.boolean(),basePath:zod.z.string().min(1),options:zod.z.custom(e=>typeof e=="object"&&e!==null),clientOptions:zod.z.custom(e=>typeof e=="object"&&e!==null)}).strict(),scheduler:Pn.optional(),realtime:$a.optional(),wranglerOverrides:zod.z.record(zod.z.string(),zod.z.unknown()).optional(),build:zod.z.boolean().optional()}).strict();function
|
|
9604
|
+
`);}}var Mn=zod.z.object({binding:zod.z.string().min(1),databaseName:zod.z.string().min(1),databaseId:zod.z.string().min(1),previewDatabaseId:zod.z.string().min(1).optional(),migrationsDir:zod.z.string().min(1).optional()}).strict(),In=zod.z.object({binding:zod.z.string().min(1),id:zod.z.string().min(1),previewId:zod.z.string().min(1).optional()}).strict(),En=zod.z.object({binding:zod.z.string().min(1),bucketName:zod.z.string().min(1),previewBucketName:zod.z.string().min(1).optional(),jurisdiction:zod.z.string().min(1).optional()}).strict(),Pn=zod.z.object({enabled:zod.z.boolean().optional(),binding:zod.z.string().min(1).optional(),queue:zod.z.string().min(1).optional()}).strict(),$a=zod.z.object({enabled:zod.z.boolean().optional(),binding:zod.z.string().min(1).optional(),className:zod.z.string().min(1).optional(),objectName:zod.z.string().min(1).optional(),subscribePath:zod.z.string().min(1).optional(),websocketPath:zod.z.string().min(1).optional(),protocol:zod.z.string().min(1).optional()}).strict(),Ca=zod.z.object({scanDir:zod.z.string().min(1),outDir:zod.z.string().min(1),wranglerOutDir:zod.z.string().min(1).optional(),wranglerOutPath:zod.z.string().min(1).optional(),schema:zod.z.array(zod.z.string()).min(1),schemaDsl:zod.z.object({entry:zod.z.string().min(1),exportName:zod.z.string().min(1).optional(),outFile:zod.z.string().min(1).optional(),typesOutFile:zod.z.string().min(1).optional(),zodOutFile:zod.z.string().min(1).optional(),namingStrategy:zod.z.literal("camelToSnake").optional()}).strict().optional(),database:zod.z.union([Mn,zod.z.array(Mn).min(1)]),kv:zod.z.union([In,zod.z.array(In)]).optional(),r2:zod.z.union([En,zod.z.array(En)]).optional(),auth:zod.z.object({enabled:zod.z.boolean(),basePath:zod.z.string().min(1),options:zod.z.custom(e=>typeof e=="object"&&e!==null),clientOptions:zod.z.custom(e=>typeof e=="object"&&e!==null)}).strict(),scheduler:Pn.optional(),realtime:$a.optional(),wranglerOverrides:zod.z.record(zod.z.string(),zod.z.unknown()).optional(),build:zod.z.boolean().optional()}).strict();function jn(e){return typeof e=="object"&&e!==null}function qa(e){let n=jn(e.wranglerOverrides)?e.wranglerOverrides.scheduler:void 0,t=Pn.safeParse(n);return t.success?t.data:{}}function Fa(e){if(!jn(e)||!("scheduler"in e))return e;let{scheduler:n,...t}=e;return t}function Ma(e){let t={...qa(e)??{},...e.scheduler??{}},r=e.realtime??{};return {...e,database:Array.isArray(e.database)?e.database:[e.database],kv:e.kv?Array.isArray(e.kv)?e.kv:[e.kv]:[],r2:e.r2?Array.isArray(e.r2)?e.r2:[e.r2]:[],scheduler:{enabled:t.enabled??true,binding:t.binding??"APPFLARE_SCHEDULER_QUEUE",queue:t.queue},realtime:{enabled:r.enabled??true,binding:r.binding??"APPFLARE_REALTIME",className:r.className??"AppflareRealtimeDurableObject",objectName:r.objectName??"global",subscribePath:r.subscribePath??"/realtime/subscribe",websocketPath:r.websocketPath??"/realtime/ws",protocol:r.protocol??"appflare.realtime.v1"},wranglerOverrides:Fa(e.wranglerOverrides),wranglerOutDir:e.wranglerOutDir??e.wranglerOutPath??e.outDir,build:e.build??true}}async function D(e){let n=path.isAbsolute(e??"")?e:path.resolve(process.cwd(),e??"appflare.config.ts"),t=path.dirname(n),o=(await import(url.pathToFileURL(n).href)).default,i=Ca.parse(o),s=Ma(i);return {configPath:n,configDir:t,scanDirAbs:path.resolve(t,s.scanDir),outDirAbs:path.resolve(t,s.outDir),wranglerOutDirAbs:path.resolve(t,s.wranglerOutDir),config:s}}function ja(e){let n=e;for(;;){if(fs.existsSync(path.resolve(n,"package.json")))return n;let t=path.dirname(n);if(t===n)return e;n=t;}}async function Q(e,n={}){let t=await D(e);if(n.build!==void 0&&(t.config.build=n.build),await Fn(t),t.wranglerOutDirAbs===t.outDirAbs){process.stdout.write(`\u2705 Generated artifacts in ${t.outDirAbs}
|
|
9316
9605
|
`);return}process.stdout.write(`\u2705 Generated server/client in ${t.outDirAbs} and wrangler.json in ${t.wranglerOutDirAbs}
|
|
9317
9606
|
`);}async function Dn(e,n={}){if(await Q(e,{build:n.build}),!n.watch)return;let t=await D(e),r=false,a=false,o=async()=>{if(r){a=true;return}r=true;try{await Q(e,{build:n.build});}catch(s){process.stderr.write(`\u274C Build failed: ${s.message}
|
|
9318
9607
|
`);}finally{r=false,a&&(a=false,await o());}};Ia__default.default.watch(t.scanDirAbs,{ignoreInitial:true,ignored:s=>s.includes("/_generated/")||s.includes("/dist/")||s.includes("/out/")||s.includes("/node_modules/")||s.endsWith(".d.ts")}).on("all",async(s,u)=>{process.stdout.write(`\u{1F504} Change detected: ${u}
|
|
9319
9608
|
`),await o();}),process.stdout.write(`\u{1F440} Watching ${t.scanDirAbs}
|
|
9320
|
-
`);}async function Vn(e,n={}){let t=await D(e),r=
|
|
9609
|
+
`);}async function Vn(e,n={}){let t=await D(e),r=ja(process.cwd());if([!!n.local,!!n.remote,!!n.preview].filter(Boolean).length>1)throw new Error("Only one of --local, --remote, or --preview can be set.");let o=path.resolve(t.outDirAbs,"drizzle.config.js"),i=process.platform==="win32"?"npx.cmd":"npx",u=await Bun.spawn([i,"drizzle-kit","generate","--config",o],{cwd:r,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(u!==0)throw new Error(`drizzle-kit generate failed with exit code ${u}`);let l=t.config.database[0].databaseName,c=[i,"wrangler","d1","migrations","apply",l];n.local?c.push("--local"):n.remote?c.push("--remote"):n.preview&&c.push("--preview");let d=await Bun.spawn(c,{cwd:t.configDir,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(d!==0)throw new Error(`wrangler d1 migrations apply failed with exit code ${d}`)}async function Bn(e,n={name:"",email:"",password:""}){let t=await D(e);if([!!n.local,!!n.remote].filter(Boolean).length>1)throw new Error("Only one of --local or --remote can be set.");let{hashPassword:a}=await import('better-auth/crypto'),o=await a(n.password),i=crypto.randomUUID(),s=crypto.randomUUID(),u=Date.now(),l=n.name.replace(/'/g,"''"),c=n.email.replace(/'/g,"''"),p=["INSERT INTO users (id, name, email, email_verified, created_at, updated_at, role, banned)",`VALUES ('${i}', '${l}', '${c}', 1, ${u}, ${u}, 'admin', 0);`,"INSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)",`VALUES ('${s}', '${c}', 'credential', '${i}', '${o}', ${u}, ${u});`].join(" "),d=t.config.database[0].databaseName,v=[process.platform==="win32"?"npx.cmd":"npx","wrangler","d1","execute",d,`--command=${p}`];n.local?v.push("--local"):n.remote&&v.push("--remote");let w=await Bun.spawn(v,{cwd:t.configDir,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(w!==0)throw new Error(`Failed to add admin user. wrangler d1 execute exited with code ${w}`);console.log("\u2705 Admin user "+n.email+" created successfully!");}var P=new commander.Command;P.name("appflare").description("Appflare compiler/bundler for Cloudflare-native backends and SDK generation").version("0.0.28");P.command("build").description("Generate server.ts, client.ts, auth.config.js, drizzle.config.js, and wrangler.json artifacts").option("-c, --config <path>","Path to appflare.config.ts","appflare.config.ts").option("--no-build","Skip TypeScript build step").action(async e=>{await Q(e.config,{build:e.build});});P.command("dev").description("Run generator in development mode").option("-c, --config <path>","Path to appflare.config.ts","appflare.config.ts").option("-w, --watch","Watch scanDir and regenerate on changes",false).option("--no-build","Skip TypeScript build step").action(async e=>{await Dn(e.config,{watch:e.watch,build:e.build});});P.command("migrate").description("Generate drizzle migration files from outDir/auth.schema.ts and apply them to the configured D1 database").option("-c, --config <path>","Path to appflare.config.ts","appflare.config.ts").option("--local","Execute commands/files against a local DB for use with wrangler dev",false).option("--remote","Execute commands/files against a remote DB for use with wrangler dev --remote",false).option("--preview","Execute commands/files against a preview D1 DB",false).action(async e=>{await Vn(e.config,{local:e.local,remote:e.remote,preview:e.preview});});P.command("add-admin").description("Add an admin user to the database").requiredOption("-n, --name <name>","Admin's display name").requiredOption("-e, --email <email>","Admin's email address").requiredOption("-p, --password <password>","Admin's password").option("-c, --config <path>","Path to appflare.config.ts","appflare.config.ts").option("--local","Execute command against a local DB for use with wrangler dev",false).option("--remote","Execute command against a remote DB for use with wrangler dev --remote",false).action(async e=>{await Bn(e.config,{name:e.name,email:e.email,password:e.password,local:e.local,remote:e.remote});});(async()=>{process.versions.bun||(console.error("Appflare CLI must be run with Bun."),process.exit(1)),await P.parseAsync(process.argv);})().catch(e=>{console.error(e),process.exit(1);});
|