appflare 0.2.48 → 0.2.49

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.
Files changed (139) hide show
  1. package/Documentation.md +898 -898
  2. package/cli/commands/index.ts +247 -247
  3. package/cli/generate.ts +360 -360
  4. package/cli/index.ts +120 -120
  5. package/cli/load-config.ts +184 -184
  6. package/cli/schema-compiler.ts +1366 -1366
  7. package/cli/templates/auth/README.md +156 -156
  8. package/cli/templates/auth/config.ts +61 -61
  9. package/cli/templates/auth/route-config.ts +1 -1
  10. package/cli/templates/auth/route-handler.ts +1 -1
  11. package/cli/templates/auth/route-request-utils.ts +5 -5
  12. package/cli/templates/auth/route.config.ts +18 -18
  13. package/cli/templates/auth/route.handler.ts +18 -18
  14. package/cli/templates/auth/route.request-utils.ts +55 -55
  15. package/cli/templates/auth/route.ts +14 -14
  16. package/cli/templates/core/README.md +266 -266
  17. package/cli/templates/core/app-creation.ts +19 -19
  18. package/cli/templates/core/client/appflare.ts +112 -112
  19. package/cli/templates/core/client/handlers/index.ts +763 -763
  20. package/cli/templates/core/client/handlers.ts +1 -1
  21. package/cli/templates/core/client/index.ts +7 -7
  22. package/cli/templates/core/client/storage.ts +195 -195
  23. package/cli/templates/core/client/types.ts +187 -187
  24. package/cli/templates/core/client-modules/appflare.ts +1 -1
  25. package/cli/templates/core/client-modules/handlers.ts +1 -1
  26. package/cli/templates/core/client-modules/index.ts +1 -1
  27. package/cli/templates/core/client-modules/storage.ts +1 -1
  28. package/cli/templates/core/client-modules/types.ts +1 -1
  29. package/cli/templates/core/client.artifacts.ts +39 -39
  30. package/cli/templates/core/client.ts +4 -4
  31. package/cli/templates/core/drizzle.ts +15 -15
  32. package/cli/templates/core/export.ts +14 -14
  33. package/cli/templates/core/handlers.route.ts +24 -24
  34. package/cli/templates/core/handlers.ts +1 -1
  35. package/cli/templates/core/imports.ts +9 -9
  36. package/cli/templates/core/server.ts +38 -38
  37. package/cli/templates/core/types.ts +6 -6
  38. package/cli/templates/core/wrangler.ts +109 -109
  39. package/cli/templates/dashboard/builders/functions/index.ts +17 -17
  40. package/cli/templates/dashboard/builders/functions/render-page/header.ts +20 -20
  41. package/cli/templates/dashboard/builders/functions/render-page/index.ts +33 -33
  42. package/cli/templates/dashboard/builders/functions/render-page/request-panel.ts +271 -271
  43. package/cli/templates/dashboard/builders/functions/render-page/result-panel.ts +85 -85
  44. package/cli/templates/dashboard/builders/functions/render-page/scripts.ts +703 -703
  45. package/cli/templates/dashboard/builders/functions/tree-builder.ts +47 -47
  46. package/cli/templates/dashboard/builders/navigation.ts +155 -155
  47. package/cli/templates/dashboard/builders/storage/index.ts +13 -13
  48. package/cli/templates/dashboard/builders/storage/routes/create-directory-route.ts +29 -29
  49. package/cli/templates/dashboard/builders/storage/routes/delete-route.ts +18 -18
  50. package/cli/templates/dashboard/builders/storage/routes/download-route.ts +23 -23
  51. package/cli/templates/dashboard/builders/storage/routes/index.ts +22 -22
  52. package/cli/templates/dashboard/builders/storage/routes/list-route.ts +25 -25
  53. package/cli/templates/dashboard/builders/storage/routes/preview-route.ts +21 -21
  54. package/cli/templates/dashboard/builders/storage/routes/upload-route.ts +21 -21
  55. package/cli/templates/dashboard/builders/storage/runtime/helpers.ts +72 -72
  56. package/cli/templates/dashboard/builders/storage/runtime/storage-page.ts +130 -130
  57. package/cli/templates/dashboard/builders/table-routes/common/drawer-panel.ts +27 -27
  58. package/cli/templates/dashboard/builders/table-routes/common/pagination.ts +30 -30
  59. package/cli/templates/dashboard/builders/table-routes/common/search-bar.ts +23 -23
  60. package/cli/templates/dashboard/builders/table-routes/fragments.ts +257 -217
  61. package/cli/templates/dashboard/builders/table-routes/helpers.ts +45 -45
  62. package/cli/templates/dashboard/builders/table-routes/index.ts +8 -8
  63. package/cli/templates/dashboard/builders/table-routes/table/actions-cell.ts +71 -71
  64. package/cli/templates/dashboard/builders/table-routes/table/get-route.ts +291 -291
  65. package/cli/templates/dashboard/builders/table-routes/table/index.ts +80 -80
  66. package/cli/templates/dashboard/builders/table-routes/table/post-routes.ts +163 -163
  67. package/cli/templates/dashboard/builders/table-routes/table-route.ts +7 -7
  68. package/cli/templates/dashboard/builders/table-routes/users/get-route.ts +69 -69
  69. package/cli/templates/dashboard/builders/table-routes/users/html/modals.ts +57 -57
  70. package/cli/templates/dashboard/builders/table-routes/users/html/page.ts +27 -27
  71. package/cli/templates/dashboard/builders/table-routes/users/html/table.ts +128 -128
  72. package/cli/templates/dashboard/builders/table-routes/users/index.ts +32 -32
  73. package/cli/templates/dashboard/builders/table-routes/users/post-routes.ts +150 -150
  74. package/cli/templates/dashboard/builders/table-routes/users/redirect.ts +14 -14
  75. package/cli/templates/dashboard/builders/table-routes/users-route.ts +10 -10
  76. package/cli/templates/dashboard/components/dashboard-home.ts +23 -23
  77. package/cli/templates/dashboard/components/layout.ts +420 -420
  78. package/cli/templates/dashboard/components/login-page.ts +65 -65
  79. package/cli/templates/dashboard/index.ts +61 -61
  80. package/cli/templates/dashboard/types.ts +9 -9
  81. package/cli/templates/handlers/README.md +353 -353
  82. package/cli/templates/handlers/auth.ts +37 -37
  83. package/cli/templates/handlers/execution.ts +44 -42
  84. package/cli/templates/handlers/generators/context/context-creation.ts +101 -101
  85. package/cli/templates/handlers/generators/context/error-helpers.ts +11 -11
  86. package/cli/templates/handlers/generators/context/scheduler.ts +24 -24
  87. package/cli/templates/handlers/generators/context/storage-api.ts +82 -82
  88. package/cli/templates/handlers/generators/context/storage-helpers.ts +59 -59
  89. package/cli/templates/handlers/generators/context/types.ts +40 -40
  90. package/cli/templates/handlers/generators/context.ts +43 -43
  91. package/cli/templates/handlers/generators/execution.ts +15 -15
  92. package/cli/templates/handlers/generators/handlers.ts +14 -14
  93. package/cli/templates/handlers/generators/registration/modules/cron.ts +35 -35
  94. package/cli/templates/handlers/generators/registration/modules/realtime/auth.ts +75 -75
  95. package/cli/templates/handlers/generators/registration/modules/realtime/durable-object.ts +144 -144
  96. package/cli/templates/handlers/generators/registration/modules/realtime/index.ts +14 -14
  97. package/cli/templates/handlers/generators/registration/modules/realtime/publisher.ts +102 -102
  98. package/cli/templates/handlers/generators/registration/modules/realtime/routes.ts +164 -164
  99. package/cli/templates/handlers/generators/registration/modules/realtime/types.ts +30 -30
  100. package/cli/templates/handlers/generators/registration/modules/realtime/utils.ts +510 -510
  101. package/cli/templates/handlers/generators/registration/modules/scheduler.ts +65 -65
  102. package/cli/templates/handlers/generators/registration/modules/storage.ts +199 -199
  103. package/cli/templates/handlers/generators/registration/sections.ts +210 -210
  104. package/cli/templates/handlers/generators/types/context.ts +121 -121
  105. package/cli/templates/handlers/generators/types/core.ts +108 -108
  106. package/cli/templates/handlers/generators/types/operations.ts +135 -135
  107. package/cli/templates/handlers/generators/types/query-definitions/filter-and-where-types.ts +291 -291
  108. package/cli/templates/handlers/generators/types/query-definitions/query-api-types.ts +135 -135
  109. package/cli/templates/handlers/generators/types/query-definitions/query-helper-functions.ts +1382 -1382
  110. package/cli/templates/handlers/generators/types/query-definitions/schema-and-table-types.ts +278 -278
  111. package/cli/templates/handlers/generators/types/query-definitions.ts +13 -13
  112. package/cli/templates/handlers/generators/types/query-runtime/handled-error.ts +13 -13
  113. package/cli/templates/handlers/generators/types/query-runtime/runtime-aggregate-and-footer.ts +174 -174
  114. package/cli/templates/handlers/generators/types/query-runtime/runtime-read.ts +156 -156
  115. package/cli/templates/handlers/generators/types/query-runtime/runtime-setup.ts +45 -45
  116. package/cli/templates/handlers/generators/types/query-runtime/runtime-write.ts +958 -958
  117. package/cli/templates/handlers/generators/types/query-runtime.ts +15 -15
  118. package/cli/templates/handlers/index.ts +47 -47
  119. package/cli/templates/handlers/operations.ts +116 -116
  120. package/cli/templates/handlers/registration.ts +91 -91
  121. package/cli/templates/handlers/types.ts +17 -17
  122. package/cli/templates/handlers/utils.ts +48 -48
  123. package/cli/types.ts +110 -110
  124. package/cli/utils/handler-discovery.ts +501 -501
  125. package/cli/utils/json-utils.ts +24 -24
  126. package/cli/utils/path-utils.ts +19 -19
  127. package/cli/utils/schema-discovery.ts +402 -399
  128. package/dist/cli/index.js +77 -55
  129. package/dist/cli/index.mjs +77 -55
  130. package/index.ts +18 -18
  131. package/package.json +58 -58
  132. package/react/index.ts +5 -5
  133. package/react/use-infinite-query.ts +255 -255
  134. package/react/use-mutation.ts +89 -89
  135. package/react/use-query.ts +210 -210
  136. package/schema.ts +641 -641
  137. package/test-better-auth-hash.ts +2 -2
  138. package/tsconfig.json +6 -6
  139. 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,121 +1,121 @@
1
- export function generateTypesContextSection(
2
- roles: string[] = [],
3
- additionalFields: Array<{ name: string; tsType: string }> = [],
4
- ): string {
5
- const additionalFieldLines = additionalFields.map(
6
- (f) => `\t${f.name}?: ${f.tsType} | null;`,
7
- ).join("\n");
8
-
9
- const adminFieldLines = roles.length > 0
10
- ? [
11
- "\trole: UserRole;",
12
- "\tbanned: boolean | null;",
13
- "\tbanReason?: string | null | undefined;",
14
- "\tbanExpires?: Date | null | undefined;",
15
- ].join("\n")
16
- : "";
17
-
18
- const userFields = [adminFieldLines, additionalFieldLines].filter(Boolean).join("\n");
19
-
20
- const userType = roles.length > 0
21
- ? `export type UserRole = ${roles.map((r) => `"${r}"`).join(" | ")};
22
- type User = import("better-auth").User & {
23
- ${userFields}
24
- };`
25
- : additionalFields.length > 0
26
- ? `type User = import("better-auth").User & {
27
- ${userFields}
28
- };`
29
- : "type User = import(\"better-auth\").User;";
30
-
31
- return `type AuthSession = typeof auth.$Infer.Session;
32
- type AuthAdapter = Awaited<typeof auth.$context>["internalAdapter"];
33
- ${userType}
34
- type Session = AuthSession['session']
35
-
36
- export type StoragePutArgs = {
37
- path: string;
38
- body: ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob;
39
- contentType?: string;
40
- httpMetadata?: Record<string, unknown>;
41
- customMetadata?: Record<string, string>;
42
- returnSignedUrlOnly?: boolean;
43
- expiresIn?: number;
44
- };
45
-
46
- export type StorageGetArgs = {
47
- path: string;
48
- method?: StorageMethod;
49
- onlyIf?: unknown;
50
- range?: unknown;
51
- includeBody?: boolean;
52
- };
53
-
54
- export type StorageGetResult = {
55
- body: ReadableStream;
56
- bodyUsed: boolean;
57
- writeHttpResponse: (response: Response) => void;
58
- httpMetadata?: Record<string, string | undefined>;
59
- customMetadata?: Record<string, string>;
60
- range?: {
61
- offset: number;
62
- length: number;
63
- };
64
- size: number;
65
- etag: string;
66
- httpEtag: string;
67
- checksums: {
68
- md5?: ArrayBuffer;
69
- sha1?: ArrayBuffer;
70
- sha256?: ArrayBuffer;
71
- sha384?: ArrayBuffer;
72
- sha512?: ArrayBuffer;
73
- };
74
- uploaded: Date;
75
- key: string;
76
- contentType?: string;
77
- };
78
-
79
- export type StorageDeleteArgs = {
80
- path: string;
81
- };
82
-
83
- export type StorageListArgs = {
84
- prefix?: string;
85
- cursor?: string;
86
- limit?: number;
87
- delimiter?: string;
88
- include?: Array<"httpMetadata" | "customMetadata">;
89
- method?: StorageMethod;
90
- };
91
-
92
- export type StorageSignedUrlArgs = {
93
- path: string;
94
- method?: "GET" | "PUT" | "DELETE";
95
- expiresIn?: number;
96
- contentType?: string;
97
- downloadAsAttachment?: boolean;
98
- fileName?: string;
99
- };
100
-
101
- export type AppflareStorage = {
102
- put: (args: StoragePutArgs) => Promise<unknown>;
103
- get: (args: StorageGetArgs) => Promise<StorageGetResult | null>;
104
- delete: (args: StorageDeleteArgs) => Promise<void>;
105
- list: (args?: StorageListArgs) => Promise<unknown>;
106
- };
107
-
108
- export type AppflareContext = {
109
- $db: AppflareDb;
110
- db: AppflareQueryDb;
111
- mutationEvents: DbMutationEvent[];
112
- user: User;
113
- session: Session;
114
- auth: AuthAdapter;
115
- context: Context<WorkerEnv>;
116
- scheduler: Scheduler;
117
- storage: AppflareStorage;
118
- error: (status: number, message: string, details?: unknown) => never;
119
- };
120
- `;
121
- }
1
+ export function generateTypesContextSection(
2
+ roles: string[] = [],
3
+ additionalFields: Array<{ name: string; tsType: string }> = [],
4
+ ): string {
5
+ const additionalFieldLines = additionalFields.map(
6
+ (f) => `\t${f.name}?: ${f.tsType} | null;`,
7
+ ).join("\n");
8
+
9
+ const adminFieldLines = roles.length > 0
10
+ ? [
11
+ "\trole: UserRole;",
12
+ "\tbanned: boolean | null;",
13
+ "\tbanReason?: string | null | undefined;",
14
+ "\tbanExpires?: Date | null | undefined;",
15
+ ].join("\n")
16
+ : "";
17
+
18
+ const userFields = [adminFieldLines, additionalFieldLines].filter(Boolean).join("\n");
19
+
20
+ const userType = roles.length > 0
21
+ ? `export type UserRole = ${roles.map((r) => `"${r}"`).join(" | ")};
22
+ type User = import("better-auth").User & {
23
+ ${userFields}
24
+ };`
25
+ : additionalFields.length > 0
26
+ ? `type User = import("better-auth").User & {
27
+ ${userFields}
28
+ };`
29
+ : "type User = import(\"better-auth\").User;";
30
+
31
+ return `type AuthSession = typeof auth.$Infer.Session;
32
+ type AuthAdapter = Awaited<typeof auth.$context>["internalAdapter"];
33
+ ${userType}
34
+ type Session = AuthSession['session']
35
+
36
+ export type StoragePutArgs = {
37
+ path: string;
38
+ body: ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob;
39
+ contentType?: string;
40
+ httpMetadata?: Record<string, unknown>;
41
+ customMetadata?: Record<string, string>;
42
+ returnSignedUrlOnly?: boolean;
43
+ expiresIn?: number;
44
+ };
45
+
46
+ export type StorageGetArgs = {
47
+ path: string;
48
+ method?: StorageMethod;
49
+ onlyIf?: unknown;
50
+ range?: unknown;
51
+ includeBody?: boolean;
52
+ };
53
+
54
+ export type StorageGetResult = {
55
+ body: ReadableStream;
56
+ bodyUsed: boolean;
57
+ writeHttpResponse: (response: Response) => void;
58
+ httpMetadata?: Record<string, string | undefined>;
59
+ customMetadata?: Record<string, string>;
60
+ range?: {
61
+ offset: number;
62
+ length: number;
63
+ };
64
+ size: number;
65
+ etag: string;
66
+ httpEtag: string;
67
+ checksums: {
68
+ md5?: ArrayBuffer;
69
+ sha1?: ArrayBuffer;
70
+ sha256?: ArrayBuffer;
71
+ sha384?: ArrayBuffer;
72
+ sha512?: ArrayBuffer;
73
+ };
74
+ uploaded: Date;
75
+ key: string;
76
+ contentType?: string;
77
+ };
78
+
79
+ export type StorageDeleteArgs = {
80
+ path: string;
81
+ };
82
+
83
+ export type StorageListArgs = {
84
+ prefix?: string;
85
+ cursor?: string;
86
+ limit?: number;
87
+ delimiter?: string;
88
+ include?: Array<"httpMetadata" | "customMetadata">;
89
+ method?: StorageMethod;
90
+ };
91
+
92
+ export type StorageSignedUrlArgs = {
93
+ path: string;
94
+ method?: "GET" | "PUT" | "DELETE";
95
+ expiresIn?: number;
96
+ contentType?: string;
97
+ downloadAsAttachment?: boolean;
98
+ fileName?: string;
99
+ };
100
+
101
+ export type AppflareStorage = {
102
+ put: (args: StoragePutArgs) => Promise<unknown>;
103
+ get: (args: StorageGetArgs) => Promise<StorageGetResult | null>;
104
+ delete: (args: StorageDeleteArgs) => Promise<void>;
105
+ list: (args?: StorageListArgs) => Promise<unknown>;
106
+ };
107
+
108
+ export type AppflareContext = {
109
+ $db: AppflareDb;
110
+ db: AppflareQueryDb;
111
+ mutationEvents: DbMutationEvent[];
112
+ user: User;
113
+ session: Session;
114
+ auth: AuthAdapter;
115
+ context: Context<WorkerEnv>;
116
+ scheduler: Scheduler;
117
+ storage: AppflareStorage;
118
+ error: (status: number, message: string, details?: unknown) => never;
119
+ };
120
+ `;
121
+ }