appflare 0.2.29 → 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.
Files changed (140) hide show
  1. package/Documentation.md +758 -758
  2. package/cli/commands/index.ts +238 -238
  3. package/cli/generate.ts +178 -178
  4. package/cli/index.ts +120 -120
  5. package/cli/load-config.ts +184 -184
  6. package/cli/schema-compiler.ts +1183 -1183
  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 +748 -748
  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 +186 -186
  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 +171 -171
  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 +554 -554
  45. package/cli/templates/dashboard/builders/navigation.ts +122 -122
  46. package/cli/templates/dashboard/builders/storage/index.ts +13 -13
  47. package/cli/templates/dashboard/builders/storage/routes/create-directory-route.ts +29 -29
  48. package/cli/templates/dashboard/builders/storage/routes/delete-route.ts +18 -18
  49. package/cli/templates/dashboard/builders/storage/routes/download-route.ts +23 -23
  50. package/cli/templates/dashboard/builders/storage/routes/index.ts +22 -22
  51. package/cli/templates/dashboard/builders/storage/routes/list-route.ts +25 -25
  52. package/cli/templates/dashboard/builders/storage/routes/preview-route.ts +21 -21
  53. package/cli/templates/dashboard/builders/storage/routes/upload-route.ts +21 -21
  54. package/cli/templates/dashboard/builders/storage/runtime/helpers.ts +72 -72
  55. package/cli/templates/dashboard/builders/storage/runtime/storage-page.ts +130 -130
  56. package/cli/templates/dashboard/builders/table-routes/common/drawer-panel.ts +27 -27
  57. package/cli/templates/dashboard/builders/table-routes/common/pagination.ts +30 -30
  58. package/cli/templates/dashboard/builders/table-routes/common/search-bar.ts +23 -23
  59. package/cli/templates/dashboard/builders/table-routes/fragments.ts +217 -217
  60. package/cli/templates/dashboard/builders/table-routes/helpers.ts +45 -45
  61. package/cli/templates/dashboard/builders/table-routes/index.ts +8 -8
  62. package/cli/templates/dashboard/builders/table-routes/table/actions-cell.ts +71 -71
  63. package/cli/templates/dashboard/builders/table-routes/table/get-route.ts +291 -291
  64. package/cli/templates/dashboard/builders/table-routes/table/index.ts +80 -80
  65. package/cli/templates/dashboard/builders/table-routes/table/post-routes.ts +163 -163
  66. package/cli/templates/dashboard/builders/table-routes/table-route.ts +7 -7
  67. package/cli/templates/dashboard/builders/table-routes/users/get-route.ts +69 -69
  68. package/cli/templates/dashboard/builders/table-routes/users/html/modals.ts +57 -57
  69. package/cli/templates/dashboard/builders/table-routes/users/html/page.ts +27 -27
  70. package/cli/templates/dashboard/builders/table-routes/users/html/table.ts +128 -128
  71. package/cli/templates/dashboard/builders/table-routes/users/index.ts +32 -32
  72. package/cli/templates/dashboard/builders/table-routes/users/post-routes.ts +150 -150
  73. package/cli/templates/dashboard/builders/table-routes/users/redirect.ts +14 -14
  74. package/cli/templates/dashboard/builders/table-routes/users-route.ts +10 -10
  75. package/cli/templates/dashboard/components/dashboard-home.ts +23 -23
  76. package/cli/templates/dashboard/components/layout.ts +388 -388
  77. package/cli/templates/dashboard/components/login-page.ts +65 -65
  78. package/cli/templates/dashboard/index.ts +61 -61
  79. package/cli/templates/dashboard/types.ts +9 -9
  80. package/cli/templates/handlers/README.md +353 -353
  81. package/cli/templates/handlers/auth.ts +37 -37
  82. package/cli/templates/handlers/execution.ts +42 -42
  83. package/cli/templates/handlers/generators/context/context-creation.ts +101 -101
  84. package/cli/templates/handlers/generators/context/error-helpers.ts +11 -11
  85. package/cli/templates/handlers/generators/context/scheduler.ts +24 -24
  86. package/cli/templates/handlers/generators/context/storage-api.ts +82 -82
  87. package/cli/templates/handlers/generators/context/storage-helpers.ts +59 -59
  88. package/cli/templates/handlers/generators/context/types.ts +40 -40
  89. package/cli/templates/handlers/generators/context.ts +43 -43
  90. package/cli/templates/handlers/generators/execution.ts +15 -15
  91. package/cli/templates/handlers/generators/handlers.ts +13 -13
  92. package/cli/templates/handlers/generators/registration/modules/cron.ts +26 -26
  93. package/cli/templates/handlers/generators/registration/modules/realtime/auth.ts +75 -75
  94. package/cli/templates/handlers/generators/registration/modules/realtime/durable-object.ts +144 -144
  95. package/cli/templates/handlers/generators/registration/modules/realtime/index.ts +14 -14
  96. package/cli/templates/handlers/generators/registration/modules/realtime/publisher.ts +102 -102
  97. package/cli/templates/handlers/generators/registration/modules/realtime/routes.ts +164 -164
  98. package/cli/templates/handlers/generators/registration/modules/realtime/types.ts +30 -30
  99. package/cli/templates/handlers/generators/registration/modules/realtime/utils.ts +516 -516
  100. package/cli/templates/handlers/generators/registration/modules/scheduler.ts +56 -56
  101. package/cli/templates/handlers/generators/registration/modules/storage.ts +199 -199
  102. package/cli/templates/handlers/generators/registration/sections.ts +210 -210
  103. package/cli/templates/handlers/generators/types/context.ts +92 -92
  104. package/cli/templates/handlers/generators/types/core.ts +106 -106
  105. package/cli/templates/handlers/generators/types/operations.ts +135 -135
  106. package/cli/templates/handlers/generators/types/query-definitions/filter-and-where-types.ts +281 -259
  107. package/cli/templates/handlers/generators/types/query-definitions/query-api-types.ts +135 -135
  108. package/cli/templates/handlers/generators/types/query-definitions/query-helper-functions.ts +1103 -1031
  109. package/cli/templates/handlers/generators/types/query-definitions/schema-and-table-types.ts +278 -246
  110. package/cli/templates/handlers/generators/types/query-definitions.ts +13 -13
  111. package/cli/templates/handlers/generators/types/query-runtime/handled-error.ts +13 -13
  112. package/cli/templates/handlers/generators/types/query-runtime/runtime-aggregate-and-footer.ts +174 -174
  113. package/cli/templates/handlers/generators/types/query-runtime/runtime-read.ts +157 -121
  114. package/cli/templates/handlers/generators/types/query-runtime/runtime-setup.ts +45 -45
  115. package/cli/templates/handlers/generators/types/query-runtime/runtime-write.ts +697 -676
  116. package/cli/templates/handlers/generators/types/query-runtime.ts +15 -15
  117. package/cli/templates/handlers/index.ts +43 -43
  118. package/cli/templates/handlers/operations.ts +116 -116
  119. package/cli/templates/handlers/registration.ts +91 -91
  120. package/cli/templates/handlers/types.ts +15 -15
  121. package/cli/templates/handlers/utils.ts +48 -48
  122. package/cli/types.ts +110 -110
  123. package/cli/utils/handler-discovery.ts +466 -466
  124. package/cli/utils/json-utils.ts +24 -24
  125. package/cli/utils/path-utils.ts +19 -19
  126. package/cli/utils/schema-discovery.ts +399 -399
  127. package/dist/cli/index.d.mts +2 -0
  128. package/dist/cli/index.d.ts +2 -0
  129. package/dist/cli/index.js +301 -118
  130. package/dist/cli/index.mjs +301 -118
  131. package/index.ts +18 -18
  132. package/package.json +58 -58
  133. package/react/index.ts +5 -5
  134. package/react/use-infinite-query.ts +252 -252
  135. package/react/use-mutation.ts +89 -89
  136. package/react/use-query.ts +207 -207
  137. package/schema.ts +415 -415
  138. package/test-better-auth-hash.ts +2 -2
  139. package/tsconfig.json +6 -6
  140. package/tsup.config.ts +82 -82
package/cli/generate.ts CHANGED
@@ -1,178 +1,178 @@
1
- import { mkdir } from "node:fs/promises";
2
- import { existsSync } from "node:fs";
3
- import { relative, resolve } from "node:path";
4
- import { generateAuthConfigSource } from "./templates/auth/config";
5
- import { generateClientArtifacts } from "./templates/core/client.artifacts";
6
- import { generateDrizzleConfigSource } from "./templates/core/drizzle";
7
- import { generateHandlersArtifacts } from "./templates/core/handlers";
8
- import { generateServerSource } from "./templates/core/server";
9
- import { generateWranglerJson } from "./templates/core/wrangler";
10
- import { generateDashboardSource } from "./templates/dashboard/index";
11
- import { compileSchemaDsl } from "./schema-compiler";
12
- import type { LoadedAppflareConfig } from "./types";
13
- import { discoverHandlerOperations } from "./utils/handler-discovery";
14
- import { discoverSchema } from "./utils/schema-discovery";
15
- import { ensureRelativeImportPath } from "./utils/path-utils";
16
-
17
- function toConfigRelativePath(configDir: string, absolutePath: string): string {
18
- const relativePath = relative(configDir, absolutePath).replace(/\\/g, "/");
19
- return relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
20
- }
21
-
22
- export async function generateArtifacts(
23
- loadedConfig: LoadedAppflareConfig,
24
- ): Promise<void> {
25
- const { outDirAbs, wranglerOutDirAbs, config, configPath, configDir } =
26
- loadedConfig;
27
- const configImport = ensureRelativeImportPath(outDirAbs, configPath);
28
- const clientOutDirAbs = resolve(outDirAbs, "client");
29
- const clientConfigImport = ensureRelativeImportPath(
30
- clientOutDirAbs,
31
- configPath,
32
- );
33
-
34
- await Promise.all([
35
- mkdir(outDirAbs, { recursive: true }),
36
- mkdir(clientOutDirAbs, { recursive: true }),
37
- mkdir(wranglerOutDirAbs, { recursive: true }),
38
- ]);
39
-
40
- const serverPath = resolve(outDirAbs, "server.ts");
41
- const clientPath = resolve(outDirAbs, "client.ts");
42
- const authConfigPath = resolve(outDirAbs, "auth.config.ts");
43
- const authSchemaPath = resolve(outDirAbs, "auth.schema.ts");
44
- const drizzleConfigPath = resolve(outDirAbs, "drizzle.config.ts");
45
- const wranglerPath = resolve(wranglerOutDirAbs, "wrangler.json");
46
- const compiledSchema = await compileSchemaDsl(loadedConfig);
47
-
48
- const discoveredSchema = await discoverSchema(
49
- loadedConfig,
50
- compiledSchema ? [compiledSchema.schemaPath] : [],
51
- );
52
- const schemaImport = ensureRelativeImportPath(
53
- outDirAbs,
54
- discoveredSchema.schemaPath,
55
- );
56
- const discoveredHandlers = await discoverHandlerOperations(loadedConfig);
57
-
58
- const serverSource = generateServerSource(
59
- config.auth.basePath,
60
- config.database[0].binding,
61
- config.kv[0]?.binding,
62
- config.scheduler.binding,
63
- config.r2[0]?.binding,
64
- config.realtime.binding,
65
- config.realtime.objectName,
66
- config.realtime.subscribePath,
67
- config.realtime.websocketPath,
68
- config.realtime.protocol,
69
- );
70
- const clientArtifacts = generateClientArtifacts(
71
- clientConfigImport,
72
- discoveredHandlers,
73
- );
74
- const handlerArtifacts = generateHandlersArtifacts(
75
- schemaImport,
76
- discoveredHandlers,
77
- config.r2[0]?.binding,
78
- );
79
- const authConfigSource = generateAuthConfigSource(configImport);
80
- const drizzleSchemaPaths = compiledSchema
81
- ? [
82
- toConfigRelativePath(configDir, compiledSchema.schemaPath),
83
- ...config.schema.filter((schemaPath) => {
84
- return !/(^|\/)schema\.ts$/.test(schemaPath);
85
- }),
86
- ]
87
- : config.schema;
88
- const drizzleConfigSource = generateDrizzleConfigSource(drizzleSchemaPaths);
89
- const wranglerJson = generateWranglerJson(loadedConfig, discoveredHandlers);
90
- const dashboardSource = generateDashboardSource(
91
- schemaImport,
92
- discoveredSchema,
93
- discoveredHandlers,
94
- );
95
- const dashboardPath = resolve(outDirAbs, "admin.routes.ts");
96
- const handlerWriteOperations = handlerArtifacts.map((artifact) => {
97
- return Bun.write(
98
- resolve(outDirAbs, artifact.relativePath),
99
- artifact.source,
100
- );
101
- });
102
- const clientWriteOperations = clientArtifacts.map((artifact) => {
103
- return Bun.write(
104
- resolve(outDirAbs, artifact.relativePath),
105
- artifact.source,
106
- );
107
- });
108
-
109
- await Promise.all([
110
- Bun.write(serverPath, serverSource),
111
- Bun.write(clientPath, 'export * from "./client/index";\n'),
112
- ...clientWriteOperations,
113
- ...handlerWriteOperations,
114
- Bun.write(authConfigPath, authConfigSource),
115
- Bun.write(authSchemaPath, ""),
116
- Bun.write(drizzleConfigPath, drizzleConfigSource),
117
- Bun.write(wranglerPath, `${JSON.stringify(wranglerJson, null, 2)}\n`),
118
- Bun.write(dashboardPath, dashboardSource),
119
- ]);
120
-
121
- const authConfigPathFromConfigDir = relative(
122
- configDir,
123
- authConfigPath,
124
- ).replace(/\\/g, "/");
125
- const authConfigCliPath = authConfigPathFromConfigDir.startsWith(".")
126
- ? authConfigPathFromConfigDir
127
- : `./${authConfigPathFromConfigDir}`;
128
- const authSchemaPathFromConfigDir = relative(
129
- configDir,
130
- authSchemaPath,
131
- ).replace(/\\/g, "/");
132
- const authSchemaCliPath = authSchemaPathFromConfigDir.startsWith(".")
133
- ? authSchemaPathFromConfigDir
134
- : `./${authSchemaPathFromConfigDir}`;
135
-
136
- const betterAuthGenerate = Bun.spawn(
137
- [
138
- "npx",
139
- "@better-auth/cli",
140
- "generate",
141
- "--config",
142
- authConfigCliPath,
143
- "--output",
144
- authSchemaCliPath,
145
- "--yes",
146
- ],
147
- {
148
- cwd: configDir,
149
- stdout: "inherit",
150
- stderr: "inherit",
151
- },
152
- );
153
-
154
- const exitCode = await betterAuthGenerate.exited;
155
- if (exitCode !== 0) {
156
- throw new Error(`better-auth generation failed with exit code ${exitCode}`);
157
- }
158
-
159
- const tsconfigPath = resolve(configDir, "tsconfig.json");
160
- if (loadedConfig.config.build && existsSync(tsconfigPath)) {
161
- const npxCmd = process.platform === "win32" ? "npx.cmd" : "npx";
162
- const tsBuild = Bun.spawn(
163
- [npxCmd, "--yes", "-p", "typescript", "tsc", "--build"],
164
- {
165
- cwd: configDir,
166
- stdout: "inherit",
167
- stderr: "inherit",
168
- },
169
- );
170
-
171
- const tsBuildExitCode = await tsBuild.exited;
172
- if (tsBuildExitCode !== 0) {
173
- throw new Error(
174
- `TypeScript build failed with exit code ${tsBuildExitCode}`,
175
- );
176
- }
177
- }
178
- }
1
+ import { mkdir } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { relative, resolve } from "node:path";
4
+ import { generateAuthConfigSource } from "./templates/auth/config";
5
+ import { generateClientArtifacts } from "./templates/core/client.artifacts";
6
+ import { generateDrizzleConfigSource } from "./templates/core/drizzle";
7
+ import { generateHandlersArtifacts } from "./templates/core/handlers";
8
+ import { generateServerSource } from "./templates/core/server";
9
+ import { generateWranglerJson } from "./templates/core/wrangler";
10
+ import { generateDashboardSource } from "./templates/dashboard/index";
11
+ import { compileSchemaDsl } from "./schema-compiler";
12
+ import type { LoadedAppflareConfig } from "./types";
13
+ import { discoverHandlerOperations } from "./utils/handler-discovery";
14
+ import { discoverSchema } from "./utils/schema-discovery";
15
+ import { ensureRelativeImportPath } from "./utils/path-utils";
16
+
17
+ function toConfigRelativePath(configDir: string, absolutePath: string): string {
18
+ const relativePath = relative(configDir, absolutePath).replace(/\\/g, "/");
19
+ return relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
20
+ }
21
+
22
+ export async function generateArtifacts(
23
+ loadedConfig: LoadedAppflareConfig,
24
+ ): Promise<void> {
25
+ const { outDirAbs, wranglerOutDirAbs, config, configPath, configDir } =
26
+ loadedConfig;
27
+ const configImport = ensureRelativeImportPath(outDirAbs, configPath);
28
+ const clientOutDirAbs = resolve(outDirAbs, "client");
29
+ const clientConfigImport = ensureRelativeImportPath(
30
+ clientOutDirAbs,
31
+ configPath,
32
+ );
33
+
34
+ await Promise.all([
35
+ mkdir(outDirAbs, { recursive: true }),
36
+ mkdir(clientOutDirAbs, { recursive: true }),
37
+ mkdir(wranglerOutDirAbs, { recursive: true }),
38
+ ]);
39
+
40
+ const serverPath = resolve(outDirAbs, "server.ts");
41
+ const clientPath = resolve(outDirAbs, "client.ts");
42
+ const authConfigPath = resolve(outDirAbs, "auth.config.ts");
43
+ const authSchemaPath = resolve(outDirAbs, "auth.schema.ts");
44
+ const drizzleConfigPath = resolve(outDirAbs, "drizzle.config.ts");
45
+ const wranglerPath = resolve(wranglerOutDirAbs, "wrangler.json");
46
+ const compiledSchema = await compileSchemaDsl(loadedConfig);
47
+
48
+ const discoveredSchema = await discoverSchema(
49
+ loadedConfig,
50
+ compiledSchema ? [compiledSchema.schemaPath] : [],
51
+ );
52
+ const schemaImport = ensureRelativeImportPath(
53
+ outDirAbs,
54
+ discoveredSchema.schemaPath,
55
+ );
56
+ const discoveredHandlers = await discoverHandlerOperations(loadedConfig);
57
+
58
+ const serverSource = generateServerSource(
59
+ config.auth.basePath,
60
+ config.database[0].binding,
61
+ config.kv[0]?.binding,
62
+ config.scheduler.binding,
63
+ config.r2[0]?.binding,
64
+ config.realtime.binding,
65
+ config.realtime.objectName,
66
+ config.realtime.subscribePath,
67
+ config.realtime.websocketPath,
68
+ config.realtime.protocol,
69
+ );
70
+ const clientArtifacts = generateClientArtifacts(
71
+ clientConfigImport,
72
+ discoveredHandlers,
73
+ );
74
+ const handlerArtifacts = generateHandlersArtifacts(
75
+ schemaImport,
76
+ discoveredHandlers,
77
+ config.r2[0]?.binding,
78
+ );
79
+ const authConfigSource = generateAuthConfigSource(configImport);
80
+ const drizzleSchemaPaths = compiledSchema
81
+ ? [
82
+ toConfigRelativePath(configDir, compiledSchema.schemaPath),
83
+ ...config.schema.filter((schemaPath) => {
84
+ return !/(^|\/)schema\.ts$/.test(schemaPath);
85
+ }),
86
+ ]
87
+ : config.schema;
88
+ const drizzleConfigSource = generateDrizzleConfigSource(drizzleSchemaPaths);
89
+ const wranglerJson = generateWranglerJson(loadedConfig, discoveredHandlers);
90
+ const dashboardSource = generateDashboardSource(
91
+ schemaImport,
92
+ discoveredSchema,
93
+ discoveredHandlers,
94
+ );
95
+ const dashboardPath = resolve(outDirAbs, "admin.routes.ts");
96
+ const handlerWriteOperations = handlerArtifacts.map((artifact) => {
97
+ return Bun.write(
98
+ resolve(outDirAbs, artifact.relativePath),
99
+ artifact.source,
100
+ );
101
+ });
102
+ const clientWriteOperations = clientArtifacts.map((artifact) => {
103
+ return Bun.write(
104
+ resolve(outDirAbs, artifact.relativePath),
105
+ artifact.source,
106
+ );
107
+ });
108
+
109
+ await Promise.all([
110
+ Bun.write(serverPath, serverSource),
111
+ Bun.write(clientPath, 'export * from "./client/index";\n'),
112
+ ...clientWriteOperations,
113
+ ...handlerWriteOperations,
114
+ Bun.write(authConfigPath, authConfigSource),
115
+ Bun.write(authSchemaPath, ""),
116
+ Bun.write(drizzleConfigPath, drizzleConfigSource),
117
+ Bun.write(wranglerPath, `${JSON.stringify(wranglerJson, null, 2)}\n`),
118
+ Bun.write(dashboardPath, dashboardSource),
119
+ ]);
120
+
121
+ const authConfigPathFromConfigDir = relative(
122
+ configDir,
123
+ authConfigPath,
124
+ ).replace(/\\/g, "/");
125
+ const authConfigCliPath = authConfigPathFromConfigDir.startsWith(".")
126
+ ? authConfigPathFromConfigDir
127
+ : `./${authConfigPathFromConfigDir}`;
128
+ const authSchemaPathFromConfigDir = relative(
129
+ configDir,
130
+ authSchemaPath,
131
+ ).replace(/\\/g, "/");
132
+ const authSchemaCliPath = authSchemaPathFromConfigDir.startsWith(".")
133
+ ? authSchemaPathFromConfigDir
134
+ : `./${authSchemaPathFromConfigDir}`;
135
+
136
+ const betterAuthGenerate = Bun.spawn(
137
+ [
138
+ "npx",
139
+ "@better-auth/cli",
140
+ "generate",
141
+ "--config",
142
+ authConfigCliPath,
143
+ "--output",
144
+ authSchemaCliPath,
145
+ "--yes",
146
+ ],
147
+ {
148
+ cwd: configDir,
149
+ stdout: "inherit",
150
+ stderr: "inherit",
151
+ },
152
+ );
153
+
154
+ const exitCode = await betterAuthGenerate.exited;
155
+ if (exitCode !== 0) {
156
+ throw new Error(`better-auth generation failed with exit code ${exitCode}`);
157
+ }
158
+
159
+ const tsconfigPath = resolve(configDir, "tsconfig.json");
160
+ if (loadedConfig.config.build && existsSync(tsconfigPath)) {
161
+ const npxCmd = process.platform === "win32" ? "npx.cmd" : "npx";
162
+ const tsBuild = Bun.spawn(
163
+ [npxCmd, "--yes", "-p", "typescript", "tsc", "--build"],
164
+ {
165
+ cwd: configDir,
166
+ stdout: "inherit",
167
+ stderr: "inherit",
168
+ },
169
+ );
170
+
171
+ const tsBuildExitCode = await tsBuild.exited;
172
+ if (tsBuildExitCode !== 0) {
173
+ throw new Error(
174
+ `TypeScript build failed with exit code ${tsBuildExitCode}`,
175
+ );
176
+ }
177
+ }
178
+ }
package/cli/index.ts CHANGED
@@ -1,120 +1,120 @@
1
- import { Command } from "commander";
2
- import { runBuild, runDev, runMigrate, runAddAdmin } from "./commands/index";
3
-
4
- const program = new Command();
5
-
6
- program
7
- .name("appflare")
8
- .description(
9
- "Appflare compiler/bundler for Cloudflare-native backends and SDK generation",
10
- )
11
- .version("0.0.28");
12
-
13
- program
14
- .command("build")
15
- .description(
16
- "Generate server.ts, client.ts, auth.config.ts, drizzle.config.ts, and wrangler.json artifacts",
17
- )
18
- .option(
19
- "-c, --config <path>",
20
- "Path to appflare.config.ts",
21
- "appflare.config.ts",
22
- )
23
- .option("--no-build", "Skip TypeScript build step")
24
- .action(async (options: { config: string; build: boolean }) => {
25
- await runBuild(options.config, { build: options.build });
26
- });
27
-
28
- program
29
- .command("dev")
30
- .description("Run generator in development mode")
31
- .option(
32
- "-c, --config <path>",
33
- "Path to appflare.config.ts",
34
- "appflare.config.ts",
35
- )
36
- .option("-w, --watch", "Watch scanDir and regenerate on changes", false)
37
- .option("--no-build", "Skip TypeScript build step")
38
- .action(
39
- async (options: { config: string; watch: boolean; build: boolean }) => {
40
- await runDev(options.config, { watch: options.watch, build: options.build });
41
- },
42
- );
43
-
44
- program
45
- .command("migrate")
46
- .description(
47
- "Generate drizzle migration files from outDir/auth.schema.ts and apply them to the configured D1 database",
48
- )
49
- .option(
50
- "-c, --config <path>",
51
- "Path to appflare.config.ts",
52
- "appflare.config.ts",
53
- )
54
- .option(
55
- "--local",
56
- "Execute commands/files against a local DB for use with wrangler dev",
57
- false,
58
- )
59
- .option(
60
- "--remote",
61
- "Execute commands/files against a remote DB for use with wrangler dev --remote",
62
- false,
63
- )
64
- .option("--preview", "Execute commands/files against a preview D1 DB", false)
65
- .action(
66
- async (options: {
67
- config: string;
68
- local: boolean;
69
- remote: boolean;
70
- preview: boolean;
71
- }) => {
72
- await runMigrate(options.config, {
73
- local: options.local,
74
- remote: options.remote,
75
- preview: options.preview,
76
- });
77
- },
78
- );
79
-
80
- program
81
- .command("add-admin")
82
- .description("Add an admin user to the database")
83
- .requiredOption("-n, --name <name>", "Admin's display name")
84
- .requiredOption("-e, --email <email>", "Admin's email address")
85
- .requiredOption("-p, --password <password>", "Admin's password")
86
- .option(
87
- "-c, --config <path>",
88
- "Path to appflare.config.ts",
89
- "appflare.config.ts",
90
- )
91
- .option(
92
- "--local",
93
- "Execute command against a local DB for use with wrangler dev",
94
- false,
95
- )
96
- .option(
97
- "--remote",
98
- "Execute command against a remote DB for use with wrangler dev --remote",
99
- false,
100
- )
101
- .action(async (options: any) => {
102
- await runAddAdmin(options.config, {
103
- name: options.name,
104
- email: options.email,
105
- password: options.password,
106
- local: options.local,
107
- remote: options.remote,
108
- });
109
- });
110
-
111
- (async () => {
112
- if (!process.versions.bun) {
113
- console.error("Appflare CLI must be run with Bun.");
114
- process.exit(1);
115
- }
116
- await program.parseAsync(process.argv);
117
- })().catch((error) => {
118
- console.error(error);
119
- process.exit(1);
120
- });
1
+ import { Command } from "commander";
2
+ import { runBuild, runDev, runMigrate, runAddAdmin } from "./commands/index";
3
+
4
+ const program = new Command();
5
+
6
+ program
7
+ .name("appflare")
8
+ .description(
9
+ "Appflare compiler/bundler for Cloudflare-native backends and SDK generation",
10
+ )
11
+ .version("0.0.28");
12
+
13
+ program
14
+ .command("build")
15
+ .description(
16
+ "Generate server.ts, client.ts, auth.config.ts, drizzle.config.ts, and wrangler.json artifacts",
17
+ )
18
+ .option(
19
+ "-c, --config <path>",
20
+ "Path to appflare.config.ts",
21
+ "appflare.config.ts",
22
+ )
23
+ .option("--no-build", "Skip TypeScript build step")
24
+ .action(async (options: { config: string; build: boolean }) => {
25
+ await runBuild(options.config, { build: options.build });
26
+ });
27
+
28
+ program
29
+ .command("dev")
30
+ .description("Run generator in development mode")
31
+ .option(
32
+ "-c, --config <path>",
33
+ "Path to appflare.config.ts",
34
+ "appflare.config.ts",
35
+ )
36
+ .option("-w, --watch", "Watch scanDir and regenerate on changes", false)
37
+ .option("--no-build", "Skip TypeScript build step")
38
+ .action(
39
+ async (options: { config: string; watch: boolean; build: boolean }) => {
40
+ await runDev(options.config, { watch: options.watch, build: options.build });
41
+ },
42
+ );
43
+
44
+ program
45
+ .command("migrate")
46
+ .description(
47
+ "Generate drizzle migration files from outDir/auth.schema.ts and apply them to the configured D1 database",
48
+ )
49
+ .option(
50
+ "-c, --config <path>",
51
+ "Path to appflare.config.ts",
52
+ "appflare.config.ts",
53
+ )
54
+ .option(
55
+ "--local",
56
+ "Execute commands/files against a local DB for use with wrangler dev",
57
+ false,
58
+ )
59
+ .option(
60
+ "--remote",
61
+ "Execute commands/files against a remote DB for use with wrangler dev --remote",
62
+ false,
63
+ )
64
+ .option("--preview", "Execute commands/files against a preview D1 DB", false)
65
+ .action(
66
+ async (options: {
67
+ config: string;
68
+ local: boolean;
69
+ remote: boolean;
70
+ preview: boolean;
71
+ }) => {
72
+ await runMigrate(options.config, {
73
+ local: options.local,
74
+ remote: options.remote,
75
+ preview: options.preview,
76
+ });
77
+ },
78
+ );
79
+
80
+ program
81
+ .command("add-admin")
82
+ .description("Add an admin user to the database")
83
+ .requiredOption("-n, --name <name>", "Admin's display name")
84
+ .requiredOption("-e, --email <email>", "Admin's email address")
85
+ .requiredOption("-p, --password <password>", "Admin's password")
86
+ .option(
87
+ "-c, --config <path>",
88
+ "Path to appflare.config.ts",
89
+ "appflare.config.ts",
90
+ )
91
+ .option(
92
+ "--local",
93
+ "Execute command against a local DB for use with wrangler dev",
94
+ false,
95
+ )
96
+ .option(
97
+ "--remote",
98
+ "Execute command against a remote DB for use with wrangler dev --remote",
99
+ false,
100
+ )
101
+ .action(async (options: any) => {
102
+ await runAddAdmin(options.config, {
103
+ name: options.name,
104
+ email: options.email,
105
+ password: options.password,
106
+ local: options.local,
107
+ remote: options.remote,
108
+ });
109
+ });
110
+
111
+ (async () => {
112
+ if (!process.versions.bun) {
113
+ console.error("Appflare CLI must be run with Bun.");
114
+ process.exit(1);
115
+ }
116
+ await program.parseAsync(process.argv);
117
+ })().catch((error) => {
118
+ console.error(error);
119
+ process.exit(1);
120
+ });