@convex-dev/static-hosting 0.1.2-beta.0

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 (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +333 -0
  3. package/dist/cli/deploy.d.ts +16 -0
  4. package/dist/cli/deploy.d.ts.map +1 -0
  5. package/dist/cli/deploy.js +324 -0
  6. package/dist/cli/deploy.js.map +1 -0
  7. package/dist/cli/index.d.ts +15 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +95 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/init.d.ts +9 -0
  12. package/dist/cli/init.d.ts.map +1 -0
  13. package/dist/cli/init.js +181 -0
  14. package/dist/cli/init.js.map +1 -0
  15. package/dist/cli/next-build.d.ts +24 -0
  16. package/dist/cli/next-build.d.ts.map +1 -0
  17. package/dist/cli/next-build.js +569 -0
  18. package/dist/cli/next-build.js.map +1 -0
  19. package/dist/cli/setup.d.ts +9 -0
  20. package/dist/cli/setup.d.ts.map +1 -0
  21. package/dist/cli/setup.js +157 -0
  22. package/dist/cli/setup.js.map +1 -0
  23. package/dist/cli/upload.d.ts +15 -0
  24. package/dist/cli/upload.d.ts.map +1 -0
  25. package/dist/cli/upload.js +436 -0
  26. package/dist/cli/upload.js.map +1 -0
  27. package/dist/client/_generated/_ignore.d.ts +1 -0
  28. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  29. package/dist/client/_generated/_ignore.js +3 -0
  30. package/dist/client/_generated/_ignore.js.map +1 -0
  31. package/dist/client/index.d.ts +142 -0
  32. package/dist/client/index.d.ts.map +1 -0
  33. package/dist/client/index.js +475 -0
  34. package/dist/client/index.js.map +1 -0
  35. package/dist/client/next.d.ts +38 -0
  36. package/dist/client/next.d.ts.map +1 -0
  37. package/dist/client/next.js +175 -0
  38. package/dist/client/next.js.map +1 -0
  39. package/dist/client/nextAdapter.d.ts +4 -0
  40. package/dist/client/nextAdapter.d.ts.map +1 -0
  41. package/dist/client/nextAdapter.js +9 -0
  42. package/dist/client/nextAdapter.js.map +1 -0
  43. package/dist/component/_generated/api.d.ts +34 -0
  44. package/dist/component/_generated/api.d.ts.map +1 -0
  45. package/dist/component/_generated/api.js +31 -0
  46. package/dist/component/_generated/api.js.map +1 -0
  47. package/dist/component/_generated/component.d.ts +73 -0
  48. package/dist/component/_generated/component.d.ts.map +1 -0
  49. package/dist/component/_generated/component.js +11 -0
  50. package/dist/component/_generated/component.js.map +1 -0
  51. package/dist/component/_generated/dataModel.d.ts +46 -0
  52. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  53. package/dist/component/_generated/dataModel.js +11 -0
  54. package/dist/component/_generated/dataModel.js.map +1 -0
  55. package/dist/component/_generated/server.d.ts +121 -0
  56. package/dist/component/_generated/server.d.ts.map +1 -0
  57. package/dist/component/_generated/server.js +78 -0
  58. package/dist/component/_generated/server.js.map +1 -0
  59. package/dist/component/convex.config.d.ts +3 -0
  60. package/dist/component/convex.config.d.ts.map +1 -0
  61. package/dist/component/convex.config.js +3 -0
  62. package/dist/component/convex.config.js.map +1 -0
  63. package/dist/component/lib.d.ts +88 -0
  64. package/dist/component/lib.d.ts.map +1 -0
  65. package/dist/component/lib.js +210 -0
  66. package/dist/component/lib.js.map +1 -0
  67. package/dist/component/schema.d.ts +27 -0
  68. package/dist/component/schema.d.ts.map +1 -0
  69. package/dist/component/schema.js +20 -0
  70. package/dist/component/schema.js.map +1 -0
  71. package/dist/react/index.d.ts +80 -0
  72. package/dist/react/index.d.ts.map +1 -0
  73. package/dist/react/index.js +138 -0
  74. package/dist/react/index.js.map +1 -0
  75. package/package.json +120 -0
  76. package/src/cli/deploy.ts +375 -0
  77. package/src/cli/index.ts +104 -0
  78. package/src/cli/init.ts +181 -0
  79. package/src/cli/next-build.ts +707 -0
  80. package/src/cli/setup.ts +190 -0
  81. package/src/cli/upload.ts +521 -0
  82. package/src/client/_generated/_ignore.ts +1 -0
  83. package/src/client/index.test.ts +67 -0
  84. package/src/client/index.ts +553 -0
  85. package/src/client/next.ts +223 -0
  86. package/src/client/nextAdapter.ts +17 -0
  87. package/src/client/setup.test.ts +26 -0
  88. package/src/component/_generated/api.ts +50 -0
  89. package/src/component/_generated/component.ts +104 -0
  90. package/src/component/_generated/dataModel.ts +60 -0
  91. package/src/component/_generated/server.ts +161 -0
  92. package/src/component/convex.config.ts +3 -0
  93. package/src/component/lib.test.ts +110 -0
  94. package/src/component/lib.ts +228 -0
  95. package/src/component/schema.ts +21 -0
  96. package/src/component/setup.test.ts +11 -0
  97. package/src/react/index.tsx +184 -0
  98. package/src/test.ts +18 -0
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI tool to build and prepare a Next.js app for Convex deployment.
4
+ *
5
+ * This tool:
6
+ * 1. Runs `next build` (output: standalone)
7
+ * 2. Collects server-side files from the standalone build
8
+ * 3. Generates `convex/_generatedNextServer.ts` with embedded file contents
9
+ * 4. Uploads static assets (.next/static/) to Convex storage
10
+ * 5. Ensures convex.json has node.externalPackages: ["next"]
11
+ *
12
+ * Usage:
13
+ * npx @convex-dev/static-hosting next-build [options]
14
+ *
15
+ * Options:
16
+ * --skip-build Skip running `next build`
17
+ * --component <name> Convex component name (default: staticHosting)
18
+ * --convex-dir <path> Path to convex/ directory (default: ./convex)
19
+ * --prod Upload statics to production deployment
20
+ * --skip-upload Skip uploading static files
21
+ * --help Show help
22
+ */
23
+ export {};
24
+ //# sourceMappingURL=next-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-build.d.ts","sourceRoot":"","sources":["../../src/cli/next-build.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -0,0 +1,569 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI tool to build and prepare a Next.js app for Convex deployment.
4
+ *
5
+ * This tool:
6
+ * 1. Runs `next build` (output: standalone)
7
+ * 2. Collects server-side files from the standalone build
8
+ * 3. Generates `convex/_generatedNextServer.ts` with embedded file contents
9
+ * 4. Uploads static assets (.next/static/) to Convex storage
10
+ * 5. Ensures convex.json has node.externalPackages: ["next"]
11
+ *
12
+ * Usage:
13
+ * npx @convex-dev/static-hosting next-build [options]
14
+ *
15
+ * Options:
16
+ * --skip-build Skip running `next build`
17
+ * --component <name> Convex component name (default: staticHosting)
18
+ * --convex-dir <path> Path to convex/ directory (default: ./convex)
19
+ * --prod Upload statics to production deployment
20
+ * --skip-upload Skip uploading static files
21
+ * --help Show help
22
+ */
23
+ import { readFileSync, readdirSync, writeFileSync, existsSync, statSync, mkdirSync, } from "node:fs";
24
+ import { join, relative, extname, resolve, dirname } from "node:path";
25
+ import { randomUUID } from "node:crypto";
26
+ import { execFile, spawnSync } from "node:child_process";
27
+ // MIME type mapping
28
+ const MIME_TYPES = {
29
+ ".html": "text/html; charset=utf-8",
30
+ ".js": "application/javascript; charset=utf-8",
31
+ ".mjs": "application/javascript; charset=utf-8",
32
+ ".css": "text/css; charset=utf-8",
33
+ ".json": "application/json; charset=utf-8",
34
+ ".png": "image/png",
35
+ ".jpg": "image/jpeg",
36
+ ".jpeg": "image/jpeg",
37
+ ".gif": "image/gif",
38
+ ".svg": "image/svg+xml",
39
+ ".ico": "image/x-icon",
40
+ ".webp": "image/webp",
41
+ ".woff": "font/woff",
42
+ ".woff2": "font/woff2",
43
+ ".ttf": "font/ttf",
44
+ ".txt": "text/plain; charset=utf-8",
45
+ ".map": "application/json",
46
+ ".webmanifest": "application/manifest+json",
47
+ ".xml": "application/xml",
48
+ };
49
+ function getMimeType(filePath) {
50
+ return MIME_TYPES[extname(filePath).toLowerCase()] || "application/octet-stream";
51
+ }
52
+ // File extensions considered text (embedded as UTF-8 strings)
53
+ const TEXT_EXTENSIONS = new Set([
54
+ ".js",
55
+ ".cjs",
56
+ ".mjs",
57
+ ".json",
58
+ ".html",
59
+ ".css",
60
+ ".txt",
61
+ ".xml",
62
+ ".rsc",
63
+ ".meta",
64
+ ".map",
65
+ ]);
66
+ // Top-level packages to exclude from embedded node_modules
67
+ // (not needed for SSR, saves significant bundle space)
68
+ const EXCLUDED_MODULES = new Set([
69
+ "@img", // Sharp native image binaries (~16MB)
70
+ "sharp", // Image optimization (~244KB but needs @img)
71
+ "typescript", // TypeScript compiler (~9MB) — not needed at runtime
72
+ "caniuse-lite", // Browser compat data (~2.4MB) — not needed for SSR
73
+ ]);
74
+ // Directories to exclude from server file collection
75
+ const EXCLUDED_DIRS = new Set(["static", "cache", "diagnostics", "trace"]);
76
+ function parseArgs(argv) {
77
+ const result = {
78
+ skipBuild: false,
79
+ component: "staticHosting",
80
+ componentApi: "staticHosting",
81
+ convexDir: "./convex",
82
+ prod: false,
83
+ skipUpload: false,
84
+ forceColdStart: false,
85
+ help: false,
86
+ };
87
+ for (let i = 0; i < argv.length; i++) {
88
+ const arg = argv[i];
89
+ if (arg === "--help" || arg === "-h") {
90
+ result.help = true;
91
+ }
92
+ else if (arg === "--skip-build") {
93
+ result.skipBuild = true;
94
+ }
95
+ else if (arg === "--force-cold-start") {
96
+ result.forceColdStart = true;
97
+ }
98
+ else if (arg === "--component" || arg === "-c") {
99
+ result.component = argv[++i] || result.component;
100
+ }
101
+ else if (arg === "--component-api") {
102
+ result.componentApi = argv[++i] || result.componentApi;
103
+ }
104
+ else if (arg === "--convex-dir") {
105
+ result.convexDir = argv[++i] || result.convexDir;
106
+ }
107
+ else if (arg === "--prod") {
108
+ result.prod = true;
109
+ }
110
+ else if (arg === "--skip-upload") {
111
+ result.skipUpload = true;
112
+ }
113
+ }
114
+ return result;
115
+ }
116
+ function showHelp() {
117
+ console.log(`
118
+ Usage: npx @convex-dev/static-hosting next-build [options]
119
+
120
+ Build a Next.js app and prepare it for Convex deployment.
121
+
122
+ This command:
123
+ 1. Runs \`next build\` (output: standalone)
124
+ 2. Embeds server files into a generated Convex action
125
+ 3. Uploads static assets to Convex storage
126
+ 4. Configures convex.json for Next.js
127
+
128
+ Options:
129
+ --skip-build Skip running \`next build\` (use existing .next/)
130
+ -c, --component <name> Convex component name (default: staticHosting)
131
+ --convex-dir <path> Path to convex/ directory (default: ./convex)
132
+ --prod Upload statics to production deployment
133
+ --skip-upload Skip uploading static files (upload later)
134
+ -h, --help Show this help message
135
+
136
+ Examples:
137
+ # Full build and upload
138
+ npx @convex-dev/static-hosting next-build --prod
139
+
140
+ # Skip build, just regenerate and upload
141
+ npx @convex-dev/static-hosting next-build --skip-build --prod
142
+
143
+ # Generate only, upload later
144
+ npx @convex-dev/static-hosting next-build --skip-upload
145
+
146
+ After running, deploy your Convex backend:
147
+ npx convex deploy
148
+ `);
149
+ }
150
+ function isTextFile(filePath) {
151
+ return TEXT_EXTENSIONS.has(extname(filePath).toLowerCase());
152
+ }
153
+ function collectFilesRecursive(dir, baseDir, prefix, excludeDirs, files) {
154
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
155
+ const fullPath = join(dir, entry.name);
156
+ if (entry.isDirectory()) {
157
+ // Skip excluded directories (only at top level under .next/)
158
+ const relFromBase = relative(baseDir, fullPath);
159
+ const topDir = relFromBase.split("/")[0];
160
+ if (excludeDirs.has(topDir))
161
+ continue;
162
+ // Skip .nft.json trace directories
163
+ if (entry.name.endsWith(".nft.json"))
164
+ continue;
165
+ collectFilesRecursive(fullPath, baseDir, prefix, new Set(), files);
166
+ }
167
+ else if (entry.isFile()) {
168
+ // Skip .nft.json trace files
169
+ if (entry.name.endsWith(".nft.json"))
170
+ continue;
171
+ const relPath = prefix + "/" + relative(baseDir, fullPath);
172
+ files.push({
173
+ relativePath: relPath,
174
+ content: readFileSync(fullPath),
175
+ isText: isTextFile(fullPath),
176
+ });
177
+ }
178
+ }
179
+ }
180
+ function collectBuildFiles(standaloneDir) {
181
+ const files = [];
182
+ const standaloneDotNext = join(standaloneDir, ".next");
183
+ if (!existsSync(standaloneDotNext)) {
184
+ throw new Error(`Standalone build not found at ${standaloneDotNext}.\n` +
185
+ "Make sure your next.config has output: 'standalone'.");
186
+ }
187
+ // Collect server-side files from .next/standalone/.next/
188
+ // (excluding static/, cache/, diagnostics/ and .nft.json files)
189
+ collectFilesRecursive(standaloneDotNext, standaloneDotNext, ".next", EXCLUDED_DIRS, files);
190
+ // Collect public/ files if they exist
191
+ const publicDir = join(standaloneDir, "public");
192
+ if (existsSync(publicDir)) {
193
+ collectFilesRecursive(publicDir, publicDir, "public", new Set(), files);
194
+ }
195
+ // Collect standalone node_modules (pruned by Next.js, minus dead weight)
196
+ const modulesDir = join(standaloneDir, "node_modules");
197
+ if (existsSync(modulesDir)) {
198
+ collectFilesRecursive(modulesDir, modulesDir, "node_modules", EXCLUDED_MODULES, files);
199
+ }
200
+ // Add a minimal package.json for the work directory
201
+ files.push({
202
+ relativePath: "package.json",
203
+ content: Buffer.from('{"type":"commonjs"}'),
204
+ isText: true,
205
+ });
206
+ return files;
207
+ }
208
+ // ---------------------------------------------------------------------------
209
+ // Code generation
210
+ // ---------------------------------------------------------------------------
211
+ function generateServerFile(files, outputPath, forceColdStart = false) {
212
+ const textEntries = [];
213
+ const binaryEntries = [];
214
+ for (const file of files) {
215
+ const key = JSON.stringify(file.relativePath);
216
+ if (file.isText) {
217
+ const value = JSON.stringify(file.content.toString("utf-8"));
218
+ textEntries.push(` ${key}: ${value},`);
219
+ }
220
+ else {
221
+ const value = JSON.stringify(file.content.toString("base64"));
222
+ binaryEntries.push(` ${key}: ${value},`);
223
+ }
224
+ }
225
+ const handlerPreamble = forceColdStart
226
+ ? ` // FORCE_COLD_START: wipe /tmp and handler cache on every request
227
+ clearColdStartCache();
228
+ `
229
+ : "";
230
+ const code = `"use node";
231
+ /* eslint-disable */
232
+ /* This file is auto-generated by @convex-dev/static-hosting next-build. Do not edit. */
233
+ import { internalActionGeneric } from "convex/server";
234
+ import { v } from "convex/values";
235
+ import { writeFileSync, mkdirSync, existsSync } from "node:fs";
236
+ import { join, dirname } from "node:path";
237
+ import { createRequire } from "node:module";
238
+ import { toReqRes, toFetchResponse } from "fetch-to-node";
239
+ import type { IncomingMessage, ServerResponse } from "node:http";
240
+ ${forceColdStart ? 'import { rmSync } from "node:fs";' : ""}
241
+
242
+ type NodeRequestHandler = (req: IncomingMessage, res: ServerResponse) => Promise<void>;
243
+
244
+ const WORK_DIR = "/tmp/next-app";
245
+
246
+ const BUILD_FILES: Record<string, string> = {
247
+ ${textEntries.join("\n")}
248
+ };
249
+
250
+ const BINARY_FILES: Record<string, string> = {
251
+ ${binaryEntries.join("\n")}
252
+ };
253
+
254
+ let cachedHandler: NodeRequestHandler | null = null;
255
+ ${forceColdStart ? `
256
+ function clearColdStartCache(): void {
257
+ try { rmSync(WORK_DIR, { recursive: true, force: true }); } catch {}
258
+ cachedHandler = null;
259
+ // Clear require cache for /tmp modules
260
+ for (const key of Object.keys(require.cache)) {
261
+ if (key.startsWith(WORK_DIR)) delete require.cache[key];
262
+ }
263
+ }
264
+ ` : ""}
265
+ function ensureFilesWritten(): void {
266
+ if (existsSync(join(WORK_DIR, ".next", "BUILD_ID"))) return;
267
+ const t0 = Date.now();
268
+ for (const [relPath, content] of Object.entries(BUILD_FILES)) {
269
+ const fullPath = join(WORK_DIR, relPath);
270
+ mkdirSync(dirname(fullPath), { recursive: true });
271
+ writeFileSync(fullPath, content);
272
+ }
273
+ for (const [relPath, b64] of Object.entries(BINARY_FILES)) {
274
+ const fullPath = join(WORK_DIR, relPath);
275
+ mkdirSync(dirname(fullPath), { recursive: true });
276
+ writeFileSync(fullPath, Buffer.from(b64, "base64"));
277
+ }
278
+ console.log(\`[next] Wrote \${Object.keys(BUILD_FILES).length + Object.keys(BINARY_FILES).length} files to /tmp in \${Date.now() - t0}ms\`);
279
+ }
280
+
281
+ async function bootNextServer(): Promise<NodeRequestHandler> {
282
+ const t0 = Date.now();
283
+
284
+ // Write all embedded files (app + node_modules) to /tmp
285
+ ensureFilesWritten();
286
+
287
+ const config = JSON.parse(
288
+ BUILD_FILES[".next/required-server-files.json"],
289
+ ).config;
290
+
291
+ process.chdir(WORK_DIR);
292
+ process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(config);
293
+
294
+ // Load NextServer from the embedded node_modules
295
+ const appRequire = createRequire(join(WORK_DIR, "package.json"));
296
+ const NextServer = appRequire("next/dist/server/next-server").default;
297
+ const server = new NextServer({
298
+ dir: WORK_DIR,
299
+ dev: false,
300
+ conf: config,
301
+ });
302
+ await server.prepare();
303
+
304
+ console.log(\`[next] Server ready in \${Date.now() - t0}ms\`);
305
+ return server.getRequestHandler() as NodeRequestHandler;
306
+ }
307
+
308
+ export const handle = internalActionGeneric({
309
+ args: {
310
+ url: v.string(),
311
+ method: v.string(),
312
+ headers: v.array(v.array(v.string())),
313
+ body: v.optional(v.bytes()),
314
+ },
315
+ returns: v.object({
316
+ status: v.number(),
317
+ headers: v.array(v.array(v.string())),
318
+ body: v.bytes(),
319
+ }),
320
+ handler: async (ctx, args) => {
321
+ ${handlerPreamble} if (!cachedHandler) {
322
+ cachedHandler = await bootNextServer();
323
+ }
324
+
325
+ const hasBody = !["GET", "HEAD"].includes(args.method);
326
+ const request = new Request(args.url, {
327
+ method: args.method,
328
+ headers: args.headers as [string, string][],
329
+ body: hasBody && args.body ? args.body : undefined,
330
+ });
331
+
332
+ const { req, res } = toReqRes(request);
333
+ await cachedHandler(req, res);
334
+ if (!res.writableEnded) res.end();
335
+ const response = await toFetchResponse(res);
336
+
337
+ const responseBody = await response.arrayBuffer();
338
+ const responseHeaders: string[][] = [];
339
+ response.headers.forEach((value: string, key: string) => {
340
+ responseHeaders.push([key, value]);
341
+ });
342
+
343
+ return {
344
+ status: response.status,
345
+ headers: responseHeaders,
346
+ body: responseBody,
347
+ };
348
+ },
349
+ });
350
+ `;
351
+ mkdirSync(dirname(outputPath), { recursive: true });
352
+ writeFileSync(outputPath, code);
353
+ }
354
+ // ---------------------------------------------------------------------------
355
+ // Static file upload
356
+ // ---------------------------------------------------------------------------
357
+ let useProd = false;
358
+ function convexRunAsync(functionPath, args = {}) {
359
+ return new Promise((resolve, reject) => {
360
+ const cmdArgs = [
361
+ "convex",
362
+ "run",
363
+ functionPath,
364
+ JSON.stringify(args),
365
+ "--typecheck=disable",
366
+ "--codegen=disable",
367
+ ];
368
+ if (useProd)
369
+ cmdArgs.push("--prod");
370
+ execFile("npx", cmdArgs, { encoding: "utf-8" }, (error, stdout, stderr) => {
371
+ if (error) {
372
+ console.error("Convex run failed:", stderr || stdout);
373
+ reject(error);
374
+ return;
375
+ }
376
+ resolve(stdout.trim());
377
+ });
378
+ });
379
+ }
380
+ function collectStaticFiles(staticDir) {
381
+ const files = [];
382
+ function walk(dir) {
383
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
384
+ const fullPath = join(dir, entry.name);
385
+ if (entry.isDirectory()) {
386
+ walk(fullPath);
387
+ }
388
+ else if (entry.isFile()) {
389
+ const relPath = relative(staticDir, fullPath).replace(/\\/g, "/");
390
+ files.push({
391
+ path: `/_next/static/${relPath}`,
392
+ localPath: fullPath,
393
+ contentType: getMimeType(fullPath),
394
+ });
395
+ }
396
+ }
397
+ }
398
+ walk(staticDir);
399
+ return files;
400
+ }
401
+ async function uploadSingleFile(file, componentName, deploymentId) {
402
+ const content = readFileSync(file.localPath);
403
+ // Generate upload URL
404
+ const uploadUrlOutput = await convexRunAsync(`${componentName}:generateUploadUrl`);
405
+ const uploadUrl = JSON.parse(uploadUrlOutput);
406
+ // Upload file
407
+ const response = await fetch(uploadUrl, {
408
+ method: "POST",
409
+ headers: { "Content-Type": file.contentType },
410
+ body: content,
411
+ });
412
+ const { storageId } = (await response.json());
413
+ // Record the asset
414
+ await convexRunAsync(`${componentName}:recordAsset`, {
415
+ path: file.path,
416
+ storageId,
417
+ contentType: file.contentType,
418
+ deploymentId,
419
+ });
420
+ }
421
+ async function uploadStaticFiles(staticDir, componentName, deploymentId, concurrency = 5) {
422
+ const files = collectStaticFiles(staticDir);
423
+ if (files.length === 0) {
424
+ console.log(" No static files to upload.");
425
+ return;
426
+ }
427
+ const total = files.length;
428
+ let completed = 0;
429
+ let failed = false;
430
+ const pending = new Set();
431
+ const iterator = files[Symbol.iterator]();
432
+ function enqueue() {
433
+ if (failed)
434
+ return;
435
+ const next = iterator.next();
436
+ if (next.done)
437
+ return;
438
+ const file = next.value;
439
+ const task = uploadSingleFile(file, componentName, deploymentId).then(() => {
440
+ completed++;
441
+ console.log(` [${completed}/${total}] ${file.path}`);
442
+ pending.delete(task);
443
+ });
444
+ task.catch(() => {
445
+ failed = true;
446
+ });
447
+ pending.add(task);
448
+ return task;
449
+ }
450
+ // Fill initial pool
451
+ for (let i = 0; i < concurrency && i < total; i++) {
452
+ void enqueue();
453
+ }
454
+ // Process remaining
455
+ while (pending.size > 0) {
456
+ await Promise.race(pending);
457
+ if (failed) {
458
+ await Promise.allSettled(pending);
459
+ throw new Error("Static file upload failed");
460
+ }
461
+ void enqueue();
462
+ }
463
+ // Garbage collect old assets and set deployment
464
+ const gcOutput = await convexRunAsync(`${componentName}:gcOldAssets`, {
465
+ currentDeploymentId: deploymentId,
466
+ });
467
+ const gcResult = JSON.parse(gcOutput);
468
+ const deletedCount = typeof gcResult === "number" ? gcResult : gcResult.deleted;
469
+ if (deletedCount > 0) {
470
+ console.log(` Cleaned up ${deletedCount} old file(s) from previous deployments`);
471
+ }
472
+ }
473
+ // ---------------------------------------------------------------------------
474
+ // convex.json configuration
475
+ // ---------------------------------------------------------------------------
476
+ function ensureConvexJson(convexDir) {
477
+ // Ensure convex.json exists (Convex needs it for the functions directory)
478
+ const projectRoot = resolve(dirname(convexDir));
479
+ const convexJsonPath = join(projectRoot, "convex.json");
480
+ if (!existsSync(convexJsonPath)) {
481
+ writeFileSync(convexJsonPath, JSON.stringify({ functions: "convex" }, null, 2) + "\n");
482
+ }
483
+ }
484
+ // ---------------------------------------------------------------------------
485
+ // Main
486
+ // ---------------------------------------------------------------------------
487
+ async function main() {
488
+ const args = parseArgs(process.argv.slice(2));
489
+ if (args.help) {
490
+ showHelp();
491
+ process.exit(0);
492
+ }
493
+ useProd = args.prod;
494
+ const convexDir = resolve(args.convexDir);
495
+ // Step 1: Run next build
496
+ if (!args.skipBuild) {
497
+ console.log("Building Next.js app...");
498
+ const buildResult = spawnSync("npx", ["next", "build"], {
499
+ stdio: "inherit",
500
+ });
501
+ if (buildResult.status !== 0) {
502
+ console.error("Next.js build failed.");
503
+ process.exit(1);
504
+ }
505
+ console.log("");
506
+ }
507
+ // Step 2: Verify standalone output exists
508
+ const standaloneDir = resolve(".next/standalone");
509
+ if (!existsSync(standaloneDir)) {
510
+ console.error('Error: .next/standalone not found. Make sure next.config has output: "standalone".');
511
+ process.exit(1);
512
+ }
513
+ // Step 3: Collect build files
514
+ console.log("Collecting build files...");
515
+ const buildFiles = collectBuildFiles(standaloneDir);
516
+ const textCount = buildFiles.filter((f) => f.isText).length;
517
+ const binaryCount = buildFiles.filter((f) => !f.isText).length;
518
+ const totalSize = buildFiles.reduce((sum, f) => sum + f.content.length, 0);
519
+ console.log(` ${buildFiles.length} files (${textCount} text, ${binaryCount} binary, ${(totalSize / 1024).toFixed(0)} KB total)`);
520
+ // Step 4: Generate the server file
521
+ const outputPath = join(convexDir, "_generatedNextServer.ts");
522
+ console.log(`\nGenerating ${relative(process.cwd(), outputPath)}...`);
523
+ generateServerFile(buildFiles, outputPath, args.forceColdStart);
524
+ if (args.forceColdStart) {
525
+ console.log(" ⚠ FORCE_COLD_START enabled — every request will cold boot");
526
+ }
527
+ const generatedSize = statSync(outputPath).size;
528
+ console.log(` Generated file: ${(generatedSize / 1024).toFixed(0)} KB`);
529
+ if (generatedSize > 30 * 1024 * 1024) {
530
+ console.warn("\n WARNING: Generated file exceeds 30 MB. It may exceed Convex's 32 MB bundle limit.");
531
+ console.warn(" Consider reducing the number of pages or using dynamic imports.");
532
+ }
533
+ // Step 5: Ensure convex.json exists
534
+ ensureConvexJson(convexDir);
535
+ // Step 6: Upload static assets to Convex storage
536
+ if (!args.skipUpload) {
537
+ const envLabel = args.prod ? "production" : "development";
538
+ const deploymentId = randomUUID();
539
+ let staticDir = join(standaloneDir, ".next", "static");
540
+ if (!existsSync(staticDir)) {
541
+ staticDir = resolve(".next/static");
542
+ }
543
+ if (existsSync(staticDir)) {
544
+ console.log(`\nUploading static assets to ${envLabel}...`);
545
+ try {
546
+ await uploadStaticFiles(staticDir, args.component, deploymentId);
547
+ console.log("\nStatic assets uploaded.");
548
+ }
549
+ catch (error) {
550
+ console.error("\nFailed to upload static assets:", error);
551
+ console.error("Make sure your Convex backend is deployed. You can upload later with:");
552
+ console.error(" npx @convex-dev/static-hosting next-build --skip-build --prod");
553
+ }
554
+ }
555
+ else {
556
+ console.log("\nNo static directory found, skipping upload.");
557
+ }
558
+ }
559
+ else {
560
+ console.log("\nSkipping uploads (--skip-upload).");
561
+ }
562
+ console.log("\nDone! Next steps:");
563
+ console.log(" npx convex deploy");
564
+ }
565
+ main().catch((error) => {
566
+ console.error("Error:", error);
567
+ process.exit(1);
568
+ });
569
+ //# sourceMappingURL=next-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-build.js","sourceRoot":"","sources":["../../src/cli/next-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Interactive setup wizard for Convex Static Hosting.
4
+ *
5
+ * Usage:
6
+ * npx @convex-dev/static-hosting setup
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}