appflare 0.2.50 → 0.2.51
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.
|
@@ -274,6 +274,48 @@ type ManyToManyRelationRows<
|
|
|
274
274
|
>
|
|
275
275
|
>
|
|
276
276
|
: Array<TableModel<TTargetTable>>;
|
|
277
|
+
type NativeManyRelationRows<
|
|
278
|
+
TSourceTable extends TableName,
|
|
279
|
+
TRelationName extends string,
|
|
280
|
+
TRelationArgs,
|
|
281
|
+
> = RuntimeRelationTargetTable<TSourceTable, TRelationName> extends infer TTarget
|
|
282
|
+
? TTarget extends TableName
|
|
283
|
+
? TRelationArgs extends true
|
|
284
|
+
? Array<TableModel<TTarget>>
|
|
285
|
+
: TRelationArgs extends Record<string, unknown>
|
|
286
|
+
? Awaited<
|
|
287
|
+
TableFindManyResult<
|
|
288
|
+
TTarget,
|
|
289
|
+
Extract<
|
|
290
|
+
Omit<TRelationArgs, "_count" | "_avg">,
|
|
291
|
+
QueryFindManyArgs<TTarget>
|
|
292
|
+
>
|
|
293
|
+
>
|
|
294
|
+
>
|
|
295
|
+
: Array<TableModel<TTarget>>
|
|
296
|
+
: never
|
|
297
|
+
: never;
|
|
298
|
+
type NativeOneRelationValue<
|
|
299
|
+
TSourceTable extends TableName,
|
|
300
|
+
TRelationName extends string,
|
|
301
|
+
TRelationArgs,
|
|
302
|
+
> = RuntimeRelationTargetTable<TSourceTable, TRelationName> extends infer TTarget
|
|
303
|
+
? TTarget extends TableName
|
|
304
|
+
? TRelationArgs extends true
|
|
305
|
+
? TableModel<TTarget> | null
|
|
306
|
+
: TRelationArgs extends Record<string, unknown>
|
|
307
|
+
? Awaited<
|
|
308
|
+
TableFindFirstResult<
|
|
309
|
+
TTarget,
|
|
310
|
+
Extract<
|
|
311
|
+
Omit<TRelationArgs, "_count" | "_avg">,
|
|
312
|
+
QueryFindFirstArgs<TTarget>
|
|
313
|
+
>
|
|
314
|
+
>
|
|
315
|
+
>
|
|
316
|
+
: TableModel<TTarget> | null
|
|
317
|
+
: never
|
|
318
|
+
: never;
|
|
277
319
|
type ReplaceManyToManyRelationsInRow<
|
|
278
320
|
TSourceTable extends string,
|
|
279
321
|
TRow,
|
|
@@ -284,15 +326,33 @@ type ReplaceManyToManyRelationsInRow<
|
|
|
284
326
|
? TWith extends Record<string, unknown>
|
|
285
327
|
? K extends keyof TWith
|
|
286
328
|
? [ManyToManyTargetTableName<Extract<TSourceTable, TableName>, K>] extends [never]
|
|
287
|
-
?
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
329
|
+
? RuntimeRelationKind<Extract<TSourceTable, TableName>, K> extends "many"
|
|
330
|
+
? NativeManyRelationRows<
|
|
331
|
+
Extract<TSourceTable, TableName>,
|
|
332
|
+
K,
|
|
333
|
+
TWith[K]
|
|
334
|
+
>
|
|
335
|
+
: RuntimeRelationKind<Extract<TSourceTable, TableName>, K> extends "one"
|
|
336
|
+
? NativeOneRelationValue<
|
|
337
|
+
Extract<TSourceTable, TableName>,
|
|
338
|
+
K,
|
|
339
|
+
TWith[K]
|
|
340
|
+
>
|
|
341
|
+
: ReplaceManyToManyRelationsInRow<
|
|
342
|
+
[RuntimeRelationTargetTable<
|
|
343
|
+
Extract<TSourceTable, TableName>,
|
|
344
|
+
K
|
|
345
|
+
>] extends [never]
|
|
346
|
+
? K
|
|
347
|
+
: RuntimeRelationTargetTable<
|
|
348
|
+
Extract<TSourceTable, TableName>,
|
|
349
|
+
K
|
|
350
|
+
>,
|
|
351
|
+
TRow[K],
|
|
352
|
+
TWith[K] extends { with: infer TNestedWith }
|
|
353
|
+
? TNestedWith
|
|
354
|
+
: undefined
|
|
355
|
+
>
|
|
296
356
|
: ManyToManyRelationRows<
|
|
297
357
|
Extract<ManyToManyTargetTableName<Extract<TSourceTable, TableName>, K>, TableName>,
|
|
298
358
|
TWith[K]
|
package/dist/cli/index.js
CHANGED
|
@@ -1290,7 +1290,7 @@ function buildSignedRequest(
|
|
|
1290
1290
|
headers,
|
|
1291
1291
|
});
|
|
1292
1292
|
}
|
|
1293
|
-
`}function
|
|
1293
|
+
`}function Oe(){return `
|
|
1294
1294
|
function createStorageApi(
|
|
1295
1295
|
ctx: AppflareContext,
|
|
1296
1296
|
bucket: R2BucketBinding | undefined,
|
|
@@ -1369,7 +1369,7 @@ function createStorageApi(
|
|
|
1369
1369
|
},
|
|
1370
1370
|
};
|
|
1371
1371
|
}
|
|
1372
|
-
`}function
|
|
1372
|
+
`}function Pe(e){return `
|
|
1373
1373
|
export async function createSchedulerExecutionContext(
|
|
1374
1374
|
env: Record<string, unknown>,
|
|
1375
1375
|
options: RegisterHandlersOptions,
|
|
@@ -1496,9 +1496,9 @@ ${je()}
|
|
|
1496
1496
|
|
|
1497
1497
|
${Ie()}
|
|
1498
1498
|
|
|
1499
|
-
${
|
|
1499
|
+
${Oe()}
|
|
1500
1500
|
|
|
1501
|
-
${
|
|
1501
|
+
${Pe(e)}
|
|
1502
1502
|
`}function Ve(){return `
|
|
1503
1503
|
export async function executeOperation<
|
|
1504
1504
|
TShape extends ZodRawShape,
|
|
@@ -3454,7 +3454,7 @@ function inferConflictTarget(table: unknown): string[] {
|
|
|
3454
3454
|
|
|
3455
3455
|
return [];
|
|
3456
3456
|
}
|
|
3457
|
-
`}function
|
|
3457
|
+
`}function _e(){return `const mergedSchema = {
|
|
3458
3458
|
...authSchema,
|
|
3459
3459
|
...schema,
|
|
3460
3460
|
};
|
|
@@ -3729,6 +3729,48 @@ type ManyToManyRelationRows<
|
|
|
3729
3729
|
>
|
|
3730
3730
|
>
|
|
3731
3731
|
: Array<TableModel<TTargetTable>>;
|
|
3732
|
+
type NativeManyRelationRows<
|
|
3733
|
+
TSourceTable extends TableName,
|
|
3734
|
+
TRelationName extends string,
|
|
3735
|
+
TRelationArgs,
|
|
3736
|
+
> = RuntimeRelationTargetTable<TSourceTable, TRelationName> extends infer TTarget
|
|
3737
|
+
? TTarget extends TableName
|
|
3738
|
+
? TRelationArgs extends true
|
|
3739
|
+
? Array<TableModel<TTarget>>
|
|
3740
|
+
: TRelationArgs extends Record<string, unknown>
|
|
3741
|
+
? Awaited<
|
|
3742
|
+
TableFindManyResult<
|
|
3743
|
+
TTarget,
|
|
3744
|
+
Extract<
|
|
3745
|
+
Omit<TRelationArgs, "_count" | "_avg">,
|
|
3746
|
+
QueryFindManyArgs<TTarget>
|
|
3747
|
+
>
|
|
3748
|
+
>
|
|
3749
|
+
>
|
|
3750
|
+
: Array<TableModel<TTarget>>
|
|
3751
|
+
: never
|
|
3752
|
+
: never;
|
|
3753
|
+
type NativeOneRelationValue<
|
|
3754
|
+
TSourceTable extends TableName,
|
|
3755
|
+
TRelationName extends string,
|
|
3756
|
+
TRelationArgs,
|
|
3757
|
+
> = RuntimeRelationTargetTable<TSourceTable, TRelationName> extends infer TTarget
|
|
3758
|
+
? TTarget extends TableName
|
|
3759
|
+
? TRelationArgs extends true
|
|
3760
|
+
? TableModel<TTarget> | null
|
|
3761
|
+
: TRelationArgs extends Record<string, unknown>
|
|
3762
|
+
? Awaited<
|
|
3763
|
+
TableFindFirstResult<
|
|
3764
|
+
TTarget,
|
|
3765
|
+
Extract<
|
|
3766
|
+
Omit<TRelationArgs, "_count" | "_avg">,
|
|
3767
|
+
QueryFindFirstArgs<TTarget>
|
|
3768
|
+
>
|
|
3769
|
+
>
|
|
3770
|
+
>
|
|
3771
|
+
: TableModel<TTarget> | null
|
|
3772
|
+
: never
|
|
3773
|
+
: never;
|
|
3732
3774
|
type ReplaceManyToManyRelationsInRow<
|
|
3733
3775
|
TSourceTable extends string,
|
|
3734
3776
|
TRow,
|
|
@@ -3739,15 +3781,33 @@ type ReplaceManyToManyRelationsInRow<
|
|
|
3739
3781
|
? TWith extends Record<string, unknown>
|
|
3740
3782
|
? K extends keyof TWith
|
|
3741
3783
|
? [ManyToManyTargetTableName<Extract<TSourceTable, TableName>, K>] extends [never]
|
|
3742
|
-
?
|
|
3743
|
-
|
|
3744
|
-
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
|
|
3748
|
-
|
|
3749
|
-
|
|
3750
|
-
|
|
3784
|
+
? RuntimeRelationKind<Extract<TSourceTable, TableName>, K> extends "many"
|
|
3785
|
+
? NativeManyRelationRows<
|
|
3786
|
+
Extract<TSourceTable, TableName>,
|
|
3787
|
+
K,
|
|
3788
|
+
TWith[K]
|
|
3789
|
+
>
|
|
3790
|
+
: RuntimeRelationKind<Extract<TSourceTable, TableName>, K> extends "one"
|
|
3791
|
+
? NativeOneRelationValue<
|
|
3792
|
+
Extract<TSourceTable, TableName>,
|
|
3793
|
+
K,
|
|
3794
|
+
TWith[K]
|
|
3795
|
+
>
|
|
3796
|
+
: ReplaceManyToManyRelationsInRow<
|
|
3797
|
+
[RuntimeRelationTargetTable<
|
|
3798
|
+
Extract<TSourceTable, TableName>,
|
|
3799
|
+
K
|
|
3800
|
+
>] extends [never]
|
|
3801
|
+
? K
|
|
3802
|
+
: RuntimeRelationTargetTable<
|
|
3803
|
+
Extract<TSourceTable, TableName>,
|
|
3804
|
+
K
|
|
3805
|
+
>,
|
|
3806
|
+
TRow[K],
|
|
3807
|
+
TWith[K] extends { with: infer TNestedWith }
|
|
3808
|
+
? TNestedWith
|
|
3809
|
+
: undefined
|
|
3810
|
+
>
|
|
3751
3811
|
: ManyToManyRelationRows<
|
|
3752
3812
|
Extract<ManyToManyTargetTableName<Extract<TSourceTable, TableName>, K>, TableName>,
|
|
3753
3813
|
TWith[K]
|
|
@@ -3852,7 +3912,7 @@ type TableFindFirstResult<
|
|
|
3852
3912
|
type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
3853
3913
|
(typeof mergedDbSchema)[TName]
|
|
3854
3914
|
>;
|
|
3855
|
-
`}function
|
|
3915
|
+
`}function Ue(){return [_e(),He(),Le(),ze()].join(`
|
|
3856
3916
|
|
|
3857
3917
|
`)}function Qe(){return ` count: async (args?: QueryCountArgs<TableName>) => {
|
|
3858
3918
|
const withValue = args?.with;
|
|
@@ -4025,7 +4085,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
4025
4085
|
},
|
|
4026
4086
|
}) as AppflareQueryDb;
|
|
4027
4087
|
}
|
|
4028
|
-
`}function
|
|
4088
|
+
`}function Ke(){return `export class AppflareHandledError extends Error {
|
|
4029
4089
|
public readonly status: number;
|
|
4030
4090
|
public readonly payload: unknown;
|
|
4031
4091
|
|
|
@@ -4035,7 +4095,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
4035
4095
|
this.payload = payload;
|
|
4036
4096
|
}
|
|
4037
4097
|
}
|
|
4038
|
-
`}function
|
|
4098
|
+
`}function Je(){return ` findMany: (args?: Record<string, unknown>) => {
|
|
4039
4099
|
const where = isRecord(args?.where)
|
|
4040
4100
|
? (args?.where as Record<string, unknown>)
|
|
4041
4101
|
: undefined;
|
|
@@ -5186,7 +5246,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
5186
5246
|
);
|
|
5187
5247
|
return rows;
|
|
5188
5248
|
},
|
|
5189
|
-
`}function Xe(){return [Ge(),
|
|
5249
|
+
`}function Xe(){return [Ge(),Je(),Ze(),Qe(),Ke()].join(`
|
|
5190
5250
|
|
|
5191
5251
|
`)}function Ye(e=[],t=[]){let n=t.map(i=>` ${i.name}?: ${i.tsType} | null;`).join(`
|
|
5192
5252
|
`),a=[e.length>0?[" role: UserRole;"," banned: boolean | null;"," banReason?: string | null | undefined;"," banExpires?: Date | null | undefined;"].join(`
|
|
@@ -5417,7 +5477,7 @@ export function cron(definition: CronDefinition): RegisteredCron {
|
|
|
5417
5477
|
definition,
|
|
5418
5478
|
};
|
|
5419
5479
|
}
|
|
5420
|
-
`}function tt(e=[],t=[]){return [We(),
|
|
5480
|
+
`}function tt(e=[],t=[]){return [We(),Ue(),Xe(),Ye(e,t),et()].join(`
|
|
5421
5481
|
|
|
5422
5482
|
`)}function nt(e,t=[],n=[]){return `import type { Context } from "hono";
|
|
5423
5483
|
import type { D1Database } from "@cloudflare/workers-types";
|
|
@@ -7157,7 +7217,7 @@ ${n}</li>`;}return i}function Ct(e){let t=e.filter(s=>s.kind==="query"),n=e.filt
|
|
|
7157
7217
|
payload.${n} = raw_${n};
|
|
7158
7218
|
}
|
|
7159
7219
|
`}).join(`
|
|
7160
|
-
`)}function jt(e){return e.columns.find(t=>t.primaryKey)?.name||e.columns[0]?.name||""}function It(e,t){let n=e.columns.find(r=>r.name===t);return !(!n||n.autoIncrement||n.primaryKey)}function
|
|
7220
|
+
`)}function jt(e){return e.columns.find(t=>t.primaryKey)?.name||e.columns[0]?.name||""}function It(e,t){let n=e.columns.find(r=>r.name===t);return !(!n||n.autoIncrement||n.primaryKey)}function Ot(e,t){let n=e.columns.find(r=>r.name===t);return !(!n||n.primaryKey||n.autoIncrement)}function Pt(e,t,n,r){return t?`<td class="text-right">
|
|
7161
7221
|
<div class="drawer drawer-end">
|
|
7162
7222
|
<input id="edit-drawer-${e.exportName}-\${rowIndex}" type="checkbox" class="drawer-toggle" />
|
|
7163
7223
|
<div class="drawer-content">
|
|
@@ -7628,7 +7688,7 @@ ${n}</li>`;}return i}function Ct(e){let t=e.filter(s=>s.kind==="query"),n=e.filt
|
|
|
7628
7688
|
return c.redirect('/admin/table/${e}?' + query.toString());
|
|
7629
7689
|
});
|
|
7630
7690
|
${l}
|
|
7631
|
-
`}function ae(e){let t=jt(e),n=!!t,r=e.columns.map(w=>w.name),a=r.filter(w=>It(e,w)),o=r.filter(w=>
|
|
7691
|
+
`}function ae(e){let t=jt(e),n=!!t,r=e.columns.map(w=>w.name),a=r.filter(w=>It(e,w)),o=r.filter(w=>Ot(e,w)),i=qt(e),s=Mt(e,r),c=Et(e,r,t),u=a.map(w=>ne(e,w,"create")).join(""),l=o.map(w=>ne(e,w,"edit")).join(""),p=re(e,a),d=re(e,o),y=n?t:r[0]||"id",x=e.columns.find(w=>w.name===t)?.type,N=Pt(e,n,t,l);return Dt(e,y,t,n,r,i,s,c,N,u)+`
|
|
7632
7692
|
`+Vt(e.exportName,y,t,x,n,i,p,d)}function Bt(){return `
|
|
7633
7693
|
const buildUsersRedirect = (params: { page?: string; sort?: string; order?: string; search?: string }) => {
|
|
7634
7694
|
const page = params.page && params.page.trim() ? params.page : '1';
|
|
@@ -7780,7 +7840,7 @@ ${Ht()}
|
|
|
7780
7840
|
</div>
|
|
7781
7841
|
\${tableHtml}
|
|
7782
7842
|
</div>
|
|
7783
|
-
\`;`}function
|
|
7843
|
+
\`;`}function _t(){let e=Lt(),t=zt();return `
|
|
7784
7844
|
adminApp.get('/users', async (c) => {
|
|
7785
7845
|
const db = drizzle(c.env[options.databaseBinding]);
|
|
7786
7846
|
const auth = createAuth({ DATABASE: c.env[options.databaseBinding] } as any, c.req.raw.cf as any);
|
|
@@ -7836,7 +7896,7 @@ ${Ht()}
|
|
|
7836
7896
|
title: "users - Admin Dashboard",
|
|
7837
7897
|
children: content,
|
|
7838
7898
|
}));
|
|
7839
|
-
});`}function
|
|
7899
|
+
});`}function Ut(){return `
|
|
7840
7900
|
adminApp.post('/users/edit', async (c) => {
|
|
7841
7901
|
const session = await requireAdminSession(c);
|
|
7842
7902
|
if (!session) {
|
|
@@ -7991,12 +8051,12 @@ ${Ht()}
|
|
|
7991
8051
|
return session;
|
|
7992
8052
|
};
|
|
7993
8053
|
|
|
7994
|
-
${Ut()}
|
|
7995
|
-
|
|
7996
8054
|
${_t()}
|
|
8055
|
+
|
|
8056
|
+
${Ut()}
|
|
7997
8057
|
`}function Qt(e){return `${e.tables.map(t=>ae(t)).join(`
|
|
7998
8058
|
`)}
|
|
7999
|
-
${oe()}`}function
|
|
8059
|
+
${oe()}`}function Kt(e){return `
|
|
8000
8060
|
<div class="flex items-center justify-between">
|
|
8001
8061
|
<div class="flex items-center gap-3">
|
|
8002
8062
|
<div class="w-10 h-10 rounded-xl bg-primary/10 flex items-center justify-center">
|
|
@@ -8150,7 +8210,7 @@ ${oe()}`}function Jt(e){return `
|
|
|
8150
8210
|
</div>
|
|
8151
8211
|
<p id="headers-error" class="text-[11px] text-error mt-1.5 hidden"></p>
|
|
8152
8212
|
</div>
|
|
8153
|
-
`}function
|
|
8213
|
+
`}function Jt(e){return `
|
|
8154
8214
|
<div class="card bg-base-100 border border-base-200 shadow-sm overflow-hidden flex flex-col h-full">
|
|
8155
8215
|
<div class="px-5 py-3 border-b border-base-200 bg-base-200/20 flex items-center justify-between flex-none">
|
|
8156
8216
|
<h3 class="text-xs font-bold uppercase tracking-widest opacity-40">Request</h3>
|
|
@@ -8971,11 +9031,11 @@ ${oe()}`}function Jt(e){return `
|
|
|
8971
9031
|
`}function Xt(e){return `
|
|
8972
9032
|
const content = html\`
|
|
8973
9033
|
<div class="flex flex-col gap-6 max-w-5xl mx-auto" id="main-content">
|
|
8974
|
-
${
|
|
9034
|
+
${Kt(e)}
|
|
8975
9035
|
|
|
8976
9036
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
8977
9037
|
<!-- Request Panel -->
|
|
8978
|
-
${
|
|
9038
|
+
${Jt(e)}
|
|
8979
9039
|
|
|
8980
9040
|
<!-- Result Panel -->
|
|
8981
9041
|
${Gt()}
|
|
@@ -9841,8 +9901,8 @@ ${p}
|
|
|
9841
9901
|
app.route('/admin', adminApp);
|
|
9842
9902
|
app.get('/admin/', (c) => c.redirect('/admin'));
|
|
9843
9903
|
}
|
|
9844
|
-
`}function ie(e){if(typeof e!="object"||e===null)return false;let t=e;return t.kind==="schema"&&typeof t.tables=="object"&&(typeof t.enums=="object"||t.enums===void 0)}function I(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase()}function q(e){return e.replace(/[_-]+/g," ").replace(/\s+(.)/g,(t,n)=>n.toUpperCase()).replace(/\s/g,"").replace(/^(.)/,(t,n)=>n.toUpperCase())}function ue(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 g(e){return JSON.stringify(e)}function
|
|
9845
|
-
`}function Qr(e){return Object.values(e.relations).filter(t=>t.relation==="one").map(t=>t.targetTable)}function
|
|
9904
|
+
`}function ie(e){if(typeof e!="object"||e===null)return false;let t=e;return t.kind==="schema"&&typeof t.tables=="object"&&(typeof t.enums=="object"||t.enums===void 0)}function I(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase()}function q(e){return e.replace(/[_-]+/g," ").replace(/\s+(.)/g,(t,n)=>n.toUpperCase()).replace(/\s/g,"").replace(/^(.)/,(t,n)=>n.toUpperCase())}function ue(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 g(e){return JSON.stringify(e)}function Or(e){if(typeof e=="string")return g(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(e===null)return "null";if(e instanceof Date)return g(e.toISOString());if(typeof e=="object"&&e!==null)return JSON.stringify(e);throw new Error(`Unsupported SQL default value '${String(e)}'. Use string, number, boolean, null, Date, array, or object.`)}function Pr(e){return {kind:"schema",tables:Object.fromEntries(Object.entries(e.tables).map(([t,n])=>[t,{kind:"table",sqlName:n.sqlName,columns:Object.fromEntries(Object.entries(n.columns).map(([r,a])=>[r,{...a}])),relations:Object.fromEntries(Object.entries(n.relations).map(([r,a])=>[r,{...a}]))}])),enums:Object.fromEntries(Object.entries(e.enums??{}).map(([t,n])=>[t,{...n}]))}}function L(e,t,n){let r=e.tables[t];return r?r.columns[n]?.type:void 0}function gn(e,t,n,r,a,o,i){let s=t.columns[n];if(s){if(s.references&&(s.references.table!==r||s.references.column!==a))throw new Error(`Inferred relation '${e}.${n}' conflicts with explicit references(${s.references.table}.${s.references.column}).`);t.columns[n]={...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}t.columns[n]={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 hn(e,t,n){if(t.notNull===true&&t.nullable===true)throw new Error(`Invalid nullable configuration on '${e}': cannot set both notNull and nullable to true.`);return t.notNull===true?true:t.nullable===true||t.notNull===false?false:n}function yn(e,t){return `${e}:${t}`}function Dr(e,t,n,r){let a=yn(e,t),o=yn(n,r);return a<=o?{key:`${a}|${o}`,leftTable:e,leftReferenceField:t,rightTable:n,rightReferenceField:r,sourceIsLeft:true}:{key:`${o}|${a}`,leftTable:n,leftReferenceField:r,rightTable:e,rightReferenceField:t,sourceIsLeft:false}}function Vr(e,t){return `${e}${q(t)}Links`}function bn(e,t,n){let r=ue(e),a=ue(t);return r===a?`${n}${q(r)}Id`:`${r}Id`}function Br(e,t,n){if(e.junctionTable!==t.junctionTable)throw new Error(`manyToMany pair '${n}' has conflicting junctionTable values ('${e.junctionTable}' vs '${t.junctionTable}').`);if(e.leftField!==t.leftField)throw new Error(`manyToMany pair '${n}' has conflicting left field values ('${e.leftField}' vs '${t.leftField}').`);if(e.rightField!==t.rightField)throw new Error(`manyToMany pair '${n}' has conflicting right field values ('${e.rightField}' vs '${t.rightField}').`);if(e.leftSqlName!==t.leftSqlName)throw new Error(`manyToMany pair '${n}' has conflicting left sql name values ('${e.leftSqlName}' vs '${t.leftSqlName}').`);if(e.rightSqlName!==t.rightSqlName)throw new Error(`manyToMany pair '${n}' has conflicting right sql name values ('${e.rightSqlName}' vs '${t.rightSqlName}').`);if(e.onDelete!==t.onDelete)throw new Error(`manyToMany pair '${n}' has conflicting onDelete values ('${e.onDelete}' vs '${t.onDelete}').`);if(e.onUpdate!==t.onUpdate)throw new Error(`manyToMany pair '${n}' has conflicting onUpdate values ('${e.onUpdate}' vs '${t.onUpdate}').`);return e}function Wr(e){let t=new Map;for(let[n,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=Dr(n,o,a.targetTable,i),c=bn(s.leftTable,s.rightTable,"source"),u=bn(s.rightTable,s.leftTable,"target"),l={leftTable:s.leftTable,leftReferenceField:s.leftReferenceField,rightTable:s.rightTable,rightReferenceField:s.rightReferenceField,junctionTable:a.junctionTable??Vr(s.leftTable,s.rightTable),leftField:s.sourceIsLeft?a.sourceField??c:a.targetField??c,rightField:s.sourceIsLeft?a.targetField??u:a.sourceField??u,leftSqlName:s.sourceIsLeft?a.sourceSqlName:a.targetSqlName,rightSqlName:s.sourceIsLeft?a.targetSqlName:a.sourceSqlName,onDelete:a.onDelete,onUpdate:a.onUpdate};if(l.leftField===l.rightField)throw new Error(`manyToMany pair '${s.key}' resolves to duplicate junction fields '${l.leftField}'. Set sourceField/targetField explicitly.`);let p=t.get(s.key);p?Br(p,l,s.key):t.set(s.key,l),a.referenceField=o,a.targetReferenceField=i,a.junctionTable=l.junctionTable,a.sourceField=s.sourceIsLeft?l.leftField:l.rightField,a.targetField=s.sourceIsLeft?l.rightField:l.leftField,a.sourceSqlName=s.sourceIsLeft?l.leftSqlName:l.rightSqlName,a.targetSqlName=s.sourceIsLeft?l.rightSqlName:l.leftSqlName;}for(let n of t.values()){if(n.junctionTable in e.tables)throw new Error(`manyToMany auto junction table '${n.junctionTable}' conflicts with an existing table. Set a different junctionTable name.`);let r=L(e,n.leftTable,n.leftReferenceField)??"string",a=L(e,n.rightTable,n.rightReferenceField)??"string";e.tables[n.junctionTable]={kind:"table",columns:{[n.leftField]:{kind:"column",type:r,sqlName:n.leftSqlName,notNull:true,nullable:false,references:{table:n.leftTable,column:n.leftReferenceField,onDelete:n.onDelete,onUpdate:n.onUpdate},index:true},[n.rightField]:{kind:"column",type:a,sqlName:n.rightSqlName,notNull:true,nullable:false,references:{table:n.rightTable,column:n.rightReferenceField,onDelete:n.onDelete,onUpdate:n.onUpdate},index:true}},relations:{[n.leftTable]:{kind:"relation",relation:"one",targetTable:n.leftTable,field:n.leftField,referenceField:n.leftReferenceField},[n.rightTable]:{kind:"relation",relation:"one",targetTable:n.rightTable,field:n.rightField,referenceField:n.rightReferenceField}}};}}function Hr(e){for(let[t,n]of Object.entries(e.tables)){for(let[r,a]of Object.entries(n.columns))if(a.notNull===true&&a.nullable===true)throw new Error(`Invalid nullable configuration on '${t}.${r}': cannot set both notNull and nullable to true.`);for(let[r,a]of Object.entries(n.relations))if(a.relation!=="manyToMany"&&a.notNull===true&&a.nullable===true)throw new Error(`Invalid nullable configuration on '${t}.${r}': cannot set both notNull and nullable to true.`)}}function Lr(e){Hr(e);let t=Pr(e);for(let[n,r]of Object.entries(t.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 c=L(t,o.targetTable,i)??o.fkType??"string";gn(n,r,s,o.targetTable,i,{fkType:o.fkType,sqlName:o.sqlName,notNull:hn(`${n}.${a}`,o,true),onDelete:o.onDelete,onUpdate:o.onUpdate},c);}for(let[n,r]of Object.entries(t.tables))for(let a of Object.values(r.relations)){if(a.relation!=="many")continue;let o=t.tables[a.targetTable];if(!o)continue;let i=a.referenceField??"id",s=a.field??`${ue(n)}Id`;a.field=s;let c=L(t,n,i)??a.fkType??"string";gn(a.targetTable,o,s,n,i,{fkType:a.fkType,sqlName:a.sqlName,notNull:hn(`${n}.${a.targetTable}`,a,true),onDelete:a.onDelete,onUpdate:a.onUpdate},c);}return Wr(t),t}function xn(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 zr(e,t,n){let r=t.sqlName??I(e),a=r!==e;if(t.type==="int")return a?`t.int(${g(r)})`:"t.int()";if(t.type==="string")return t.length!==void 0?a?`t.text(${g(r)}, { length: ${t.length} })`:`t.text({ length: ${t.length} })`:a?`t.text(${g(r)})`:"t.text()";if(t.type==="boolean")return a?`t.int(${g(r)}, { mode: "boolean" })`:'t.int({ mode: "boolean" })';if(t.type==="date")return a?`t.int(${g(r)}, { mode: "timestamp_ms" })`:'t.int({ mode: "timestamp_ms" })';if(t.type==="enum"&&t.enumValues&&t.enumValues.length>0)return t.isArray?a?`t.text(${g(r)}).array()`:"t.text().array()":a?`t.text(${g(r)})`:"t.text()";if(t.type==="json"&&t.jsonShape){let o=z(t.jsonShape);return `${a?`t.text(${g(r)}, { mode: "json" })`:'t.text({ mode: "json" })'}.$type<${o}>()`}return n==="camelToSnake"&&a?`t.text(${g(r)})`:"t.text()"}function _r(e,t,n){let r=n.field,a=n.referenceField??"id";if(!r)throw new Error(`Relation on '${e}' targeting '${n.targetTable}' is missing a local field.`);if(!(r in t.columns))throw new Error(`Relation '${e}.${r}' references missing local field '${r}'.`);return {sourceField:r,targetField:a}}function Ur(e){return e.size===0?"":`import { ${Array.from(e).sort().join(", ")} } from "./auth.schema";
|
|
9905
|
+
`}function Qr(e){return Object.values(e.relations).filter(t=>t.relation==="one").map(t=>t.targetTable)}function Kr(e,t,n){if(t.references)return {tableName:t.references.table,fieldName:t.references.column};let r=Object.values(n.relations).find(a=>a.relation==="one"&&a.field===e);if(r)return {tableName:r.targetTable,fieldName:r.referenceField??"id"}}function Jr(e){let t=[];for(let[n,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=ce(i.jsonShape);a.push(`${g(o)}: { shape: ${s} },`);}a.length!==0&&t.push(`${g(n)}: {
|
|
9846
9906
|
${a.map(o=>` ${o}`).join(`
|
|
9847
9907
|
`)}
|
|
9848
9908
|
},`);}return t.length===0?`export const __appflareJsonColumns = {} as const;
|
|
@@ -9891,7 +9951,7 @@ ${a.map(o=>` ${o}`).join(`
|
|
|
9891
9951
|
${t.map(n=>` ${n}`).join(`
|
|
9892
9952
|
`)}
|
|
9893
9953
|
} as const;
|
|
9894
|
-
`}function Xr(e,t){let n=new Set(Object.keys(e.tables)),r=new Set;for(let l of Object.values(e.tables)){for(let p of Qr(l))n.has(p)||r.add(p);for(let p of Object.values(l.columns))p.references&&!n.has(p.references.table)&&r.add(p.references.table);}let a=new Map;for(let[l,p]of Object.entries(e.tables))for(let[d,y]of Object.entries(p.columns))if(y.type==="enum"&&y.enumValues&&y.enumValues.length>0){let x=y.enumRef??`${l}_${d}`;a.has(x)||a.set(x,{column:y,tableName:l,fieldName:d});}let o=[],i=[];for(let[l,p]of a.entries()){let d=q(l),y=p.column.enumValues.map(x=>`"${x}"`).join(" | ");o.push(`export type ${d} = ${y};`),i.push(`export const ${d}Column = t.customType<{ data: ${d}; dataNotNull: ${d} }>({ dataType: () => "text" });`);}let s=[],c=[],u=[];for(let[l,p]of Object.entries(e.tables)){let d=p.sqlName??I(l),y=[],x=[];u.push(` ${l},`);for(let[b,h]of Object.entries(p.columns)){let v;if(h.type==="enum"&&h.enumValues&&h.enumValues.length>0){let k=h.enumRef??`${l}_${b}`,V=q(k),B=h.sqlName??I(b);v=B!==b?`${V}Column(${g(B)})`:`${V}Column()`,h.isArray&&(v+=".array()");}else v=zr(b,h,t);h.uuidPrimaryKey&&(v+=".$defaultFn(() => crypto.randomUUID())"),h.primaryKey&&(v+=h.autoIncrement?".primaryKey({ autoIncrement: true })":".primaryKey()"),h.notNull&&(v+=".notNull()"),h.sqlDefault!==void 0&&(v+=`.default(${
|
|
9954
|
+
`}function Xr(e,t){let n=new Set(Object.keys(e.tables)),r=new Set;for(let l of Object.values(e.tables)){for(let p of Qr(l))n.has(p)||r.add(p);for(let p of Object.values(l.columns))p.references&&!n.has(p.references.table)&&r.add(p.references.table);}let a=new Map;for(let[l,p]of Object.entries(e.tables))for(let[d,y]of Object.entries(p.columns))if(y.type==="enum"&&y.enumValues&&y.enumValues.length>0){let x=y.enumRef??`${l}_${d}`;a.has(x)||a.set(x,{column:y,tableName:l,fieldName:d});}let o=[],i=[];for(let[l,p]of a.entries()){let d=q(l),y=p.column.enumValues.map(x=>`"${x}"`).join(" | ");o.push(`export type ${d} = ${y};`),i.push(`export const ${d}Column = t.customType<{ data: ${d}; dataNotNull: ${d} }>({ dataType: () => "text" });`);}let s=[],c=[],u=[];for(let[l,p]of Object.entries(e.tables)){let d=p.sqlName??I(l),y=[],x=[];u.push(` ${l},`);for(let[b,h]of Object.entries(p.columns)){let v;if(h.type==="enum"&&h.enumValues&&h.enumValues.length>0){let k=h.enumRef??`${l}_${b}`,V=q(k),B=h.sqlName??I(b);v=B!==b?`${V}Column(${g(B)})`:`${V}Column()`,h.isArray&&(v+=".array()");}else v=zr(b,h,t);h.uuidPrimaryKey&&(v+=".$defaultFn(() => crypto.randomUUID())"),h.primaryKey&&(v+=h.autoIncrement?".primaryKey({ autoIncrement: true })":".primaryKey()"),h.notNull&&(v+=".notNull()"),h.sqlDefault!==void 0&&(v+=`.default(${Or(h.sqlDefault)})`);let A=Kr(b,h,p);if(A)if(h.references?.onDelete||h.references?.onUpdate){let k=[];h.references.onDelete&&k.push(`onDelete: ${g(h.references.onDelete)}`),h.references.onUpdate&&k.push(`onUpdate: ${g(h.references.onUpdate)}`),v+=`.references((): AnySQLiteColumn => ${A.tableName}.${A.fieldName}, { ${k.join(", ")} })`;}else v+=`.references((): AnySQLiteColumn => ${A.tableName}.${A.fieldName})`;if(h.unique){let k=typeof h.unique=="object"&&h.unique.name?h.unique.name:`${d}_${I(b)}_unique_idx`;x.push(` t.uniqueIndex(${g(k)}).on(table.${b})`);}if(h.index){let k=typeof h.index=="object"&&h.index.name?h.index.name:`${d}_${I(b)}_idx`;x.push(` t.index(${g(k)}).on(table.${b})`);}y.push(` ${b}: ${v},`);}x.length>0?s.push(`export const ${l} = table(
|
|
9895
9955
|
${g(d)},
|
|
9896
9956
|
{
|
|
9897
9957
|
${y.join(`
|
|
@@ -9904,7 +9964,7 @@ ${x.join(`,
|
|
|
9904
9964
|
);`):s.push(`export const ${l} = table(${g(d)}, {
|
|
9905
9965
|
${y.join(`
|
|
9906
9966
|
`)}
|
|
9907
|
-
});`);let N=Object.entries(p.relations).filter(([,b])=>b.relation==="one"),w=Object.entries(p.relations).filter(([,b])=>b.relation==="many"),D=Object.entries(p.relations).filter(([,b])=>b.relation==="manyToMany");if(N.length===0&&w.length===0&&D.length===0)continue;let E=[];for(let[b,h]of N){let v=
|
|
9967
|
+
});`);let N=Object.entries(p.relations).filter(([,b])=>b.relation==="one"),w=Object.entries(p.relations).filter(([,b])=>b.relation==="many"),D=Object.entries(p.relations).filter(([,b])=>b.relation==="manyToMany");if(N.length===0&&w.length===0&&D.length===0)continue;let E=[];for(let[b,h]of N){let v=_r(l,p,h);E.push(` ${b}: one(${h.targetTable}, {
|
|
9908
9968
|
fields: [${l}.${v.sourceField}],
|
|
9909
9969
|
references: [${h.targetTable}.${v.targetField}],
|
|
9910
9970
|
}),`);}for(let[b,h]of w)E.push(` ${b}: many(${h.targetTable}),`);for(let[b,h]of D){if(!h.junctionTable)throw new Error(`manyToMany relation '${l}.${b}' is missing junctionTable after normalization.`);E.push(` ${b}: many(${h.junctionTable}),`);}c.push(`export const ${l}Relations = relations(${l}, ({ one, many }) => ({
|
|
@@ -9913,7 +9973,7 @@ ${E.join(`
|
|
|
9913
9973
|
}));`),u.push(` ${l}Relations,`);}return `import * as t from "drizzle-orm/sqlite-core";
|
|
9914
9974
|
import { sqliteTable as table, type AnySQLiteColumn } from "drizzle-orm/sqlite-core";
|
|
9915
9975
|
import { relations } from "drizzle-orm";
|
|
9916
|
-
${
|
|
9976
|
+
${Ur(r)}
|
|
9917
9977
|
${o.join(`
|
|
9918
9978
|
`)}
|
|
9919
9979
|
${i.join(`
|
|
@@ -9932,12 +9992,12 @@ ${u.join(`
|
|
|
9932
9992
|
`)}
|
|
9933
9993
|
} as const;
|
|
9934
9994
|
|
|
9935
|
-
${
|
|
9995
|
+
${Jr(e)}
|
|
9936
9996
|
|
|
9937
9997
|
${Gr(e)}
|
|
9938
9998
|
|
|
9939
9999
|
${Zr(e)}
|
|
9940
|
-
`}function de(e){return e.kind==="array"?`z.array(${de(e.element)})`:e.kind==="object"?`z.object({ ${Object.entries(e.shape).map(([n,r])=>`${g(n)}: ${de(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 wn(e,t,n){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=de(e.jsonShape));return t&&(r+=".optional()"),n&&(r+=".nullable()"),r}function Yr(e){let t=[];for(let[n,r]of Object.entries(e.tables)){let a=q(n),o=[],i=[];for(let[s,c]of Object.entries(r.columns))o.push(` ${s}: ${wn(c,xn(c),
|
|
10000
|
+
`}function de(e){return e.kind==="array"?`z.array(${de(e.element)})`:e.kind==="object"?`z.object({ ${Object.entries(e.shape).map(([n,r])=>`${g(n)}: ${de(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 wn(e,t,n){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=de(e.jsonShape));return t&&(r+=".optional()"),n&&(r+=".nullable()"),r}function Yr(e){let t=[];for(let[n,r]of Object.entries(e.tables)){let a=q(n),o=[],i=[];for(let[s,c]of Object.entries(r.columns))o.push(` ${s}: ${wn(c,xn(c),O(c))},`),i.push(` ${s}: ${wn(c,O(c),O(c))},`);t.push(`export const ${n}InsertSchema = z.object({
|
|
9941
10001
|
${o.join(`
|
|
9942
10002
|
`)}
|
|
9943
10003
|
});
|
|
@@ -9951,7 +10011,7 @@ export type ${a}Select = z.infer<typeof ${n}SelectSchema>;
|
|
|
9951
10011
|
`);}return `import { z } from "zod";
|
|
9952
10012
|
|
|
9953
10013
|
${t.join(`
|
|
9954
|
-
`)}`}function z(e){return e.kind==="array"?`Array<${z(e.element)}>`:e.kind==="object"?`{ ${Object.entries(e.shape).map(([n,r])=>`${n}: ${z(r)}`).join("; ")} }`:e.kind==="string"?"string":e.kind==="number"?"number":e.kind==="boolean"?"boolean":e.kind==="date"?"Date":"unknown"}function ea(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 t=e.enumValues.map(n=>`"${n}"`).join(" | ");return e.isArray?`Array<${t}>`:t}return e.type==="json"&&e.jsonShape?z(e.jsonShape):"unknown"}function ta(e){let t=[];for(let[r,a]of Object.entries(e.enums??{})){let o=q(r),i=a.values.map(s=>`"${s}"`).join(" | ");t.push(`export type ${o} = ${i};`);}let n=[];for(let[r,a]of Object.entries(e.tables)){let o=q(r),i=[],s=[];for(let[c,u]of Object.entries(a.columns)){let l=ea(u),p=
|
|
10014
|
+
`)}`}function z(e){return e.kind==="array"?`Array<${z(e.element)}>`:e.kind==="object"?`{ ${Object.entries(e.shape).map(([n,r])=>`${n}: ${z(r)}`).join("; ")} }`:e.kind==="string"?"string":e.kind==="number"?"number":e.kind==="boolean"?"boolean":e.kind==="date"?"Date":"unknown"}function ea(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 t=e.enumValues.map(n=>`"${n}"`).join(" | ");return e.isArray?`Array<${t}>`:t}return e.type==="json"&&e.jsonShape?z(e.jsonShape):"unknown"}function ta(e){let t=[];for(let[r,a]of Object.entries(e.enums??{})){let o=q(r),i=a.values.map(s=>`"${s}"`).join(" | ");t.push(`export type ${o} = ${i};`);}let n=[];for(let[r,a]of Object.entries(e.tables)){let o=q(r),i=[],s=[];for(let[c,u]of Object.entries(a.columns)){let l=ea(u),p=O(u)?" | null":"";i.push(` ${c}${O(u)?"?":""}: ${l}${p};`),s.push(` ${c}${xn(u)?"?":""}: ${l}${p};`);}n.push(`export type ${o} = {
|
|
9955
10015
|
${i.join(`
|
|
9956
10016
|
`)}
|
|
9957
10017
|
};
|
|
@@ -9967,10 +10027,10 @@ ${n.join(`
|
|
|
9967
10027
|
`}function na(e,t){if(t){let n=e[t];if(!ie(n))throw new Error(`schemaDsl.exportName '${t}' does not point to a schema() export.`);return n}for(let n of Object.values(e))if(ie(n))return n;throw new Error("No schema() export found in schemaDsl entry module. Set schemaDsl.exportName to the correct export.")}async function Tn(e){let t=e.config.schemaDsl;if(!t)return;let n=t.namingStrategy??"camelToSnake",r=path.resolve(e.configDir,t.entry),a=path.resolve(e.configDir,t.outFile??path.resolve(e.outDirAbs,"schema.compiled.ts")),o=path.resolve(e.configDir,t.typesOutFile??path.resolve(e.outDirAbs,"schema.types.ts")),i=path.resolve(e.configDir,t.zodOutFile??path.resolve(e.outDirAbs,"schema.zod.ts")),c=await import(`${url.pathToFileURL(r).href}?t=${Date.now()}`),u=na(c,t.exportName),l=Lr(u);await Promise.all([promises.mkdir(path.dirname(a),{recursive:true}),promises.mkdir(path.dirname(o),{recursive:true}),promises.mkdir(path.dirname(i),{recursive:true})]);let p=Xr(l,n),d=ta(l),y=Yr(l);return await Promise.all([Bun.write(a,p),Bun.write(o,d),Bun.write(i,y)]),{schemaPath:a,typesPath:o,zodPath:i,tableNames:Object.keys(l.tables)}}function aa(e){return e.replaceAll("\\","/")}function M(e,t){let n=aa(path.relative(e,t)).replace(/\.tsx?$/,"");return n.startsWith(".")?n:`./${n}`}var la=new Set([".ts",".tsx",".mts",".cts"]);async function Sn(e){let t=await promises.readdir(e,{withFileTypes:true}),n=[];for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="_generated")continue;let a=path.resolve(e,r.name);if(r.isDirectory()){n.push(...await Sn(a));continue}r.isFile()&&la.has(path.extname(r.name))&&n.push(a);}return n}function me(e){return e.replace(/\.[cm]?tsx?$/,"")}function pe(e,t){let n=e,r=false,a,o="unknown",i,s,c;for(;f__namespace.isCallExpression(n);){let u=n.expression;if(!f__namespace.isPropertyAccessExpression(u))break;let l=u.name.text;if(l==="optional"||l==="nullable")r=true,n=u.expression;else if(l==="default"){r=true;let p=n.arguments[0];p&&(f__namespace.isStringLiteral(p)||f__namespace.isNumericLiteral(p)?a=p.text:p.kind===f__namespace.SyntaxKind.TrueKeyword?a="true":p.kind===f__namespace.SyntaxKind.FalseKeyword&&(a="false")),n=u.expression;}else if(l==="string"||l==="uuid"||l==="email"||l==="url"){o="string";break}else if(l==="number"||l==="int"||l==="float"){o="number";break}else if(l==="boolean"){o="boolean";break}else if(l==="date"){o="date";break}else if(l==="object"){o="object";let p=n.arguments[0];if(p&&f__namespace.isObjectLiteralExpression(p)){i=[];for(let d of p.properties)f__namespace.isPropertyAssignment(d)&&f__namespace.isIdentifier(d.name)&&i.push(pe(d.initializer,d.name.text));}break}else if(l==="array"){o="array";let p=n.arguments[0];if(p){let d=pe(p,"");s=d.type==="array"?"unknown":d.type,d.type==="object"&&(c=d.fields);}break}else n=u.expression;}return {name:t,type:o,optional:r,defaultValue:a,fields:i,itemType:s,itemFields:c}}function ua(e){if(!e||!f__namespace.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>f__namespace.isPropertyAssignment(r)&&f__namespace.isIdentifier(r.name)&&r.name.text==="args");if(!t||!f__namespace.isObjectLiteralExpression(t.initializer))return [];let n=[];for(let r of t.initializer.properties)!f__namespace.isPropertyAssignment(r)||!f__namespace.isIdentifier(r.name)||n.push(pe(r.initializer,r.name.text));return n}function ca(e){return f__namespace.isVariableStatement(e)?e.modifiers?.some(t=>t.kind===f__namespace.SyntaxKind.ExportKeyword)??false:false}function An(e){return f__namespace.isIdentifier(e)?e.text:f__namespace.isParenthesizedExpression(e)?An(e.expression):null}function da(e){if(!e||!f__namespace.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>!f__namespace.isPropertyAssignment(r)||!f__namespace.isIdentifier(r.name)?false:r.name.text==="cronTrigger");if(!t||!f__namespace.isPropertyAssignment(t))return [];let n=t.initializer;return f__namespace.isStringLiteral(n)||f__namespace.isNoSubstitutionTemplateLiteral(n)?[n.text.trim()].filter(r=>r.length>0):f__namespace.isArrayLiteralExpression(n)?n.elements.map(r=>f__namespace.isStringLiteral(r)||f__namespace.isNoSubstitutionTemplateLiteral(r)?r.text.trim():"").filter(r=>r.length>0):[]}function pa(e,t){let n=f__namespace.createSourceFile(t,e,f__namespace.ScriptTarget.Latest,true,f__namespace.ScriptKind.TS),r=[];for(let a of n.statements)if(ca(a))for(let o of a.declarationList.declarations){if(!f__namespace.isIdentifier(o.name)||!o.initializer||!f__namespace.isCallExpression(o.initializer))continue;let i=An(o.initializer.expression);i!=="query"&&i!=="mutation"&&i!=="scheduler"&&i!=="cron"&&i!=="storageManager"||r.push({exportName:o.name.text,kind:i==="storageManager"?"storage":i,cronTriggers:i==="cron"?da(o.initializer.arguments[0]):[],args:i==="query"||i==="mutation"?ua(o.initializer.arguments[0]):[]});}return r}function vn(e,t,n){let r=t.replace(/\\/g,"/"),o=me(r).split("/").filter(Boolean);return `/${[e,...o,n].filter(Boolean).map(s=>s.trim()).filter(s=>s.length>0).join("/")}`}function ma(e,t){let n=e.replace(/\\/g,"/"),r=`${t}/`,a=n.indexOf(r);return a>=0?n.slice(a+r.length):n===t?"index.ts":n}function Rn(e,t){let n=e.replace(/\\/g,"/"),a=me(n).split("/").filter(Boolean),o=a[a.length-1]??"index";return [a.length>1?a[a.length-2]:"root",o,t].map(s=>s.trim()).filter(s=>s.length>0).join("/")}async function Nn(e){let t=[],n=await Sn(e.scanDirAbs).catch(()=>[]);for(let a of n){let o=Bun.file(a);if(!await o.exists())continue;let i=await o.text(),s=path.relative(e.scanDirAbs,a),c=pa(i,a),u=[{kind:"query",kindDirectory:"queries",exports:c.filter(l=>l.kind==="query")},{kind:"mutation",kindDirectory:"mutations",exports:c.filter(l=>l.kind==="mutation")},{kind:"scheduler",kindDirectory:"schedulers",exports:c.filter(l=>l.kind==="scheduler")},{kind:"cron",kindDirectory:"crons",exports:c.filter(l=>l.kind==="cron")},{kind:"storage",kindDirectory:"queries",exports:c.filter(l=>l.kind==="storage")}];for(let l of u){if(l.exports.length===0)continue;let p=ma(s,l.kindDirectory);for(let d of l.exports){let y=l.kind==="query"||l.kind==="mutation"?Rn(p,d.exportName):void 0,x=l.kind==="scheduler"||l.kind==="cron"?Rn(p,d.exportName):void 0,N=l.kind==="query"||l.kind==="mutation"?[...me(p).split("/").filter(Boolean),d.exportName]:void 0,w=l.kind==="query"?vn("queries",p,d.exportName):l.kind==="mutation"?vn("mutations",p,d.exportName):l.kind==="storage"?`/storage/managers/${d.exportName}`:`/${l.kindDirectory}/${x}`;t.push({kind:l.kind,exportName:d.exportName,filePath:a,importPath:M(e.outDirAbs,a),clientImportPath:M(path.resolve(e.outDirAbs,"client"),a),routePath:w,handlerName:y,clientSegments:N,taskName:x,cronTriggers:d.cronTriggers,args:d.args});}}}t.sort((a,o)=>a.routePath.localeCompare(o.routePath));let r=new Map;for(let a of t){let o=a.taskName?`task:${a.taskName}`:`route:${a.routePath}`,i=r.get(o);if(i)throw new Error(`Duplicate handler operation discovered: ${a.taskName??a.routePath} (${i} and ${a.filePath}#${a.exportName}).`);r.set(o,`${a.filePath}#${a.exportName}`);}return t}function ga(e){let t=[],n="",r=0,a=0,o=0,i=false,s=false,c=false,u=false;for(let p=0;p<e.length;p+=1){let d=e[p];if(u){n+=d,u=false;continue}if(d==="\\"){n+=d,u=true;continue}if(!s&&!c&&d==="'"){i=!i,n+=d;continue}if(!i&&!c&&d==='"'){s=!s,n+=d;continue}if(!i&&!s&&d==="`"){c=!c,n+=d;continue}if(i||s||c){n+=d;continue}if(d==="("?r+=1:d===")"?r-=1:d==="{"?a+=1:d==="}"?a-=1:d==="["?o+=1:d==="]"&&(o-=1),d===","&&r===0&&a===0&&o===0){let y=n.trim();y.length>0&&t.push(y),n="";continue}n+=d;}let l=n.trim();return l.length>0&&t.push(l),t}function ha(e){let t=0,n=0,r=0,a=false,o=false,i=false,s=false;for(let c=0;c<e.length;c+=1){let u=e[c];if(s){s=false;continue}if(u==="\\"){s=true;continue}if(!o&&!i&&u==="'"){a=!a;continue}if(!a&&!i&&u==='"'){o=!o;continue}if(!a&&!o&&u==="`"){i=!i;continue}if(!(a||o||i)){if(u==="("){t+=1;continue}if(u===")"){t-=1;continue}if(u==="{"){n+=1;continue}if(u==="}"){n-=1;continue}if(u==="["){r+=1;continue}if(u==="]"){r-=1;continue}if(u===":"&&t===0&&n===0&&r===0)return c}}return -1}function ya(e){let t=e.toLowerCase();return /mode\s*:\s*["'`](timestamp|timestamp_ms)["'`]/.test(t)?"date":/mode\s*:\s*["'`]boolean["'`]/.test(t)?"boolean":/\.(date|datetime|timestamp)\s*\(/.test(t)?"date":/\.(int|integer|real|numeric|decimal|float|double)\s*\(/.test(t)?"number":/mode\s*:\s*["'`]json["'`]/.test(t)||/\.json\s*\(/.test(t)?"json":/\.(text|varchar|char)\s*\(/.test(t)?"string":/\.(boolean|bool)\s*\(/.test(t)?"boolean":"unknown"}function ba(e){let t=ga(e),n=[];for(let r of t){let a=ha(r);if(a===-1)continue;let o=r.slice(0,a).trim().replace(/^['"]|['"]$/g,"");if(!o)continue;let i=r.slice(a+1).trim(),s=/\.primarykey\s*\(/i.test(i),c=/autoincrement\s*:\s*true/i.test(i),u=/\.default\s*\(/i.test(i),p=!/\.notnull\s*\(/i.test(i)||u||c||s;n.push({name:o,expression:i,type:ya(i),optional:p,primaryKey:s,autoIncrement:c});}return n}function wa(e){let t=/export\s+const\s+(\w+)\s*=\s*table\s*\(\s*["'`]([^"'`]+)["'`]/g,n=[],r=(o,i)=>{let s=0,c=false,u=false,l=false,p=false;for(let d=i;d<o.length;d+=1){let y=o[d];if(p){p=false;continue}if(y==="\\"){p=true;continue}if(!u&&!l&&y==="'"){c=!c;continue}if(!c&&!l&&y==='"'){u=!u;continue}if(!c&&!u&&y==="`"){l=!l;continue}if(!(c||u||l)){if(y==="{"){s+=1;continue}if(y==="}"&&(s-=1,s===0))return d}}return -1},a=t.exec(e);for(;a;){let o=a[1],i=a[2],s=e.indexOf("{",t.lastIndex);if(s===-1){a=t.exec(e);continue}let c=r(e,s);if(c===-1){a=t.exec(e);continue}let u=e.slice(s+1,c);n.push({exportName:o,tableName:i,columns:ba(u)}),a=t.exec(e);}return n}async function Cn(e){let t=await promises.readdir(e,{withFileTypes:true}),n=[];for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="_generated")continue;let a=path.resolve(e,r.name);if(r.isDirectory()){n.push(...await Cn(a));continue}r.isFile()&&r.name==="schema.ts"&&n.push(a);}return n}async function Fn(e,t=[]){let n=await Cn(e.scanDirAbs).catch(()=>[]),r=path.resolve(e.configDir,"schema.ts"),a=[...t,...n.length?n:[r]];for(let o of a){let i=Bun.file(o);if(!await i.exists())continue;let s=await i.text(),c=wa(s);if(c.length>0)return {schemaPath:o,tables:c}}throw new Error(`Unable to discover schema.ts under scanDir (${e.scanDirAbs}) or fallback (${r}).`)}function va(e){let t=e.auth.options.plugins;if(!Array.isArray(t))return [];for(let n of t)if(n&&typeof n=="object"){let r=n;if(r.id==="admin"&&"options"in r){let a=r.options;if(a&&typeof a=="object"&&"roles"in a){let o=a.roles;if(o&&typeof o=="object")return Object.keys(o)}}}return []}function Ra(e){let r=e.auth.options?.user?.additionalFields;if(!r||typeof r!="object")return [];let a={string:"string",number:"number",boolean:"boolean",date:"Date"};return Object.entries(r).filter(([,o])=>o&&typeof o=="object"&&"type"in o).map(([o,i])=>({name:o,tsType:a[i.type]||"unknown"}))}async function ka(e,t){let n=await Bun.file(e).text(),r=t.map(o=>`"${o}"`).join(" | "),a=n.replace(/(import.*?from\s+["']drizzle-orm\/sqlite-core["'])/,`$1
|
|
9968
10028
|
import { customType } from "drizzle-orm/sqlite-core"`).replace(/role:\s*text\(["']role["']\)/,`role: customType<{ data: ${r}; dataNotNull: ${r} }>({ dataType: () => "text" })("role")`);await Bun.write(e,a);}function Sa(e,t){let n=path.relative(e,t).replace(/\\/g,"/");return n.startsWith(".")?n:`./${n}`}async function En(e){let{outDirAbs:t,wranglerOutDirAbs:n,config:r,configPath:a,configDir:o}=e,i=M(t,a),s=path.resolve(t,"client"),c=M(s,a),u=performance.now();await Promise.all([promises.mkdir(t,{recursive:true}),promises.mkdir(s,{recursive:true}),promises.mkdir(n,{recursive:true})]),process.stdout.write(`\u{1F4C1} Directories (${(performance.now()-u).toFixed(0)}ms)
|
|
9969
10029
|
`);let l=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href)))),p=path.join(path.dirname(Bun.resolveSync("typescript/package.json",l)),"bin","tsc"),d=path.join(path.dirname(Bun.resolveSync("@better-auth/cli/package.json",l)),"dist","index.mjs"),y=path.resolve(t,"server.ts"),x=path.resolve(t,"client.ts"),N=path.resolve(t,"auth.config.ts"),w=path.resolve(t,"auth.schema.ts"),D=path.resolve(t,"drizzle.config.ts"),E=path.resolve(n,"wrangler.json"),b=await Tn(e),h=await Fn(e,b?[b.schemaPath]:[]),v=M(t,h.schemaPath),A=await Nn(e);process.stdout.write(`\u{1F50D} ${A.length} handler(s) (${(performance.now()-u).toFixed(0)}ms)
|
|
9970
|
-
`);let k=va(r),V=Ra(r),B=kt(r.auth.basePath,r.database[0].binding,r.kv[0]?.binding,r.scheduler.binding,r.r2[0]?.binding,r.realtime.binding,r.realtime.objectName,r.realtime.subscribePath,r.realtime.websocketPath,r.realtime.protocol),ye=Ce(c,A),Ln=X(v,A,r.r2[0]?.binding,k,V),zn=ve(i),
|
|
9971
|
-
`),...Zn,...Gn,Bun.write(N,zn),Bun.write(w,""),Bun.write(D,
|
|
9972
|
-
`),Bun.write(Kn
|
|
9973
|
-
`);let
|
|
10030
|
+
`);let k=va(r),V=Ra(r),B=kt(r.auth.basePath,r.database[0].binding,r.kv[0]?.binding,r.scheduler.binding,r.r2[0]?.binding,r.realtime.binding,r.realtime.objectName,r.realtime.subscribePath,r.realtime.websocketPath,r.realtime.protocol),ye=Ce(c,A),Ln=X(v,A,r.r2[0]?.binding,k,V),zn=ve(i),_n=b?[Sa(o,b.schemaPath),...r.schema.filter(T=>!/(^|\/)schema\.ts$/.test(T))]:r.schema,Un=Fe(_n),Qn=At(e,A),Kn=fn(v,h,A),Jn=path.resolve(t,"admin.routes.ts"),Gn=Ln.map(T=>Bun.write(path.resolve(t,T.relativePath),T.source)),Zn=ye.map(T=>Bun.write(path.resolve(t,T.relativePath),T.source));await Promise.all([Bun.write(y,B),Bun.write(x,`export * from "./client/index";
|
|
10031
|
+
`),...Zn,...Gn,Bun.write(N,zn),Bun.write(w,""),Bun.write(D,Un),Bun.write(E,`${JSON.stringify(Qn,null,2)}
|
|
10032
|
+
`),Bun.write(Jn,Kn)]),process.stdout.write(`\u{1F4DD} Source artifacts (${(performance.now()-u).toFixed(0)}ms)
|
|
10033
|
+
`);let K=path.relative(o,N).replace(/\\/g,"/"),Xn=K.startsWith(".")?K:`./${K}`,J=path.relative(o,w).replace(/\\/g,"/"),Yn=J.startsWith(".")?J:`./${J}`,be=await Bun.spawn([process.execPath,d,"generate","--config",Xn,"--output",Yn,"--yes"],{cwd:o,stdout:"inherit",stderr:"inherit"}).exited;if(be!==0)throw new Error(`better-auth generation failed with exit code ${be}`);process.stdout.write(`\u{1F510} Auth schema (${(performance.now()-u).toFixed(0)}ms)
|
|
9974
10034
|
`),k.length>0&&(await ka(w,k),process.stdout.write(`\u{1F527} Patched role type (${(performance.now()-u).toFixed(0)}ms)
|
|
9975
10035
|
`));function er(T={}){return {compilerOptions:{lib:["es2024"],types:["@types/node","@cloudflare/workers-types/2023-07-01"],module:"es2022",target:"es2024",moduleResolution:"bundler",strictNullChecks:true,skipLibCheck:true,declaration:true,emitDeclarationOnly:true,noCheck:true,jsx:"react-jsx",paths:{"_generated/*":["./*"]},...T},include:["./*.ts","./client/*.ts"]}}let we=path.resolve(t,"tsconfig.js.json");await Promise.all([Bun.write(we,`${JSON.stringify(er({declaration:true,emitDeclarationOnly:false}),null,2)}
|
|
9976
10036
|
`)]),process.stdout.write(`\u{1F4C4} TS configs (${(performance.now()-u).toFixed(0)}ms)
|
|
@@ -9980,9 +10040,9 @@ import { customType } from "drizzle-orm/sqlite-core"`).replace(/role:\s*text\(["
|
|
|
9980
10040
|
`);let nr=t+"/";async function Te(T){let C=await promises.readdir(T,{withFileTypes:true});for(let R of C){let $=path.join(T,R.name);if(R.isDirectory()){if(R.name==="node_modules"||R.name.startsWith(".")||$===t)continue;await Te($);}else !$.startsWith(nr)&&(R.name.endsWith(".d.ts")||R.name.endsWith(".js"))&&await promises.rm($);}}await Te(o),process.stdout.write(`\u{1F9F9} Cleanup (${(performance.now()-u).toFixed(0)}ms)
|
|
9981
10041
|
`);let rr=path.resolve(o,"tsconfig.json");if(e.config.build&&fs.existsSync(rr)){process.stdout.write(`\u2699\uFE0F Building project... (${(performance.now()-u).toFixed(0)}ms)
|
|
9982
10042
|
`);let C=await Bun.spawn([process.execPath,p,"--build"],{cwd:o,stdout:"inherit",stderr:"inherit"}).exited;if(C!==0)throw new Error(`TypeScript build failed with exit code ${C}`);process.stdout.write(`\u2705 Build complete (${(performance.now()-u).toFixed(0)}ms)
|
|
9983
|
-
`);}}var jn=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(),
|
|
10043
|
+
`);}}var jn=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(),On=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(),Ca=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(),Fa=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([jn,zod.z.array(jn).min(1)]),kv:zod.z.union([In,zod.z.array(In)]).optional(),r2:zod.z.union([On,zod.z.array(On)]).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:Ca.optional(),wranglerOverrides:zod.z.record(zod.z.string(),zod.z.unknown()).optional(),build:zod.z.boolean().optional()}).strict();function Dn(e){return typeof e=="object"&&e!==null}function qa(e){let t=Dn(e.wranglerOverrides)?e.wranglerOverrides.scheduler:void 0,n=Pn.safeParse(t);return n.success?n.data:{}}function Ma(e){if(!Dn(e)||!("scheduler"in e))return e;let{scheduler:t,...n}=e;return n}function Ea(e){let n={...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:n.enabled??true,binding:n.binding??"APPFLARE_SCHEDULER_QUEUE",queue:n.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:Ma(e.wranglerOverrides),wranglerOutDir:e.wranglerOutDir??e.wranglerOutPath??e.outDir,build:e.build??true}}async function P(e){let t=path.isAbsolute(e??"")?e:path.resolve(process.cwd(),e??"appflare.config.ts"),n=path.dirname(t),o=(await import(url.pathToFileURL(t).href)).default,i=Fa.parse(o),s=Ea(i);return {configPath:t,configDir:n,scanDirAbs:path.resolve(n,s.scanDir),outDirAbs:path.resolve(n,s.outDir),wranglerOutDirAbs:path.resolve(n,s.wranglerOutDir),config:s}}function Pa(e){let t=e;for(;;){if(fs.existsSync(path.resolve(t,"package.json")))return t;let n=path.dirname(t);if(n===t)return e;t=n;}}async function Q(e,t={}){let n=await P(e);if(t.build!==void 0&&(n.config.build=t.build),await En(n),n.wranglerOutDirAbs===n.outDirAbs){process.stdout.write(`\u2705 Generated artifacts in ${n.outDirAbs}
|
|
9984
10044
|
`);return}process.stdout.write(`\u2705 Generated server/client in ${n.outDirAbs} and wrangler.json in ${n.wranglerOutDirAbs}
|
|
9985
|
-
`);}async function Bn(e,t={}){if(await Q(e,{build:t.build}),!t.watch)return;let n=await
|
|
10045
|
+
`);}async function Bn(e,t={}){if(await Q(e,{build:t.build}),!t.watch)return;let n=await P(e),r=false,a=false,o=async()=>{if(r){a=true;return}r=true;try{await Q(e,{build:t.build});}catch(s){process.stderr.write(`\u274C Build failed: ${s.message}
|
|
9986
10046
|
`);}finally{r=false,a&&(a=false,await o());}};ja__default.default.watch(n.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,c)=>{process.stdout.write(`\u{1F504} Change detected: ${c}
|
|
9987
10047
|
`),await o();}),process.stdout.write(`\u{1F440} Watching ${n.scanDirAbs}
|
|
9988
|
-
`);}async function Wn(e,t={}){let n=await
|
|
10048
|
+
`);}async function Wn(e,t={}){let n=await P(e),r=Pa(process.cwd());if([!!t.local,!!t.remote,!!t.preview].filter(Boolean).length>1)throw new Error("Only one of --local, --remote, or --preview can be set.");let o=path.resolve(n.outDirAbs,"drizzle.config.js"),i=process.platform==="win32"?"npx.cmd":"npx",c=await Bun.spawn([i,"drizzle-kit","generate","--config",o],{cwd:r,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(c!==0)throw new Error(`drizzle-kit generate failed with exit code ${c}`);let u=n.config.database[0].databaseName,l=[i,"wrangler","d1","migrations","apply",u];t.local?l.push("--local"):t.remote?l.push("--remote"):t.preview&&l.push("--preview");let d=await Bun.spawn(l,{cwd:n.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 Hn(e,t={name:"",email:"",password:""}){let n=await P(e);if([!!t.local,!!t.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(t.password),i=crypto.randomUUID(),s=crypto.randomUUID(),c=Date.now(),u=t.name.replace(/'/g,"''"),l=t.email.replace(/'/g,"''"),p=["INSERT INTO users (id, name, email, email_verified, created_at, updated_at, role, banned)",`VALUES ('${i}', '${u}', '${l}', 1, ${c}, ${c}, 'admin', 0);`,"INSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)",`VALUES ('${s}', '${l}', 'credential', '${i}', '${o}', ${c}, ${c});`].join(" "),d=n.config.database[0].databaseName,x=[process.platform==="win32"?"npx.cmd":"npx","wrangler","d1","execute",d,`--command=${p}`];t.local?x.push("--local"):t.remote&&x.push("--remote");let w=await Bun.spawn(x,{cwd:n.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 "+t.email+" created successfully!");}var j=new commander.Command;j.name("appflare").description("Appflare compiler/bundler for Cloudflare-native backends and SDK generation").version("0.0.28");j.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});});j.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 Bn(e.config,{watch:e.watch,build:e.build});});j.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 Wn(e.config,{local:e.local,remote:e.remote,preview:e.preview});});j.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 Hn(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 j.parseAsync(process.argv);})().catch(e=>{console.error(e),process.exit(1);});
|
package/dist/cli/index.mjs
CHANGED
|
@@ -1290,7 +1290,7 @@ function buildSignedRequest(
|
|
|
1290
1290
|
headers,
|
|
1291
1291
|
});
|
|
1292
1292
|
}
|
|
1293
|
-
`}function
|
|
1293
|
+
`}function Oe(){return `
|
|
1294
1294
|
function createStorageApi(
|
|
1295
1295
|
ctx: AppflareContext,
|
|
1296
1296
|
bucket: R2BucketBinding | undefined,
|
|
@@ -1369,7 +1369,7 @@ function createStorageApi(
|
|
|
1369
1369
|
},
|
|
1370
1370
|
};
|
|
1371
1371
|
}
|
|
1372
|
-
`}function
|
|
1372
|
+
`}function Pe(e){return `
|
|
1373
1373
|
export async function createSchedulerExecutionContext(
|
|
1374
1374
|
env: Record<string, unknown>,
|
|
1375
1375
|
options: RegisterHandlersOptions,
|
|
@@ -1496,9 +1496,9 @@ ${je()}
|
|
|
1496
1496
|
|
|
1497
1497
|
${Ie()}
|
|
1498
1498
|
|
|
1499
|
-
${
|
|
1499
|
+
${Oe()}
|
|
1500
1500
|
|
|
1501
|
-
${
|
|
1501
|
+
${Pe(e)}
|
|
1502
1502
|
`}function Ve(){return `
|
|
1503
1503
|
export async function executeOperation<
|
|
1504
1504
|
TShape extends ZodRawShape,
|
|
@@ -3454,7 +3454,7 @@ function inferConflictTarget(table: unknown): string[] {
|
|
|
3454
3454
|
|
|
3455
3455
|
return [];
|
|
3456
3456
|
}
|
|
3457
|
-
`}function
|
|
3457
|
+
`}function _e(){return `const mergedSchema = {
|
|
3458
3458
|
...authSchema,
|
|
3459
3459
|
...schema,
|
|
3460
3460
|
};
|
|
@@ -3729,6 +3729,48 @@ type ManyToManyRelationRows<
|
|
|
3729
3729
|
>
|
|
3730
3730
|
>
|
|
3731
3731
|
: Array<TableModel<TTargetTable>>;
|
|
3732
|
+
type NativeManyRelationRows<
|
|
3733
|
+
TSourceTable extends TableName,
|
|
3734
|
+
TRelationName extends string,
|
|
3735
|
+
TRelationArgs,
|
|
3736
|
+
> = RuntimeRelationTargetTable<TSourceTable, TRelationName> extends infer TTarget
|
|
3737
|
+
? TTarget extends TableName
|
|
3738
|
+
? TRelationArgs extends true
|
|
3739
|
+
? Array<TableModel<TTarget>>
|
|
3740
|
+
: TRelationArgs extends Record<string, unknown>
|
|
3741
|
+
? Awaited<
|
|
3742
|
+
TableFindManyResult<
|
|
3743
|
+
TTarget,
|
|
3744
|
+
Extract<
|
|
3745
|
+
Omit<TRelationArgs, "_count" | "_avg">,
|
|
3746
|
+
QueryFindManyArgs<TTarget>
|
|
3747
|
+
>
|
|
3748
|
+
>
|
|
3749
|
+
>
|
|
3750
|
+
: Array<TableModel<TTarget>>
|
|
3751
|
+
: never
|
|
3752
|
+
: never;
|
|
3753
|
+
type NativeOneRelationValue<
|
|
3754
|
+
TSourceTable extends TableName,
|
|
3755
|
+
TRelationName extends string,
|
|
3756
|
+
TRelationArgs,
|
|
3757
|
+
> = RuntimeRelationTargetTable<TSourceTable, TRelationName> extends infer TTarget
|
|
3758
|
+
? TTarget extends TableName
|
|
3759
|
+
? TRelationArgs extends true
|
|
3760
|
+
? TableModel<TTarget> | null
|
|
3761
|
+
: TRelationArgs extends Record<string, unknown>
|
|
3762
|
+
? Awaited<
|
|
3763
|
+
TableFindFirstResult<
|
|
3764
|
+
TTarget,
|
|
3765
|
+
Extract<
|
|
3766
|
+
Omit<TRelationArgs, "_count" | "_avg">,
|
|
3767
|
+
QueryFindFirstArgs<TTarget>
|
|
3768
|
+
>
|
|
3769
|
+
>
|
|
3770
|
+
>
|
|
3771
|
+
: TableModel<TTarget> | null
|
|
3772
|
+
: never
|
|
3773
|
+
: never;
|
|
3732
3774
|
type ReplaceManyToManyRelationsInRow<
|
|
3733
3775
|
TSourceTable extends string,
|
|
3734
3776
|
TRow,
|
|
@@ -3739,15 +3781,33 @@ type ReplaceManyToManyRelationsInRow<
|
|
|
3739
3781
|
? TWith extends Record<string, unknown>
|
|
3740
3782
|
? K extends keyof TWith
|
|
3741
3783
|
? [ManyToManyTargetTableName<Extract<TSourceTable, TableName>, K>] extends [never]
|
|
3742
|
-
?
|
|
3743
|
-
|
|
3744
|
-
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
|
|
3748
|
-
|
|
3749
|
-
|
|
3750
|
-
|
|
3784
|
+
? RuntimeRelationKind<Extract<TSourceTable, TableName>, K> extends "many"
|
|
3785
|
+
? NativeManyRelationRows<
|
|
3786
|
+
Extract<TSourceTable, TableName>,
|
|
3787
|
+
K,
|
|
3788
|
+
TWith[K]
|
|
3789
|
+
>
|
|
3790
|
+
: RuntimeRelationKind<Extract<TSourceTable, TableName>, K> extends "one"
|
|
3791
|
+
? NativeOneRelationValue<
|
|
3792
|
+
Extract<TSourceTable, TableName>,
|
|
3793
|
+
K,
|
|
3794
|
+
TWith[K]
|
|
3795
|
+
>
|
|
3796
|
+
: ReplaceManyToManyRelationsInRow<
|
|
3797
|
+
[RuntimeRelationTargetTable<
|
|
3798
|
+
Extract<TSourceTable, TableName>,
|
|
3799
|
+
K
|
|
3800
|
+
>] extends [never]
|
|
3801
|
+
? K
|
|
3802
|
+
: RuntimeRelationTargetTable<
|
|
3803
|
+
Extract<TSourceTable, TableName>,
|
|
3804
|
+
K
|
|
3805
|
+
>,
|
|
3806
|
+
TRow[K],
|
|
3807
|
+
TWith[K] extends { with: infer TNestedWith }
|
|
3808
|
+
? TNestedWith
|
|
3809
|
+
: undefined
|
|
3810
|
+
>
|
|
3751
3811
|
: ManyToManyRelationRows<
|
|
3752
3812
|
Extract<ManyToManyTargetTableName<Extract<TSourceTable, TableName>, K>, TableName>,
|
|
3753
3813
|
TWith[K]
|
|
@@ -3852,7 +3912,7 @@ type TableFindFirstResult<
|
|
|
3852
3912
|
type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
3853
3913
|
(typeof mergedDbSchema)[TName]
|
|
3854
3914
|
>;
|
|
3855
|
-
`}function
|
|
3915
|
+
`}function Ue(){return [_e(),He(),Le(),ze()].join(`
|
|
3856
3916
|
|
|
3857
3917
|
`)}function Qe(){return ` count: async (args?: QueryCountArgs<TableName>) => {
|
|
3858
3918
|
const withValue = args?.with;
|
|
@@ -4025,7 +4085,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
4025
4085
|
},
|
|
4026
4086
|
}) as AppflareQueryDb;
|
|
4027
4087
|
}
|
|
4028
|
-
`}function
|
|
4088
|
+
`}function Ke(){return `export class AppflareHandledError extends Error {
|
|
4029
4089
|
public readonly status: number;
|
|
4030
4090
|
public readonly payload: unknown;
|
|
4031
4091
|
|
|
@@ -4035,7 +4095,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
4035
4095
|
this.payload = payload;
|
|
4036
4096
|
}
|
|
4037
4097
|
}
|
|
4038
|
-
`}function
|
|
4098
|
+
`}function Je(){return ` findMany: (args?: Record<string, unknown>) => {
|
|
4039
4099
|
const where = isRecord(args?.where)
|
|
4040
4100
|
? (args?.where as Record<string, unknown>)
|
|
4041
4101
|
: undefined;
|
|
@@ -5186,7 +5246,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
|
|
|
5186
5246
|
);
|
|
5187
5247
|
return rows;
|
|
5188
5248
|
},
|
|
5189
|
-
`}function Xe(){return [Ge(),
|
|
5249
|
+
`}function Xe(){return [Ge(),Je(),Ze(),Qe(),Ke()].join(`
|
|
5190
5250
|
|
|
5191
5251
|
`)}function Ye(e=[],t=[]){let n=t.map(i=>` ${i.name}?: ${i.tsType} | null;`).join(`
|
|
5192
5252
|
`),a=[e.length>0?[" role: UserRole;"," banned: boolean | null;"," banReason?: string | null | undefined;"," banExpires?: Date | null | undefined;"].join(`
|
|
@@ -5417,7 +5477,7 @@ export function cron(definition: CronDefinition): RegisteredCron {
|
|
|
5417
5477
|
definition,
|
|
5418
5478
|
};
|
|
5419
5479
|
}
|
|
5420
|
-
`}function tt(e=[],t=[]){return [We(),
|
|
5480
|
+
`}function tt(e=[],t=[]){return [We(),Ue(),Xe(),Ye(e,t),et()].join(`
|
|
5421
5481
|
|
|
5422
5482
|
`)}function nt(e,t=[],n=[]){return `import type { Context } from "hono";
|
|
5423
5483
|
import type { D1Database } from "@cloudflare/workers-types";
|
|
@@ -7157,7 +7217,7 @@ ${n}</li>`;}return i}function Ct(e){let t=e.filter(s=>s.kind==="query"),n=e.filt
|
|
|
7157
7217
|
payload.${n} = raw_${n};
|
|
7158
7218
|
}
|
|
7159
7219
|
`}).join(`
|
|
7160
|
-
`)}function jt(e){return e.columns.find(t=>t.primaryKey)?.name||e.columns[0]?.name||""}function It(e,t){let n=e.columns.find(r=>r.name===t);return !(!n||n.autoIncrement||n.primaryKey)}function
|
|
7220
|
+
`)}function jt(e){return e.columns.find(t=>t.primaryKey)?.name||e.columns[0]?.name||""}function It(e,t){let n=e.columns.find(r=>r.name===t);return !(!n||n.autoIncrement||n.primaryKey)}function Ot(e,t){let n=e.columns.find(r=>r.name===t);return !(!n||n.primaryKey||n.autoIncrement)}function Pt(e,t,n,r){return t?`<td class="text-right">
|
|
7161
7221
|
<div class="drawer drawer-end">
|
|
7162
7222
|
<input id="edit-drawer-${e.exportName}-\${rowIndex}" type="checkbox" class="drawer-toggle" />
|
|
7163
7223
|
<div class="drawer-content">
|
|
@@ -7628,7 +7688,7 @@ ${n}</li>`;}return i}function Ct(e){let t=e.filter(s=>s.kind==="query"),n=e.filt
|
|
|
7628
7688
|
return c.redirect('/admin/table/${e}?' + query.toString());
|
|
7629
7689
|
});
|
|
7630
7690
|
${l}
|
|
7631
|
-
`}function ae(e){let t=jt(e),n=!!t,r=e.columns.map(w=>w.name),a=r.filter(w=>It(e,w)),o=r.filter(w=>
|
|
7691
|
+
`}function ae(e){let t=jt(e),n=!!t,r=e.columns.map(w=>w.name),a=r.filter(w=>It(e,w)),o=r.filter(w=>Ot(e,w)),i=qt(e),s=Mt(e,r),c=Et(e,r,t),u=a.map(w=>ne(e,w,"create")).join(""),l=o.map(w=>ne(e,w,"edit")).join(""),p=re(e,a),d=re(e,o),y=n?t:r[0]||"id",x=e.columns.find(w=>w.name===t)?.type,N=Pt(e,n,t,l);return Dt(e,y,t,n,r,i,s,c,N,u)+`
|
|
7632
7692
|
`+Vt(e.exportName,y,t,x,n,i,p,d)}function Bt(){return `
|
|
7633
7693
|
const buildUsersRedirect = (params: { page?: string; sort?: string; order?: string; search?: string }) => {
|
|
7634
7694
|
const page = params.page && params.page.trim() ? params.page : '1';
|
|
@@ -7780,7 +7840,7 @@ ${Ht()}
|
|
|
7780
7840
|
</div>
|
|
7781
7841
|
\${tableHtml}
|
|
7782
7842
|
</div>
|
|
7783
|
-
\`;`}function
|
|
7843
|
+
\`;`}function _t(){let e=Lt(),t=zt();return `
|
|
7784
7844
|
adminApp.get('/users', async (c) => {
|
|
7785
7845
|
const db = drizzle(c.env[options.databaseBinding]);
|
|
7786
7846
|
const auth = createAuth({ DATABASE: c.env[options.databaseBinding] } as any, c.req.raw.cf as any);
|
|
@@ -7836,7 +7896,7 @@ ${Ht()}
|
|
|
7836
7896
|
title: "users - Admin Dashboard",
|
|
7837
7897
|
children: content,
|
|
7838
7898
|
}));
|
|
7839
|
-
});`}function
|
|
7899
|
+
});`}function Ut(){return `
|
|
7840
7900
|
adminApp.post('/users/edit', async (c) => {
|
|
7841
7901
|
const session = await requireAdminSession(c);
|
|
7842
7902
|
if (!session) {
|
|
@@ -7991,12 +8051,12 @@ ${Ht()}
|
|
|
7991
8051
|
return session;
|
|
7992
8052
|
};
|
|
7993
8053
|
|
|
7994
|
-
${Ut()}
|
|
7995
|
-
|
|
7996
8054
|
${_t()}
|
|
8055
|
+
|
|
8056
|
+
${Ut()}
|
|
7997
8057
|
`}function Qt(e){return `${e.tables.map(t=>ae(t)).join(`
|
|
7998
8058
|
`)}
|
|
7999
|
-
${oe()}`}function
|
|
8059
|
+
${oe()}`}function Kt(e){return `
|
|
8000
8060
|
<div class="flex items-center justify-between">
|
|
8001
8061
|
<div class="flex items-center gap-3">
|
|
8002
8062
|
<div class="w-10 h-10 rounded-xl bg-primary/10 flex items-center justify-center">
|
|
@@ -8150,7 +8210,7 @@ ${oe()}`}function Jt(e){return `
|
|
|
8150
8210
|
</div>
|
|
8151
8211
|
<p id="headers-error" class="text-[11px] text-error mt-1.5 hidden"></p>
|
|
8152
8212
|
</div>
|
|
8153
|
-
`}function
|
|
8213
|
+
`}function Jt(e){return `
|
|
8154
8214
|
<div class="card bg-base-100 border border-base-200 shadow-sm overflow-hidden flex flex-col h-full">
|
|
8155
8215
|
<div class="px-5 py-3 border-b border-base-200 bg-base-200/20 flex items-center justify-between flex-none">
|
|
8156
8216
|
<h3 class="text-xs font-bold uppercase tracking-widest opacity-40">Request</h3>
|
|
@@ -8971,11 +9031,11 @@ ${oe()}`}function Jt(e){return `
|
|
|
8971
9031
|
`}function Xt(e){return `
|
|
8972
9032
|
const content = html\`
|
|
8973
9033
|
<div class="flex flex-col gap-6 max-w-5xl mx-auto" id="main-content">
|
|
8974
|
-
${
|
|
9034
|
+
${Kt(e)}
|
|
8975
9035
|
|
|
8976
9036
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
8977
9037
|
<!-- Request Panel -->
|
|
8978
|
-
${
|
|
9038
|
+
${Jt(e)}
|
|
8979
9039
|
|
|
8980
9040
|
<!-- Result Panel -->
|
|
8981
9041
|
${Gt()}
|
|
@@ -9841,8 +9901,8 @@ ${p}
|
|
|
9841
9901
|
app.route('/admin', adminApp);
|
|
9842
9902
|
app.get('/admin/', (c) => c.redirect('/admin'));
|
|
9843
9903
|
}
|
|
9844
|
-
`}function ie(e){if(typeof e!="object"||e===null)return false;let t=e;return t.kind==="schema"&&typeof t.tables=="object"&&(typeof t.enums=="object"||t.enums===void 0)}function I(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase()}function q(e){return e.replace(/[_-]+/g," ").replace(/\s+(.)/g,(t,n)=>n.toUpperCase()).replace(/\s/g,"").replace(/^(.)/,(t,n)=>n.toUpperCase())}function ue(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 g(e){return JSON.stringify(e)}function
|
|
9845
|
-
`}function Qr(e){return Object.values(e.relations).filter(t=>t.relation==="one").map(t=>t.targetTable)}function
|
|
9904
|
+
`}function ie(e){if(typeof e!="object"||e===null)return false;let t=e;return t.kind==="schema"&&typeof t.tables=="object"&&(typeof t.enums=="object"||t.enums===void 0)}function I(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase()}function q(e){return e.replace(/[_-]+/g," ").replace(/\s+(.)/g,(t,n)=>n.toUpperCase()).replace(/\s/g,"").replace(/^(.)/,(t,n)=>n.toUpperCase())}function ue(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 g(e){return JSON.stringify(e)}function Or(e){if(typeof e=="string")return g(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(e===null)return "null";if(e instanceof Date)return g(e.toISOString());if(typeof e=="object"&&e!==null)return JSON.stringify(e);throw new Error(`Unsupported SQL default value '${String(e)}'. Use string, number, boolean, null, Date, array, or object.`)}function Pr(e){return {kind:"schema",tables:Object.fromEntries(Object.entries(e.tables).map(([t,n])=>[t,{kind:"table",sqlName:n.sqlName,columns:Object.fromEntries(Object.entries(n.columns).map(([r,a])=>[r,{...a}])),relations:Object.fromEntries(Object.entries(n.relations).map(([r,a])=>[r,{...a}]))}])),enums:Object.fromEntries(Object.entries(e.enums??{}).map(([t,n])=>[t,{...n}]))}}function L(e,t,n){let r=e.tables[t];return r?r.columns[n]?.type:void 0}function gn(e,t,n,r,a,o,i){let s=t.columns[n];if(s){if(s.references&&(s.references.table!==r||s.references.column!==a))throw new Error(`Inferred relation '${e}.${n}' conflicts with explicit references(${s.references.table}.${s.references.column}).`);t.columns[n]={...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}t.columns[n]={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 hn(e,t,n){if(t.notNull===true&&t.nullable===true)throw new Error(`Invalid nullable configuration on '${e}': cannot set both notNull and nullable to true.`);return t.notNull===true?true:t.nullable===true||t.notNull===false?false:n}function yn(e,t){return `${e}:${t}`}function Dr(e,t,n,r){let a=yn(e,t),o=yn(n,r);return a<=o?{key:`${a}|${o}`,leftTable:e,leftReferenceField:t,rightTable:n,rightReferenceField:r,sourceIsLeft:true}:{key:`${o}|${a}`,leftTable:n,leftReferenceField:r,rightTable:e,rightReferenceField:t,sourceIsLeft:false}}function Vr(e,t){return `${e}${q(t)}Links`}function bn(e,t,n){let r=ue(e),a=ue(t);return r===a?`${n}${q(r)}Id`:`${r}Id`}function Br(e,t,n){if(e.junctionTable!==t.junctionTable)throw new Error(`manyToMany pair '${n}' has conflicting junctionTable values ('${e.junctionTable}' vs '${t.junctionTable}').`);if(e.leftField!==t.leftField)throw new Error(`manyToMany pair '${n}' has conflicting left field values ('${e.leftField}' vs '${t.leftField}').`);if(e.rightField!==t.rightField)throw new Error(`manyToMany pair '${n}' has conflicting right field values ('${e.rightField}' vs '${t.rightField}').`);if(e.leftSqlName!==t.leftSqlName)throw new Error(`manyToMany pair '${n}' has conflicting left sql name values ('${e.leftSqlName}' vs '${t.leftSqlName}').`);if(e.rightSqlName!==t.rightSqlName)throw new Error(`manyToMany pair '${n}' has conflicting right sql name values ('${e.rightSqlName}' vs '${t.rightSqlName}').`);if(e.onDelete!==t.onDelete)throw new Error(`manyToMany pair '${n}' has conflicting onDelete values ('${e.onDelete}' vs '${t.onDelete}').`);if(e.onUpdate!==t.onUpdate)throw new Error(`manyToMany pair '${n}' has conflicting onUpdate values ('${e.onUpdate}' vs '${t.onUpdate}').`);return e}function Wr(e){let t=new Map;for(let[n,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=Dr(n,o,a.targetTable,i),c=bn(s.leftTable,s.rightTable,"source"),u=bn(s.rightTable,s.leftTable,"target"),l={leftTable:s.leftTable,leftReferenceField:s.leftReferenceField,rightTable:s.rightTable,rightReferenceField:s.rightReferenceField,junctionTable:a.junctionTable??Vr(s.leftTable,s.rightTable),leftField:s.sourceIsLeft?a.sourceField??c:a.targetField??c,rightField:s.sourceIsLeft?a.targetField??u:a.sourceField??u,leftSqlName:s.sourceIsLeft?a.sourceSqlName:a.targetSqlName,rightSqlName:s.sourceIsLeft?a.targetSqlName:a.sourceSqlName,onDelete:a.onDelete,onUpdate:a.onUpdate};if(l.leftField===l.rightField)throw new Error(`manyToMany pair '${s.key}' resolves to duplicate junction fields '${l.leftField}'. Set sourceField/targetField explicitly.`);let p=t.get(s.key);p?Br(p,l,s.key):t.set(s.key,l),a.referenceField=o,a.targetReferenceField=i,a.junctionTable=l.junctionTable,a.sourceField=s.sourceIsLeft?l.leftField:l.rightField,a.targetField=s.sourceIsLeft?l.rightField:l.leftField,a.sourceSqlName=s.sourceIsLeft?l.leftSqlName:l.rightSqlName,a.targetSqlName=s.sourceIsLeft?l.rightSqlName:l.leftSqlName;}for(let n of t.values()){if(n.junctionTable in e.tables)throw new Error(`manyToMany auto junction table '${n.junctionTable}' conflicts with an existing table. Set a different junctionTable name.`);let r=L(e,n.leftTable,n.leftReferenceField)??"string",a=L(e,n.rightTable,n.rightReferenceField)??"string";e.tables[n.junctionTable]={kind:"table",columns:{[n.leftField]:{kind:"column",type:r,sqlName:n.leftSqlName,notNull:true,nullable:false,references:{table:n.leftTable,column:n.leftReferenceField,onDelete:n.onDelete,onUpdate:n.onUpdate},index:true},[n.rightField]:{kind:"column",type:a,sqlName:n.rightSqlName,notNull:true,nullable:false,references:{table:n.rightTable,column:n.rightReferenceField,onDelete:n.onDelete,onUpdate:n.onUpdate},index:true}},relations:{[n.leftTable]:{kind:"relation",relation:"one",targetTable:n.leftTable,field:n.leftField,referenceField:n.leftReferenceField},[n.rightTable]:{kind:"relation",relation:"one",targetTable:n.rightTable,field:n.rightField,referenceField:n.rightReferenceField}}};}}function Hr(e){for(let[t,n]of Object.entries(e.tables)){for(let[r,a]of Object.entries(n.columns))if(a.notNull===true&&a.nullable===true)throw new Error(`Invalid nullable configuration on '${t}.${r}': cannot set both notNull and nullable to true.`);for(let[r,a]of Object.entries(n.relations))if(a.relation!=="manyToMany"&&a.notNull===true&&a.nullable===true)throw new Error(`Invalid nullable configuration on '${t}.${r}': cannot set both notNull and nullable to true.`)}}function Lr(e){Hr(e);let t=Pr(e);for(let[n,r]of Object.entries(t.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 c=L(t,o.targetTable,i)??o.fkType??"string";gn(n,r,s,o.targetTable,i,{fkType:o.fkType,sqlName:o.sqlName,notNull:hn(`${n}.${a}`,o,true),onDelete:o.onDelete,onUpdate:o.onUpdate},c);}for(let[n,r]of Object.entries(t.tables))for(let a of Object.values(r.relations)){if(a.relation!=="many")continue;let o=t.tables[a.targetTable];if(!o)continue;let i=a.referenceField??"id",s=a.field??`${ue(n)}Id`;a.field=s;let c=L(t,n,i)??a.fkType??"string";gn(a.targetTable,o,s,n,i,{fkType:a.fkType,sqlName:a.sqlName,notNull:hn(`${n}.${a.targetTable}`,a,true),onDelete:a.onDelete,onUpdate:a.onUpdate},c);}return Wr(t),t}function xn(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 zr(e,t,n){let r=t.sqlName??I(e),a=r!==e;if(t.type==="int")return a?`t.int(${g(r)})`:"t.int()";if(t.type==="string")return t.length!==void 0?a?`t.text(${g(r)}, { length: ${t.length} })`:`t.text({ length: ${t.length} })`:a?`t.text(${g(r)})`:"t.text()";if(t.type==="boolean")return a?`t.int(${g(r)}, { mode: "boolean" })`:'t.int({ mode: "boolean" })';if(t.type==="date")return a?`t.int(${g(r)}, { mode: "timestamp_ms" })`:'t.int({ mode: "timestamp_ms" })';if(t.type==="enum"&&t.enumValues&&t.enumValues.length>0)return t.isArray?a?`t.text(${g(r)}).array()`:"t.text().array()":a?`t.text(${g(r)})`:"t.text()";if(t.type==="json"&&t.jsonShape){let o=z(t.jsonShape);return `${a?`t.text(${g(r)}, { mode: "json" })`:'t.text({ mode: "json" })'}.$type<${o}>()`}return n==="camelToSnake"&&a?`t.text(${g(r)})`:"t.text()"}function _r(e,t,n){let r=n.field,a=n.referenceField??"id";if(!r)throw new Error(`Relation on '${e}' targeting '${n.targetTable}' is missing a local field.`);if(!(r in t.columns))throw new Error(`Relation '${e}.${r}' references missing local field '${r}'.`);return {sourceField:r,targetField:a}}function Ur(e){return e.size===0?"":`import { ${Array.from(e).sort().join(", ")} } from "./auth.schema";
|
|
9905
|
+
`}function Qr(e){return Object.values(e.relations).filter(t=>t.relation==="one").map(t=>t.targetTable)}function Kr(e,t,n){if(t.references)return {tableName:t.references.table,fieldName:t.references.column};let r=Object.values(n.relations).find(a=>a.relation==="one"&&a.field===e);if(r)return {tableName:r.targetTable,fieldName:r.referenceField??"id"}}function Jr(e){let t=[];for(let[n,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=ce(i.jsonShape);a.push(`${g(o)}: { shape: ${s} },`);}a.length!==0&&t.push(`${g(n)}: {
|
|
9846
9906
|
${a.map(o=>` ${o}`).join(`
|
|
9847
9907
|
`)}
|
|
9848
9908
|
},`);}return t.length===0?`export const __appflareJsonColumns = {} as const;
|
|
@@ -9891,7 +9951,7 @@ ${a.map(o=>` ${o}`).join(`
|
|
|
9891
9951
|
${t.map(n=>` ${n}`).join(`
|
|
9892
9952
|
`)}
|
|
9893
9953
|
} as const;
|
|
9894
|
-
`}function Xr(e,t){let n=new Set(Object.keys(e.tables)),r=new Set;for(let l of Object.values(e.tables)){for(let p of Qr(l))n.has(p)||r.add(p);for(let p of Object.values(l.columns))p.references&&!n.has(p.references.table)&&r.add(p.references.table);}let a=new Map;for(let[l,p]of Object.entries(e.tables))for(let[d,y]of Object.entries(p.columns))if(y.type==="enum"&&y.enumValues&&y.enumValues.length>0){let x=y.enumRef??`${l}_${d}`;a.has(x)||a.set(x,{column:y,tableName:l,fieldName:d});}let o=[],i=[];for(let[l,p]of a.entries()){let d=q(l),y=p.column.enumValues.map(x=>`"${x}"`).join(" | ");o.push(`export type ${d} = ${y};`),i.push(`export const ${d}Column = t.customType<{ data: ${d}; dataNotNull: ${d} }>({ dataType: () => "text" });`);}let s=[],c=[],u=[];for(let[l,p]of Object.entries(e.tables)){let d=p.sqlName??I(l),y=[],x=[];u.push(` ${l},`);for(let[b,h]of Object.entries(p.columns)){let v;if(h.type==="enum"&&h.enumValues&&h.enumValues.length>0){let k=h.enumRef??`${l}_${b}`,V=q(k),B=h.sqlName??I(b);v=B!==b?`${V}Column(${g(B)})`:`${V}Column()`,h.isArray&&(v+=".array()");}else v=zr(b,h,t);h.uuidPrimaryKey&&(v+=".$defaultFn(() => crypto.randomUUID())"),h.primaryKey&&(v+=h.autoIncrement?".primaryKey({ autoIncrement: true })":".primaryKey()"),h.notNull&&(v+=".notNull()"),h.sqlDefault!==void 0&&(v+=`.default(${
|
|
9954
|
+
`}function Xr(e,t){let n=new Set(Object.keys(e.tables)),r=new Set;for(let l of Object.values(e.tables)){for(let p of Qr(l))n.has(p)||r.add(p);for(let p of Object.values(l.columns))p.references&&!n.has(p.references.table)&&r.add(p.references.table);}let a=new Map;for(let[l,p]of Object.entries(e.tables))for(let[d,y]of Object.entries(p.columns))if(y.type==="enum"&&y.enumValues&&y.enumValues.length>0){let x=y.enumRef??`${l}_${d}`;a.has(x)||a.set(x,{column:y,tableName:l,fieldName:d});}let o=[],i=[];for(let[l,p]of a.entries()){let d=q(l),y=p.column.enumValues.map(x=>`"${x}"`).join(" | ");o.push(`export type ${d} = ${y};`),i.push(`export const ${d}Column = t.customType<{ data: ${d}; dataNotNull: ${d} }>({ dataType: () => "text" });`);}let s=[],c=[],u=[];for(let[l,p]of Object.entries(e.tables)){let d=p.sqlName??I(l),y=[],x=[];u.push(` ${l},`);for(let[b,h]of Object.entries(p.columns)){let v;if(h.type==="enum"&&h.enumValues&&h.enumValues.length>0){let k=h.enumRef??`${l}_${b}`,V=q(k),B=h.sqlName??I(b);v=B!==b?`${V}Column(${g(B)})`:`${V}Column()`,h.isArray&&(v+=".array()");}else v=zr(b,h,t);h.uuidPrimaryKey&&(v+=".$defaultFn(() => crypto.randomUUID())"),h.primaryKey&&(v+=h.autoIncrement?".primaryKey({ autoIncrement: true })":".primaryKey()"),h.notNull&&(v+=".notNull()"),h.sqlDefault!==void 0&&(v+=`.default(${Or(h.sqlDefault)})`);let A=Kr(b,h,p);if(A)if(h.references?.onDelete||h.references?.onUpdate){let k=[];h.references.onDelete&&k.push(`onDelete: ${g(h.references.onDelete)}`),h.references.onUpdate&&k.push(`onUpdate: ${g(h.references.onUpdate)}`),v+=`.references((): AnySQLiteColumn => ${A.tableName}.${A.fieldName}, { ${k.join(", ")} })`;}else v+=`.references((): AnySQLiteColumn => ${A.tableName}.${A.fieldName})`;if(h.unique){let k=typeof h.unique=="object"&&h.unique.name?h.unique.name:`${d}_${I(b)}_unique_idx`;x.push(` t.uniqueIndex(${g(k)}).on(table.${b})`);}if(h.index){let k=typeof h.index=="object"&&h.index.name?h.index.name:`${d}_${I(b)}_idx`;x.push(` t.index(${g(k)}).on(table.${b})`);}y.push(` ${b}: ${v},`);}x.length>0?s.push(`export const ${l} = table(
|
|
9895
9955
|
${g(d)},
|
|
9896
9956
|
{
|
|
9897
9957
|
${y.join(`
|
|
@@ -9904,7 +9964,7 @@ ${x.join(`,
|
|
|
9904
9964
|
);`):s.push(`export const ${l} = table(${g(d)}, {
|
|
9905
9965
|
${y.join(`
|
|
9906
9966
|
`)}
|
|
9907
|
-
});`);let N=Object.entries(p.relations).filter(([,b])=>b.relation==="one"),w=Object.entries(p.relations).filter(([,b])=>b.relation==="many"),D=Object.entries(p.relations).filter(([,b])=>b.relation==="manyToMany");if(N.length===0&&w.length===0&&D.length===0)continue;let E=[];for(let[b,h]of N){let v=
|
|
9967
|
+
});`);let N=Object.entries(p.relations).filter(([,b])=>b.relation==="one"),w=Object.entries(p.relations).filter(([,b])=>b.relation==="many"),D=Object.entries(p.relations).filter(([,b])=>b.relation==="manyToMany");if(N.length===0&&w.length===0&&D.length===0)continue;let E=[];for(let[b,h]of N){let v=_r(l,p,h);E.push(` ${b}: one(${h.targetTable}, {
|
|
9908
9968
|
fields: [${l}.${v.sourceField}],
|
|
9909
9969
|
references: [${h.targetTable}.${v.targetField}],
|
|
9910
9970
|
}),`);}for(let[b,h]of w)E.push(` ${b}: many(${h.targetTable}),`);for(let[b,h]of D){if(!h.junctionTable)throw new Error(`manyToMany relation '${l}.${b}' is missing junctionTable after normalization.`);E.push(` ${b}: many(${h.junctionTable}),`);}c.push(`export const ${l}Relations = relations(${l}, ({ one, many }) => ({
|
|
@@ -9913,7 +9973,7 @@ ${E.join(`
|
|
|
9913
9973
|
}));`),u.push(` ${l}Relations,`);}return `import * as t from "drizzle-orm/sqlite-core";
|
|
9914
9974
|
import { sqliteTable as table, type AnySQLiteColumn } from "drizzle-orm/sqlite-core";
|
|
9915
9975
|
import { relations } from "drizzle-orm";
|
|
9916
|
-
${
|
|
9976
|
+
${Ur(r)}
|
|
9917
9977
|
${o.join(`
|
|
9918
9978
|
`)}
|
|
9919
9979
|
${i.join(`
|
|
@@ -9932,12 +9992,12 @@ ${u.join(`
|
|
|
9932
9992
|
`)}
|
|
9933
9993
|
} as const;
|
|
9934
9994
|
|
|
9935
|
-
${
|
|
9995
|
+
${Jr(e)}
|
|
9936
9996
|
|
|
9937
9997
|
${Gr(e)}
|
|
9938
9998
|
|
|
9939
9999
|
${Zr(e)}
|
|
9940
|
-
`}function de(e){return e.kind==="array"?`z.array(${de(e.element)})`:e.kind==="object"?`z.object({ ${Object.entries(e.shape).map(([n,r])=>`${g(n)}: ${de(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 wn(e,t,n){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=de(e.jsonShape));return t&&(r+=".optional()"),n&&(r+=".nullable()"),r}function Yr(e){let t=[];for(let[n,r]of Object.entries(e.tables)){let a=q(n),o=[],i=[];for(let[s,c]of Object.entries(r.columns))o.push(` ${s}: ${wn(c,xn(c),
|
|
10000
|
+
`}function de(e){return e.kind==="array"?`z.array(${de(e.element)})`:e.kind==="object"?`z.object({ ${Object.entries(e.shape).map(([n,r])=>`${g(n)}: ${de(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 wn(e,t,n){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=de(e.jsonShape));return t&&(r+=".optional()"),n&&(r+=".nullable()"),r}function Yr(e){let t=[];for(let[n,r]of Object.entries(e.tables)){let a=q(n),o=[],i=[];for(let[s,c]of Object.entries(r.columns))o.push(` ${s}: ${wn(c,xn(c),O(c))},`),i.push(` ${s}: ${wn(c,O(c),O(c))},`);t.push(`export const ${n}InsertSchema = z.object({
|
|
9941
10001
|
${o.join(`
|
|
9942
10002
|
`)}
|
|
9943
10003
|
});
|
|
@@ -9951,7 +10011,7 @@ export type ${a}Select = z.infer<typeof ${n}SelectSchema>;
|
|
|
9951
10011
|
`);}return `import { z } from "zod";
|
|
9952
10012
|
|
|
9953
10013
|
${t.join(`
|
|
9954
|
-
`)}`}function z(e){return e.kind==="array"?`Array<${z(e.element)}>`:e.kind==="object"?`{ ${Object.entries(e.shape).map(([n,r])=>`${n}: ${z(r)}`).join("; ")} }`:e.kind==="string"?"string":e.kind==="number"?"number":e.kind==="boolean"?"boolean":e.kind==="date"?"Date":"unknown"}function ea(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 t=e.enumValues.map(n=>`"${n}"`).join(" | ");return e.isArray?`Array<${t}>`:t}return e.type==="json"&&e.jsonShape?z(e.jsonShape):"unknown"}function ta(e){let t=[];for(let[r,a]of Object.entries(e.enums??{})){let o=q(r),i=a.values.map(s=>`"${s}"`).join(" | ");t.push(`export type ${o} = ${i};`);}let n=[];for(let[r,a]of Object.entries(e.tables)){let o=q(r),i=[],s=[];for(let[c,u]of Object.entries(a.columns)){let l=ea(u),p=
|
|
10014
|
+
`)}`}function z(e){return e.kind==="array"?`Array<${z(e.element)}>`:e.kind==="object"?`{ ${Object.entries(e.shape).map(([n,r])=>`${n}: ${z(r)}`).join("; ")} }`:e.kind==="string"?"string":e.kind==="number"?"number":e.kind==="boolean"?"boolean":e.kind==="date"?"Date":"unknown"}function ea(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 t=e.enumValues.map(n=>`"${n}"`).join(" | ");return e.isArray?`Array<${t}>`:t}return e.type==="json"&&e.jsonShape?z(e.jsonShape):"unknown"}function ta(e){let t=[];for(let[r,a]of Object.entries(e.enums??{})){let o=q(r),i=a.values.map(s=>`"${s}"`).join(" | ");t.push(`export type ${o} = ${i};`);}let n=[];for(let[r,a]of Object.entries(e.tables)){let o=q(r),i=[],s=[];for(let[c,u]of Object.entries(a.columns)){let l=ea(u),p=O(u)?" | null":"";i.push(` ${c}${O(u)?"?":""}: ${l}${p};`),s.push(` ${c}${xn(u)?"?":""}: ${l}${p};`);}n.push(`export type ${o} = {
|
|
9955
10015
|
${i.join(`
|
|
9956
10016
|
`)}
|
|
9957
10017
|
};
|
|
@@ -9967,10 +10027,10 @@ ${n.join(`
|
|
|
9967
10027
|
`}function na(e,t){if(t){let n=e[t];if(!ie(n))throw new Error(`schemaDsl.exportName '${t}' does not point to a schema() export.`);return n}for(let n of Object.values(e))if(ie(n))return n;throw new Error("No schema() export found in schemaDsl entry module. Set schemaDsl.exportName to the correct export.")}async function Tn(e){let t=e.config.schemaDsl;if(!t)return;let n=t.namingStrategy??"camelToSnake",r=resolve(e.configDir,t.entry),a=resolve(e.configDir,t.outFile??resolve(e.outDirAbs,"schema.compiled.ts")),o=resolve(e.configDir,t.typesOutFile??resolve(e.outDirAbs,"schema.types.ts")),i=resolve(e.configDir,t.zodOutFile??resolve(e.outDirAbs,"schema.zod.ts")),c=await import(`${pathToFileURL(r).href}?t=${Date.now()}`),u=na(c,t.exportName),l=Lr(u);await Promise.all([mkdir(dirname(a),{recursive:true}),mkdir(dirname(o),{recursive:true}),mkdir(dirname(i),{recursive:true})]);let p=Xr(l,n),d=ta(l),y=Yr(l);return await Promise.all([Bun.write(a,p),Bun.write(o,d),Bun.write(i,y)]),{schemaPath:a,typesPath:o,zodPath:i,tableNames:Object.keys(l.tables)}}function aa(e){return e.replaceAll("\\","/")}function M(e,t){let n=aa(relative(e,t)).replace(/\.tsx?$/,"");return n.startsWith(".")?n:`./${n}`}var la=new Set([".ts",".tsx",".mts",".cts"]);async function Sn(e){let t=await readdir(e,{withFileTypes:true}),n=[];for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="_generated")continue;let a=resolve(e,r.name);if(r.isDirectory()){n.push(...await Sn(a));continue}r.isFile()&&la.has(extname(r.name))&&n.push(a);}return n}function me(e){return e.replace(/\.[cm]?tsx?$/,"")}function pe(e,t){let n=e,r=false,a,o="unknown",i,s,c;for(;f.isCallExpression(n);){let u=n.expression;if(!f.isPropertyAccessExpression(u))break;let l=u.name.text;if(l==="optional"||l==="nullable")r=true,n=u.expression;else if(l==="default"){r=true;let p=n.arguments[0];p&&(f.isStringLiteral(p)||f.isNumericLiteral(p)?a=p.text:p.kind===f.SyntaxKind.TrueKeyword?a="true":p.kind===f.SyntaxKind.FalseKeyword&&(a="false")),n=u.expression;}else if(l==="string"||l==="uuid"||l==="email"||l==="url"){o="string";break}else if(l==="number"||l==="int"||l==="float"){o="number";break}else if(l==="boolean"){o="boolean";break}else if(l==="date"){o="date";break}else if(l==="object"){o="object";let p=n.arguments[0];if(p&&f.isObjectLiteralExpression(p)){i=[];for(let d of p.properties)f.isPropertyAssignment(d)&&f.isIdentifier(d.name)&&i.push(pe(d.initializer,d.name.text));}break}else if(l==="array"){o="array";let p=n.arguments[0];if(p){let d=pe(p,"");s=d.type==="array"?"unknown":d.type,d.type==="object"&&(c=d.fields);}break}else n=u.expression;}return {name:t,type:o,optional:r,defaultValue:a,fields:i,itemType:s,itemFields:c}}function ua(e){if(!e||!f.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>f.isPropertyAssignment(r)&&f.isIdentifier(r.name)&&r.name.text==="args");if(!t||!f.isObjectLiteralExpression(t.initializer))return [];let n=[];for(let r of t.initializer.properties)!f.isPropertyAssignment(r)||!f.isIdentifier(r.name)||n.push(pe(r.initializer,r.name.text));return n}function ca(e){return f.isVariableStatement(e)?e.modifiers?.some(t=>t.kind===f.SyntaxKind.ExportKeyword)??false:false}function An(e){return f.isIdentifier(e)?e.text:f.isParenthesizedExpression(e)?An(e.expression):null}function da(e){if(!e||!f.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>!f.isPropertyAssignment(r)||!f.isIdentifier(r.name)?false:r.name.text==="cronTrigger");if(!t||!f.isPropertyAssignment(t))return [];let n=t.initializer;return f.isStringLiteral(n)||f.isNoSubstitutionTemplateLiteral(n)?[n.text.trim()].filter(r=>r.length>0):f.isArrayLiteralExpression(n)?n.elements.map(r=>f.isStringLiteral(r)||f.isNoSubstitutionTemplateLiteral(r)?r.text.trim():"").filter(r=>r.length>0):[]}function pa(e,t){let n=f.createSourceFile(t,e,f.ScriptTarget.Latest,true,f.ScriptKind.TS),r=[];for(let a of n.statements)if(ca(a))for(let o of a.declarationList.declarations){if(!f.isIdentifier(o.name)||!o.initializer||!f.isCallExpression(o.initializer))continue;let i=An(o.initializer.expression);i!=="query"&&i!=="mutation"&&i!=="scheduler"&&i!=="cron"&&i!=="storageManager"||r.push({exportName:o.name.text,kind:i==="storageManager"?"storage":i,cronTriggers:i==="cron"?da(o.initializer.arguments[0]):[],args:i==="query"||i==="mutation"?ua(o.initializer.arguments[0]):[]});}return r}function vn(e,t,n){let r=t.replace(/\\/g,"/"),o=me(r).split("/").filter(Boolean);return `/${[e,...o,n].filter(Boolean).map(s=>s.trim()).filter(s=>s.length>0).join("/")}`}function ma(e,t){let n=e.replace(/\\/g,"/"),r=`${t}/`,a=n.indexOf(r);return a>=0?n.slice(a+r.length):n===t?"index.ts":n}function Rn(e,t){let n=e.replace(/\\/g,"/"),a=me(n).split("/").filter(Boolean),o=a[a.length-1]??"index";return [a.length>1?a[a.length-2]:"root",o,t].map(s=>s.trim()).filter(s=>s.length>0).join("/")}async function Nn(e){let t=[],n=await Sn(e.scanDirAbs).catch(()=>[]);for(let a of n){let o=Bun.file(a);if(!await o.exists())continue;let i=await o.text(),s=relative(e.scanDirAbs,a),c=pa(i,a),u=[{kind:"query",kindDirectory:"queries",exports:c.filter(l=>l.kind==="query")},{kind:"mutation",kindDirectory:"mutations",exports:c.filter(l=>l.kind==="mutation")},{kind:"scheduler",kindDirectory:"schedulers",exports:c.filter(l=>l.kind==="scheduler")},{kind:"cron",kindDirectory:"crons",exports:c.filter(l=>l.kind==="cron")},{kind:"storage",kindDirectory:"queries",exports:c.filter(l=>l.kind==="storage")}];for(let l of u){if(l.exports.length===0)continue;let p=ma(s,l.kindDirectory);for(let d of l.exports){let y=l.kind==="query"||l.kind==="mutation"?Rn(p,d.exportName):void 0,x=l.kind==="scheduler"||l.kind==="cron"?Rn(p,d.exportName):void 0,N=l.kind==="query"||l.kind==="mutation"?[...me(p).split("/").filter(Boolean),d.exportName]:void 0,w=l.kind==="query"?vn("queries",p,d.exportName):l.kind==="mutation"?vn("mutations",p,d.exportName):l.kind==="storage"?`/storage/managers/${d.exportName}`:`/${l.kindDirectory}/${x}`;t.push({kind:l.kind,exportName:d.exportName,filePath:a,importPath:M(e.outDirAbs,a),clientImportPath:M(resolve(e.outDirAbs,"client"),a),routePath:w,handlerName:y,clientSegments:N,taskName:x,cronTriggers:d.cronTriggers,args:d.args});}}}t.sort((a,o)=>a.routePath.localeCompare(o.routePath));let r=new Map;for(let a of t){let o=a.taskName?`task:${a.taskName}`:`route:${a.routePath}`,i=r.get(o);if(i)throw new Error(`Duplicate handler operation discovered: ${a.taskName??a.routePath} (${i} and ${a.filePath}#${a.exportName}).`);r.set(o,`${a.filePath}#${a.exportName}`);}return t}function ga(e){let t=[],n="",r=0,a=0,o=0,i=false,s=false,c=false,u=false;for(let p=0;p<e.length;p+=1){let d=e[p];if(u){n+=d,u=false;continue}if(d==="\\"){n+=d,u=true;continue}if(!s&&!c&&d==="'"){i=!i,n+=d;continue}if(!i&&!c&&d==='"'){s=!s,n+=d;continue}if(!i&&!s&&d==="`"){c=!c,n+=d;continue}if(i||s||c){n+=d;continue}if(d==="("?r+=1:d===")"?r-=1:d==="{"?a+=1:d==="}"?a-=1:d==="["?o+=1:d==="]"&&(o-=1),d===","&&r===0&&a===0&&o===0){let y=n.trim();y.length>0&&t.push(y),n="";continue}n+=d;}let l=n.trim();return l.length>0&&t.push(l),t}function ha(e){let t=0,n=0,r=0,a=false,o=false,i=false,s=false;for(let c=0;c<e.length;c+=1){let u=e[c];if(s){s=false;continue}if(u==="\\"){s=true;continue}if(!o&&!i&&u==="'"){a=!a;continue}if(!a&&!i&&u==='"'){o=!o;continue}if(!a&&!o&&u==="`"){i=!i;continue}if(!(a||o||i)){if(u==="("){t+=1;continue}if(u===")"){t-=1;continue}if(u==="{"){n+=1;continue}if(u==="}"){n-=1;continue}if(u==="["){r+=1;continue}if(u==="]"){r-=1;continue}if(u===":"&&t===0&&n===0&&r===0)return c}}return -1}function ya(e){let t=e.toLowerCase();return /mode\s*:\s*["'`](timestamp|timestamp_ms)["'`]/.test(t)?"date":/mode\s*:\s*["'`]boolean["'`]/.test(t)?"boolean":/\.(date|datetime|timestamp)\s*\(/.test(t)?"date":/\.(int|integer|real|numeric|decimal|float|double)\s*\(/.test(t)?"number":/mode\s*:\s*["'`]json["'`]/.test(t)||/\.json\s*\(/.test(t)?"json":/\.(text|varchar|char)\s*\(/.test(t)?"string":/\.(boolean|bool)\s*\(/.test(t)?"boolean":"unknown"}function ba(e){let t=ga(e),n=[];for(let r of t){let a=ha(r);if(a===-1)continue;let o=r.slice(0,a).trim().replace(/^['"]|['"]$/g,"");if(!o)continue;let i=r.slice(a+1).trim(),s=/\.primarykey\s*\(/i.test(i),c=/autoincrement\s*:\s*true/i.test(i),u=/\.default\s*\(/i.test(i),p=!/\.notnull\s*\(/i.test(i)||u||c||s;n.push({name:o,expression:i,type:ya(i),optional:p,primaryKey:s,autoIncrement:c});}return n}function wa(e){let t=/export\s+const\s+(\w+)\s*=\s*table\s*\(\s*["'`]([^"'`]+)["'`]/g,n=[],r=(o,i)=>{let s=0,c=false,u=false,l=false,p=false;for(let d=i;d<o.length;d+=1){let y=o[d];if(p){p=false;continue}if(y==="\\"){p=true;continue}if(!u&&!l&&y==="'"){c=!c;continue}if(!c&&!l&&y==='"'){u=!u;continue}if(!c&&!u&&y==="`"){l=!l;continue}if(!(c||u||l)){if(y==="{"){s+=1;continue}if(y==="}"&&(s-=1,s===0))return d}}return -1},a=t.exec(e);for(;a;){let o=a[1],i=a[2],s=e.indexOf("{",t.lastIndex);if(s===-1){a=t.exec(e);continue}let c=r(e,s);if(c===-1){a=t.exec(e);continue}let u=e.slice(s+1,c);n.push({exportName:o,tableName:i,columns:ba(u)}),a=t.exec(e);}return n}async function Cn(e){let t=await readdir(e,{withFileTypes:true}),n=[];for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="_generated")continue;let a=resolve(e,r.name);if(r.isDirectory()){n.push(...await Cn(a));continue}r.isFile()&&r.name==="schema.ts"&&n.push(a);}return n}async function Fn(e,t=[]){let n=await Cn(e.scanDirAbs).catch(()=>[]),r=resolve(e.configDir,"schema.ts"),a=[...t,...n.length?n:[r]];for(let o of a){let i=Bun.file(o);if(!await i.exists())continue;let s=await i.text(),c=wa(s);if(c.length>0)return {schemaPath:o,tables:c}}throw new Error(`Unable to discover schema.ts under scanDir (${e.scanDirAbs}) or fallback (${r}).`)}function va(e){let t=e.auth.options.plugins;if(!Array.isArray(t))return [];for(let n of t)if(n&&typeof n=="object"){let r=n;if(r.id==="admin"&&"options"in r){let a=r.options;if(a&&typeof a=="object"&&"roles"in a){let o=a.roles;if(o&&typeof o=="object")return Object.keys(o)}}}return []}function Ra(e){let r=e.auth.options?.user?.additionalFields;if(!r||typeof r!="object")return [];let a={string:"string",number:"number",boolean:"boolean",date:"Date"};return Object.entries(r).filter(([,o])=>o&&typeof o=="object"&&"type"in o).map(([o,i])=>({name:o,tsType:a[i.type]||"unknown"}))}async function ka(e,t){let n=await Bun.file(e).text(),r=t.map(o=>`"${o}"`).join(" | "),a=n.replace(/(import.*?from\s+["']drizzle-orm\/sqlite-core["'])/,`$1
|
|
9968
10028
|
import { customType } from "drizzle-orm/sqlite-core"`).replace(/role:\s*text\(["']role["']\)/,`role: customType<{ data: ${r}; dataNotNull: ${r} }>({ dataType: () => "text" })("role")`);await Bun.write(e,a);}function Sa(e,t){let n=relative(e,t).replace(/\\/g,"/");return n.startsWith(".")?n:`./${n}`}async function En(e){let{outDirAbs:t,wranglerOutDirAbs:n,config:r,configPath:a,configDir:o}=e,i=M(t,a),s=resolve(t,"client"),c=M(s,a),u=performance.now();await Promise.all([mkdir(t,{recursive:true}),mkdir(s,{recursive:true}),mkdir(n,{recursive:true})]),process.stdout.write(`\u{1F4C1} Directories (${(performance.now()-u).toFixed(0)}ms)
|
|
9969
10029
|
`);let l=dirname(fileURLToPath(import.meta.url)),p=join(dirname(Bun.resolveSync("typescript/package.json",l)),"bin","tsc"),d=join(dirname(Bun.resolveSync("@better-auth/cli/package.json",l)),"dist","index.mjs"),y=resolve(t,"server.ts"),x=resolve(t,"client.ts"),N=resolve(t,"auth.config.ts"),w=resolve(t,"auth.schema.ts"),D=resolve(t,"drizzle.config.ts"),E=resolve(n,"wrangler.json"),b=await Tn(e),h=await Fn(e,b?[b.schemaPath]:[]),v=M(t,h.schemaPath),A=await Nn(e);process.stdout.write(`\u{1F50D} ${A.length} handler(s) (${(performance.now()-u).toFixed(0)}ms)
|
|
9970
|
-
`);let k=va(r),V=Ra(r),B=kt(r.auth.basePath,r.database[0].binding,r.kv[0]?.binding,r.scheduler.binding,r.r2[0]?.binding,r.realtime.binding,r.realtime.objectName,r.realtime.subscribePath,r.realtime.websocketPath,r.realtime.protocol),ye=Ce(c,A),Ln=X(v,A,r.r2[0]?.binding,k,V),zn=ve(i),
|
|
9971
|
-
`),...Zn,...Gn,Bun.write(N,zn),Bun.write(w,""),Bun.write(D,
|
|
9972
|
-
`),Bun.write(Kn
|
|
9973
|
-
`);let
|
|
10030
|
+
`);let k=va(r),V=Ra(r),B=kt(r.auth.basePath,r.database[0].binding,r.kv[0]?.binding,r.scheduler.binding,r.r2[0]?.binding,r.realtime.binding,r.realtime.objectName,r.realtime.subscribePath,r.realtime.websocketPath,r.realtime.protocol),ye=Ce(c,A),Ln=X(v,A,r.r2[0]?.binding,k,V),zn=ve(i),_n=b?[Sa(o,b.schemaPath),...r.schema.filter(T=>!/(^|\/)schema\.ts$/.test(T))]:r.schema,Un=Fe(_n),Qn=At(e,A),Kn=fn(v,h,A),Jn=resolve(t,"admin.routes.ts"),Gn=Ln.map(T=>Bun.write(resolve(t,T.relativePath),T.source)),Zn=ye.map(T=>Bun.write(resolve(t,T.relativePath),T.source));await Promise.all([Bun.write(y,B),Bun.write(x,`export * from "./client/index";
|
|
10031
|
+
`),...Zn,...Gn,Bun.write(N,zn),Bun.write(w,""),Bun.write(D,Un),Bun.write(E,`${JSON.stringify(Qn,null,2)}
|
|
10032
|
+
`),Bun.write(Jn,Kn)]),process.stdout.write(`\u{1F4DD} Source artifacts (${(performance.now()-u).toFixed(0)}ms)
|
|
10033
|
+
`);let K=relative(o,N).replace(/\\/g,"/"),Xn=K.startsWith(".")?K:`./${K}`,J=relative(o,w).replace(/\\/g,"/"),Yn=J.startsWith(".")?J:`./${J}`,be=await Bun.spawn([process.execPath,d,"generate","--config",Xn,"--output",Yn,"--yes"],{cwd:o,stdout:"inherit",stderr:"inherit"}).exited;if(be!==0)throw new Error(`better-auth generation failed with exit code ${be}`);process.stdout.write(`\u{1F510} Auth schema (${(performance.now()-u).toFixed(0)}ms)
|
|
9974
10034
|
`),k.length>0&&(await ka(w,k),process.stdout.write(`\u{1F527} Patched role type (${(performance.now()-u).toFixed(0)}ms)
|
|
9975
10035
|
`));function er(T={}){return {compilerOptions:{lib:["es2024"],types:["@types/node","@cloudflare/workers-types/2023-07-01"],module:"es2022",target:"es2024",moduleResolution:"bundler",strictNullChecks:true,skipLibCheck:true,declaration:true,emitDeclarationOnly:true,noCheck:true,jsx:"react-jsx",paths:{"_generated/*":["./*"]},...T},include:["./*.ts","./client/*.ts"]}}let we=resolve(t,"tsconfig.js.json");await Promise.all([Bun.write(we,`${JSON.stringify(er({declaration:true,emitDeclarationOnly:false}),null,2)}
|
|
9976
10036
|
`)]),process.stdout.write(`\u{1F4C4} TS configs (${(performance.now()-u).toFixed(0)}ms)
|
|
@@ -9980,9 +10040,9 @@ import { customType } from "drizzle-orm/sqlite-core"`).replace(/role:\s*text\(["
|
|
|
9980
10040
|
`);let nr=t+"/";async function Te(T){let C=await readdir(T,{withFileTypes:true});for(let R of C){let $=join(T,R.name);if(R.isDirectory()){if(R.name==="node_modules"||R.name.startsWith(".")||$===t)continue;await Te($);}else !$.startsWith(nr)&&(R.name.endsWith(".d.ts")||R.name.endsWith(".js"))&&await rm($);}}await Te(o),process.stdout.write(`\u{1F9F9} Cleanup (${(performance.now()-u).toFixed(0)}ms)
|
|
9981
10041
|
`);let rr=resolve(o,"tsconfig.json");if(e.config.build&&existsSync(rr)){process.stdout.write(`\u2699\uFE0F Building project... (${(performance.now()-u).toFixed(0)}ms)
|
|
9982
10042
|
`);let C=await Bun.spawn([process.execPath,p,"--build"],{cwd:o,stdout:"inherit",stderr:"inherit"}).exited;if(C!==0)throw new Error(`TypeScript build failed with exit code ${C}`);process.stdout.write(`\u2705 Build complete (${(performance.now()-u).toFixed(0)}ms)
|
|
9983
|
-
`);}}var jn=z$1.object({binding:z$1.string().min(1),databaseName:z$1.string().min(1),databaseId:z$1.string().min(1),previewDatabaseId:z$1.string().min(1).optional(),migrationsDir:z$1.string().min(1).optional()}).strict(),In=z$1.object({binding:z$1.string().min(1),id:z$1.string().min(1),previewId:z$1.string().min(1).optional()}).strict(),
|
|
10043
|
+
`);}}var jn=z$1.object({binding:z$1.string().min(1),databaseName:z$1.string().min(1),databaseId:z$1.string().min(1),previewDatabaseId:z$1.string().min(1).optional(),migrationsDir:z$1.string().min(1).optional()}).strict(),In=z$1.object({binding:z$1.string().min(1),id:z$1.string().min(1),previewId:z$1.string().min(1).optional()}).strict(),On=z$1.object({binding:z$1.string().min(1),bucketName:z$1.string().min(1),previewBucketName:z$1.string().min(1).optional(),jurisdiction:z$1.string().min(1).optional()}).strict(),Pn=z$1.object({enabled:z$1.boolean().optional(),binding:z$1.string().min(1).optional(),queue:z$1.string().min(1).optional()}).strict(),Ca=z$1.object({enabled:z$1.boolean().optional(),binding:z$1.string().min(1).optional(),className:z$1.string().min(1).optional(),objectName:z$1.string().min(1).optional(),subscribePath:z$1.string().min(1).optional(),websocketPath:z$1.string().min(1).optional(),protocol:z$1.string().min(1).optional()}).strict(),Fa=z$1.object({scanDir:z$1.string().min(1),outDir:z$1.string().min(1),wranglerOutDir:z$1.string().min(1).optional(),wranglerOutPath:z$1.string().min(1).optional(),schema:z$1.array(z$1.string()).min(1),schemaDsl:z$1.object({entry:z$1.string().min(1),exportName:z$1.string().min(1).optional(),outFile:z$1.string().min(1).optional(),typesOutFile:z$1.string().min(1).optional(),zodOutFile:z$1.string().min(1).optional(),namingStrategy:z$1.literal("camelToSnake").optional()}).strict().optional(),database:z$1.union([jn,z$1.array(jn).min(1)]),kv:z$1.union([In,z$1.array(In)]).optional(),r2:z$1.union([On,z$1.array(On)]).optional(),auth:z$1.object({enabled:z$1.boolean(),basePath:z$1.string().min(1),options:z$1.custom(e=>typeof e=="object"&&e!==null),clientOptions:z$1.custom(e=>typeof e=="object"&&e!==null)}).strict(),scheduler:Pn.optional(),realtime:Ca.optional(),wranglerOverrides:z$1.record(z$1.string(),z$1.unknown()).optional(),build:z$1.boolean().optional()}).strict();function Dn(e){return typeof e=="object"&&e!==null}function qa(e){let t=Dn(e.wranglerOverrides)?e.wranglerOverrides.scheduler:void 0,n=Pn.safeParse(t);return n.success?n.data:{}}function Ma(e){if(!Dn(e)||!("scheduler"in e))return e;let{scheduler:t,...n}=e;return n}function Ea(e){let n={...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:n.enabled??true,binding:n.binding??"APPFLARE_SCHEDULER_QUEUE",queue:n.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:Ma(e.wranglerOverrides),wranglerOutDir:e.wranglerOutDir??e.wranglerOutPath??e.outDir,build:e.build??true}}async function P(e){let t=isAbsolute(e??"")?e:resolve(process.cwd(),e??"appflare.config.ts"),n=dirname(t),o=(await import(pathToFileURL(t).href)).default,i=Fa.parse(o),s=Ea(i);return {configPath:t,configDir:n,scanDirAbs:resolve(n,s.scanDir),outDirAbs:resolve(n,s.outDir),wranglerOutDirAbs:resolve(n,s.wranglerOutDir),config:s}}function Pa(e){let t=e;for(;;){if(existsSync(resolve(t,"package.json")))return t;let n=dirname(t);if(n===t)return e;t=n;}}async function Q(e,t={}){let n=await P(e);if(t.build!==void 0&&(n.config.build=t.build),await En(n),n.wranglerOutDirAbs===n.outDirAbs){process.stdout.write(`\u2705 Generated artifacts in ${n.outDirAbs}
|
|
9984
10044
|
`);return}process.stdout.write(`\u2705 Generated server/client in ${n.outDirAbs} and wrangler.json in ${n.wranglerOutDirAbs}
|
|
9985
|
-
`);}async function Bn(e,t={}){if(await Q(e,{build:t.build}),!t.watch)return;let n=await
|
|
10045
|
+
`);}async function Bn(e,t={}){if(await Q(e,{build:t.build}),!t.watch)return;let n=await P(e),r=false,a=false,o=async()=>{if(r){a=true;return}r=true;try{await Q(e,{build:t.build});}catch(s){process.stderr.write(`\u274C Build failed: ${s.message}
|
|
9986
10046
|
`);}finally{r=false,a&&(a=false,await o());}};ja.watch(n.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,c)=>{process.stdout.write(`\u{1F504} Change detected: ${c}
|
|
9987
10047
|
`),await o();}),process.stdout.write(`\u{1F440} Watching ${n.scanDirAbs}
|
|
9988
|
-
`);}async function Wn(e,t={}){let n=await
|
|
10048
|
+
`);}async function Wn(e,t={}){let n=await P(e),r=Pa(process.cwd());if([!!t.local,!!t.remote,!!t.preview].filter(Boolean).length>1)throw new Error("Only one of --local, --remote, or --preview can be set.");let o=resolve(n.outDirAbs,"drizzle.config.js"),i=process.platform==="win32"?"npx.cmd":"npx",c=await Bun.spawn([i,"drizzle-kit","generate","--config",o],{cwd:r,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(c!==0)throw new Error(`drizzle-kit generate failed with exit code ${c}`);let u=n.config.database[0].databaseName,l=[i,"wrangler","d1","migrations","apply",u];t.local?l.push("--local"):t.remote?l.push("--remote"):t.preview&&l.push("--preview");let d=await Bun.spawn(l,{cwd:n.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 Hn(e,t={name:"",email:"",password:""}){let n=await P(e);if([!!t.local,!!t.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(t.password),i=crypto.randomUUID(),s=crypto.randomUUID(),c=Date.now(),u=t.name.replace(/'/g,"''"),l=t.email.replace(/'/g,"''"),p=["INSERT INTO users (id, name, email, email_verified, created_at, updated_at, role, banned)",`VALUES ('${i}', '${u}', '${l}', 1, ${c}, ${c}, 'admin', 0);`,"INSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)",`VALUES ('${s}', '${l}', 'credential', '${i}', '${o}', ${c}, ${c});`].join(" "),d=n.config.database[0].databaseName,x=[process.platform==="win32"?"npx.cmd":"npx","wrangler","d1","execute",d,`--command=${p}`];t.local?x.push("--local"):t.remote&&x.push("--remote");let w=await Bun.spawn(x,{cwd:n.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 "+t.email+" created successfully!");}var j=new Command;j.name("appflare").description("Appflare compiler/bundler for Cloudflare-native backends and SDK generation").version("0.0.28");j.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});});j.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 Bn(e.config,{watch:e.watch,build:e.build});});j.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 Wn(e.config,{local:e.local,remote:e.remote,preview:e.preview});});j.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 Hn(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 j.parseAsync(process.argv);})().catch(e=>{console.error(e),process.exit(1);});
|