appflare 0.2.16 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -164,8 +164,8 @@ export function createAppflare<Options extends BetterAuthClientOptions = Inferre
164
164
  ): Appflare<Options> {
165
165
  return new Appflare(options);
166
166
  }
167
- `}function Pn(e){let t=e.replace(/[^A-Za-z0-9_]/g,"_");return /^[0-9]/.test(t)?`_${t}`:t||"_route"}function re(e){return e.split(/[^A-Za-z0-9]+/).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function In(e){return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)?e:JSON.stringify(e)}function ae(e){let t={children:new Map};for(let n of e){let r=t;for(let a of n.segments){let o=r.children.get(a);o||(o={children:new Map},r.children.set(a,o)),r=o;}r.operation=n;}return t}function V(e,t=1){let n=" ".repeat(t),r=" ".repeat(t+1),a=Array.from(e.children.entries()).sort(([i],[s])=>i.localeCompare(s));if(a.length===0)return e.operation?`${e.operation.alias}Route(runtime)`:"{}";let o=["{"];for(let[i,s]of a)o.push(`${r}${In(i)}: ${V(s,t+1)},`);return e.operation&&(o.push(`${r}run: ${e.operation.alias}Route(runtime).run,`),o.push(`${r}schema: ${e.operation.alias}Route(runtime).schema,`),e.operation.kind==="query"&&o.push(`${r}subscribe: ${e.operation.alias}Route(runtime).subscribe,`)),o.push(`${n}}`),o.join(`
168
- `)}function Dn(e,t){if(e.kind!=="query"&&e.kind!=="mutation")return null;let n=e.clientSegments&&e.clientSegments.length>0?e.clientSegments:e.routePath.replace(/^\//,"").split("/").filter(Boolean).slice(1);if(n.length===0)return null;let r=Pn(`op_${t}_${e.kind}_${n.join("_")}`);return {kind:e.kind,routePath:e.routePath,queryName:e.handlerName??n.join("/"),segments:n,importPath:e.clientImportPath,exportName:e.exportName,alias:r,schemaConst:`${r}Schema`,typeBase:`${re(e.kind)}${re(n.join("_"))}`}}function En(e){let t=`${e.typeBase}Input`,n=`${e.typeBase}Output`,r=`${e.typeBase}Schema`,a=e.kind==="query"?"GET":"POST";return e.kind==="query"?`const ${e.alias}Route = (
167
+ `}function Cn(e){let t=e.replace(/[^A-Za-z0-9_]/g,"_");return /^[0-9]/.test(t)?`_${t}`:t||"_route"}function re(e){return e.split(/[^A-Za-z0-9]+/).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Pn(e){return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)?e:JSON.stringify(e)}function ae(e){let t={children:new Map};for(let n of e){let r=t;for(let a of n.segments){let o=r.children.get(a);o||(o={children:new Map},r.children.set(a,o)),r=o;}r.operation=n;}return t}function V(e,t=1){let n=" ".repeat(t),r=" ".repeat(t+1),a=Array.from(e.children.entries()).sort(([i],[s])=>i.localeCompare(s));if(a.length===0)return e.operation?`${e.operation.alias}Route(runtime)`:"{}";let o=["{"];for(let[i,s]of a)o.push(`${r}${Pn(i)}: ${V(s,t+1)},`);return e.operation&&(o.push(`${r}run: ${e.operation.alias}Route(runtime).run,`),o.push(`${r}schema: ${e.operation.alias}Route(runtime).schema,`),e.operation.kind==="query"&&o.push(`${r}subscribe: ${e.operation.alias}Route(runtime).subscribe,`)),o.push(`${n}}`),o.join(`
168
+ `)}function Dn(e,t){if(e.kind!=="query"&&e.kind!=="mutation")return null;let n=e.clientSegments&&e.clientSegments.length>0?e.clientSegments:e.routePath.replace(/^\//,"").split("/").filter(Boolean).slice(1);if(n.length===0)return null;let r=Cn(`op_${t}_${e.kind}_${n.join("_")}`);return {kind:e.kind,routePath:e.routePath,queryName:e.handlerName??n.join("/"),segments:n,importPath:e.clientImportPath,exportName:e.exportName,alias:r,schemaConst:`${r}Schema`,typeBase:`${re(e.kind)}${re(n.join("_"))}`}}function Fn(e){let t=`${e.typeBase}Input`,n=`${e.typeBase}Output`,r=`${e.typeBase}Schema`,a=e.kind==="query"?"GET":"POST";return e.kind==="query"?`const ${e.alias}Route = (
169
169
  runtime: RequestRuntime,
170
170
  ): AppflareQueryRouteClient<typeof ${e.schemaConst}, ${n}> => {
171
171
  const run: AppflareQueryRouteClient<typeof ${e.schemaConst}, ${n}>["run"] = async (
@@ -357,7 +357,7 @@ export type ${c} = z.input<typeof ${u.schemaConst}>;
357
357
  export type ${f} = Awaited<ReturnType<typeof ${u.alias}.definition.handler>>;
358
358
  export const ${d} = ${u.schemaConst};`}).join(`
359
359
 
360
- `),i=t.map(u=>En(u)).join(`
360
+ `),i=t.map(u=>Fn(u)).join(`
361
361
 
362
362
  `),s=V(ae(n)),l=V(ae(r));return `import betterFetch from "better-fetch";
363
363
  import { z } from "zod";
@@ -1755,11 +1755,11 @@ type QueryWithRelationInputForTable<
1755
1755
  TSourceTable extends TableName,
1756
1756
  TRelationName extends string,
1757
1757
  TEntry,
1758
- > = ManyToManyTargetTableName<TSourceTable, TRelationName> extends infer TTarget
1759
- ? TTarget extends TableName
1760
- ? QueryManyToManyWithRelationInput<TTarget>
1761
- : QueryNativeWithRelationInput<TEntry>
1762
- : QueryNativeWithRelationInput<TEntry>;
1758
+ > = [ManyToManyTargetTableName<TSourceTable, TRelationName>] extends [never]
1759
+ ? QueryNativeWithRelationInput<TEntry>
1760
+ : QueryManyToManyWithRelationInput<
1761
+ Extract<ManyToManyTargetTableName<TSourceTable, TRelationName>, TableName>
1762
+ >;
1763
1763
 
1764
1764
  type QueryWithInputForTable<
1765
1765
  TSourceTable extends TableName,
@@ -1795,13 +1795,6 @@ export type QueryFindFirstArgs<TName extends TableName> = Omit<
1795
1795
  with?: QueryWithInput<TName, NativeFindFirstWith<TName>>;
1796
1796
  };
1797
1797
 
1798
- type SingularizeRelationName<TName extends string> =
1799
- TName extends \`\${infer TRoot}ies\`
1800
- ? \`\${TRoot}y\`
1801
- : TName extends \`\${infer TRoot}s\`
1802
- ? TRoot
1803
- : TName;
1804
-
1805
1798
  type RelationInsertItem<TTargetTable extends TableName> =
1806
1799
  | TableModel<TTargetTable>
1807
1800
  | TableInsertModel<TTargetTable>
@@ -1827,21 +1820,38 @@ type RelationInsertFields<TName extends TableName> = {
1827
1820
  >;
1828
1821
  };
1829
1822
 
1830
- type RelationInsertIdAliasFields<TName extends TableName> = {
1831
- [TRelationName in RuntimeRelationName<TName> as \`\${TRelationName}Id\`]?: RelationInsertValue<
1832
- TName,
1833
- TRelationName
1834
- >;
1835
- } & {
1836
- [TRelationName in RuntimeRelationName<TName> as \`\${SingularizeRelationName<TRelationName>}Id\`]?: RelationInsertValue<
1837
- TName,
1838
- TRelationName
1839
- >;
1840
- };
1841
-
1842
1823
  type QueryInsertValue<TName extends TableName> = TableInsertScalarModel<TName> &
1843
- RelationInsertFields<TName> &
1844
- RelationInsertIdAliasFields<TName>;
1824
+ RelationInsertFields<TName>;
1825
+
1826
+ type InsertItemValue<TArgs> = TArgs extends { values: infer TValue }
1827
+ ? TValue extends Array<infer TItem>
1828
+ ? TItem
1829
+ : TValue
1830
+ : never;
1831
+
1832
+ type InsertRelationNameFromArgs<
1833
+ TName extends TableName,
1834
+ TArgs,
1835
+ > = Extract<keyof InsertItemValue<TArgs>, RuntimeRelationName<TName>>;
1836
+
1837
+ type InsertRelationResultValue<
1838
+ TSourceTable extends TableName,
1839
+ TRelationName extends RuntimeRelationName<TSourceTable>,
1840
+ > = RuntimeRelationTargetTable<TSourceTable, TRelationName> extends infer TTargetTable
1841
+ ? TTargetTable extends TableName
1842
+ ? RuntimeRelationKind<TSourceTable, TRelationName> extends "one"
1843
+ ? TableModel<TTargetTable> | null
1844
+ : Array<TableModel<TTargetTable>>
1845
+ : never
1846
+ : never;
1847
+
1848
+ export type QueryInsertResultRow<
1849
+ TName extends TableName,
1850
+ TArgs extends QueryInsertArgs<TName>,
1851
+ > = TableModel<TName> & {
1852
+ [TRelationName in InsertRelationNameFromArgs<TName, TArgs>]:
1853
+ InsertRelationResultValue<TName, TRelationName>;
1854
+ };
1845
1855
 
1846
1856
  export type QueryInsertArgs<TName extends TableName> = {
1847
1857
  values: QueryInsertValue<TName> | Array<QueryInsertValue<TName>>;
@@ -1963,7 +1973,9 @@ export type QueryTableApi<TName extends TableName> = {
1963
1973
  >(
1964
1974
  args?: TArgs,
1965
1975
  ) => ApplyFindFirstWithAggregateResult<TableFindFirstResult<TName, TArgs>, TArgs>;
1966
- insert: (args: QueryInsertArgs<TName>) => Promise<Array<TableModel<TName>>>;
1976
+ insert: <TArgs extends QueryInsertArgs<TName>>(
1977
+ args: TArgs,
1978
+ ) => Promise<Array<QueryInsertResultRow<TName, TArgs>>>;
1967
1979
  update: (args: QueryUpdateArgs<TName>) => Promise<Array<TableModel<TName>>>;
1968
1980
  upsert: (args: QueryUpsertArgs<TName>) => Promise<Array<TableModel<TName>>>;
1969
1981
  delete: (args?: QueryDeleteArgs<TName>) => Promise<Array<TableModel<TName>>>;
@@ -3068,45 +3080,44 @@ type TableModel<TName extends TableName> = InferSelectModel<
3068
3080
  (typeof mergedSchema)[TName]
3069
3081
  >;
3070
3082
  type ManyToManySchemaMap = typeof schema extends {
3071
- __appflareManyToMany: infer TMap;
3083
+ __appflareManyToMany: infer TMap extends Record<string, unknown>;
3072
3084
  }
3073
- ? TMap extends Record<string, Record<string, { targetTable: string }>>
3074
- ? TMap
3075
- : {}
3085
+ ? TMap
3076
3086
  : {};
3087
+ type ManyToManySourceTableMap<TSourceTable extends TableName> =
3088
+ TSourceTable extends keyof ManyToManySchemaMap
3089
+ ? ManyToManySchemaMap[TSourceTable] extends Record<string, unknown>
3090
+ ? ManyToManySchemaMap[TSourceTable]
3091
+ : {}
3092
+ : {};
3077
3093
  type ManyToManyTargetTableName<
3078
3094
  TSourceTable extends TableName,
3079
3095
  TRelationName extends string,
3080
- > = TSourceTable extends keyof ManyToManySchemaMap
3081
- ? TRelationName extends keyof ManyToManySchemaMap[TSourceTable]
3082
- ? ManyToManySchemaMap[TSourceTable][TRelationName] extends {
3096
+ > = TRelationName extends keyof ManyToManySourceTableMap<TSourceTable>
3097
+ ? ManyToManySourceTableMap<TSourceTable>[TRelationName] extends {
3083
3098
  targetTable: infer TTarget extends string;
3084
3099
  }
3085
3100
  ? Extract<TTarget, TableName>
3086
3101
  : never
3087
- : never
3088
3102
  : never;
3089
3103
  type RuntimeRelationsSchemaMap = typeof schema extends {
3090
- __appflareRelations: infer TMap;
3104
+ __appflareRelations: infer TMap extends Record<string, unknown>;
3091
3105
  }
3092
- ? TMap extends Record<
3093
- string,
3094
- Record<string, { kind: string; targetTable: string }>
3095
- >
3096
- ? TMap
3097
- : {}
3106
+ ? TMap
3098
3107
  : {};
3099
- type RuntimeRelationName<TSourceTable extends TableName> =
3108
+ type RuntimeRelationsSourceTableMap<TSourceTable extends TableName> =
3100
3109
  TSourceTable extends keyof RuntimeRelationsSchemaMap
3101
- ? Extract<keyof RuntimeRelationsSchemaMap[TSourceTable], string>
3102
- : never;
3110
+ ? RuntimeRelationsSchemaMap[TSourceTable] extends Record<string, unknown>
3111
+ ? RuntimeRelationsSchemaMap[TSourceTable]
3112
+ : {}
3113
+ : {};
3114
+ type RuntimeRelationName<TSourceTable extends TableName> =
3115
+ Extract<keyof RuntimeRelationsSourceTableMap<TSourceTable>, string>;
3103
3116
  type RuntimeRelationConfig<
3104
3117
  TSourceTable extends TableName,
3105
3118
  TRelationName extends string,
3106
- > = TSourceTable extends keyof RuntimeRelationsSchemaMap
3107
- ? TRelationName extends keyof RuntimeRelationsSchemaMap[TSourceTable]
3108
- ? RuntimeRelationsSchemaMap[TSourceTable][TRelationName]
3109
- : never
3119
+ > = TRelationName extends keyof RuntimeRelationsSourceTableMap<TSourceTable>
3120
+ ? RuntimeRelationsSourceTableMap<TSourceTable>[TRelationName]
3110
3121
  : never;
3111
3122
  type RuntimeRelationKind<
3112
3123
  TSourceTable extends TableName,
@@ -3124,10 +3135,7 @@ type RuntimeRelationTargetTable<
3124
3135
  }
3125
3136
  ? Extract<TTarget, TableName>
3126
3137
  : never;
3127
- type TableInsertScalarModel<TName extends TableName> = Omit<
3128
- TableInsertModel<TName>,
3129
- RuntimeRelationName<TName>
3130
- >;
3138
+ type TableInsertScalarModel<TName extends TableName> = TableInsertModel<TName>;
3131
3139
  type FindManyWithFromArgs<TArgs> = TArgs extends { with?: infer TWith }
3132
3140
  ? TWith
3133
3141
  : undefined;
@@ -3156,11 +3164,12 @@ type ReplaceManyToManyRelationsInRow<
3156
3164
  [K in keyof TRow]: K extends string
3157
3165
  ? TWith extends Record<string, unknown>
3158
3166
  ? K extends keyof TWith
3159
- ? ManyToManyTargetTableName<TSourceTable, K> extends infer TTarget
3160
- ? TTarget extends TableName
3161
- ? ManyToManyRelationRows<TTarget, TWith[K]>
3162
- : TRow[K]
3163
- : TRow[K]
3167
+ ? [ManyToManyTargetTableName<TSourceTable, K>] extends [never]
3168
+ ? TRow[K]
3169
+ : ManyToManyRelationRows<
3170
+ Extract<ManyToManyTargetTableName<TSourceTable, K>, TableName>,
3171
+ TWith[K]
3172
+ >
3164
3173
  : TRow[K]
3165
3174
  : TRow[K]
3166
3175
  : TRow[K];
@@ -3222,10 +3231,7 @@ type TableFindFirstArgs<TName extends TableName> = Omit<
3222
3231
  TableFindManyArgs<TName>,
3223
3232
  "limit"
3224
3233
  >;
3225
- type NativeFindFirstWith<TName extends TableName> =
3226
- NonNullable<TableFindFirstArgs<TName>> extends { with?: infer TWith }
3227
- ? TWith
3228
- : never;
3234
+ type NativeFindFirstWith<TName extends TableName> = NativeFindManyWith<TName>;
3229
3235
  type ResolveNativeFindFirstWith<
3230
3236
  TName extends TableName,
3231
3237
  TArgs extends QueryFindFirstArgs<TName> | undefined,
@@ -3611,7 +3617,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3611
3617
  };
3612
3618
 
3613
3619
  const tableApi = {
3614
- `}function Ce(){return ` insert: async (args: QueryInsertArgs<TableName>) => {
3620
+ `}function Ie(){return ` insert: async <TArgs extends QueryInsertArgs<TableName>>(args: TArgs) => {
3615
3621
  const transaction = ($db as any).transaction;
3616
3622
 
3617
3623
  const valuesArray = Array.isArray(args.values)
@@ -3626,16 +3632,6 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3626
3632
  }>
3627
3633
  > = [];
3628
3634
 
3629
- const resolveSingularAlias = (relationName: string): string => {
3630
- if (relationName.endsWith("ies")) {
3631
- return relationName.slice(0, -3) + "yId";
3632
- }
3633
- if (relationName.endsWith("s") && relationName.length > 1) {
3634
- return relationName.slice(0, -1) + "Id";
3635
- }
3636
- return relationName + "Id";
3637
- };
3638
-
3639
3635
  const toRelationItems = (
3640
3636
  relation: RuntimeRelation,
3641
3637
  relationName: string,
@@ -3688,7 +3684,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3688
3684
  const referenceField =
3689
3685
  relation.kind === "manyToMany"
3690
3686
  ? (relation.targetReferenceField ?? "id")
3691
- : "id";
3687
+ : (relation.referenceField ?? "id");
3692
3688
  const existingId = input[referenceField];
3693
3689
  if (existingId !== undefined && existingId !== null) {
3694
3690
  return existingId;
@@ -3741,6 +3737,74 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3741
3737
  return createdId;
3742
3738
  };
3743
3739
 
3740
+ const getRelationTargetTable = (
3741
+ relation: RuntimeRelation,
3742
+ relationName: string,
3743
+ ): any => {
3744
+ const targetTable = (mergedSchema as Record<string, unknown>)[
3745
+ relation.targetTable
3746
+ ];
3747
+ if (!targetTable) {
3748
+ throw new Error(
3749
+ "Unknown target table '" +
3750
+ relation.targetTable +
3751
+ "' for relation '" +
3752
+ tableName +
3753
+ "." +
3754
+ relationName +
3755
+ "'.",
3756
+ );
3757
+ }
3758
+ return targetTable;
3759
+ };
3760
+
3761
+ const getRelationReferenceField = (relation: RuntimeRelation): string => {
3762
+ if (relation.kind === "manyToMany") {
3763
+ return relation.targetReferenceField ?? "id";
3764
+ }
3765
+ return relation.referenceField ?? "id";
3766
+ };
3767
+
3768
+ const fetchRelatedRowByIdentifier = async (
3769
+ tx: any,
3770
+ relation: RuntimeRelation,
3771
+ relationName: string,
3772
+ identifier: unknown,
3773
+ ): Promise<Record<string, unknown> | null> => {
3774
+ if (identifier === undefined || identifier === null) {
3775
+ return null;
3776
+ }
3777
+
3778
+ const targetTable = getRelationTargetTable(relation, relationName);
3779
+ const referenceField = getRelationReferenceField(relation);
3780
+ const referenceColumn = (targetTable as Record<string, unknown>)[
3781
+ referenceField
3782
+ ];
3783
+ if (!referenceColumn) {
3784
+ throw new Error(
3785
+ "Target table '" +
3786
+ relation.targetTable +
3787
+ "' is missing column '" +
3788
+ referenceField +
3789
+ "' required by relation '" +
3790
+ tableName +
3791
+ "." +
3792
+ relationName +
3793
+ "'.",
3794
+ );
3795
+ }
3796
+
3797
+ let query: any = tx
3798
+ .select()
3799
+ .from(targetTable as any)
3800
+ .where(eq(referenceColumn as any, identifier as any));
3801
+ if (typeof query.limit === "function") {
3802
+ query = query.limit(1);
3803
+ }
3804
+ const rows = (await query) as Array<Record<string, unknown>>;
3805
+ return rows[0] ?? null;
3806
+ };
3807
+
3744
3808
  for (const inputValue of valuesArray) {
3745
3809
  const scalarValues: Record<string, unknown> = {};
3746
3810
  const relationInputs: Array<{
@@ -3760,50 +3824,16 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3760
3824
  });
3761
3825
  continue;
3762
3826
  }
3763
-
3764
- let matchedAlias = false;
3765
- if (fieldName.endsWith("Id")) {
3766
- for (const [relationName, relationValue] of Object.entries(
3767
- runtimeRelationMap[tableName] ?? {},
3768
- )) {
3769
- const pluralAlias = relationName + "Id";
3770
- const singularAlias = resolveSingularAlias(relationName);
3771
- if (fieldName !== pluralAlias && fieldName !== singularAlias) {
3772
- continue;
3773
- }
3774
-
3775
- if (valueRecord[relationName] !== undefined) {
3776
- throw new Error(
3777
- "Insert payload for '" +
3778
- tableName +
3779
- "' cannot contain both '" +
3780
- relationName +
3781
- "' and '" +
3782
- fieldName +
3783
- "'.",
3784
- );
3785
- }
3786
-
3787
- relationInputs.push({
3788
- relationName,
3789
- relation: relationValue,
3790
- value: fieldValue,
3791
- });
3792
- matchedAlias = true;
3793
- break;
3794
- }
3795
- }
3796
-
3797
- if (!matchedAlias) {
3798
- scalarValues[fieldName] = fieldValue;
3799
- }
3827
+ scalarValues[fieldName] = fieldValue;
3800
3828
  }
3801
3829
 
3802
3830
  baseValuesArray.push(scalarValues);
3803
3831
  postInsertRelations.push(relationInputs);
3804
3832
  }
3805
3833
 
3806
- const executeInsertGraph = async (tx: any): Promise<Array<TableModel<TableName>>> => {
3834
+ const executeInsertGraph = async (
3835
+ tx: any,
3836
+ ): Promise<Array<QueryInsertResultRow<TableName, TArgs>>> => {
3807
3837
  for (let index = 0; index < baseValuesArray.length; index += 1) {
3808
3838
  const relationInputs = postInsertRelations[index] ?? [];
3809
3839
  for (const relationInput of relationInputs) {
@@ -3859,13 +3889,46 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3859
3889
  insertQuery = insertQuery.returning();
3860
3890
  }
3861
3891
  const insertedRows = (await insertQuery) as Array<TableModel<TableName>>;
3892
+ const hydratedRows: Array<Record<string, unknown>> = [];
3862
3893
 
3863
3894
  for (let index = 0; index < insertedRows.length; index += 1) {
3864
3895
  const parentRow = insertedRows[index] as unknown as Record<string, unknown>;
3896
+ const hydratedRow: Record<string, unknown> = {
3897
+ ...parentRow,
3898
+ };
3865
3899
  const relationInputs = postInsertRelations[index] ?? [];
3866
3900
 
3867
3901
  for (const relationInput of relationInputs) {
3868
3902
  if (relationInput.relation.kind === "one") {
3903
+ const sourceField = relationInput.relation.sourceField;
3904
+ if (!sourceField) {
3905
+ throw new Error(
3906
+ "Relation '" +
3907
+ tableName +
3908
+ "." +
3909
+ relationInput.relationName +
3910
+ "' is missing sourceField metadata.",
3911
+ );
3912
+ }
3913
+
3914
+ const relationItems = toRelationItems(
3915
+ relationInput.relation,
3916
+ relationInput.relationName,
3917
+ relationInput.value,
3918
+ );
3919
+ if (relationItems.length === 0) {
3920
+ hydratedRow[relationInput.relationName] = null;
3921
+ continue;
3922
+ }
3923
+
3924
+ const sourceIdentifier = parentRow[sourceField];
3925
+ hydratedRow[relationInput.relationName] =
3926
+ (await fetchRelatedRowByIdentifier(
3927
+ tx,
3928
+ relationInput.relation,
3929
+ relationInput.relationName,
3930
+ sourceIdentifier,
3931
+ )) ?? null;
3869
3932
  continue;
3870
3933
  }
3871
3934
 
@@ -3886,6 +3949,9 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3886
3949
  );
3887
3950
  }
3888
3951
 
3952
+ const relatedRows: Array<Record<string, unknown>> = [];
3953
+ hydratedRow[relationInput.relationName] = relatedRows;
3954
+
3889
3955
  const relationItems = toRelationItems(
3890
3956
  relationInput.relation,
3891
3957
  relationInput.relationName,
@@ -3896,29 +3962,36 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3896
3962
  }
3897
3963
 
3898
3964
  if (relationInput.relation.kind === "many") {
3899
- const targetTable = (mergedSchema as Record<string, unknown>)[
3900
- relationInput.relation.targetTable
3901
- ];
3902
- if (!targetTable) {
3965
+ const targetTable = getRelationTargetTable(
3966
+ relationInput.relation,
3967
+ relationInput.relationName,
3968
+ );
3969
+
3970
+ const sourceField = relationInput.relation.sourceField;
3971
+ const targetReferenceField =
3972
+ relationInput.relation.referenceField ?? "id";
3973
+ const targetReferenceColumn =
3974
+ (targetTable as Record<string, unknown>)[targetReferenceField];
3975
+ if (!sourceField) {
3903
3976
  throw new Error(
3904
- "Unknown target table '" +
3905
- relationInput.relation.targetTable +
3906
- "' for relation '" +
3977
+ "Relation '" +
3907
3978
  tableName +
3908
3979
  "." +
3909
3980
  relationInput.relationName +
3910
- "'.",
3981
+ "' is missing sourceField metadata.",
3911
3982
  );
3912
3983
  }
3913
-
3914
- const sourceField = relationInput.relation.sourceField;
3915
- if (!sourceField) {
3984
+ if (!targetReferenceColumn) {
3916
3985
  throw new Error(
3917
- "Relation '" +
3986
+ "Target table '" +
3987
+ relationInput.relation.targetTable +
3988
+ "' is missing column '" +
3989
+ targetReferenceField +
3990
+ "' required by relation '" +
3918
3991
  tableName +
3919
3992
  "." +
3920
3993
  relationInput.relationName +
3921
- "' is missing sourceField metadata.",
3994
+ "'.",
3922
3995
  );
3923
3996
  }
3924
3997
 
@@ -3931,7 +4004,18 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3931
4004
  await tx
3932
4005
  .update(targetTable as any)
3933
4006
  .set({ [sourceField]: parentReferenceValue } as any)
3934
- .where(eq((targetTable as any).id, relationItem as any));
4007
+ .where(
4008
+ eq(targetReferenceColumn as any, relationItem as any),
4009
+ );
4010
+ const linkedRow = await fetchRelatedRowByIdentifier(
4011
+ tx,
4012
+ relationInput.relation,
4013
+ relationInput.relationName,
4014
+ relationItem,
4015
+ );
4016
+ if (linkedRow) {
4017
+ relatedRows.push(linkedRow);
4018
+ }
3935
4019
  continue;
3936
4020
  }
3937
4021
 
@@ -3945,22 +4029,48 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3945
4029
  );
3946
4030
  }
3947
4031
 
3948
- const existingId = relationItem.id;
4032
+ const existingId = relationItem[targetReferenceField];
3949
4033
  const payload = {
3950
4034
  ...relationItem,
3951
4035
  [sourceField]: parentReferenceValue,
3952
4036
  };
3953
4037
 
3954
4038
  if (existingId !== undefined && existingId !== null) {
3955
- const { id: _ignored, ...setPayload } = payload;
4039
+ const setPayload: Record<string, unknown> = {
4040
+ ...payload,
4041
+ };
4042
+ delete setPayload[targetReferenceField];
3956
4043
  await tx
3957
4044
  .update(targetTable as any)
3958
4045
  .set(setPayload as any)
3959
- .where(eq((targetTable as any).id, existingId as any));
4046
+ .where(
4047
+ eq(targetReferenceColumn as any, existingId as any),
4048
+ );
4049
+ const linkedRow = await fetchRelatedRowByIdentifier(
4050
+ tx,
4051
+ relationInput.relation,
4052
+ relationInput.relationName,
4053
+ existingId,
4054
+ );
4055
+ if (linkedRow) {
4056
+ relatedRows.push(linkedRow);
4057
+ }
3960
4058
  continue;
3961
4059
  }
3962
4060
 
3963
- await tx.insert(targetTable as any).values(payload as any);
4061
+ let createQuery: any = tx
4062
+ .insert(targetTable as any)
4063
+ .values(payload as any);
4064
+ if (typeof createQuery.returning === "function") {
4065
+ createQuery = createQuery.returning();
4066
+ }
4067
+ const createdRows = (await createQuery) as Array<
4068
+ Record<string, unknown>
4069
+ >;
4070
+ const createdRow = createdRows[0];
4071
+ if (createdRow) {
4072
+ relatedRows.push(createdRow);
4073
+ }
3964
4074
  }
3965
4075
  continue;
3966
4076
  }
@@ -3993,6 +4103,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
3993
4103
  }
3994
4104
 
3995
4105
  const linkValues: Array<Record<string, unknown>> = [];
4106
+ const targetIdentifiers: unknown[] = [];
3996
4107
  for (const relationItem of relationItems) {
3997
4108
  const targetId = await resolveRelationIdentifier(
3998
4109
  tx,
@@ -4000,6 +4111,7 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
4000
4111
  relationInput.relationName,
4001
4112
  relationItem,
4002
4113
  );
4114
+ targetIdentifiers.push(targetId);
4003
4115
 
4004
4116
  linkValues.push({
4005
4117
  [sourceField]: parentReferenceValue,
@@ -4010,13 +4122,27 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
4010
4122
  if (linkValues.length > 0) {
4011
4123
  await tx.insert(junctionTable as any).values(linkValues as any);
4012
4124
  }
4125
+
4126
+ for (const targetId of targetIdentifiers) {
4127
+ const linkedRow = await fetchRelatedRowByIdentifier(
4128
+ tx,
4129
+ relationInput.relation,
4130
+ relationInput.relationName,
4131
+ targetId,
4132
+ );
4133
+ if (linkedRow) {
4134
+ relatedRows.push(linkedRow);
4135
+ }
4136
+ }
4013
4137
  }
4138
+
4139
+ hydratedRows.push(hydratedRow);
4014
4140
  }
4015
4141
 
4016
- return insertedRows;
4142
+ return hydratedRows as Array<QueryInsertResultRow<TableName, TArgs>>;
4017
4143
  };
4018
4144
 
4019
- let rows: Array<TableModel<TableName>>;
4145
+ let rows: Array<QueryInsertResultRow<TableName, TArgs>>;
4020
4146
  if (typeof transaction === "function") {
4021
4147
  try {
4022
4148
  rows = await transaction.call($db, (tx: any) =>
@@ -4164,9 +4290,9 @@ type TableInsertModel<TName extends TableName> = InferInsertModel<
4164
4290
  );
4165
4291
  return rows;
4166
4292
  },
4167
- `}function Me(){return [qe(),$e(),Ce(),Ae(),Ne()].join(`
4293
+ `}function Me(){return [qe(),$e(),Ie(),Ae(),Ne()].join(`
4168
4294
 
4169
- `)}function Pe(){return `type AuthSession = typeof auth.$Infer.Session;
4295
+ `)}function Ce(){return `type AuthSession = typeof auth.$Infer.Session;
4170
4296
  type User = AuthSession['user']
4171
4297
  type Session = AuthSession['session']
4172
4298
 
@@ -4227,7 +4353,7 @@ export type AppflareContext = {
4227
4353
  storage: AppflareStorage;
4228
4354
  error: (status: number, message: string, details?: unknown) => never;
4229
4355
  };
4230
- `}function Ie(){return `type InferOperationArgs<TShape extends ZodRawShape> = z.output<z.ZodObject<TShape>>;
4356
+ `}function Pe(){return `type InferOperationArgs<TShape extends ZodRawShape> = z.output<z.ZodObject<TShape>>;
4231
4357
 
4232
4358
  export type SchedulerEnqueueOptions = {
4233
4359
  delaySeconds?: number;
@@ -4359,9 +4485,9 @@ export function cron(definition: CronDefinition): RegisteredCron {
4359
4485
  definition,
4360
4486
  };
4361
4487
  }
4362
- `}function De(){return [xe(),Se(),Me(),Pe(),Ie()].join(`
4488
+ `}function De(){return [xe(),Se(),Me(),Ce(),Pe()].join(`
4363
4489
 
4364
- `)}function Ee(e){return `import type { Context } from "hono";
4490
+ `)}function Fe(e){return `import type { Context } from "hono";
4365
4491
  import type { D1Database } from "@cloudflare/workers-types";
4366
4492
  import { drizzle } from "drizzle-orm/d1";
4367
4493
  import { z, type ZodRawShape } from "zod";
@@ -4369,7 +4495,7 @@ import * as authSchema from "./auth.schema";
4369
4495
  import * as schema from "${e}";
4370
4496
 
4371
4497
  ${De()}
4372
- `}function On(e){let t=e.replace(/[^A-Za-z0-9_]/g,"_");return /^[0-9]/.test(t)?`_${t}`:t}function Fn(e,t){let n=e.routePath.replace(/^\//,"").replace(/\//g,"_");return On(`op_${t}_${n}`)}function jn(e){return e.map((t,n)=>({operation:t,index:n,alias:Fn(t,n)}))}function Vn(e){return e.map(({operation:t,alias:n})=>`import { ${t.exportName} as ${n} } from "${t.importPath}";`).join(`
4498
+ `}function En(e){let t=e.replace(/[^A-Za-z0-9_]/g,"_");return /^[0-9]/.test(t)?`_${t}`:t}function On(e,t){let n=e.routePath.replace(/^\//,"").replace(/\//g,"_");return En(`op_${t}_${n}`)}function jn(e){return e.map((t,n)=>({operation:t,index:n,alias:On(t,n)}))}function Vn(e){return e.map(({operation:t,alias:n})=>`import { ${t.exportName} as ${n} } from "${t.importPath}";`).join(`
4373
4499
  `)}function Bn(e){return e.filter(({operation:t})=>t.kind==="query"||t.kind==="mutation").map(({alias:t})=>`const ${`${t}Schema`} = z.object(${t}.definition.args);`).join(`
4374
4500
  `)}function Hn(e){return e.filter(({operation:t})=>t.kind==="scheduler").map(({alias:t})=>`const ${`${t}SchedulerSchema`} = ${t}.definition.args ? z.object(${t}.definition.args) : z.undefined();`).join(`
4375
4501
  `)}function Wn(e){return e.filter(({operation:t})=>t.kind==="query").map(({operation:t,alias:n})=>{let r=`${n}Schema`;return `
@@ -4419,7 +4545,7 @@ ${De()}
4419
4545
  },`}).join(`
4420
4546
  `)}function Kn(e){return e.filter(({operation:t})=>t.kind==="storage").map(({alias:t})=>`
4421
4547
  ${t}.definition.handler,`).join(`
4422
- `)}function Oe(e){let t=jn(e);return {imports:Vn(t),operationSchemas:Bn(t),schedulerSchemas:Hn(t),queryRoutes:Wn(t),mutationRoutes:Ln(t),queryRegistryEntries:zn(t),schedulerEntries:Un(t),schedulerPayloadMapEntries:Qn(t),cronEntries:_n(t),storageHandlersEntries:Kn(t)}}var Fe=`
4548
+ `)}function Ee(e){let t=jn(e);return {imports:Vn(t),operationSchemas:Bn(t),schedulerSchemas:Hn(t),queryRoutes:Wn(t),mutationRoutes:Ln(t),queryRegistryEntries:zn(t),schedulerEntries:Un(t),schedulerPayloadMapEntries:Qn(t),cronEntries:_n(t),storageHandlersEntries:Kn(t)}}var Oe=`
4423
4549
  function getRealtimeStub(
4424
4550
  env: Record<string, unknown>,
4425
4551
  options: RegisterHandlersOptions,
@@ -5444,7 +5570,7 @@ function doesSubscriptionMatchMutation(
5444
5570
 
5445
5571
  return false;
5446
5572
  }
5447
- `;var Le=[He,We,Fe,Ve,Be,je].join(`
5573
+ `;var Le=[He,We,Oe,Ve,Be,je].join(`
5448
5574
 
5449
5575
  `);var ze=`
5450
5576
  function parseExpiresIn(value: string | undefined): number | undefined {
@@ -5723,7 +5849,7 @@ export async function executeCronTriggers(
5723
5849
  }
5724
5850
  }
5725
5851
  }
5726
- `;function _e(e){let{imports:t,operationSchemas:n,schedulerSchemas:r,queryRoutes:a,mutationRoutes:o,queryRegistryEntries:i,schedulerEntries:s,schedulerPayloadMapEntries:l,cronEntries:u,storageHandlersEntries:c}=Oe(e);return `import { sValidator } from "@hono/standard-validator";
5852
+ `;function _e(e){let{imports:t,operationSchemas:n,schedulerSchemas:r,queryRoutes:a,mutationRoutes:o,queryRegistryEntries:i,schedulerEntries:s,schedulerPayloadMapEntries:l,cronEntries:u,storageHandlersEntries:c}=Ee(e);return `import { sValidator } from "@hono/standard-validator";
5727
5853
  import type { Hono } from "hono";
5728
5854
  import type { D1Database, IncomingRequestCfProperties, KVNamespace } from "@cloudflare/workers-types";
5729
5855
  import { ZodError, z } from "zod";
@@ -5790,7 +5916,7 @@ export function registerGeneratedHandlers(
5790
5916
  ${ze}
5791
5917
 
5792
5918
  ${Qe}
5793
- `}function H(e,t,n){let r=Ee(e),a=be(n),o=we(),i=_e(t);return [{relativePath:"handlers.ts",source:r},{relativePath:"handlers.context.ts",source:a},{relativePath:"handlers.execution.ts",source:o},{relativePath:"handlers.routes.ts",source:i}]}function Gn(e){return e?`,
5919
+ `}function H(e,t,n){let r=Fe(e),a=be(n),o=we(),i=_e(t);return [{relativePath:"handlers.ts",source:r},{relativePath:"handlers.context.ts",source:a},{relativePath:"handlers.execution.ts",source:o},{relativePath:"handlers.routes.ts",source:i}]}function Gn(e){return e?`,
5794
5920
  KV: c.env["${e}"] as KVNamespace`:""}function Ke(e,t){return `{
5795
5921
  DATABASE: c.env["${e}"] as D1Database${Gn(t)}
5796
5922
  }`}function Ge(e,t,n){return `app.on(["GET", "POST"], "${e}/*", async (c) => {
@@ -5965,7 +6091,7 @@ import type { D1Database, IncomingRequestCfProperties, KVNamespace } from "@clou
5965
6091
  <span class="text-[10px] opacity-30">\${sort === '${n}' ? (order === 'asc' ? '\u25B2' : '\u25BC') : ''}</span>
5966
6092
  </a>
5967
6093
  </th>
5968
- `}).join("")}function pt(e){return e.map(t=>`<td><div class="truncate max-w-[200px] text-sm" title="\${String((row as any).${t} ?? '')}">\${String((row as any).${t} ?? '')}</div></td>`).join("")}function L(e,t,n){let r=e.columns.find(i=>i.name===t);if(!r)return "";let a=r.optional?"":" required",o=r.type==="number"?"number":r.type==="date"?"date":"text";if(r.type==="boolean")return n==="edit"?`
6094
+ `}).join("")}function pt(e,t){return e.map(n=>t&&n===t?`<td><button type="button" class="truncate max-w-[200px] text-sm font-mono text-xs opacity-70 hover:opacity-100 cursor-copy text-left" title="Click to copy: \${String((row as any).${n} ?? '')}" data-copy-value="\${String((row as any).${n} ?? '')}" onclick="navigator.clipboard?.writeText(this.dataset.copyValue || '')">\${String((row as any).${n} ?? '')}</button></td>`:`<td><div class="truncate max-w-[200px] text-sm" title="\${String((row as any).${n} ?? '')}">\${String((row as any).${n} ?? '')}</div></td>`).join("")}function L(e,t,n){let r=e.columns.find(i=>i.name===t);if(!r)return "";let a=r.optional?"":" required",o=r.type==="number"?"number":r.type==="date"?"date":"text";if(r.type==="boolean")return n==="edit"?`
5969
6095
  <div class="form-control">
5970
6096
  <label class="label cursor-pointer justify-start gap-3">
5971
6097
  <input type="checkbox" name="${t}" value="true" class="checkbox checkbox-sm checkbox-primary" \${(row as any).${t} ? 'checked' : ''} />
@@ -6101,7 +6227,7 @@ import type { D1Database, IncomingRequestCfProperties, KVNamespace } from "@clou
6101
6227
  </div>
6102
6228
  </div>
6103
6229
  </div>
6104
- </td>`:'<td class="text-right"><span class="text-xs opacity-30">No primary key</span></td>'}function C(e){return `
6230
+ </td>`:'<td class="text-right"><span class="text-xs opacity-30">No primary key</span></td>'}function I(e){return `
6105
6231
  <div class="flex flex-col sm:flex-row justify-between items-center mt-4 gap-3 py-3 px-1">
6106
6232
  <div class="text-xs text-base-content/40">
6107
6233
  Total found: <span class="font-medium text-base-content/60">\${total}</span>
@@ -6134,7 +6260,7 @@ import type { D1Database, IncomingRequestCfProperties, KVNamespace } from "@clou
6134
6260
  hx-trigger="keyup changed delay:500ms, search"
6135
6261
  hx-target="#main-content"
6136
6262
  class="input input-sm md:input-md input-bordered pl-9 w-full md:w-72 bg-base-200/50 border-base-200 focus:bg-base-100 focus:border-primary transition-all text-sm" />
6137
- </div>`}function bt(e,t,n,r,a,o,i,s,l,u){let c=C(`/admin/table/${e.exportName}`),f=M(`/admin/table/${e.exportName}`,"Search term or filter..."),d=r?`<th class="w-10"><input id="select-all-${e.exportName}" type="checkbox" class="checkbox checkbox-xs" /></th>`:'<th class="w-10"><input type="checkbox" class="checkbox checkbox-xs opacity-30" disabled /></th>',y=r?`<td><input type="checkbox" class="checkbox checkbox-xs row-select-checkbox" value="\${String((row as any).${n} ?? '')}" /></td>`:'<td><input type="checkbox" class="checkbox checkbox-xs opacity-30" disabled /></td>',w=r?`
6263
+ </div>`}function bt(e,t,n,r,a,o,i,s,l,u){let c=I(`/admin/table/${e.exportName}`),f=M(`/admin/table/${e.exportName}`,"Search term or filter..."),d=r?`<th class="w-10"><input id="select-all-${e.exportName}" type="checkbox" class="checkbox checkbox-xs" /></th>`:'<th class="w-10"><input type="checkbox" class="checkbox checkbox-xs opacity-30" disabled /></th>',y=r?`<td><input type="checkbox" class="checkbox checkbox-xs row-select-checkbox" value="\${String((row as any).${n} ?? '')}" /></td>`:'<td><input type="checkbox" class="checkbox checkbox-xs opacity-30" disabled /></td>',w=r?`
6138
6264
  <div id="bulk-delete-bar-${e.exportName}" class="fixed bottom-4 left-1/2 -translate-x-1/2 z-40 hidden">
6139
6265
  <div class="bg-base-100 border border-base-200 rounded-xl shadow-lg px-3 py-2 flex items-center gap-3">
6140
6266
  <div class="text-xs text-base-content/70">
@@ -6519,7 +6645,7 @@ import type { D1Database, IncomingRequestCfProperties, KVNamespace } from "@clou
6519
6645
  return c.redirect('/admin/table/${e}?' + query.toString());
6520
6646
  });
6521
6647
  ${c}
6522
- `}function U(e){let t=mt(e),n=!!t,r=e.columns.map(m=>m.name),a=r.filter(m=>gt(e,m)),o=r.filter(m=>ft(e,m)),i=ut(e),s=dt(e,r),l=pt(r),u=a.map(m=>L(e,m,"create")).join(""),c=o.map(m=>L(e,m,"edit")).join(""),f=z(e,a),d=z(e,o),y=n?t:r[0]||"id",w=e.columns.find(m=>m.name===t)?.type,b=ht(e,n,t,c);return bt(e,y,t,n,r,i,s,l,b,u)+`
6648
+ `}function U(e){let t=mt(e),n=!!t,r=e.columns.map(m=>m.name),a=r.filter(m=>gt(e,m)),o=r.filter(m=>ft(e,m)),i=ut(e),s=dt(e,r),l=pt(r,t),u=a.map(m=>L(e,m,"create")).join(""),c=o.map(m=>L(e,m,"edit")).join(""),f=z(e,a),d=z(e,o),y=n?t:r[0]||"id",w=e.columns.find(m=>m.name===t)?.type,b=ht(e,n,t,c);return bt(e,y,t,n,r,i,s,l,b,u)+`
6523
6649
  `+yt(e.exportName,y,t,w,n,i,f,d)}function wt(){return `
6524
6650
  const buildUsersRedirect = (params: { page?: string; sort?: string; order?: string; search?: string }) => {
6525
6651
  const page = params.page && params.page.trim() ? params.page : '1';
@@ -6570,7 +6696,7 @@ ${c}
6570
6696
  <label class="modal-backdrop" for="delete-user-modal-\${String((row as any).id)}">Close</label>
6571
6697
  </div>
6572
6698
  \`}`}var er=["id","name","email","role","createdAt","banned"],tr={id:"mdi:pound",name:"mdi:format-text",email:"mdi:at",role:"mdi:shield-account-outline",createdAt:"mdi:calendar",banned:"mdi:toggle-switch-outline"};function nr(e){let t=tr[e]||"mdi:format-text";return `<th><a href="#" hx-get="/admin/users?page=\${page}&search=\${search}&sort=${e}&order=\${sort === '${e}' && order === 'asc' ? 'desc' : 'asc'}" hx-target="#main-content" hx-push-url="true" class="hover:text-primary flex items-center gap-1.5 transition-colors whitespace-nowrap"><iconify-icon icon="${t}" width="14" height="14" class="opacity-40"></iconify-icon>${e} <span class="text-[10px] opacity-30">\${sort === '${e}' ? (order === 'asc' ? '\u25B2' : '\u25BC') : ''}</span></a></th>`}function Tt(){let e=er.map(nr).join(`
6573
- `),t=C("/admin/users");return `
6699
+ `),t=I("/admin/users");return `
6574
6700
  const tableHtml = html\`
6575
6701
  <div class="bg-base-100 rounded-xl border border-base-200 overflow-hidden">
6576
6702
  <div class="overflow-x-auto">
@@ -6586,7 +6712,7 @@ ${c}
6586
6712
  <tbody>
6587
6713
  \${data.map((row) => html\`
6588
6714
  <tr class="hover:bg-base-200/30 transition-colors">
6589
- <td><div class="truncate max-w-[220px] text-sm font-mono text-xs opacity-60" title="\${String((row as any).id ?? '')}">\${String((row as any).id ?? '')}</div></td>
6715
+ <td><button type="button" class="truncate max-w-[220px] text-sm font-mono text-xs opacity-70 hover:opacity-100 cursor-copy text-left" title="Click to copy: \${String((row as any).id ?? '')}" data-copy-value="\${String((row as any).id ?? '')}" onclick="navigator.clipboard?.writeText(this.dataset.copyValue || '')">\${String((row as any).id ?? '')}</button></td>
6590
6716
  <td><div class="truncate max-w-[220px] text-sm" title="\${String((row as any).name ?? '')}">\${String((row as any).name ?? '')}</div></td>
6591
6717
  <td><div class="truncate max-w-[260px] text-sm" title="\${String((row as any).email ?? '')}">\${String((row as any).email ?? '')}</div></td>
6592
6718
  <td><span class="badge badge-sm \${String((row as any).role ?? '') === 'admin' ? 'badge-primary' : 'badge-ghost'}">\${String((row as any).role ?? '')}</span></td>
@@ -6654,7 +6780,8 @@ ${vt()}
6654
6780
  </div>
6655
6781
  ${t}
6656
6782
  </div>
6657
- \`;`}function Rt(){return `
6783
+ \`;
6784
+ `}function Rt(){return `
6658
6785
  const content = html\`
6659
6786
  <div id="main-content">
6660
6787
  <div class="flex flex-col md:flex-row justify-between items-start md:items-center mb-5 gap-3">
@@ -7107,7 +7234,7 @@ ${Q()}`}function Nt(e){return `
7107
7234
 
7108
7235
  </div>
7109
7236
  </div>
7110
- `}function Ct(e){let t=e.kind==="query",n=e.routePath,r=e.handlerName??e.routePath;return `
7237
+ `}function It(e){let t=e.kind==="query",n=e.routePath,r=e.handlerName??e.routePath;return `
7111
7238
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
7112
7239
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
7113
7240
 
@@ -7663,7 +7790,7 @@ ${Q()}`}function Nt(e){return `
7663
7790
  </div>
7664
7791
  </div>
7665
7792
 
7666
- ${Ct(e)}
7793
+ ${It(e)}
7667
7794
  \`;
7668
7795
 
7669
7796
  if (c.req.header('hx-request')) {
@@ -7673,11 +7800,11 @@ ${Q()}`}function Nt(e){return `
7673
7800
  return c.html(Layout({
7674
7801
  title: "${e.exportName} - Functions",
7675
7802
  children: content
7676
- }));`}function Pt(e){return e.map(n=>n.kind!=="query"&&n.kind!=="mutation"?"":`
7803
+ }));`}function Ct(e){return e.map(n=>n.kind!=="query"&&n.kind!=="mutation"?"":`
7677
7804
  adminApp.get('/functions${n.routePath}', (c) => {
7678
7805
  ${Mt(n)}
7679
7806
  });`).join(`
7680
- `)}function It(){return `
7807
+ `)}function Pt(){return `
7681
7808
  const getStorageBucket = (c: any): R2Bucket | null => {
7682
7809
  const r2Binding = (options as any).r2Binding;
7683
7810
  if (!r2Binding || !c.env[r2Binding]) return null;
@@ -7873,7 +8000,7 @@ ${Q()}`}function Nt(e){return `
7873
8000
  </div>
7874
8001
  \`;
7875
8002
  };
7876
- `}function Et(){return `
8003
+ `}function Ft(){return `
7877
8004
  const handleStorageListRoute = async (c: any) => {
7878
8005
  const bucket = getStorageBucket(c);
7879
8006
  if (!bucket) {
@@ -7895,7 +8022,7 @@ ${Q()}`}function Nt(e){return `
7895
8022
 
7896
8023
  adminApp.get('/storage', handleStorageListRoute);
7897
8024
  adminApp.get('/storage/*', handleStorageListRoute);
7898
- `}function Ot(){return `
8025
+ `}function Et(){return `
7899
8026
  adminApp.post('/storage/upload', async (c) => {
7900
8027
  const bucket = getStorageBucket(c);
7901
8028
  if (!bucket) return c.text("Storage not configured", 400);
@@ -7913,7 +8040,7 @@ ${Q()}`}function Nt(e){return `
7913
8040
 
7914
8041
  return c.redirect(prefixToStoragePath(prefix));
7915
8042
  });
7916
- `}function Ft(){return `
8043
+ `}function Ot(){return `
7917
8044
  adminApp.delete('/storage/delete', async (c) => {
7918
8045
  const bucket = getStorageBucket(c);
7919
8046
  if (!bucket) return c.text("Storage not configured", 400);
@@ -7997,15 +8124,15 @@ ${Q()}`}function Nt(e){return `
7997
8124
 
7998
8125
  ${Bt()}
7999
8126
 
8000
- ${Ot()}
8127
+ ${Et()}
8001
8128
 
8002
- ${Ft()}
8129
+ ${Ot()}
8003
8130
 
8004
8131
  ${jt()}
8005
8132
 
8006
- ${Et()}
8133
+ ${Ft()}
8007
8134
  `}function Wt(){return `
8008
- ${It()}
8135
+ ${Pt()}
8009
8136
 
8010
8137
  ${Dt()}
8011
8138
 
@@ -8461,7 +8588,7 @@ function Layout(props: { children: any; title: string; hideSidebar?: boolean })
8461
8588
  \`
8462
8589
  }));
8463
8590
  });
8464
- `}function Qt(e,t,n){let r=it(t),a=st(r),o=ct(r),i=At(t),s=Pt(n),l=Wt(),u=Lt(a,n),c=zt(),f=Ut(o);return `import { Hono } from "hono";
8591
+ `}function Qt(e,t,n){let r=it(t),a=st(r),o=ct(r),i=At(t),s=Ct(n),l=Wt(),u=Lt(a,n),c=zt(),f=Ut(o);return `import { Hono } from "hono";
8465
8592
  import { html, raw } from "hono/html";
8466
8593
  import { drizzle } from "drizzle-orm/d1";
8467
8594
  import { eq, desc, asc, sql, like, or, inArray } from "drizzle-orm";
@@ -8490,7 +8617,7 @@ ${f}
8490
8617
  app.route('/admin', adminApp);
8491
8618
  app.get('/admin/', (c) => c.redirect('/admin'));
8492
8619
  }
8493
- `}function _(e){if(typeof e!="object"||e===null)return false;let t=e;return t.kind==="schema"&&typeof t.tables=="object"}function P(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase()}function D(e){return e.replace(/[_-]+/g," ").replace(/\s+(.)/g,(t,n)=>n.toUpperCase()).replace(/\s/g,"").replace(/^(.)/,(t,n)=>n.toUpperCase())}function J(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 h(e){return JSON.stringify(e)}function cr(e){if(typeof e=="string")return h(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(e===null)return "null";if(e instanceof Date)return h(e.toISOString());throw new Error(`Unsupported SQL default value '${String(e)}'. Use string, number, boolean, null, or Date.`)}function ur(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}]))}]))}}function I(e,t,n){let r=e.tables[t];return r?r.columns[n]?.type:void 0}function _t(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 Kt(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 Gt(e,t){return `${e}:${t}`}function dr(e,t,n,r){let a=Gt(e,t),o=Gt(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 pr(e,t){return `${e}${D(t)}Links`}function Jt(e,t,n){let r=J(e),a=J(t);return r===a?`${n}${D(r)}Id`:`${r}Id`}function mr(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 gr(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),l=Jt(s.leftTable,s.rightTable,"source"),u=Jt(s.rightTable,s.leftTable,"target"),c={leftTable:s.leftTable,leftReferenceField:s.leftReferenceField,rightTable:s.rightTable,rightReferenceField:s.rightReferenceField,junctionTable:a.junctionTable??pr(s.leftTable,s.rightTable),leftField:s.sourceIsLeft?a.sourceField??l:a.targetField??l,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(c.leftField===c.rightField)throw new Error(`manyToMany pair '${s.key}' resolves to duplicate junction fields '${c.leftField}'. Set sourceField/targetField explicitly.`);let f=t.get(s.key);f?mr(f,c,s.key):t.set(s.key,c),a.referenceField=o,a.targetReferenceField=i,a.junctionTable=c.junctionTable,a.sourceField=s.sourceIsLeft?c.leftField:c.rightField,a.targetField=s.sourceIsLeft?c.rightField:c.leftField,a.sourceSqlName=s.sourceIsLeft?c.leftSqlName:c.rightSqlName,a.targetSqlName=s.sourceIsLeft?c.rightSqlName:c.leftSqlName;}for(let 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=I(e,n.leftTable,n.leftReferenceField)??"string",a=I(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 fr(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 hr(e){fr(e);let t=ur(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 l=I(t,o.targetTable,i)??o.fkType??"string";_t(n,r,s,o.targetTable,i,{fkType:o.fkType,sqlName:o.sqlName,notNull:Kt(`${n}.${a}`,o,true),onDelete:o.onDelete,onUpdate:o.onUpdate},l);}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??`${J(n)}Id`;a.field=s;let l=I(t,n,i)??a.fkType??"string";_t(a.targetTable,o,s,n,i,{fkType:a.fkType,sqlName:a.sqlName,notNull:Kt(`${n}.${a.targetTable}`,a,true),onDelete:a.onDelete,onUpdate:a.onUpdate},l);}return gr(t),t}function Yt(e){return e.primaryKey===true||e.notNull!==true||e.autoIncrement===true||e.sqlDefault!==void 0||e.runtimeDefaultFn!==void 0}function $(e){return e.notNull!==true}function br(e,t,n){let r=t.sqlName??P(e),a=r!==e;return t.type==="int"?a?`t.int(${h(r)})`:"t.int()":t.type==="string"?t.length!==void 0?a?`t.text(${h(r)}, { length: ${t.length} })`:`t.text({ length: ${t.length} })`:a?`t.text(${h(r)})`:"t.text()":t.type==="boolean"?a?`t.int(${h(r)}, { mode: "boolean" })`:'t.int({ mode: "boolean" })':t.type==="date"?a?`t.int(${h(r)}, { mode: "timestamp_ms" })`:'t.int({ mode: "timestamp_ms" })':n==="camelToSnake"&&a?`t.text(${h(r)})`:"t.text()"}function yr(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 wr(e){return e.size===0?"":`import { ${Array.from(e).sort().join(", ")} } from "./auth.schema";
8620
+ `}function _(e){if(typeof e!="object"||e===null)return false;let t=e;return t.kind==="schema"&&typeof t.tables=="object"}function C(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase()}function D(e){return e.replace(/[_-]+/g," ").replace(/\s+(.)/g,(t,n)=>n.toUpperCase()).replace(/\s/g,"").replace(/^(.)/,(t,n)=>n.toUpperCase())}function J(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 h(e){return JSON.stringify(e)}function cr(e){if(typeof e=="string")return h(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(e===null)return "null";if(e instanceof Date)return h(e.toISOString());throw new Error(`Unsupported SQL default value '${String(e)}'. Use string, number, boolean, null, or Date.`)}function ur(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}]))}]))}}function P(e,t,n){let r=e.tables[t];return r?r.columns[n]?.type:void 0}function _t(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 Kt(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 Gt(e,t){return `${e}:${t}`}function dr(e,t,n,r){let a=Gt(e,t),o=Gt(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 pr(e,t){return `${e}${D(t)}Links`}function Jt(e,t,n){let r=J(e),a=J(t);return r===a?`${n}${D(r)}Id`:`${r}Id`}function mr(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 gr(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),l=Jt(s.leftTable,s.rightTable,"source"),u=Jt(s.rightTable,s.leftTable,"target"),c={leftTable:s.leftTable,leftReferenceField:s.leftReferenceField,rightTable:s.rightTable,rightReferenceField:s.rightReferenceField,junctionTable:a.junctionTable??pr(s.leftTable,s.rightTable),leftField:s.sourceIsLeft?a.sourceField??l:a.targetField??l,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(c.leftField===c.rightField)throw new Error(`manyToMany pair '${s.key}' resolves to duplicate junction fields '${c.leftField}'. Set sourceField/targetField explicitly.`);let f=t.get(s.key);f?mr(f,c,s.key):t.set(s.key,c),a.referenceField=o,a.targetReferenceField=i,a.junctionTable=c.junctionTable,a.sourceField=s.sourceIsLeft?c.leftField:c.rightField,a.targetField=s.sourceIsLeft?c.rightField:c.leftField,a.sourceSqlName=s.sourceIsLeft?c.leftSqlName:c.rightSqlName,a.targetSqlName=s.sourceIsLeft?c.rightSqlName:c.leftSqlName;}for(let 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=P(e,n.leftTable,n.leftReferenceField)??"string",a=P(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 fr(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 hr(e){fr(e);let t=ur(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 l=P(t,o.targetTable,i)??o.fkType??"string";_t(n,r,s,o.targetTable,i,{fkType:o.fkType,sqlName:o.sqlName,notNull:Kt(`${n}.${a}`,o,true),onDelete:o.onDelete,onUpdate:o.onUpdate},l);}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??`${J(n)}Id`;a.field=s;let l=P(t,n,i)??a.fkType??"string";_t(a.targetTable,o,s,n,i,{fkType:a.fkType,sqlName:a.sqlName,notNull:Kt(`${n}.${a.targetTable}`,a,true),onDelete:a.onDelete,onUpdate:a.onUpdate},l);}return gr(t),t}function Yt(e){return e.primaryKey===true||e.notNull!==true||e.autoIncrement===true||e.sqlDefault!==void 0||e.runtimeDefaultFn!==void 0}function $(e){return e.notNull!==true}function br(e,t,n){let r=t.sqlName??C(e),a=r!==e;return t.type==="int"?a?`t.int(${h(r)})`:"t.int()":t.type==="string"?t.length!==void 0?a?`t.text(${h(r)}, { length: ${t.length} })`:`t.text({ length: ${t.length} })`:a?`t.text(${h(r)})`:"t.text()":t.type==="boolean"?a?`t.int(${h(r)}, { mode: "boolean" })`:'t.int({ mode: "boolean" })':t.type==="date"?a?`t.int(${h(r)}, { mode: "timestamp_ms" })`:'t.int({ mode: "timestamp_ms" })':n==="camelToSnake"&&a?`t.text(${h(r)})`:"t.text()"}function yr(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 wr(e){return e.size===0?"":`import { ${Array.from(e).sort().join(", ")} } from "./auth.schema";
8494
8621
  `}function xr(e){return Object.values(e.relations).filter(t=>t.relation==="one").map(t=>t.targetTable)}function vr(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 Tr(e){let t=[];for(let[n,r]of Object.entries(e.tables)){let a=[];for(let[o,i]of Object.entries(r.relations))i.relation==="manyToMany"&&i.junctionTable&&a.push(`${h(o)}: {
8495
8622
  targetTable: ${h(i.targetTable)},
8496
8623
  junctionTable: ${h(i.junctionTable)},
@@ -8530,7 +8657,7 @@ ${a.map(o=>` ${o}`).join(`
8530
8657
  ${t.map(n=>` ${n}`).join(`
8531
8658
  `)}
8532
8659
  } as const;
8533
- `}function kr(e,t){let n=new Set(Object.keys(e.tables)),r=new Set;for(let i of Object.values(e.tables)){for(let s of xr(i))n.has(s)||r.add(s);for(let s of Object.values(i.columns))s.references&&!n.has(s.references.table)&&r.add(s.references.table);}let a=[],o=[];for(let[i,s]of Object.entries(e.tables)){let l=s.sqlName??P(i),u=[],c=[];for(let[b,m]of Object.entries(s.columns)){let x=br(b,m,t);m.uuidPrimaryKey&&(x+=".$defaultFn(() => crypto.randomUUID())"),m.primaryKey&&(x+=m.autoIncrement?".primaryKey({ autoIncrement: true })":".primaryKey()"),m.notNull&&(x+=".notNull()"),m.sqlDefault!==void 0&&(x+=`.default(${cr(m.sqlDefault)})`);let v=vr(b,m,s);if(v)if(m.references?.onDelete||m.references?.onUpdate){let R=[];m.references.onDelete&&R.push(`onDelete: ${h(m.references.onDelete)}`),m.references.onUpdate&&R.push(`onUpdate: ${h(m.references.onUpdate)}`),x+=`.references(() => ${v.tableName}.${v.fieldName}, { ${R.join(", ")} })`;}else x+=`.references(() => ${v.tableName}.${v.fieldName})`;if(m.unique){let R=typeof m.unique=="object"&&m.unique.name?m.unique.name:`${l}_${P(b)}_unique_idx`;c.push(` t.uniqueIndex(${h(R)}).on(table.${b})`);}if(m.index){let R=typeof m.index=="object"&&m.index.name?m.index.name:`${l}_${P(b)}_idx`;c.push(` t.index(${h(R)}).on(table.${b})`);}u.push(` ${b}: ${x},`);}c.length>0?a.push(`export const ${i} = table(
8660
+ `}function kr(e,t){let n=new Set(Object.keys(e.tables)),r=new Set;for(let i of Object.values(e.tables)){for(let s of xr(i))n.has(s)||r.add(s);for(let s of Object.values(i.columns))s.references&&!n.has(s.references.table)&&r.add(s.references.table);}let a=[],o=[];for(let[i,s]of Object.entries(e.tables)){let l=s.sqlName??C(i),u=[],c=[];for(let[b,m]of Object.entries(s.columns)){let x=br(b,m,t);m.uuidPrimaryKey&&(x+=".$defaultFn(() => crypto.randomUUID())"),m.primaryKey&&(x+=m.autoIncrement?".primaryKey({ autoIncrement: true })":".primaryKey()"),m.notNull&&(x+=".notNull()"),m.sqlDefault!==void 0&&(x+=`.default(${cr(m.sqlDefault)})`);let v=vr(b,m,s);if(v)if(m.references?.onDelete||m.references?.onUpdate){let R=[];m.references.onDelete&&R.push(`onDelete: ${h(m.references.onDelete)}`),m.references.onUpdate&&R.push(`onUpdate: ${h(m.references.onUpdate)}`),x+=`.references(() => ${v.tableName}.${v.fieldName}, { ${R.join(", ")} })`;}else x+=`.references(() => ${v.tableName}.${v.fieldName})`;if(m.unique){let R=typeof m.unique=="object"&&m.unique.name?m.unique.name:`${l}_${C(b)}_unique_idx`;c.push(` t.uniqueIndex(${h(R)}).on(table.${b})`);}if(m.index){let R=typeof m.index=="object"&&m.index.name?m.index.name:`${l}_${C(b)}_idx`;c.push(` t.index(${h(R)}).on(table.${b})`);}u.push(` ${b}: ${x},`);}c.length>0?a.push(`export const ${i} = table(
8534
8661
  ${h(l)},
8535
8662
  {
8536
8663
  ${u.join(`
@@ -8589,11 +8716,11 @@ ${i.join(`
8589
8716
  };`);}return `${t.join(`
8590
8717
 
8591
8718
  `)}
8592
- `}function $r(e,t){if(t){let n=e[t];if(!_(n))throw new Error(`schemaDsl.exportName '${t}' does not point to a schema() export.`);return n}for(let n of Object.values(e))if(_(n))return n;throw new Error("No schema() export found in schemaDsl entry module. Set schemaDsl.exportName to the correct export.")}async function Xt(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")),l=await import(`${url.pathToFileURL(r).href}?t=${Date.now()}`),u=$r(l,t.exportName),c=hr(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 f=kr(c,n),d=Nr(c),y=Sr(c);return await Promise.all([Bun.write(a,f),Bun.write(o,d),Bun.write(i,y)]),{schemaPath:a,typesPath:o,zodPath:i,tableNames:Object.keys(c.tables)}}function Cr(e){return e.replaceAll("\\","/")}function A(e,t){let n=Cr(path.relative(e,t)).replace(/\.tsx?$/,"");return n.startsWith(".")?n:`./${n}`}var Dr=new Set([".ts",".tsx",".mts",".cts"]);async function rn(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 rn(a));continue}r.isFile()&&Dr.has(path.extname(r.name))&&n.push(a);}return n}function Z(e){return e.replace(/\.[cm]?tsx?$/,"")}function Er(e,t){let n=e,r=false,a,o="unknown";for(;g__namespace.isCallExpression(n);){let i=n.expression;if(!g__namespace.isPropertyAccessExpression(i))break;let s=i.name.text;if(s==="optional"||s==="nullable")r=true,n=i.expression;else if(s==="default"){r=true;let l=n.arguments[0];l&&(g__namespace.isStringLiteral(l)||g__namespace.isNumericLiteral(l)?a=l.text:l.kind===g__namespace.SyntaxKind.TrueKeyword?a="true":l.kind===g__namespace.SyntaxKind.FalseKeyword&&(a="false")),n=i.expression;}else if(s==="string"||s==="uuid"||s==="email"||s==="url"){o="string";break}else if(s==="number"||s==="int"||s==="float"){o="number";break}else if(s==="boolean"){o="boolean";break}else n=i.expression;}return {name:t,type:o,optional:r,defaultValue:a}}function Or(e){if(!e||!g__namespace.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>g__namespace.isPropertyAssignment(r)&&g__namespace.isIdentifier(r.name)&&r.name.text==="args");if(!t||!g__namespace.isObjectLiteralExpression(t.initializer))return [];let n=[];for(let r of t.initializer.properties)!g__namespace.isPropertyAssignment(r)||!g__namespace.isIdentifier(r.name)||n.push(Er(r.initializer,r.name.text));return n}function Fr(e){return g__namespace.isVariableStatement(e)?e.modifiers?.some(t=>t.kind===g__namespace.SyntaxKind.ExportKeyword)??false:false}function an(e){return g__namespace.isIdentifier(e)?e.text:g__namespace.isParenthesizedExpression(e)?an(e.expression):null}function jr(e){if(!e||!g__namespace.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>!g__namespace.isPropertyAssignment(r)||!g__namespace.isIdentifier(r.name)?false:r.name.text==="cronTrigger");if(!t||!g__namespace.isPropertyAssignment(t))return [];let n=t.initializer;return g__namespace.isStringLiteral(n)||g__namespace.isNoSubstitutionTemplateLiteral(n)?[n.text.trim()].filter(r=>r.length>0):g__namespace.isArrayLiteralExpression(n)?n.elements.map(r=>g__namespace.isStringLiteral(r)||g__namespace.isNoSubstitutionTemplateLiteral(r)?r.text.trim():"").filter(r=>r.length>0):[]}function Vr(e,t){let n=g__namespace.createSourceFile(t,e,g__namespace.ScriptTarget.Latest,true,g__namespace.ScriptKind.TS),r=[];for(let a of n.statements)if(Fr(a))for(let o of a.declarationList.declarations){if(!g__namespace.isIdentifier(o.name)||!o.initializer||!g__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"?jr(o.initializer.arguments[0]):[],args:i==="query"||i==="mutation"?Or(o.initializer.arguments[0]):[]});}return r}function en(e,t,n){let r=t.replace(/\\/g,"/"),o=Z(r).split("/").filter(Boolean);return `/${[e,...o,n].filter(Boolean).map(s=>s.trim()).filter(s=>s.length>0).join("/")}`}function Br(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 tn(e,t){let n=e.replace(/\\/g,"/"),a=Z(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 on(e){let t=[],n=await rn(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),l=Vr(i,a),u=[{kind:"query",kindDirectory:"queries",exports:l.filter(c=>c.kind==="query")},{kind:"mutation",kindDirectory:"mutations",exports:l.filter(c=>c.kind==="mutation")},{kind:"scheduler",kindDirectory:"schedulers",exports:l.filter(c=>c.kind==="scheduler")},{kind:"cron",kindDirectory:"crons",exports:l.filter(c=>c.kind==="cron")},{kind:"storage",kindDirectory:"queries",exports:l.filter(c=>c.kind==="storage")}];for(let c of u){if(c.exports.length===0)continue;let f=Br(s,c.kindDirectory);for(let d of c.exports){let y=c.kind==="query"||c.kind==="mutation"?tn(f,d.exportName):void 0,w=c.kind==="scheduler"||c.kind==="cron"?tn(f,d.exportName):void 0,b=c.kind==="query"||c.kind==="mutation"?[...Z(f).split("/").filter(Boolean),d.exportName]:void 0,m=c.kind==="query"?en("queries",f,d.exportName):c.kind==="mutation"?en("mutations",f,d.exportName):c.kind==="storage"?`/storage/managers/${d.exportName}`:`/${c.kindDirectory}/${w}`;t.push({kind:c.kind,exportName:d.exportName,filePath:a,importPath:A(e.outDirAbs,a),clientImportPath:A(path.resolve(e.outDirAbs,"client"),a),routePath:m,handlerName:y,clientSegments:b,taskName:w,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 Wr(e){let t=[],n="",r=0,a=0,o=0,i=false,s=false,l=false,u=false;for(let f=0;f<e.length;f+=1){let d=e[f];if(u){n+=d,u=false;continue}if(d==="\\"){n+=d,u=true;continue}if(!s&&!l&&d==="'"){i=!i,n+=d;continue}if(!i&&!l&&d==='"'){s=!s,n+=d;continue}if(!i&&!s&&d==="`"){l=!l,n+=d;continue}if(i||s||l){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 c=n.trim();return c.length>0&&t.push(c),t}function Lr(e){let t=0,n=0,r=0,a=false,o=false,i=false,s=false;for(let l=0;l<e.length;l+=1){let u=e[l];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 l}}return -1}function zr(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":/\.(text|varchar|char)\s*\(/.test(t)?"string":/\.(boolean|bool)\s*\(/.test(t)?"boolean":"unknown"}function Ur(e){let t=Wr(e),n=[];for(let r of t){let a=Lr(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),l=/autoincrement\s*:\s*true/i.test(i),u=/\.default\s*\(/i.test(i),f=!/\.notnull\s*\(/i.test(i)||u||l||s;n.push({name:o,expression:i,type:zr(i),optional:f,primaryKey:s,autoIncrement:l});}return n}function Qr(e){let t=/export\s+const\s+(\w+)\s*=\s*table\s*\(\s*["'`]([^"'`]+)["'`]/g,n=[],r=(o,i)=>{let s=0,l=false,u=false,c=false,f=false;for(let d=i;d<o.length;d+=1){let y=o[d];if(f){f=false;continue}if(y==="\\"){f=true;continue}if(!u&&!c&&y==="'"){l=!l;continue}if(!l&&!c&&y==='"'){u=!u;continue}if(!l&&!u&&y==="`"){c=!c;continue}if(!(l||u||c)){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 l=r(e,s);if(l===-1){a=t.exec(e);continue}let u=e.slice(s+1,l);n.push({exportName:o,tableName:i,columns:Ur(u)}),a=t.exec(e);}return n}async function ln(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 ln(a));continue}r.isFile()&&r.name==="schema.ts"&&n.push(a);}return n}async function cn(e,t=[]){let n=await ln(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(),l=Qr(s);if(l.length>0)return {schemaPath:o,tables:l}}throw new Error(`Unable to discover schema.ts under scanDir (${e.scanDirAbs}) or fallback (${r}).`)}function _r(e,t){let n=path.relative(e,t).replace(/\\/g,"/");return n.startsWith(".")?n:`./${n}`}async function un(e){let{outDirAbs:t,wranglerOutDirAbs:n,config:r,configPath:a,configDir:o}=e,i=A(t,a),s=path.resolve(t,"client"),l=A(s,a);await Promise.all([promises.mkdir(t,{recursive:true}),promises.mkdir(s,{recursive:true}),promises.mkdir(n,{recursive:true})]);let u=path.resolve(t,"server.ts"),c=path.resolve(t,"client.ts"),f=path.resolve(t,"auth.config.ts"),d=path.resolve(t,"auth.schema.ts"),y=path.resolve(t,"drizzle.config.ts"),w=path.resolve(n,"wrangler.json"),b=await Xt(e),m=await cn(e,b?[b.schemaPath]:[]),x=A(t,m.schemaPath),v=await on(e),R=rt(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),xn=le(l,v),vn=H(x,v,r.r2[0]?.binding),Tn=te(i),Rn=b?[_r(o,b.schemaPath),...r.schema.filter(k=>!/(^|\/)schema\.ts$/.test(k))]:r.schema,kn=ce(Rn),Sn=ot(e,v),An=Qt(x,m,v),Nn=path.resolve(t,"admin.routes.ts"),$n=vn.map(k=>Bun.write(path.resolve(t,k.relativePath),k.source)),qn=xn.map(k=>Bun.write(path.resolve(t,k.relativePath),k.source));await Promise.all([Bun.write(u,R),Bun.write(c,`export * from "./client/index";
8719
+ `}function $r(e,t){if(t){let n=e[t];if(!_(n))throw new Error(`schemaDsl.exportName '${t}' does not point to a schema() export.`);return n}for(let n of Object.values(e))if(_(n))return n;throw new Error("No schema() export found in schemaDsl entry module. Set schemaDsl.exportName to the correct export.")}async function Xt(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")),l=await import(`${url.pathToFileURL(r).href}?t=${Date.now()}`),u=$r(l,t.exportName),c=hr(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 f=kr(c,n),d=Nr(c),y=Sr(c);return await Promise.all([Bun.write(a,f),Bun.write(o,d),Bun.write(i,y)]),{schemaPath:a,typesPath:o,zodPath:i,tableNames:Object.keys(c.tables)}}function Ir(e){return e.replaceAll("\\","/")}function A(e,t){let n=Ir(path.relative(e,t)).replace(/\.tsx?$/,"");return n.startsWith(".")?n:`./${n}`}var Dr=new Set([".ts",".tsx",".mts",".cts"]);async function rn(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 rn(a));continue}r.isFile()&&Dr.has(path.extname(r.name))&&n.push(a);}return n}function Z(e){return e.replace(/\.[cm]?tsx?$/,"")}function Fr(e,t){let n=e,r=false,a,o="unknown";for(;g__namespace.isCallExpression(n);){let i=n.expression;if(!g__namespace.isPropertyAccessExpression(i))break;let s=i.name.text;if(s==="optional"||s==="nullable")r=true,n=i.expression;else if(s==="default"){r=true;let l=n.arguments[0];l&&(g__namespace.isStringLiteral(l)||g__namespace.isNumericLiteral(l)?a=l.text:l.kind===g__namespace.SyntaxKind.TrueKeyword?a="true":l.kind===g__namespace.SyntaxKind.FalseKeyword&&(a="false")),n=i.expression;}else if(s==="string"||s==="uuid"||s==="email"||s==="url"){o="string";break}else if(s==="number"||s==="int"||s==="float"){o="number";break}else if(s==="boolean"){o="boolean";break}else n=i.expression;}return {name:t,type:o,optional:r,defaultValue:a}}function Er(e){if(!e||!g__namespace.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>g__namespace.isPropertyAssignment(r)&&g__namespace.isIdentifier(r.name)&&r.name.text==="args");if(!t||!g__namespace.isObjectLiteralExpression(t.initializer))return [];let n=[];for(let r of t.initializer.properties)!g__namespace.isPropertyAssignment(r)||!g__namespace.isIdentifier(r.name)||n.push(Fr(r.initializer,r.name.text));return n}function Or(e){return g__namespace.isVariableStatement(e)?e.modifiers?.some(t=>t.kind===g__namespace.SyntaxKind.ExportKeyword)??false:false}function an(e){return g__namespace.isIdentifier(e)?e.text:g__namespace.isParenthesizedExpression(e)?an(e.expression):null}function jr(e){if(!e||!g__namespace.isObjectLiteralExpression(e))return [];let t=e.properties.find(r=>!g__namespace.isPropertyAssignment(r)||!g__namespace.isIdentifier(r.name)?false:r.name.text==="cronTrigger");if(!t||!g__namespace.isPropertyAssignment(t))return [];let n=t.initializer;return g__namespace.isStringLiteral(n)||g__namespace.isNoSubstitutionTemplateLiteral(n)?[n.text.trim()].filter(r=>r.length>0):g__namespace.isArrayLiteralExpression(n)?n.elements.map(r=>g__namespace.isStringLiteral(r)||g__namespace.isNoSubstitutionTemplateLiteral(r)?r.text.trim():"").filter(r=>r.length>0):[]}function Vr(e,t){let n=g__namespace.createSourceFile(t,e,g__namespace.ScriptTarget.Latest,true,g__namespace.ScriptKind.TS),r=[];for(let a of n.statements)if(Or(a))for(let o of a.declarationList.declarations){if(!g__namespace.isIdentifier(o.name)||!o.initializer||!g__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"?jr(o.initializer.arguments[0]):[],args:i==="query"||i==="mutation"?Er(o.initializer.arguments[0]):[]});}return r}function en(e,t,n){let r=t.replace(/\\/g,"/"),o=Z(r).split("/").filter(Boolean);return `/${[e,...o,n].filter(Boolean).map(s=>s.trim()).filter(s=>s.length>0).join("/")}`}function Br(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 tn(e,t){let n=e.replace(/\\/g,"/"),a=Z(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 on(e){let t=[],n=await rn(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),l=Vr(i,a),u=[{kind:"query",kindDirectory:"queries",exports:l.filter(c=>c.kind==="query")},{kind:"mutation",kindDirectory:"mutations",exports:l.filter(c=>c.kind==="mutation")},{kind:"scheduler",kindDirectory:"schedulers",exports:l.filter(c=>c.kind==="scheduler")},{kind:"cron",kindDirectory:"crons",exports:l.filter(c=>c.kind==="cron")},{kind:"storage",kindDirectory:"queries",exports:l.filter(c=>c.kind==="storage")}];for(let c of u){if(c.exports.length===0)continue;let f=Br(s,c.kindDirectory);for(let d of c.exports){let y=c.kind==="query"||c.kind==="mutation"?tn(f,d.exportName):void 0,w=c.kind==="scheduler"||c.kind==="cron"?tn(f,d.exportName):void 0,b=c.kind==="query"||c.kind==="mutation"?[...Z(f).split("/").filter(Boolean),d.exportName]:void 0,m=c.kind==="query"?en("queries",f,d.exportName):c.kind==="mutation"?en("mutations",f,d.exportName):c.kind==="storage"?`/storage/managers/${d.exportName}`:`/${c.kindDirectory}/${w}`;t.push({kind:c.kind,exportName:d.exportName,filePath:a,importPath:A(e.outDirAbs,a),clientImportPath:A(path.resolve(e.outDirAbs,"client"),a),routePath:m,handlerName:y,clientSegments:b,taskName:w,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 Wr(e){let t=[],n="",r=0,a=0,o=0,i=false,s=false,l=false,u=false;for(let f=0;f<e.length;f+=1){let d=e[f];if(u){n+=d,u=false;continue}if(d==="\\"){n+=d,u=true;continue}if(!s&&!l&&d==="'"){i=!i,n+=d;continue}if(!i&&!l&&d==='"'){s=!s,n+=d;continue}if(!i&&!s&&d==="`"){l=!l,n+=d;continue}if(i||s||l){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 c=n.trim();return c.length>0&&t.push(c),t}function Lr(e){let t=0,n=0,r=0,a=false,o=false,i=false,s=false;for(let l=0;l<e.length;l+=1){let u=e[l];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 l}}return -1}function zr(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":/\.(text|varchar|char)\s*\(/.test(t)?"string":/\.(boolean|bool)\s*\(/.test(t)?"boolean":"unknown"}function Ur(e){let t=Wr(e),n=[];for(let r of t){let a=Lr(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),l=/autoincrement\s*:\s*true/i.test(i),u=/\.default\s*\(/i.test(i),f=!/\.notnull\s*\(/i.test(i)||u||l||s;n.push({name:o,expression:i,type:zr(i),optional:f,primaryKey:s,autoIncrement:l});}return n}function Qr(e){let t=/export\s+const\s+(\w+)\s*=\s*table\s*\(\s*["'`]([^"'`]+)["'`]/g,n=[],r=(o,i)=>{let s=0,l=false,u=false,c=false,f=false;for(let d=i;d<o.length;d+=1){let y=o[d];if(f){f=false;continue}if(y==="\\"){f=true;continue}if(!u&&!c&&y==="'"){l=!l;continue}if(!l&&!c&&y==='"'){u=!u;continue}if(!l&&!u&&y==="`"){c=!c;continue}if(!(l||u||c)){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 l=r(e,s);if(l===-1){a=t.exec(e);continue}let u=e.slice(s+1,l);n.push({exportName:o,tableName:i,columns:Ur(u)}),a=t.exec(e);}return n}async function ln(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 ln(a));continue}r.isFile()&&r.name==="schema.ts"&&n.push(a);}return n}async function cn(e,t=[]){let n=await ln(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(),l=Qr(s);if(l.length>0)return {schemaPath:o,tables:l}}throw new Error(`Unable to discover schema.ts under scanDir (${e.scanDirAbs}) or fallback (${r}).`)}function _r(e,t){let n=path.relative(e,t).replace(/\\/g,"/");return n.startsWith(".")?n:`./${n}`}async function un(e){let{outDirAbs:t,wranglerOutDirAbs:n,config:r,configPath:a,configDir:o}=e,i=A(t,a),s=path.resolve(t,"client"),l=A(s,a);await Promise.all([promises.mkdir(t,{recursive:true}),promises.mkdir(s,{recursive:true}),promises.mkdir(n,{recursive:true})]);let u=path.resolve(t,"server.ts"),c=path.resolve(t,"client.ts"),f=path.resolve(t,"auth.config.ts"),d=path.resolve(t,"auth.schema.ts"),y=path.resolve(t,"drizzle.config.ts"),w=path.resolve(n,"wrangler.json"),b=await Xt(e),m=await cn(e,b?[b.schemaPath]:[]),x=A(t,m.schemaPath),v=await on(e),R=rt(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),xn=le(l,v),vn=H(x,v,r.r2[0]?.binding),Tn=te(i),Rn=b?[_r(o,b.schemaPath),...r.schema.filter(k=>!/(^|\/)schema\.ts$/.test(k))]:r.schema,kn=ce(Rn),Sn=ot(e,v),An=Qt(x,m,v),Nn=path.resolve(t,"admin.routes.ts"),$n=vn.map(k=>Bun.write(path.resolve(t,k.relativePath),k.source)),qn=xn.map(k=>Bun.write(path.resolve(t,k.relativePath),k.source));await Promise.all([Bun.write(u,R),Bun.write(c,`export * from "./client/index";
8593
8720
  `),...qn,...$n,Bun.write(f,Tn),Bun.write(d,""),Bun.write(y,kn),Bun.write(w,`${JSON.stringify(Sn,null,2)}
8594
- `),Bun.write(Nn,An)]);let F=path.relative(o,f).replace(/\\/g,"/"),Cn=F.startsWith(".")?F:`./${F}`,j=path.relative(o,d).replace(/\\/g,"/"),Mn=j.startsWith(".")?j:`./${j}`,ee=await Bun.spawn(["npx","@better-auth/cli","generate","--config",Cn,"--output",Mn,"--yes"],{cwd:o,stdout:"inherit",stderr:"inherit"}).exited;if(ee!==0)throw new Error(`better-auth generation failed with exit code ${ee}`)}var dn=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(),pn=zod.z.object({binding:zod.z.string().min(1),id:zod.z.string().min(1),previewId:zod.z.string().min(1).optional()}).strict(),mn=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(),gn=zod.z.object({enabled:zod.z.boolean().optional(),binding:zod.z.string().min(1).optional(),queue:zod.z.string().min(1).optional()}).strict(),Zr=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(),Yr=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([dn,zod.z.array(dn).min(1)]),kv:zod.z.union([pn,zod.z.array(pn)]).optional(),r2:zod.z.union([mn,zod.z.array(mn)]).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:gn.optional(),realtime:Zr.optional(),wranglerOverrides:zod.z.record(zod.z.string(),zod.z.unknown()).optional()}).strict();function fn(e){return typeof e=="object"&&e!==null}function Xr(e){let t=fn(e.wranglerOverrides)?e.wranglerOverrides.scheduler:void 0,n=gn.safeParse(t);return n.success?n.data:{}}function ea(e){if(!fn(e)||!("scheduler"in e))return e;let{scheduler:t,...n}=e;return n}function ta(e){let n={...Xr(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:ea(e.wranglerOverrides),wranglerOutDir:e.wranglerOutDir??e.wranglerOutPath??e.outDir}}async function q(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=Yr.parse(o),s=ta(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 oa(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 O(e){let t=await q(e);if(await un(t),t.wranglerOutDirAbs===t.outDirAbs){process.stdout.write(`\u2705 Generated artifacts in ${t.outDirAbs}
8721
+ `),Bun.write(Nn,An)]);let O=path.relative(o,f).replace(/\\/g,"/"),In=O.startsWith(".")?O:`./${O}`,j=path.relative(o,d).replace(/\\/g,"/"),Mn=j.startsWith(".")?j:`./${j}`,ee=await Bun.spawn(["npx","@better-auth/cli","generate","--config",In,"--output",Mn,"--yes"],{cwd:o,stdout:"inherit",stderr:"inherit"}).exited;if(ee!==0)throw new Error(`better-auth generation failed with exit code ${ee}`)}var dn=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(),pn=zod.z.object({binding:zod.z.string().min(1),id:zod.z.string().min(1),previewId:zod.z.string().min(1).optional()}).strict(),mn=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(),gn=zod.z.object({enabled:zod.z.boolean().optional(),binding:zod.z.string().min(1).optional(),queue:zod.z.string().min(1).optional()}).strict(),Zr=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(),Yr=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([dn,zod.z.array(dn).min(1)]),kv:zod.z.union([pn,zod.z.array(pn)]).optional(),r2:zod.z.union([mn,zod.z.array(mn)]).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:gn.optional(),realtime:Zr.optional(),wranglerOverrides:zod.z.record(zod.z.string(),zod.z.unknown()).optional()}).strict();function fn(e){return typeof e=="object"&&e!==null}function Xr(e){let t=fn(e.wranglerOverrides)?e.wranglerOverrides.scheduler:void 0,n=gn.safeParse(t);return n.success?n.data:{}}function ea(e){if(!fn(e)||!("scheduler"in e))return e;let{scheduler:t,...n}=e;return n}function ta(e){let n={...Xr(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:ea(e.wranglerOverrides),wranglerOutDir:e.wranglerOutDir??e.wranglerOutPath??e.outDir}}async function q(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=Yr.parse(o),s=ta(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 oa(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 E(e){let t=await q(e);if(await un(t),t.wranglerOutDirAbs===t.outDirAbs){process.stdout.write(`\u2705 Generated artifacts in ${t.outDirAbs}
8595
8722
  `);return}process.stdout.write(`\u2705 Generated server/client in ${t.outDirAbs} and wrangler.json in ${t.wranglerOutDirAbs}
8596
- `);}async function bn(e,t=false){if(await O(e),!t)return;let n=await q(e),r=false,a=false,o=async()=>{if(r){a=true;return}r=true;try{await O(e);}catch(s){process.stderr.write(`\u274C Build failed: ${s.message}
8723
+ `);}async function bn(e,t=false){if(await E(e),!t)return;let n=await q(e),r=false,a=false,o=async()=>{if(r){a=true;return}r=true;try{await E(e);}catch(s){process.stderr.write(`\u274C Build failed: ${s.message}
8597
8724
  `);}finally{r=false,a&&(a=false,await o());}};na__default.default.watch(n.scanDirAbs,{ignoreInitial:true}).on("all",async(s,l)=>{process.stdout.write(`\u{1F504} Change detected: ${l}
8598
8725
  `),await o();}),process.stdout.write(`\u{1F440} Watching ${n.scanDirAbs}
8599
- `);}async function yn(e,t={}){let n=await q(e),r=oa(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.ts"),i=process.platform==="win32"?"npx.cmd":"npx",l=await Bun.spawn([i,"drizzle-kit","generate","--config",o],{cwd:r,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(l!==0)throw new Error(`drizzle-kit generate failed with exit code ${l}`);let u=n.config.database[0].databaseName,c=[i,"wrangler","d1","migrations","apply",u];t.local?c.push("--local"):t.remote?c.push("--remote"):t.preview&&c.push("--preview");let d=await Bun.spawn(c,{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 wn(e,t={name:"",email:"",password:""}){let n=await q(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(),l=Date.now(),u=t.name.replace(/'/g,"''"),c=t.email.replace(/'/g,"''"),f=["INSERT INTO users (id, name, email, email_verified, created_at, updated_at, role, banned)",`VALUES ('${i}', '${u}', '${c}', 1, ${l}, ${l}, 'admin', 0);`,"INSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)",`VALUES ('${s}', '${c}', 'credential', '${i}', '${o}', ${l}, ${l});`].join(" "),d=n.config.database[0].databaseName,w=[process.platform==="win32"?"npx.cmd":"npx","wrangler","d1","execute",d,`--command=${f}`];t.local?w.push("--local"):t.remote&&w.push("--remote");let m=await Bun.spawn(w,{cwd:n.configDir,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(m!==0)throw new Error(`Failed to add admin user. wrangler d1 execute exited with code ${m}`);console.log("\u2705 Admin user "+t.email+" created successfully!");}var N=new commander.Command;N.name("appflare").description("Appflare compiler/bundler for Cloudflare-native backends and SDK generation").version("0.0.28");N.command("build").description("Generate server.ts, client.ts, auth.config.ts, drizzle.config.ts, and wrangler.json artifacts").option("-c, --config <path>","Path to appflare.config.ts","appflare.config.ts").action(async e=>{await O(e.config);});N.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).action(async e=>{await bn(e.config,e.watch);});N.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 yn(e.config,{local:e.local,remote:e.remote,preview:e.preview});});N.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 wn(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 N.parseAsync(process.argv);})().catch(e=>{console.error(e),process.exit(1);});
8726
+ `);}async function yn(e,t={}){let n=await q(e),r=oa(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.ts"),i=process.platform==="win32"?"npx.cmd":"npx",l=await Bun.spawn([i,"drizzle-kit","generate","--config",o],{cwd:r,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(l!==0)throw new Error(`drizzle-kit generate failed with exit code ${l}`);let u=n.config.database[0].databaseName,c=[i,"wrangler","d1","migrations","apply",u];t.local?c.push("--local"):t.remote?c.push("--remote"):t.preview&&c.push("--preview");let d=await Bun.spawn(c,{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 wn(e,t={name:"",email:"",password:""}){let n=await q(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(),l=Date.now(),u=t.name.replace(/'/g,"''"),c=t.email.replace(/'/g,"''"),f=["INSERT INTO users (id, name, email, email_verified, created_at, updated_at, role, banned)",`VALUES ('${i}', '${u}', '${c}', 1, ${l}, ${l}, 'admin', 0);`,"INSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)",`VALUES ('${s}', '${c}', 'credential', '${i}', '${o}', ${l}, ${l});`].join(" "),d=n.config.database[0].databaseName,w=[process.platform==="win32"?"npx.cmd":"npx","wrangler","d1","execute",d,`--command=${f}`];t.local?w.push("--local"):t.remote&&w.push("--remote");let m=await Bun.spawn(w,{cwd:n.configDir,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(m!==0)throw new Error(`Failed to add admin user. wrangler d1 execute exited with code ${m}`);console.log("\u2705 Admin user "+t.email+" created successfully!");}var N=new commander.Command;N.name("appflare").description("Appflare compiler/bundler for Cloudflare-native backends and SDK generation").version("0.0.28");N.command("build").description("Generate server.ts, client.ts, auth.config.ts, drizzle.config.ts, and wrangler.json artifacts").option("-c, --config <path>","Path to appflare.config.ts","appflare.config.ts").action(async e=>{await E(e.config);});N.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).action(async e=>{await bn(e.config,e.watch);});N.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 yn(e.config,{local:e.local,remote:e.remote,preview:e.preview});});N.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 wn(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 N.parseAsync(process.argv);})().catch(e=>{console.error(e),process.exit(1);});