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
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
|
+
});
|