appflare 0.2.4 → 0.2.7
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/cli/commands/index.ts +98 -4
- package/cli/generate.ts +8 -0
- package/cli/index.ts +32 -1
- package/cli/templates/auth/config.ts +0 -2
- package/cli/templates/core/handlers.route.ts +1 -0
- package/cli/templates/core/imports.ts +1 -0
- package/cli/templates/dashboard/builders/functions/execute-handler.ts +124 -0
- package/cli/templates/dashboard/builders/functions/index.ts +22 -0
- package/cli/templates/dashboard/builders/functions/render-page/header.ts +20 -0
- package/cli/templates/dashboard/builders/functions/render-page/index.ts +33 -0
- package/cli/templates/dashboard/builders/functions/render-page/request-panel.ts +67 -0
- package/cli/templates/dashboard/builders/functions/render-page/result-panel.ts +19 -0
- package/cli/templates/dashboard/builders/functions/render-page/scripts.ts +17 -0
- package/cli/templates/dashboard/builders/navigation.ts +122 -0
- package/cli/templates/dashboard/builders/storage/index.ts +13 -0
- package/cli/templates/dashboard/builders/storage/routes/create-directory-route.ts +29 -0
- package/cli/templates/dashboard/builders/storage/routes/delete-route.ts +18 -0
- package/cli/templates/dashboard/builders/storage/routes/download-route.ts +23 -0
- package/cli/templates/dashboard/builders/storage/routes/index.ts +22 -0
- package/cli/templates/dashboard/builders/storage/routes/list-route.ts +25 -0
- package/cli/templates/dashboard/builders/storage/routes/preview-route.ts +21 -0
- package/cli/templates/dashboard/builders/storage/routes/upload-route.ts +21 -0
- package/cli/templates/dashboard/builders/storage/runtime/helpers.ts +72 -0
- package/cli/templates/dashboard/builders/storage/runtime/storage-page.ts +130 -0
- package/cli/templates/dashboard/builders/table-routes/common/drawer-panel.ts +27 -0
- package/cli/templates/dashboard/builders/table-routes/common/pagination.ts +30 -0
- package/cli/templates/dashboard/builders/table-routes/common/search-bar.ts +23 -0
- package/cli/templates/dashboard/builders/table-routes/fragments.ts +214 -0
- package/cli/templates/dashboard/builders/table-routes/helpers.ts +49 -0
- package/cli/templates/dashboard/builders/table-routes/index.ts +8 -0
- package/cli/templates/dashboard/builders/table-routes/table/actions-cell.ts +71 -0
- package/cli/templates/dashboard/builders/table-routes/table/get-route.ts +166 -0
- package/cli/templates/dashboard/builders/table-routes/table/index.ts +77 -0
- package/cli/templates/dashboard/builders/table-routes/table/post-routes.ts +111 -0
- package/cli/templates/dashboard/builders/table-routes/table-route.ts +7 -0
- package/cli/templates/dashboard/builders/table-routes/users/get-route.ts +69 -0
- package/cli/templates/dashboard/builders/table-routes/users/html/modals.ts +57 -0
- package/cli/templates/dashboard/builders/table-routes/users/html/page.ts +27 -0
- package/cli/templates/dashboard/builders/table-routes/users/html/table.ts +127 -0
- package/cli/templates/dashboard/builders/table-routes/users/index.ts +32 -0
- package/cli/templates/dashboard/builders/table-routes/users/post-routes.ts +150 -0
- package/cli/templates/dashboard/builders/table-routes/users/redirect.ts +14 -0
- package/cli/templates/dashboard/builders/table-routes/users-route.ts +10 -0
- package/cli/templates/dashboard/components/dashboard-home.ts +23 -0
- package/cli/templates/dashboard/components/layout.ts +388 -0
- package/cli/templates/dashboard/components/login-page.ts +65 -0
- package/cli/templates/dashboard/index.ts +61 -0
- package/cli/templates/dashboard/types.ts +9 -0
- package/cli/templates/handlers/generators/registration/modules/realtime/durable-object.ts +1 -1
- package/cli/templates/handlers/generators/types/core.ts +5 -0
- package/cli/templates/handlers/generators/types/query-definitions/filter-and-where-types.ts +168 -0
- package/cli/templates/handlers/generators/types/query-definitions/query-api-types.ts +133 -0
- package/cli/templates/handlers/generators/types/query-definitions/query-helper-functions.ts +686 -0
- package/cli/templates/handlers/generators/types/query-definitions/schema-and-table-types.ts +97 -0
- package/cli/templates/handlers/generators/types/query-definitions.ts +11 -1083
- package/cli/templates/handlers/generators/types/query-runtime/handled-error.ts +13 -0
- package/cli/templates/handlers/generators/types/query-runtime/runtime-aggregate-and-footer.ts +164 -0
- package/cli/templates/handlers/generators/types/query-runtime/runtime-read.ts +85 -0
- package/cli/templates/handlers/generators/types/query-runtime/runtime-setup.ts +45 -0
- package/cli/templates/handlers/generators/types/query-runtime/runtime-write.ts +137 -0
- package/cli/templates/handlers/generators/types/query-runtime.ts +13 -431
- package/cli/utils/schema-discovery.ts +10 -1
- package/package.json +1 -1
- package/test-better-auth-hash.ts +2 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
export function generateFilterAndWhereTypesSection(): string {
|
|
2
|
+
return `type Primitive = string | number | boolean | Date;
|
|
3
|
+
type NonNil<T> = Exclude<T, null | undefined>;
|
|
4
|
+
type Friendly<T> = T extends Date ? Date | number : T;
|
|
5
|
+
type Comparable<T> = Friendly<Extract<NonNil<T>, Primitive>>;
|
|
6
|
+
type RegexOperand<T> = T extends string ? string : never;
|
|
7
|
+
|
|
8
|
+
type GeoPoint = {
|
|
9
|
+
latitude: number;
|
|
10
|
+
longitude: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type GeoCoordinates = {
|
|
14
|
+
type?: "Point";
|
|
15
|
+
coordinates: [number, number] | readonly [number, number];
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
type GeoWithinOperand = {
|
|
19
|
+
$geometry: GeoPoint | GeoCoordinates;
|
|
20
|
+
latitudeField?: string;
|
|
21
|
+
longitudeField?: string;
|
|
22
|
+
$minDistance?: number;
|
|
23
|
+
$maxDistance?: number;
|
|
24
|
+
gt?: number;
|
|
25
|
+
gte?: number;
|
|
26
|
+
lt?: number;
|
|
27
|
+
lte?: number;
|
|
28
|
+
$gt?: number;
|
|
29
|
+
$gte?: number;
|
|
30
|
+
$lt?: number;
|
|
31
|
+
$lte?: number;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
type GeoWithinOperandForField<TFieldKey extends string> = Omit<
|
|
35
|
+
GeoWithinOperand,
|
|
36
|
+
"latitudeField" | "longitudeField"
|
|
37
|
+
> & {
|
|
38
|
+
latitudeField?: TFieldKey;
|
|
39
|
+
longitudeField?: TFieldKey;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
type FieldOperators<T, TFieldKey extends string = string> = {
|
|
43
|
+
eq?: Friendly<NonNil<T>>;
|
|
44
|
+
$eq?: Friendly<NonNil<T>>;
|
|
45
|
+
ne?: Friendly<NonNil<T>>;
|
|
46
|
+
$ne?: Friendly<NonNil<T>>;
|
|
47
|
+
in?: ReadonlyArray<Friendly<NonNil<T>>>;
|
|
48
|
+
$in?: ReadonlyArray<Friendly<NonNil<T>>>;
|
|
49
|
+
nin?: ReadonlyArray<Friendly<NonNil<T>>>;
|
|
50
|
+
$nin?: ReadonlyArray<Friendly<NonNil<T>>>;
|
|
51
|
+
gt?: Comparable<T>;
|
|
52
|
+
$gt?: Comparable<T>;
|
|
53
|
+
gte?: Comparable<T>;
|
|
54
|
+
$gte?: Comparable<T>;
|
|
55
|
+
lt?: Comparable<T>;
|
|
56
|
+
$lt?: Comparable<T>;
|
|
57
|
+
lte?: Comparable<T>;
|
|
58
|
+
$lte?: Comparable<T>;
|
|
59
|
+
exists?: boolean;
|
|
60
|
+
regex?: RegexOperand<T>;
|
|
61
|
+
$options?: string;
|
|
62
|
+
geoWithin?: GeoWithinOperandForField<TFieldKey>;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
type WhereFieldValue<T, TFieldKey extends string> =
|
|
66
|
+
| Friendly<NonNil<T>>
|
|
67
|
+
| FieldOperators<T, TFieldKey>;
|
|
68
|
+
|
|
69
|
+
export type WhereInput<TModel extends Record<string, unknown>> = {
|
|
70
|
+
[K in keyof TModel]?: WhereFieldValue<
|
|
71
|
+
TModel[K],
|
|
72
|
+
Extract<keyof TModel, string>
|
|
73
|
+
>;
|
|
74
|
+
} & {
|
|
75
|
+
geoWithin?: GeoWithinOperandForField<Extract<keyof TModel, string>>;
|
|
76
|
+
$geoWithin?: GeoWithinOperandForField<Extract<keyof TModel, string>>;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
type ColumnData<TColumn> = TColumn extends { _: { data: infer TData } }
|
|
80
|
+
? TData
|
|
81
|
+
: unknown;
|
|
82
|
+
|
|
83
|
+
type InferRelationWhereFields<TConfig> = TConfig extends { where?: infer TWhere }
|
|
84
|
+
? TWhere extends (...args: infer TArgs) => unknown
|
|
85
|
+
? TArgs extends [infer TFields, ...unknown[]]
|
|
86
|
+
? TFields extends Record<string, unknown>
|
|
87
|
+
? TFields
|
|
88
|
+
: never
|
|
89
|
+
: never
|
|
90
|
+
: never
|
|
91
|
+
: never;
|
|
92
|
+
|
|
93
|
+
type RelationModelFromConfig<TConfig extends Record<string, unknown>> =
|
|
94
|
+
InferRelationWhereFields<TConfig> extends infer TFields
|
|
95
|
+
? TFields extends Record<string, unknown>
|
|
96
|
+
? {
|
|
97
|
+
[K in Extract<keyof TFields, string>]: ColumnData<TFields[K]>;
|
|
98
|
+
}
|
|
99
|
+
: Record<string, unknown>
|
|
100
|
+
: Record<string, unknown>;
|
|
101
|
+
|
|
102
|
+
type NumericModelFieldKey<TModel extends Record<string, unknown>> = Extract<
|
|
103
|
+
{
|
|
104
|
+
[K in keyof TModel]-?: NonNullable<TModel[K]> extends number ? K : never;
|
|
105
|
+
}[keyof TModel],
|
|
106
|
+
string
|
|
107
|
+
>;
|
|
108
|
+
|
|
109
|
+
type RelationAvgSelectionInput<TModel extends Record<string, unknown>> =
|
|
110
|
+
Partial<Record<NumericModelFieldKey<TModel>, boolean>>;
|
|
111
|
+
|
|
112
|
+
type RelationAggregateSelectionInput<TModel extends Record<string, unknown>> = {
|
|
113
|
+
_count?: boolean;
|
|
114
|
+
_avg?: RelationAvgSelectionInput<TModel>;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
type QueryWithRelationInput<TEntry> =
|
|
118
|
+
| (Extract<TEntry, true> extends never ? never : true)
|
|
119
|
+
| (Extract<TEntry, Record<string, unknown>> extends infer TRelation
|
|
120
|
+
? TRelation extends Record<string, unknown>
|
|
121
|
+
? Omit<TRelation, "where" | "with" | "_count" | "_avg"> &
|
|
122
|
+
RelationAggregateSelectionInput<RelationModelFromConfig<TRelation>> & {
|
|
123
|
+
where?: WhereInput<RelationModelFromConfig<TRelation>>;
|
|
124
|
+
with?: TRelation extends { with?: infer TNestedWith }
|
|
125
|
+
? QueryWithInput<TNestedWith>
|
|
126
|
+
: never;
|
|
127
|
+
}
|
|
128
|
+
: never
|
|
129
|
+
: never);
|
|
130
|
+
|
|
131
|
+
type QueryWithInput<TWith> = TWith extends Record<string, unknown>
|
|
132
|
+
? {
|
|
133
|
+
[K in keyof TWith]?: QueryWithRelationInput<TWith[K]>;
|
|
134
|
+
}
|
|
135
|
+
: TWith;
|
|
136
|
+
|
|
137
|
+
export type QueryFindManyArgs<TName extends TableName> = Omit<
|
|
138
|
+
NonNullable<TableFindManyArgs<TName>>,
|
|
139
|
+
"where" | "with"
|
|
140
|
+
> & {
|
|
141
|
+
where?: WhereInput<TableModel<TName>>;
|
|
142
|
+
with?: QueryWithInput<NativeFindManyWith<TName>>;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export type QueryFindFirstArgs<TName extends TableName> = Omit<
|
|
146
|
+
NonNullable<TableFindFirstArgs<TName>>,
|
|
147
|
+
"where" | "with"
|
|
148
|
+
> & {
|
|
149
|
+
where?: WhereInput<TableModel<TName>>;
|
|
150
|
+
with?: QueryWithInput<NativeFindFirstWith<TName>>;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export type QueryInsertArgs<TName extends TableName> = {
|
|
154
|
+
values: TableInsertModel<TName> | Array<TableInsertModel<TName>>;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
export type QueryUpdateArgs<TName extends TableName> = {
|
|
158
|
+
set: Partial<TableInsertModel<TName>>;
|
|
159
|
+
where?: WhereInput<TableModel<TName>>;
|
|
160
|
+
limit?: number;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export type QueryDeleteArgs<TName extends TableName> = {
|
|
164
|
+
where?: WhereInput<TableModel<TName>>;
|
|
165
|
+
limit?: number;
|
|
166
|
+
};
|
|
167
|
+
`;
|
|
168
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
export function generateQueryApiTypesSection(): string {
|
|
2
|
+
return `type AggregateWithInput<TName extends TableName> =
|
|
3
|
+
QueryWithInput<NativeFindManyWith<TName>>;
|
|
4
|
+
|
|
5
|
+
type NumericFieldKey<TName extends TableName> = NumericModelFieldKey<
|
|
6
|
+
TableModel<TName>
|
|
7
|
+
>;
|
|
8
|
+
|
|
9
|
+
type RelationAggregateAvgResult<TAvg> = TAvg extends Record<string, unknown>
|
|
10
|
+
? {
|
|
11
|
+
[K in Extract<keyof TAvg, string> as TAvg[K] extends true ? K : never]: number;
|
|
12
|
+
}
|
|
13
|
+
: {};
|
|
14
|
+
|
|
15
|
+
type RelationAggregateResult<TEntry> =
|
|
16
|
+
Extract<TEntry, Record<string, unknown>> extends infer TRelation
|
|
17
|
+
? TRelation extends Record<string, unknown>
|
|
18
|
+
? (TRelation extends { _count?: true } ? { count: number } : {}) &
|
|
19
|
+
(TRelation extends { _avg?: infer TAvg }
|
|
20
|
+
? { avg: RelationAggregateAvgResult<TAvg> }
|
|
21
|
+
: {})
|
|
22
|
+
: {}
|
|
23
|
+
: {};
|
|
24
|
+
|
|
25
|
+
type HasRelationAggregateRequest<TEntry> =
|
|
26
|
+
Extract<TEntry, Record<string, unknown>> extends infer TRelation
|
|
27
|
+
? TRelation extends Record<string, unknown>
|
|
28
|
+
? TRelation extends { _count?: true }
|
|
29
|
+
? true
|
|
30
|
+
: TRelation extends { _avg?: Record<string, unknown> }
|
|
31
|
+
? true
|
|
32
|
+
: false
|
|
33
|
+
: false
|
|
34
|
+
: false;
|
|
35
|
+
|
|
36
|
+
type QueryWithAggregateResult<TWith> = TWith extends Record<string, unknown>
|
|
37
|
+
? {
|
|
38
|
+
[K in Extract<keyof TWith, string> as HasRelationAggregateRequest<
|
|
39
|
+
TWith[K]
|
|
40
|
+
> extends true
|
|
41
|
+
? \`\${K}Aggregate\`
|
|
42
|
+
: never]: RelationAggregateResult<TWith[K]>;
|
|
43
|
+
}
|
|
44
|
+
: {};
|
|
45
|
+
|
|
46
|
+
type WithFromArgs<TArgs> = TArgs extends { with?: infer TWith }
|
|
47
|
+
? TWith
|
|
48
|
+
: undefined;
|
|
49
|
+
|
|
50
|
+
type AppendRelationAggregatesToRow<TRow, TWith> = TRow &
|
|
51
|
+
QueryWithAggregateResult<TWith>;
|
|
52
|
+
|
|
53
|
+
type ApplyFindManyWithAggregateResult<TResult, TArgs> =
|
|
54
|
+
TResult extends Promise<infer TRows>
|
|
55
|
+
? TRows extends Array<infer TRow>
|
|
56
|
+
? Promise<
|
|
57
|
+
Array<AppendRelationAggregatesToRow<TRow, WithFromArgs<TArgs>>>
|
|
58
|
+
>
|
|
59
|
+
: TResult
|
|
60
|
+
: TResult;
|
|
61
|
+
|
|
62
|
+
type ApplyFindFirstWithAggregateResult<TResult, TArgs> =
|
|
63
|
+
TResult extends Promise<infer TRow>
|
|
64
|
+
? Promise<
|
|
65
|
+
TRow extends null
|
|
66
|
+
? null
|
|
67
|
+
: AppendRelationAggregatesToRow<TRow, WithFromArgs<TArgs>>
|
|
68
|
+
>
|
|
69
|
+
: TResult;
|
|
70
|
+
|
|
71
|
+
export type QueryCountArgs<TName extends TableName> = {
|
|
72
|
+
where?: WhereInput<TableModel<TName>>;
|
|
73
|
+
field?: Extract<keyof TableModel<TName>, string> | string;
|
|
74
|
+
distinct?: boolean;
|
|
75
|
+
with?: AggregateWithInput<TName>;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export type QueryAvgArgs<TName extends TableName> = {
|
|
79
|
+
where?: WhereInput<TableModel<TName>>;
|
|
80
|
+
field: NumericFieldKey<TName> | string;
|
|
81
|
+
distinct?: boolean;
|
|
82
|
+
with?: AggregateWithInput<TName>;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export type QueryUpsertArgs<TName extends TableName> = {
|
|
86
|
+
values: TableInsertModel<TName> | Array<TableInsertModel<TName>>;
|
|
87
|
+
target?:
|
|
88
|
+
| Extract<keyof TableInsertModel<TName>, string>
|
|
89
|
+
| Array<Extract<keyof TableInsertModel<TName>, string>>;
|
|
90
|
+
set?: Partial<TableInsertModel<TName>>;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export type QueryTableApi<TName extends TableName> = {
|
|
94
|
+
findMany: <
|
|
95
|
+
TArgs extends QueryFindManyArgs<TName> | undefined =
|
|
96
|
+
| QueryFindManyArgs<TName>
|
|
97
|
+
| undefined,
|
|
98
|
+
>(
|
|
99
|
+
args?: TArgs,
|
|
100
|
+
) => ApplyFindManyWithAggregateResult<TableFindManyResult<TName, TArgs>, TArgs>;
|
|
101
|
+
findFirst: <
|
|
102
|
+
TArgs extends QueryFindFirstArgs<TName> | undefined =
|
|
103
|
+
| QueryFindFirstArgs<TName>
|
|
104
|
+
| undefined,
|
|
105
|
+
>(
|
|
106
|
+
args?: TArgs,
|
|
107
|
+
) => ApplyFindFirstWithAggregateResult<TableFindFirstResult<TName, TArgs>, TArgs>;
|
|
108
|
+
insert: (args: QueryInsertArgs<TName>) => Promise<Array<TableModel<TName>>>;
|
|
109
|
+
update: (args: QueryUpdateArgs<TName>) => Promise<Array<TableModel<TName>>>;
|
|
110
|
+
upsert: (args: QueryUpsertArgs<TName>) => Promise<Array<TableModel<TName>>>;
|
|
111
|
+
delete: (args?: QueryDeleteArgs<TName>) => Promise<Array<TableModel<TName>>>;
|
|
112
|
+
count: (args?: QueryCountArgs<TName>) => Promise<number>;
|
|
113
|
+
avg: (args: QueryAvgArgs<TName>) => Promise<number | null>;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export type AppflareQueryDb = {
|
|
117
|
+
[TName in TableName]: QueryTableApi<TName>;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export type DbMutationKind = "insert" | "update" | "upsert" | "delete";
|
|
121
|
+
|
|
122
|
+
export type DbMutationEvent = {
|
|
123
|
+
kind: DbMutationKind;
|
|
124
|
+
table: string;
|
|
125
|
+
args: Record<string, unknown>;
|
|
126
|
+
rows: unknown[];
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export type QueryDbOptions = {
|
|
130
|
+
onMutation?: (event: DbMutationEvent) => void;
|
|
131
|
+
};
|
|
132
|
+
`;
|
|
133
|
+
}
|