appflare 0.2.30 → 0.2.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Documentation.md +758 -758
- package/cli/commands/index.ts +238 -238
- package/cli/generate.ts +178 -178
- package/cli/index.ts +120 -120
- package/cli/load-config.ts +184 -184
- package/cli/schema-compiler.ts +1183 -1183
- package/cli/templates/auth/README.md +156 -156
- package/cli/templates/auth/config.ts +61 -61
- package/cli/templates/auth/route-config.ts +1 -1
- package/cli/templates/auth/route-handler.ts +1 -1
- package/cli/templates/auth/route-request-utils.ts +5 -5
- package/cli/templates/auth/route.config.ts +18 -18
- package/cli/templates/auth/route.handler.ts +18 -18
- package/cli/templates/auth/route.request-utils.ts +55 -55
- package/cli/templates/auth/route.ts +14 -14
- package/cli/templates/core/README.md +266 -266
- package/cli/templates/core/app-creation.ts +19 -19
- package/cli/templates/core/client/appflare.ts +112 -112
- package/cli/templates/core/client/handlers/index.ts +748 -748
- package/cli/templates/core/client/handlers.ts +1 -1
- package/cli/templates/core/client/index.ts +7 -7
- package/cli/templates/core/client/storage.ts +195 -195
- package/cli/templates/core/client/types.ts +186 -186
- package/cli/templates/core/client-modules/appflare.ts +1 -1
- package/cli/templates/core/client-modules/handlers.ts +1 -1
- package/cli/templates/core/client-modules/index.ts +1 -1
- package/cli/templates/core/client-modules/storage.ts +1 -1
- package/cli/templates/core/client-modules/types.ts +1 -1
- package/cli/templates/core/client.artifacts.ts +39 -39
- package/cli/templates/core/client.ts +4 -4
- package/cli/templates/core/drizzle.ts +15 -15
- package/cli/templates/core/export.ts +14 -14
- package/cli/templates/core/handlers.route.ts +24 -24
- package/cli/templates/core/handlers.ts +1 -1
- package/cli/templates/core/imports.ts +9 -9
- package/cli/templates/core/server.ts +38 -38
- package/cli/templates/core/types.ts +6 -6
- package/cli/templates/core/wrangler.ts +109 -109
- package/cli/templates/dashboard/builders/functions/index.ts +17 -17
- package/cli/templates/dashboard/builders/functions/render-page/header.ts +20 -20
- package/cli/templates/dashboard/builders/functions/render-page/index.ts +33 -33
- package/cli/templates/dashboard/builders/functions/render-page/request-panel.ts +171 -171
- package/cli/templates/dashboard/builders/functions/render-page/result-panel.ts +85 -85
- package/cli/templates/dashboard/builders/functions/render-page/scripts.ts +554 -554
- package/cli/templates/dashboard/builders/navigation.ts +122 -122
- package/cli/templates/dashboard/builders/storage/index.ts +13 -13
- package/cli/templates/dashboard/builders/storage/routes/create-directory-route.ts +29 -29
- package/cli/templates/dashboard/builders/storage/routes/delete-route.ts +18 -18
- package/cli/templates/dashboard/builders/storage/routes/download-route.ts +23 -23
- package/cli/templates/dashboard/builders/storage/routes/index.ts +22 -22
- package/cli/templates/dashboard/builders/storage/routes/list-route.ts +25 -25
- package/cli/templates/dashboard/builders/storage/routes/preview-route.ts +21 -21
- package/cli/templates/dashboard/builders/storage/routes/upload-route.ts +21 -21
- package/cli/templates/dashboard/builders/storage/runtime/helpers.ts +72 -72
- package/cli/templates/dashboard/builders/storage/runtime/storage-page.ts +130 -130
- package/cli/templates/dashboard/builders/table-routes/common/drawer-panel.ts +27 -27
- package/cli/templates/dashboard/builders/table-routes/common/pagination.ts +30 -30
- package/cli/templates/dashboard/builders/table-routes/common/search-bar.ts +23 -23
- package/cli/templates/dashboard/builders/table-routes/fragments.ts +217 -217
- package/cli/templates/dashboard/builders/table-routes/helpers.ts +45 -45
- package/cli/templates/dashboard/builders/table-routes/index.ts +8 -8
- package/cli/templates/dashboard/builders/table-routes/table/actions-cell.ts +71 -71
- package/cli/templates/dashboard/builders/table-routes/table/get-route.ts +291 -291
- package/cli/templates/dashboard/builders/table-routes/table/index.ts +80 -80
- package/cli/templates/dashboard/builders/table-routes/table/post-routes.ts +163 -163
- package/cli/templates/dashboard/builders/table-routes/table-route.ts +7 -7
- package/cli/templates/dashboard/builders/table-routes/users/get-route.ts +69 -69
- package/cli/templates/dashboard/builders/table-routes/users/html/modals.ts +57 -57
- package/cli/templates/dashboard/builders/table-routes/users/html/page.ts +27 -27
- package/cli/templates/dashboard/builders/table-routes/users/html/table.ts +128 -128
- package/cli/templates/dashboard/builders/table-routes/users/index.ts +32 -32
- package/cli/templates/dashboard/builders/table-routes/users/post-routes.ts +150 -150
- package/cli/templates/dashboard/builders/table-routes/users/redirect.ts +14 -14
- package/cli/templates/dashboard/builders/table-routes/users-route.ts +10 -10
- package/cli/templates/dashboard/components/dashboard-home.ts +23 -23
- package/cli/templates/dashboard/components/layout.ts +388 -388
- package/cli/templates/dashboard/components/login-page.ts +65 -65
- package/cli/templates/dashboard/index.ts +61 -61
- package/cli/templates/dashboard/types.ts +9 -9
- package/cli/templates/handlers/README.md +353 -353
- package/cli/templates/handlers/auth.ts +37 -37
- package/cli/templates/handlers/execution.ts +42 -42
- package/cli/templates/handlers/generators/context/context-creation.ts +101 -101
- package/cli/templates/handlers/generators/context/error-helpers.ts +11 -11
- package/cli/templates/handlers/generators/context/scheduler.ts +24 -24
- package/cli/templates/handlers/generators/context/storage-api.ts +82 -82
- package/cli/templates/handlers/generators/context/storage-helpers.ts +59 -59
- package/cli/templates/handlers/generators/context/types.ts +40 -40
- package/cli/templates/handlers/generators/context.ts +43 -43
- package/cli/templates/handlers/generators/execution.ts +15 -15
- package/cli/templates/handlers/generators/handlers.ts +13 -13
- package/cli/templates/handlers/generators/registration/modules/cron.ts +26 -26
- package/cli/templates/handlers/generators/registration/modules/realtime/auth.ts +75 -75
- package/cli/templates/handlers/generators/registration/modules/realtime/durable-object.ts +144 -144
- package/cli/templates/handlers/generators/registration/modules/realtime/index.ts +14 -14
- package/cli/templates/handlers/generators/registration/modules/realtime/publisher.ts +102 -102
- package/cli/templates/handlers/generators/registration/modules/realtime/routes.ts +164 -164
- package/cli/templates/handlers/generators/registration/modules/realtime/types.ts +30 -30
- package/cli/templates/handlers/generators/registration/modules/realtime/utils.ts +516 -516
- package/cli/templates/handlers/generators/registration/modules/scheduler.ts +56 -56
- package/cli/templates/handlers/generators/registration/modules/storage.ts +199 -199
- package/cli/templates/handlers/generators/registration/sections.ts +210 -210
- package/cli/templates/handlers/generators/types/context.ts +92 -92
- package/cli/templates/handlers/generators/types/core.ts +106 -106
- package/cli/templates/handlers/generators/types/operations.ts +135 -135
- package/cli/templates/handlers/generators/types/query-definitions/filter-and-where-types.ts +281 -259
- package/cli/templates/handlers/generators/types/query-definitions/query-api-types.ts +135 -135
- package/cli/templates/handlers/generators/types/query-definitions/query-helper-functions.ts +1103 -1031
- package/cli/templates/handlers/generators/types/query-definitions/schema-and-table-types.ts +278 -246
- package/cli/templates/handlers/generators/types/query-definitions.ts +13 -13
- package/cli/templates/handlers/generators/types/query-runtime/handled-error.ts +13 -13
- package/cli/templates/handlers/generators/types/query-runtime/runtime-aggregate-and-footer.ts +174 -174
- package/cli/templates/handlers/generators/types/query-runtime/runtime-read.ts +157 -121
- package/cli/templates/handlers/generators/types/query-runtime/runtime-setup.ts +45 -45
- package/cli/templates/handlers/generators/types/query-runtime/runtime-write.ts +697 -697
- package/cli/templates/handlers/generators/types/query-runtime.ts +15 -15
- package/cli/templates/handlers/index.ts +43 -43
- package/cli/templates/handlers/operations.ts +116 -116
- package/cli/templates/handlers/registration.ts +91 -91
- package/cli/templates/handlers/types.ts +15 -15
- package/cli/templates/handlers/utils.ts +48 -48
- package/cli/types.ts +110 -110
- package/cli/utils/handler-discovery.ts +466 -466
- package/cli/utils/json-utils.ts +24 -24
- package/cli/utils/path-utils.ts +19 -19
- package/cli/utils/schema-discovery.ts +399 -399
- package/dist/cli/index.d.mts +2 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +270 -108
- package/dist/cli/index.mjs +270 -108
- package/index.ts +18 -18
- package/package.json +58 -58
- package/react/index.ts +5 -5
- package/react/use-infinite-query.ts +252 -252
- package/react/use-mutation.ts +89 -89
- package/react/use-query.ts +207 -207
- package/schema.ts +415 -415
- package/test-better-auth-hash.ts +2 -2
- package/tsconfig.json +6 -6
- package/tsup.config.ts +82 -82
|
@@ -1,210 +1,210 @@
|
|
|
1
|
-
import type { DiscoveredHandlerOperation } from "../../../../utils/handler-discovery";
|
|
2
|
-
|
|
3
|
-
type IndexedOperation = {
|
|
4
|
-
operation: DiscoveredHandlerOperation;
|
|
5
|
-
index: number;
|
|
6
|
-
alias: string;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export type RegistrationTemplateSections = {
|
|
10
|
-
imports: string;
|
|
11
|
-
operationSchemas: string;
|
|
12
|
-
schedulerSchemas: string;
|
|
13
|
-
queryRoutes: string;
|
|
14
|
-
mutationRoutes: string;
|
|
15
|
-
queryRegistryEntries: string;
|
|
16
|
-
schedulerEntries: string;
|
|
17
|
-
schedulerPayloadMapEntries: string;
|
|
18
|
-
cronEntries: string;
|
|
19
|
-
storageHandlersEntries: string;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
function toSafeIdentifier(value: string): string {
|
|
23
|
-
const sanitized = value.replace(/[^A-Za-z0-9_]/g, "_");
|
|
24
|
-
if (/^[0-9]/.test(sanitized)) {
|
|
25
|
-
return `_${sanitized}`;
|
|
26
|
-
}
|
|
27
|
-
return sanitized;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function buildImportAlias(
|
|
31
|
-
operation: DiscoveredHandlerOperation,
|
|
32
|
-
index: number,
|
|
33
|
-
): string {
|
|
34
|
-
const routeName = operation.routePath.replace(/^\//, "").replace(/\//g, "_");
|
|
35
|
-
return toSafeIdentifier(`op_${index}_${routeName}`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function indexOperations(
|
|
39
|
-
operations: DiscoveredHandlerOperation[],
|
|
40
|
-
): IndexedOperation[] {
|
|
41
|
-
return operations.map((operation, index) => ({
|
|
42
|
-
operation,
|
|
43
|
-
index,
|
|
44
|
-
alias: buildImportAlias(operation, index),
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function buildImports(operations: IndexedOperation[]): string {
|
|
49
|
-
return operations
|
|
50
|
-
.map(({ operation, alias }) => {
|
|
51
|
-
return `import { ${operation.exportName} as ${alias} } from "${operation.importPath}";`;
|
|
52
|
-
})
|
|
53
|
-
.join("\n");
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function buildOperationSchemas(operations: IndexedOperation[]): string {
|
|
57
|
-
return operations
|
|
58
|
-
.filter(
|
|
59
|
-
({ operation }) =>
|
|
60
|
-
operation.kind === "query" || operation.kind === "mutation",
|
|
61
|
-
)
|
|
62
|
-
.map(({ alias }) => {
|
|
63
|
-
const schemaName = `${alias}Schema`;
|
|
64
|
-
return `const ${schemaName} = z.object(${alias}.definition.args);`;
|
|
65
|
-
})
|
|
66
|
-
.join("\n");
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function buildSchedulerSchemas(operations: IndexedOperation[]): string {
|
|
70
|
-
return operations
|
|
71
|
-
.filter(({ operation }) => operation.kind === "scheduler")
|
|
72
|
-
.map(({ alias }) => {
|
|
73
|
-
const schemaName = `${alias}SchedulerSchema`;
|
|
74
|
-
return `const ${schemaName} = ${alias}.definition.args ? z.object(${alias}.definition.args) : z.undefined();`;
|
|
75
|
-
})
|
|
76
|
-
.join("\n");
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function buildQueryRoutes(operations: IndexedOperation[]): string {
|
|
80
|
-
return operations
|
|
81
|
-
.filter(({ operation }) => operation.kind === "query")
|
|
82
|
-
.map(({ operation, alias }) => {
|
|
83
|
-
const schemaName = `${alias}Schema`;
|
|
84
|
-
return `
|
|
85
|
-
app.get(
|
|
86
|
-
"${operation.routePath}",
|
|
87
|
-
sValidator("query", ${schemaName}),
|
|
88
|
-
async (c) => {
|
|
89
|
-
const ctx = await createExecutionContext(c, options);
|
|
90
|
-
try {
|
|
91
|
-
return await executeOperation(c, ${alias}, c.req.valid("query"), ctx);
|
|
92
|
-
} catch (error) {
|
|
93
|
-
return handleOperationError(c, error, "Invalid query arguments");
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
);`;
|
|
97
|
-
})
|
|
98
|
-
.join("\n");
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function buildMutationRoutes(operations: IndexedOperation[]): string {
|
|
102
|
-
return operations
|
|
103
|
-
.filter(({ operation }) => operation.kind === "mutation")
|
|
104
|
-
.map(({ operation, alias }) => {
|
|
105
|
-
const schemaName = `${alias}Schema`;
|
|
106
|
-
return `
|
|
107
|
-
app.post(
|
|
108
|
-
"${operation.routePath}",
|
|
109
|
-
sValidator("json", ${schemaName}),
|
|
110
|
-
async (c) => {
|
|
111
|
-
const ctx = await createExecutionContext(c, options);
|
|
112
|
-
try {
|
|
113
|
-
const response = await executeOperation(c, ${alias}, c.req.valid("json"), ctx);
|
|
114
|
-
await publishMutationEvents(c, options, ctx.mutationEvents);
|
|
115
|
-
return response;
|
|
116
|
-
} catch (error) {
|
|
117
|
-
return handleOperationError(c, error, "Invalid mutation arguments");
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
);`;
|
|
121
|
-
})
|
|
122
|
-
.join("\n");
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function buildQueryRegistryEntries(operations: IndexedOperation[]): string {
|
|
126
|
-
return operations
|
|
127
|
-
.filter(({ operation }) => operation.kind === "query")
|
|
128
|
-
.map(({ operation, alias }) => {
|
|
129
|
-
const schemaName = `${alias}Schema`;
|
|
130
|
-
const queryName = operation.handlerName ?? operation.routePath;
|
|
131
|
-
return `
|
|
132
|
-
${JSON.stringify(queryName)}: {
|
|
133
|
-
definition: ${alias}.definition,
|
|
134
|
-
schema: ${schemaName},
|
|
135
|
-
},`;
|
|
136
|
-
})
|
|
137
|
-
.join("\n");
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function buildSchedulerEntries(operations: IndexedOperation[]): string {
|
|
141
|
-
return operations
|
|
142
|
-
.filter(({ operation }) => operation.kind === "scheduler")
|
|
143
|
-
.map(({ operation, alias }) => {
|
|
144
|
-
const schemaName = `${alias}SchedulerSchema`;
|
|
145
|
-
const taskName = operation.taskName ?? `${operation.routePath}`;
|
|
146
|
-
return `
|
|
147
|
-
${JSON.stringify(taskName)}: {
|
|
148
|
-
definition: ${alias}.definition,
|
|
149
|
-
schema: ${schemaName},
|
|
150
|
-
},`;
|
|
151
|
-
})
|
|
152
|
-
.join("\n");
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function buildSchedulerPayloadMapEntries(
|
|
156
|
-
operations: IndexedOperation[],
|
|
157
|
-
): string {
|
|
158
|
-
return operations
|
|
159
|
-
.filter(({ operation }) => operation.kind === "scheduler")
|
|
160
|
-
.map(({ operation, alias }) => {
|
|
161
|
-
const taskName = operation.taskName ?? `${operation.routePath}`;
|
|
162
|
-
return `\t${JSON.stringify(taskName)}: Parameters<typeof ${alias}.definition.handler>[1];`;
|
|
163
|
-
})
|
|
164
|
-
.join("\n");
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
function buildCronEntries(operations: IndexedOperation[]): string {
|
|
168
|
-
return operations
|
|
169
|
-
.filter(({ operation }) => operation.kind === "cron")
|
|
170
|
-
.map(({ operation, alias }) => {
|
|
171
|
-
const taskName = operation.taskName ?? `${operation.routePath}`;
|
|
172
|
-
const cronTriggers = operation.cronTriggers ?? [];
|
|
173
|
-
return `
|
|
174
|
-
{
|
|
175
|
-
taskName: ${JSON.stringify(taskName)},
|
|
176
|
-
cronTriggers: ${JSON.stringify(cronTriggers)},
|
|
177
|
-
definition: ${alias}.definition,
|
|
178
|
-
},`;
|
|
179
|
-
})
|
|
180
|
-
.join("\n");
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function buildStorageHandlersEntries(operations: IndexedOperation[]): string {
|
|
184
|
-
return operations
|
|
185
|
-
.filter(({ operation }) => operation.kind === "storage")
|
|
186
|
-
.map(({ alias }) => {
|
|
187
|
-
return `\n\t${alias}.definition.handler,`;
|
|
188
|
-
})
|
|
189
|
-
.join("\n");
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export function buildRegistrationTemplateSections(
|
|
193
|
-
operations: DiscoveredHandlerOperation[],
|
|
194
|
-
): RegistrationTemplateSections {
|
|
195
|
-
const indexedOperations = indexOperations(operations);
|
|
196
|
-
|
|
197
|
-
return {
|
|
198
|
-
imports: buildImports(indexedOperations),
|
|
199
|
-
operationSchemas: buildOperationSchemas(indexedOperations),
|
|
200
|
-
schedulerSchemas: buildSchedulerSchemas(indexedOperations),
|
|
201
|
-
queryRoutes: buildQueryRoutes(indexedOperations),
|
|
202
|
-
mutationRoutes: buildMutationRoutes(indexedOperations),
|
|
203
|
-
queryRegistryEntries: buildQueryRegistryEntries(indexedOperations),
|
|
204
|
-
schedulerEntries: buildSchedulerEntries(indexedOperations),
|
|
205
|
-
schedulerPayloadMapEntries:
|
|
206
|
-
buildSchedulerPayloadMapEntries(indexedOperations),
|
|
207
|
-
cronEntries: buildCronEntries(indexedOperations),
|
|
208
|
-
storageHandlersEntries: buildStorageHandlersEntries(indexedOperations),
|
|
209
|
-
};
|
|
210
|
-
}
|
|
1
|
+
import type { DiscoveredHandlerOperation } from "../../../../utils/handler-discovery";
|
|
2
|
+
|
|
3
|
+
type IndexedOperation = {
|
|
4
|
+
operation: DiscoveredHandlerOperation;
|
|
5
|
+
index: number;
|
|
6
|
+
alias: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type RegistrationTemplateSections = {
|
|
10
|
+
imports: string;
|
|
11
|
+
operationSchemas: string;
|
|
12
|
+
schedulerSchemas: string;
|
|
13
|
+
queryRoutes: string;
|
|
14
|
+
mutationRoutes: string;
|
|
15
|
+
queryRegistryEntries: string;
|
|
16
|
+
schedulerEntries: string;
|
|
17
|
+
schedulerPayloadMapEntries: string;
|
|
18
|
+
cronEntries: string;
|
|
19
|
+
storageHandlersEntries: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
function toSafeIdentifier(value: string): string {
|
|
23
|
+
const sanitized = value.replace(/[^A-Za-z0-9_]/g, "_");
|
|
24
|
+
if (/^[0-9]/.test(sanitized)) {
|
|
25
|
+
return `_${sanitized}`;
|
|
26
|
+
}
|
|
27
|
+
return sanitized;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function buildImportAlias(
|
|
31
|
+
operation: DiscoveredHandlerOperation,
|
|
32
|
+
index: number,
|
|
33
|
+
): string {
|
|
34
|
+
const routeName = operation.routePath.replace(/^\//, "").replace(/\//g, "_");
|
|
35
|
+
return toSafeIdentifier(`op_${index}_${routeName}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function indexOperations(
|
|
39
|
+
operations: DiscoveredHandlerOperation[],
|
|
40
|
+
): IndexedOperation[] {
|
|
41
|
+
return operations.map((operation, index) => ({
|
|
42
|
+
operation,
|
|
43
|
+
index,
|
|
44
|
+
alias: buildImportAlias(operation, index),
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function buildImports(operations: IndexedOperation[]): string {
|
|
49
|
+
return operations
|
|
50
|
+
.map(({ operation, alias }) => {
|
|
51
|
+
return `import { ${operation.exportName} as ${alias} } from "${operation.importPath}";`;
|
|
52
|
+
})
|
|
53
|
+
.join("\n");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function buildOperationSchemas(operations: IndexedOperation[]): string {
|
|
57
|
+
return operations
|
|
58
|
+
.filter(
|
|
59
|
+
({ operation }) =>
|
|
60
|
+
operation.kind === "query" || operation.kind === "mutation",
|
|
61
|
+
)
|
|
62
|
+
.map(({ alias }) => {
|
|
63
|
+
const schemaName = `${alias}Schema`;
|
|
64
|
+
return `const ${schemaName} = z.object(${alias}.definition.args);`;
|
|
65
|
+
})
|
|
66
|
+
.join("\n");
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function buildSchedulerSchemas(operations: IndexedOperation[]): string {
|
|
70
|
+
return operations
|
|
71
|
+
.filter(({ operation }) => operation.kind === "scheduler")
|
|
72
|
+
.map(({ alias }) => {
|
|
73
|
+
const schemaName = `${alias}SchedulerSchema`;
|
|
74
|
+
return `const ${schemaName} = ${alias}.definition.args ? z.object(${alias}.definition.args) : z.undefined();`;
|
|
75
|
+
})
|
|
76
|
+
.join("\n");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function buildQueryRoutes(operations: IndexedOperation[]): string {
|
|
80
|
+
return operations
|
|
81
|
+
.filter(({ operation }) => operation.kind === "query")
|
|
82
|
+
.map(({ operation, alias }) => {
|
|
83
|
+
const schemaName = `${alias}Schema`;
|
|
84
|
+
return `
|
|
85
|
+
app.get(
|
|
86
|
+
"${operation.routePath}",
|
|
87
|
+
sValidator("query", ${schemaName}),
|
|
88
|
+
async (c) => {
|
|
89
|
+
const ctx = await createExecutionContext(c, options);
|
|
90
|
+
try {
|
|
91
|
+
return await executeOperation(c, ${alias}, c.req.valid("query"), ctx);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
return handleOperationError(c, error, "Invalid query arguments");
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
);`;
|
|
97
|
+
})
|
|
98
|
+
.join("\n");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function buildMutationRoutes(operations: IndexedOperation[]): string {
|
|
102
|
+
return operations
|
|
103
|
+
.filter(({ operation }) => operation.kind === "mutation")
|
|
104
|
+
.map(({ operation, alias }) => {
|
|
105
|
+
const schemaName = `${alias}Schema`;
|
|
106
|
+
return `
|
|
107
|
+
app.post(
|
|
108
|
+
"${operation.routePath}",
|
|
109
|
+
sValidator("json", ${schemaName}),
|
|
110
|
+
async (c) => {
|
|
111
|
+
const ctx = await createExecutionContext(c, options);
|
|
112
|
+
try {
|
|
113
|
+
const response = await executeOperation(c, ${alias}, c.req.valid("json"), ctx);
|
|
114
|
+
await publishMutationEvents(c, options, ctx.mutationEvents);
|
|
115
|
+
return response;
|
|
116
|
+
} catch (error) {
|
|
117
|
+
return handleOperationError(c, error, "Invalid mutation arguments");
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
);`;
|
|
121
|
+
})
|
|
122
|
+
.join("\n");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function buildQueryRegistryEntries(operations: IndexedOperation[]): string {
|
|
126
|
+
return operations
|
|
127
|
+
.filter(({ operation }) => operation.kind === "query")
|
|
128
|
+
.map(({ operation, alias }) => {
|
|
129
|
+
const schemaName = `${alias}Schema`;
|
|
130
|
+
const queryName = operation.handlerName ?? operation.routePath;
|
|
131
|
+
return `
|
|
132
|
+
${JSON.stringify(queryName)}: {
|
|
133
|
+
definition: ${alias}.definition,
|
|
134
|
+
schema: ${schemaName},
|
|
135
|
+
},`;
|
|
136
|
+
})
|
|
137
|
+
.join("\n");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function buildSchedulerEntries(operations: IndexedOperation[]): string {
|
|
141
|
+
return operations
|
|
142
|
+
.filter(({ operation }) => operation.kind === "scheduler")
|
|
143
|
+
.map(({ operation, alias }) => {
|
|
144
|
+
const schemaName = `${alias}SchedulerSchema`;
|
|
145
|
+
const taskName = operation.taskName ?? `${operation.routePath}`;
|
|
146
|
+
return `
|
|
147
|
+
${JSON.stringify(taskName)}: {
|
|
148
|
+
definition: ${alias}.definition,
|
|
149
|
+
schema: ${schemaName},
|
|
150
|
+
},`;
|
|
151
|
+
})
|
|
152
|
+
.join("\n");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function buildSchedulerPayloadMapEntries(
|
|
156
|
+
operations: IndexedOperation[],
|
|
157
|
+
): string {
|
|
158
|
+
return operations
|
|
159
|
+
.filter(({ operation }) => operation.kind === "scheduler")
|
|
160
|
+
.map(({ operation, alias }) => {
|
|
161
|
+
const taskName = operation.taskName ?? `${operation.routePath}`;
|
|
162
|
+
return `\t${JSON.stringify(taskName)}: Parameters<typeof ${alias}.definition.handler>[1];`;
|
|
163
|
+
})
|
|
164
|
+
.join("\n");
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function buildCronEntries(operations: IndexedOperation[]): string {
|
|
168
|
+
return operations
|
|
169
|
+
.filter(({ operation }) => operation.kind === "cron")
|
|
170
|
+
.map(({ operation, alias }) => {
|
|
171
|
+
const taskName = operation.taskName ?? `${operation.routePath}`;
|
|
172
|
+
const cronTriggers = operation.cronTriggers ?? [];
|
|
173
|
+
return `
|
|
174
|
+
{
|
|
175
|
+
taskName: ${JSON.stringify(taskName)},
|
|
176
|
+
cronTriggers: ${JSON.stringify(cronTriggers)},
|
|
177
|
+
definition: ${alias}.definition,
|
|
178
|
+
},`;
|
|
179
|
+
})
|
|
180
|
+
.join("\n");
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function buildStorageHandlersEntries(operations: IndexedOperation[]): string {
|
|
184
|
+
return operations
|
|
185
|
+
.filter(({ operation }) => operation.kind === "storage")
|
|
186
|
+
.map(({ alias }) => {
|
|
187
|
+
return `\n\t${alias}.definition.handler,`;
|
|
188
|
+
})
|
|
189
|
+
.join("\n");
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function buildRegistrationTemplateSections(
|
|
193
|
+
operations: DiscoveredHandlerOperation[],
|
|
194
|
+
): RegistrationTemplateSections {
|
|
195
|
+
const indexedOperations = indexOperations(operations);
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
imports: buildImports(indexedOperations),
|
|
199
|
+
operationSchemas: buildOperationSchemas(indexedOperations),
|
|
200
|
+
schedulerSchemas: buildSchedulerSchemas(indexedOperations),
|
|
201
|
+
queryRoutes: buildQueryRoutes(indexedOperations),
|
|
202
|
+
mutationRoutes: buildMutationRoutes(indexedOperations),
|
|
203
|
+
queryRegistryEntries: buildQueryRegistryEntries(indexedOperations),
|
|
204
|
+
schedulerEntries: buildSchedulerEntries(indexedOperations),
|
|
205
|
+
schedulerPayloadMapEntries:
|
|
206
|
+
buildSchedulerPayloadMapEntries(indexedOperations),
|
|
207
|
+
cronEntries: buildCronEntries(indexedOperations),
|
|
208
|
+
storageHandlersEntries: buildStorageHandlersEntries(indexedOperations),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
export function generateTypesContextSection(): string {
|
|
2
|
-
return `type AuthSession = typeof auth.$Infer.Session;
|
|
3
|
-
type AuthAdapter = Awaited<typeof auth.$context>["internalAdapter"];
|
|
4
|
-
type User = AuthSession['user']
|
|
5
|
-
type Session = AuthSession['session']
|
|
6
|
-
|
|
7
|
-
export type StoragePutArgs = {
|
|
8
|
-
path: string;
|
|
9
|
-
body: ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob;
|
|
10
|
-
contentType?: string;
|
|
11
|
-
httpMetadata?: Record<string, unknown>;
|
|
12
|
-
customMetadata?: Record<string, string>;
|
|
13
|
-
returnSignedUrlOnly?: boolean;
|
|
14
|
-
expiresIn?: number;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export type StorageGetArgs = {
|
|
18
|
-
path: string;
|
|
19
|
-
method?: StorageMethod;
|
|
20
|
-
onlyIf?: unknown;
|
|
21
|
-
range?: unknown;
|
|
22
|
-
includeBody?: boolean;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type StorageGetResult = {
|
|
26
|
-
body: ReadableStream;
|
|
27
|
-
bodyUsed: boolean;
|
|
28
|
-
writeHttpResponse: (response: Response) => void;
|
|
29
|
-
httpMetadata?: Record<string, string | undefined>;
|
|
30
|
-
customMetadata?: Record<string, string>;
|
|
31
|
-
range?: {
|
|
32
|
-
offset: number;
|
|
33
|
-
length: number;
|
|
34
|
-
};
|
|
35
|
-
size: number;
|
|
36
|
-
etag: string;
|
|
37
|
-
httpEtag: string;
|
|
38
|
-
checksums: {
|
|
39
|
-
md5?: ArrayBuffer;
|
|
40
|
-
sha1?: ArrayBuffer;
|
|
41
|
-
sha256?: ArrayBuffer;
|
|
42
|
-
sha384?: ArrayBuffer;
|
|
43
|
-
sha512?: ArrayBuffer;
|
|
44
|
-
};
|
|
45
|
-
uploaded: Date;
|
|
46
|
-
key: string;
|
|
47
|
-
contentType?: string;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
export type StorageDeleteArgs = {
|
|
51
|
-
path: string;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
export type StorageListArgs = {
|
|
55
|
-
prefix?: string;
|
|
56
|
-
cursor?: string;
|
|
57
|
-
limit?: number;
|
|
58
|
-
delimiter?: string;
|
|
59
|
-
include?: Array<"httpMetadata" | "customMetadata">;
|
|
60
|
-
method?: StorageMethod;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
export type StorageSignedUrlArgs = {
|
|
64
|
-
path: string;
|
|
65
|
-
method?: "GET" | "PUT" | "DELETE";
|
|
66
|
-
expiresIn?: number;
|
|
67
|
-
contentType?: string;
|
|
68
|
-
downloadAsAttachment?: boolean;
|
|
69
|
-
fileName?: string;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export type AppflareStorage = {
|
|
73
|
-
put: (args: StoragePutArgs) => Promise<unknown>;
|
|
74
|
-
get: (args: StorageGetArgs) => Promise<StorageGetResult | null>;
|
|
75
|
-
delete: (args: StorageDeleteArgs) => Promise<void>;
|
|
76
|
-
list: (args?: StorageListArgs) => Promise<unknown>;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export type AppflareContext = {
|
|
80
|
-
$db: AppflareDb;
|
|
81
|
-
db: AppflareQueryDb;
|
|
82
|
-
mutationEvents: DbMutationEvent[];
|
|
83
|
-
user: User;
|
|
84
|
-
session: Session;
|
|
85
|
-
auth: AuthAdapter;
|
|
86
|
-
context: Context<WorkerEnv>;
|
|
87
|
-
scheduler: Scheduler;
|
|
88
|
-
storage: AppflareStorage;
|
|
89
|
-
error: (status: number, message: string, details?: unknown) => never;
|
|
90
|
-
};
|
|
91
|
-
`;
|
|
92
|
-
}
|
|
1
|
+
export function generateTypesContextSection(): string {
|
|
2
|
+
return `type AuthSession = typeof auth.$Infer.Session;
|
|
3
|
+
type AuthAdapter = Awaited<typeof auth.$context>["internalAdapter"];
|
|
4
|
+
type User = AuthSession['user']
|
|
5
|
+
type Session = AuthSession['session']
|
|
6
|
+
|
|
7
|
+
export type StoragePutArgs = {
|
|
8
|
+
path: string;
|
|
9
|
+
body: ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob;
|
|
10
|
+
contentType?: string;
|
|
11
|
+
httpMetadata?: Record<string, unknown>;
|
|
12
|
+
customMetadata?: Record<string, string>;
|
|
13
|
+
returnSignedUrlOnly?: boolean;
|
|
14
|
+
expiresIn?: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type StorageGetArgs = {
|
|
18
|
+
path: string;
|
|
19
|
+
method?: StorageMethod;
|
|
20
|
+
onlyIf?: unknown;
|
|
21
|
+
range?: unknown;
|
|
22
|
+
includeBody?: boolean;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type StorageGetResult = {
|
|
26
|
+
body: ReadableStream;
|
|
27
|
+
bodyUsed: boolean;
|
|
28
|
+
writeHttpResponse: (response: Response) => void;
|
|
29
|
+
httpMetadata?: Record<string, string | undefined>;
|
|
30
|
+
customMetadata?: Record<string, string>;
|
|
31
|
+
range?: {
|
|
32
|
+
offset: number;
|
|
33
|
+
length: number;
|
|
34
|
+
};
|
|
35
|
+
size: number;
|
|
36
|
+
etag: string;
|
|
37
|
+
httpEtag: string;
|
|
38
|
+
checksums: {
|
|
39
|
+
md5?: ArrayBuffer;
|
|
40
|
+
sha1?: ArrayBuffer;
|
|
41
|
+
sha256?: ArrayBuffer;
|
|
42
|
+
sha384?: ArrayBuffer;
|
|
43
|
+
sha512?: ArrayBuffer;
|
|
44
|
+
};
|
|
45
|
+
uploaded: Date;
|
|
46
|
+
key: string;
|
|
47
|
+
contentType?: string;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export type StorageDeleteArgs = {
|
|
51
|
+
path: string;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export type StorageListArgs = {
|
|
55
|
+
prefix?: string;
|
|
56
|
+
cursor?: string;
|
|
57
|
+
limit?: number;
|
|
58
|
+
delimiter?: string;
|
|
59
|
+
include?: Array<"httpMetadata" | "customMetadata">;
|
|
60
|
+
method?: StorageMethod;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export type StorageSignedUrlArgs = {
|
|
64
|
+
path: string;
|
|
65
|
+
method?: "GET" | "PUT" | "DELETE";
|
|
66
|
+
expiresIn?: number;
|
|
67
|
+
contentType?: string;
|
|
68
|
+
downloadAsAttachment?: boolean;
|
|
69
|
+
fileName?: string;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export type AppflareStorage = {
|
|
73
|
+
put: (args: StoragePutArgs) => Promise<unknown>;
|
|
74
|
+
get: (args: StorageGetArgs) => Promise<StorageGetResult | null>;
|
|
75
|
+
delete: (args: StorageDeleteArgs) => Promise<void>;
|
|
76
|
+
list: (args?: StorageListArgs) => Promise<unknown>;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export type AppflareContext = {
|
|
80
|
+
$db: AppflareDb;
|
|
81
|
+
db: AppflareQueryDb;
|
|
82
|
+
mutationEvents: DbMutationEvent[];
|
|
83
|
+
user: User;
|
|
84
|
+
session: Session;
|
|
85
|
+
auth: AuthAdapter;
|
|
86
|
+
context: Context<WorkerEnv>;
|
|
87
|
+
scheduler: Scheduler;
|
|
88
|
+
storage: AppflareStorage;
|
|
89
|
+
error: (status: number, message: string, details?: unknown) => never;
|
|
90
|
+
};
|
|
91
|
+
`;
|
|
92
|
+
}
|