@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,157 @@
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
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
9
+ import { createInterface } from "readline";
10
+ import { join } from "path";
11
+ const rl = createInterface({
12
+ input: process.stdin,
13
+ output: process.stdout,
14
+ });
15
+ function prompt(question) {
16
+ return new Promise((resolve) => {
17
+ rl.question(question, (answer) => resolve(answer.trim()));
18
+ });
19
+ }
20
+ function success(msg) {
21
+ console.log(`✓ ${msg}`);
22
+ }
23
+ function skip(msg) {
24
+ console.log(`· ${msg}`);
25
+ }
26
+ /**
27
+ * Create convex/convex.config.ts
28
+ */
29
+ function createConvexConfig() {
30
+ const configPath = join(process.cwd(), "convex", "convex.config.ts");
31
+ if (existsSync(configPath)) {
32
+ const existing = readFileSync(configPath, "utf-8");
33
+ if (existing.includes("staticHosting")) {
34
+ skip("convex/convex.config.ts (already configured)");
35
+ return false;
36
+ }
37
+ // File exists but doesn't have our component - tell user to add manually
38
+ console.log("\n⚠️ convex/convex.config.ts exists. Please add manually:");
39
+ console.log(' import staticHosting from "@convex-dev/static-hosting/convex.config";');
40
+ console.log(" app.use(staticHosting);\n");
41
+ return false;
42
+ }
43
+ writeFileSync(configPath, `import { defineApp } from "convex/server";
44
+ import staticHosting from "@convex-dev/static-hosting/convex.config";
45
+
46
+ const app = defineApp();
47
+ app.use(staticHosting);
48
+
49
+ export default app;
50
+ `);
51
+ success("Created convex/convex.config.ts");
52
+ return true;
53
+ }
54
+ /**
55
+ * Create convex/staticHosting.ts
56
+ */
57
+ function createStaticHostingFile() {
58
+ const filePath = join(process.cwd(), "convex", "staticHosting.ts");
59
+ if (existsSync(filePath)) {
60
+ skip("convex/staticHosting.ts (already exists)");
61
+ return false;
62
+ }
63
+ writeFileSync(filePath, `import { components } from "./_generated/api";
64
+ import {
65
+ exposeUploadApi,
66
+ exposeDeploymentQuery,
67
+ } from "@convex-dev/static-hosting";
68
+
69
+ // Internal functions for secure uploads (CLI only)
70
+ export const { generateUploadUrl, recordAsset, gcOldAssets, listAssets } =
71
+ exposeUploadApi(components.staticHosting);
72
+
73
+ // Public query for live reload notifications
74
+ export const { getCurrentDeployment } =
75
+ exposeDeploymentQuery(components.staticHosting);
76
+ `);
77
+ success("Created convex/staticHosting.ts");
78
+ return true;
79
+ }
80
+ /**
81
+ * Create convex/http.ts
82
+ */
83
+ function createHttpFile() {
84
+ const filePath = join(process.cwd(), "convex", "http.ts");
85
+ if (existsSync(filePath)) {
86
+ const existing = readFileSync(filePath, "utf-8");
87
+ if (existing.includes("registerStaticRoutes")) {
88
+ skip("convex/http.ts (already configured)");
89
+ return false;
90
+ }
91
+ console.log("\n⚠️ convex/http.ts exists. Please add manually:");
92
+ console.log(' import { registerStaticRoutes } from "@convex-dev/static-hosting";');
93
+ console.log(" registerStaticRoutes(http, components.staticHosting);\n");
94
+ return false;
95
+ }
96
+ writeFileSync(filePath, `import { httpRouter } from "convex/server";
97
+ import { registerStaticRoutes } from "@convex-dev/static-hosting";
98
+ import { components } from "./_generated/api";
99
+
100
+ const http = httpRouter();
101
+
102
+ // Serve static files at root with SPA fallback
103
+ registerStaticRoutes(http, components.staticHosting);
104
+
105
+ export default http;
106
+ `);
107
+ success("Created convex/http.ts");
108
+ return true;
109
+ }
110
+ /**
111
+ * Update package.json with deploy script
112
+ */
113
+ function updatePackageJson() {
114
+ const pkgPath = join(process.cwd(), "package.json");
115
+ if (!existsSync(pkgPath)) {
116
+ console.log("⚠️ No package.json found");
117
+ return false;
118
+ }
119
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
120
+ if (!pkg.scripts)
121
+ pkg.scripts = {};
122
+ if (pkg.scripts.deploy) {
123
+ skip("package.json deploy script (already exists)");
124
+ return false;
125
+ }
126
+ pkg.scripts.deploy = "npx @convex-dev/static-hosting deploy";
127
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
128
+ success("Added deploy script to package.json");
129
+ return true;
130
+ }
131
+ async function main() {
132
+ console.log("\n🚀 Convex Static Hosting Setup\n");
133
+ // Check for convex directory
134
+ if (!existsSync("convex")) {
135
+ mkdirSync("convex");
136
+ success("Created convex/ directory");
137
+ }
138
+ console.log("Creating files...\n");
139
+ // Create the Convex files
140
+ createConvexConfig();
141
+ createStaticHostingFile();
142
+ createHttpFile();
143
+ updatePackageJson();
144
+ // Next steps
145
+ console.log("\n✨ Setup complete!\n");
146
+ console.log("Next steps:\n");
147
+ console.log(" 1. npx convex dev # Generate types");
148
+ console.log(" 2. npm run deploy # Deploy everything\n");
149
+ console.log("Your app will be at: https://<deployment>.convex.site\n");
150
+ rl.close();
151
+ }
152
+ main().catch((err) => {
153
+ console.error("Setup failed:", err);
154
+ rl.close();
155
+ process.exit(1);
156
+ });
157
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI tool to upload static files to Convex storage.
4
+ *
5
+ * Usage:
6
+ * npx @convex-dev/static-hosting upload [options]
7
+ *
8
+ * Options:
9
+ * --dist <path> Path to dist directory (default: ./dist)
10
+ * --component <name> Convex component with upload functions (default: staticHosting)
11
+ * --prod Deploy to production deployment
12
+ * --help Show help
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/cli/upload.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,436 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI tool to upload static files to Convex storage.
4
+ *
5
+ * Usage:
6
+ * npx @convex-dev/static-hosting upload [options]
7
+ *
8
+ * Options:
9
+ * --dist <path> Path to dist directory (default: ./dist)
10
+ * --component <name> Convex component with upload functions (default: staticHosting)
11
+ * --prod Deploy to production deployment
12
+ * --help Show help
13
+ */
14
+ import { readFileSync, readdirSync, existsSync } from "fs";
15
+ import { join, relative, extname, resolve } from "path";
16
+ import { randomUUID } from "crypto";
17
+ import { execSync, execFile, spawnSync } from "child_process";
18
+ // MIME type mapping
19
+ const MIME_TYPES = {
20
+ ".html": "text/html; charset=utf-8",
21
+ ".js": "application/javascript; charset=utf-8",
22
+ ".mjs": "application/javascript; charset=utf-8",
23
+ ".css": "text/css; charset=utf-8",
24
+ ".json": "application/json; charset=utf-8",
25
+ ".png": "image/png",
26
+ ".jpg": "image/jpeg",
27
+ ".jpeg": "image/jpeg",
28
+ ".gif": "image/gif",
29
+ ".svg": "image/svg+xml",
30
+ ".ico": "image/x-icon",
31
+ ".webp": "image/webp",
32
+ ".woff": "font/woff",
33
+ ".woff2": "font/woff2",
34
+ ".ttf": "font/ttf",
35
+ ".txt": "text/plain; charset=utf-8",
36
+ ".map": "application/json",
37
+ ".webmanifest": "application/manifest+json",
38
+ ".xml": "application/xml",
39
+ };
40
+ function getMimeType(path) {
41
+ return MIME_TYPES[extname(path).toLowerCase()] || "application/octet-stream";
42
+ }
43
+ function parseArgs(args) {
44
+ const result = {
45
+ dist: "./dist",
46
+ component: "staticHosting",
47
+ prod: false, // Default to dev, use --prod for production
48
+ build: false,
49
+ cdn: false,
50
+ cdnDeleteFunction: "",
51
+ concurrency: 5,
52
+ help: false,
53
+ };
54
+ for (let i = 0; i < args.length; i++) {
55
+ const arg = args[i];
56
+ if (arg === "--help" || arg === "-h") {
57
+ result.help = true;
58
+ }
59
+ else if (arg === "--dist" || arg === "-d") {
60
+ result.dist = args[++i] || result.dist;
61
+ }
62
+ else if (arg === "--component" || arg === "-c") {
63
+ result.component = args[++i] || result.component;
64
+ }
65
+ else if (arg === "--prod") {
66
+ result.prod = true;
67
+ }
68
+ else if (arg === "--no-prod" || arg === "--dev") {
69
+ result.prod = false;
70
+ }
71
+ else if (arg === "--build" || arg === "-b") {
72
+ result.build = true;
73
+ }
74
+ else if (arg === "--cdn") {
75
+ result.cdn = true;
76
+ }
77
+ else if (arg === "--cdn-delete-function") {
78
+ result.cdnDeleteFunction = args[++i] || result.cdnDeleteFunction;
79
+ }
80
+ else if (arg === "--concurrency" || arg === "-j") {
81
+ const val = parseInt(args[++i], 10);
82
+ if (val > 0)
83
+ result.concurrency = val;
84
+ }
85
+ }
86
+ return result;
87
+ }
88
+ function showHelp() {
89
+ console.log(`
90
+ Usage: npx @convex-dev/static-hosting upload [options]
91
+
92
+ Upload static files from a dist directory to Convex storage.
93
+
94
+ Options:
95
+ -d, --dist <path> Path to dist directory (default: ./dist)
96
+ -c, --component <name> Convex component with upload functions (default: staticHosting)
97
+ --prod Deploy to production deployment
98
+ -b, --build Run 'npm run build' with correct VITE_CONVEX_URL before uploading
99
+ --cdn Upload non-HTML assets to convex-fs CDN instead of Convex storage
100
+ --cdn-delete-function <name> Convex function to delete CDN blobs (default: <component>:deleteCdnBlobs)
101
+ -j, --concurrency <n> Number of parallel uploads (default: 5)
102
+ -h, --help Show this help message
103
+
104
+ Examples:
105
+ # Upload to Convex storage
106
+ npx @convex-dev/static-hosting upload
107
+ npx @convex-dev/static-hosting upload --dist ./build --prod
108
+ npx @convex-dev/static-hosting upload --build --prod
109
+
110
+ # Upload with CDN (non-HTML files served from CDN)
111
+ npx @convex-dev/static-hosting upload --cdn --prod
112
+ `);
113
+ }
114
+ // Global flag for production mode
115
+ let useProd = true;
116
+ function _convexRun(functionPath, args = {}) {
117
+ const argsJson = JSON.stringify(args);
118
+ const prodFlag = useProd ? "--prod" : "";
119
+ const cmd = `npx convex run "${functionPath}" '${argsJson}' ${prodFlag} --typecheck=disable --codegen=disable`;
120
+ try {
121
+ const result = execSync(cmd, {
122
+ encoding: "utf-8",
123
+ stdio: ["pipe", "pipe", "pipe"],
124
+ });
125
+ return result.trim();
126
+ }
127
+ catch (error) {
128
+ const execError = error;
129
+ console.error("Convex run failed:", execError.stderr || execError.stdout);
130
+ throw error;
131
+ }
132
+ }
133
+ function convexRunAsync(functionPath, args = {}) {
134
+ return new Promise((resolve, reject) => {
135
+ const cmdArgs = [
136
+ "convex",
137
+ "run",
138
+ functionPath,
139
+ JSON.stringify(args),
140
+ "--typecheck=disable",
141
+ "--codegen=disable",
142
+ ];
143
+ if (useProd)
144
+ cmdArgs.push("--prod");
145
+ execFile("npx", cmdArgs, { encoding: "utf-8" }, (error, stdout, stderr) => {
146
+ if (error) {
147
+ console.error("Convex run failed:", stderr || stdout);
148
+ reject(error);
149
+ return;
150
+ }
151
+ resolve(stdout.trim());
152
+ });
153
+ });
154
+ }
155
+ async function uploadWithConcurrency(files, componentName, deploymentId, useCdn, siteUrl, concurrency) {
156
+ const total = files.length;
157
+ // Separate CDN and storage files
158
+ const cdnFiles = [];
159
+ const storageFiles = [];
160
+ for (const file of files) {
161
+ const isHtml = file.contentType.startsWith("text/html");
162
+ if (useCdn && !isHtml && siteUrl) {
163
+ cdnFiles.push(file);
164
+ }
165
+ else {
166
+ storageFiles.push(file);
167
+ }
168
+ }
169
+ // Upload storage files using batch operations
170
+ let completed = 0;
171
+ const allAssets = [];
172
+ if (storageFiles.length > 0) {
173
+ // Step 1: Generate all upload URLs in one batch call
174
+ console.log(` Generating ${storageFiles.length} upload URLs...`);
175
+ const urlsOutput = await convexRunAsync(`${componentName}:generateUploadUrls`, { count: storageFiles.length });
176
+ const uploadUrls = JSON.parse(urlsOutput);
177
+ // Step 2: Upload all files in parallel via fetch
178
+ const storageIds = new Array(storageFiles.length);
179
+ const pending = new Set();
180
+ for (let i = 0; i < storageFiles.length; i++) {
181
+ const idx = i;
182
+ const file = storageFiles[idx];
183
+ const task = (async () => {
184
+ const content = readFileSync(file.localPath);
185
+ const response = await fetch(uploadUrls[idx], {
186
+ method: "POST",
187
+ headers: { "Content-Type": file.contentType },
188
+ body: content,
189
+ });
190
+ const { storageId } = (await response.json());
191
+ storageIds[idx] = storageId;
192
+ completed++;
193
+ const isHtml = file.contentType.startsWith("text/html");
194
+ console.log(` [${completed}/${total}] ${file.path} (${isHtml ? "storage/html" : "storage"})`);
195
+ })().then(() => { pending.delete(task); });
196
+ pending.add(task);
197
+ if (pending.size >= concurrency) {
198
+ await Promise.race(pending);
199
+ }
200
+ }
201
+ await Promise.all(pending);
202
+ for (let i = 0; i < storageFiles.length; i++) {
203
+ allAssets.push({
204
+ path: storageFiles[i].path,
205
+ storageId: storageIds[i],
206
+ contentType: storageFiles[i].contentType,
207
+ deploymentId,
208
+ });
209
+ }
210
+ }
211
+ // Upload CDN files (still uses per-file calls since CDN has its own upload endpoint)
212
+ if (cdnFiles.length > 0 && siteUrl) {
213
+ const pending = new Set();
214
+ for (const file of cdnFiles) {
215
+ const task = (async () => {
216
+ const content = readFileSync(file.localPath);
217
+ const uploadResponse = await fetch(`${siteUrl}/fs/upload`, {
218
+ method: "POST",
219
+ headers: { "Content-Type": file.contentType },
220
+ body: content,
221
+ });
222
+ if (!uploadResponse.ok) {
223
+ throw new Error(`CDN upload failed for ${file.path}: ${uploadResponse.status}`);
224
+ }
225
+ const { blobId } = (await uploadResponse.json());
226
+ allAssets.push({
227
+ path: file.path,
228
+ blobId,
229
+ contentType: file.contentType,
230
+ deploymentId,
231
+ });
232
+ completed++;
233
+ console.log(` [${completed}/${total}] ${file.path} (cdn)`);
234
+ })().then(() => { pending.delete(task); });
235
+ pending.add(task);
236
+ if (pending.size >= concurrency) {
237
+ await Promise.race(pending);
238
+ }
239
+ }
240
+ await Promise.all(pending);
241
+ }
242
+ // Step 3: Record all assets in one batch call
243
+ if (allAssets.length > 0) {
244
+ console.log(" Recording assets...");
245
+ // recordAssets only handles storageId assets; CDN assets need individual recording
246
+ const storageAssets = allAssets.filter((a) => a.storageId);
247
+ const cdnAssets = allAssets.filter((a) => a.blobId);
248
+ if (storageAssets.length > 0) {
249
+ await convexRunAsync(`${componentName}:recordAssets`, {
250
+ assets: storageAssets.map((a) => ({
251
+ path: a.path,
252
+ storageId: a.storageId,
253
+ contentType: a.contentType,
254
+ deploymentId: a.deploymentId,
255
+ })),
256
+ });
257
+ }
258
+ // CDN assets still need individual recording (they use blobId not storageId)
259
+ for (const asset of cdnAssets) {
260
+ await convexRunAsync(`${componentName}:recordAsset`, {
261
+ path: asset.path,
262
+ blobId: asset.blobId,
263
+ contentType: asset.contentType,
264
+ deploymentId: asset.deploymentId,
265
+ });
266
+ }
267
+ }
268
+ }
269
+ function collectFiles(dir, baseDir) {
270
+ const files = [];
271
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
272
+ const fullPath = join(dir, entry.name);
273
+ if (entry.isDirectory()) {
274
+ files.push(...collectFiles(fullPath, baseDir));
275
+ }
276
+ else if (entry.isFile()) {
277
+ files.push({
278
+ path: "/" + relative(baseDir, fullPath).replace(/\\/g, "/"),
279
+ localPath: fullPath,
280
+ contentType: getMimeType(fullPath),
281
+ });
282
+ }
283
+ }
284
+ return files;
285
+ }
286
+ async function main() {
287
+ const args = parseArgs(process.argv.slice(2));
288
+ if (args.help) {
289
+ showHelp();
290
+ process.exit(0);
291
+ }
292
+ // Set global prod flag
293
+ useProd = args.prod;
294
+ // Run build if requested
295
+ if (args.build) {
296
+ let convexUrl = null;
297
+ if (useProd) {
298
+ // Get production URL from convex dashboard
299
+ try {
300
+ const result = execSync("npx convex dashboard --prod --no-open", {
301
+ stdio: "pipe",
302
+ encoding: "utf-8",
303
+ });
304
+ const match = result.match(/dashboard\.convex\.dev\/d\/([a-z0-9-]+)/i);
305
+ if (match) {
306
+ convexUrl = `https://${match[1]}.convex.cloud`;
307
+ }
308
+ }
309
+ catch {
310
+ console.error("Could not get production Convex URL.");
311
+ console.error("Make sure you have deployed to production: npx convex deploy");
312
+ process.exit(1);
313
+ }
314
+ }
315
+ else {
316
+ // Get dev URL from .env.local
317
+ if (existsSync(".env.local")) {
318
+ const envContent = readFileSync(".env.local", "utf-8");
319
+ const match = envContent.match(/(?:VITE_)?CONVEX_URL=(.+)/);
320
+ if (match) {
321
+ convexUrl = match[1].trim();
322
+ }
323
+ }
324
+ }
325
+ if (!convexUrl) {
326
+ console.error("Could not determine Convex URL for build.");
327
+ process.exit(1);
328
+ }
329
+ const envLabel = useProd ? "production" : "development";
330
+ console.log(`🔨 Building for ${envLabel}...`);
331
+ console.log(` VITE_CONVEX_URL=${convexUrl}`);
332
+ console.log("");
333
+ const buildResult = spawnSync("npm", ["run", "build"], {
334
+ stdio: "inherit",
335
+ env: { ...process.env, VITE_CONVEX_URL: convexUrl },
336
+ });
337
+ if (buildResult.status !== 0) {
338
+ console.error("Build failed.");
339
+ process.exit(1);
340
+ }
341
+ console.log("");
342
+ }
343
+ const distDir = resolve(args.dist);
344
+ const componentName = args.component;
345
+ const useCdn = args.cdn;
346
+ // Convex storage deployment
347
+ if (!existsSync(distDir)) {
348
+ console.error(`Error: dist directory not found: ${distDir}`);
349
+ console.error("Run your build command first (e.g., 'npm run build' or add --build flag)");
350
+ process.exit(1);
351
+ }
352
+ // If CDN mode, we need the site URL for uploading to convex-fs
353
+ let siteUrl = null;
354
+ if (useCdn) {
355
+ siteUrl = getConvexSiteUrl(useProd);
356
+ if (!siteUrl) {
357
+ console.error("Error: Could not determine Convex site URL for CDN uploads.");
358
+ console.error("Make sure your Convex deployment is running.");
359
+ process.exit(1);
360
+ }
361
+ }
362
+ const deploymentId = randomUUID();
363
+ const files = collectFiles(distDir, distDir);
364
+ const envLabel = useProd ? "production" : "development";
365
+ console.log(`🚀 Deploying to ${envLabel} environment`);
366
+ if (useCdn) {
367
+ console.log("☁️ CDN mode: non-HTML assets will be uploaded to convex-fs");
368
+ }
369
+ console.log("🔒 Using secure internal functions (requires Convex CLI auth)");
370
+ console.log(`Uploading ${files.length} files with deployment ID: ${deploymentId}`);
371
+ console.log(`Component: ${componentName}`);
372
+ console.log("");
373
+ try {
374
+ await uploadWithConcurrency(files, componentName, deploymentId, useCdn, siteUrl, args.concurrency);
375
+ }
376
+ catch {
377
+ console.error("Upload failed.");
378
+ process.exit(1);
379
+ }
380
+ console.log("");
381
+ // Garbage collect old files
382
+ const gcOutput = await convexRunAsync(`${componentName}:gcOldAssets`, {
383
+ currentDeploymentId: deploymentId,
384
+ });
385
+ const gcResult = JSON.parse(gcOutput);
386
+ // Handle both old format (number) and new format ({ deleted, blobIds })
387
+ const deletedCount = typeof gcResult === "number" ? gcResult : gcResult.deleted;
388
+ const oldBlobIds = typeof gcResult === "object" && gcResult.blobIds ? gcResult.blobIds : [];
389
+ if (deletedCount > 0) {
390
+ console.log(`Cleaned up ${deletedCount} old storage file(s) from previous deployments`);
391
+ }
392
+ // Clean up old CDN blobs if any
393
+ if (oldBlobIds.length > 0) {
394
+ const cdnDeleteFn = args.cdnDeleteFunction || `${componentName}:deleteCdnBlobs`;
395
+ try {
396
+ await convexRunAsync(cdnDeleteFn, { blobIds: oldBlobIds });
397
+ console.log(`Cleaned up ${oldBlobIds.length} old CDN blob(s) from previous deployments`);
398
+ }
399
+ catch {
400
+ console.warn(`Warning: Could not delete old CDN blobs. Make sure ${cdnDeleteFn} is defined.`);
401
+ }
402
+ }
403
+ console.log("");
404
+ console.log("✨ Upload complete!");
405
+ // Show the deployment URL
406
+ const deployedSiteUrl = getConvexSiteUrl(useProd);
407
+ if (deployedSiteUrl) {
408
+ console.log("");
409
+ console.log(`Your app is now available at: ${deployedSiteUrl}`);
410
+ }
411
+ }
412
+ /**
413
+ * Get the Convex site URL (.convex.site) from the cloud URL
414
+ */
415
+ function getConvexSiteUrl(prod) {
416
+ try {
417
+ const envFlag = prod ? "--prod" : "";
418
+ const result = execSync(`npx convex env get CONVEX_CLOUD_URL ${envFlag}`, {
419
+ stdio: "pipe",
420
+ encoding: "utf-8",
421
+ });
422
+ const cloudUrl = result.trim();
423
+ if (cloudUrl && cloudUrl.includes(".convex.cloud")) {
424
+ return cloudUrl.replace(".convex.cloud", ".convex.site");
425
+ }
426
+ }
427
+ catch {
428
+ // Ignore errors
429
+ }
430
+ return null;
431
+ }
432
+ main().catch((error) => {
433
+ console.error("Upload failed:", error);
434
+ process.exit(1);
435
+ });
436
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/cli/upload.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9D,oBAAoB;AACpB,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,uCAAuC;IAC9C,MAAM,EAAE,uCAAuC;IAC/C,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,2BAA2B;IACnC,MAAM,EAAE,kBAAkB;IAC1B,cAAc,EAAE,2BAA2B;IAC3C,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B,CAAC;AAC/E,CAAC;AAaD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAe;QACzB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,eAAe;QAC1B,IAAI,EAAE,KAAK,EAAE,4CAA4C;QACzD,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK;QACV,iBAAiB,EAAE,EAAE;QACrB,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;QACzC,CAAC;aAAM,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC;QACnD,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC7C,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;YAC3C,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC;QACnE,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,GAAG,GAAG,CAAC;gBAAE,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAC;AACH,CAAC;AAED,kCAAkC;AAClC,IAAI,OAAO,GAAG,IAAI,CAAC;AAEnB,SAAS,UAAU,CACjB,YAAoB,EACpB,OAAgC,EAAE;IAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,mBAAmB,YAAY,MAAM,QAAQ,KAAK,QAAQ,wCAAwC,CAAC;IAC/G,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;YAC3B,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,KAA6C,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,YAAoB,EACpB,OAAgC,EAAE;IAElC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG;YACd,QAAQ;YACR,KAAK;YACL,YAAY;YACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YACpB,qBAAqB;YACrB,mBAAmB;SACpB,CAAC;QACF,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC;gBACtD,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,KAAsE,EACtE,aAAqB,EACrB,YAAoB,EACpB,MAAe,EACf,OAAsB,EACtB,WAAmB;IAEnB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3B,iCAAiC;IACjC,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,MAAM,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,SAAS,GAMV,EAAE,CAAC;IAER,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,qDAAqD;QACrD,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,cAAc,CACrC,GAAG,aAAa,qBAAqB,EACrC,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAC/B,CAAC;QACF,MAAM,UAAU,GAAa,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEpD,iDAAiD;QACjD,MAAM,UAAU,GAAa,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;QAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBACvB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;oBAC5C,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE;oBAC7C,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;gBACH,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA0B,CAAC;gBACvE,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;gBAC5B,SAAS,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YACjG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;gBAChC,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC1B,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;gBACxB,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW;gBACxC,YAAY;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBACvB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7C,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;oBACzD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE;oBAC7C,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;gBACH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,MAAM,EAAE,CAC/D,CAAC;gBACJ,CAAC;gBACD,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAuB,CAAC;gBACvE,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,YAAY;iBACb,CAAC,CAAC;gBACH,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;YAC9D,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;gBAChC,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,8CAA8C;IAC9C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,mFAAmF;QACnF,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,cAAc,CAAC,GAAG,aAAa,eAAe,EAAE;gBACpD,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,SAAS,EAAE,CAAC,CAAC,SAAU;oBACvB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;iBAC7B,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,6EAA6E;QAC7E,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,cAAc,CAAC,GAAG,aAAa,cAAc,EAAE;gBACnD,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACnB,GAAW,EACX,OAAe;IAEf,MAAM,KAAK,GAIN,EAAE,CAAC;IAER,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC3D,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAEpB,yBAAyB;IACzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,IAAI,OAAO,EAAE,CAAC;YACZ,2CAA2C;YAC3C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,uCAAuC,EAAE;oBAC/D,KAAK,EAAE,MAAM;oBACb,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBACvE,IAAI,KAAK,EAAE,CAAC;oBACV,SAAS,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC;gBACjD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBACtD,OAAO,CAAC,KAAK,CACX,8DAA8D,CAC/D,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACvD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC5D,IAAI,KAAK,EAAE,CAAC;oBACV,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;YACrD,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE;SACpD,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;IAExB,4BAA4B;IAE5B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CACX,0EAA0E,CAC3E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+DAA+D;IAC/D,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,cAAc,CAAC,CAAC;IACvD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CACT,aAAa,KAAK,CAAC,MAAM,8BAA8B,YAAY,EAAE,CACtE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,qBAAqB,CACzB,KAAK,EACL,aAAa,EACb,YAAY,EACZ,MAAM,EACN,OAAO,EACP,IAAI,CAAC,WAAW,CACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,aAAa,cAAc,EAAE;QACpE,mBAAmB,EAAE,YAAY;KAClC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEtC,wEAAwE;IACxE,MAAM,YAAY,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IAChF,MAAM,UAAU,GAAa,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtG,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,gDAAgD,CAAC,CAAC;IAC1F,CAAC;IAED,gCAAgC;IAChC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,IAAI,GAAG,aAAa,iBAAiB,CAAC;QAChF,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,MAAM,4CAA4C,CAAC,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,sDAAsD,WAAW,cAAc,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAElC,0BAA0B;IAC1B,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,eAAe,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAa;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,uCAAuC,OAAO,EAAE,EAAE;YACxE,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=_ignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_ignore.d.ts","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // This is only here so convex-test can detect a _generated folder
3
+ //# sourceMappingURL=_ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_ignore.js","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":";AAAA,kEAAkE"}