@samebase/convex-hosting 0.0.0-stage → 0.3.1

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 (122) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/INTEGRATION.md +399 -0
  3. package/LICENSE +201 -0
  4. package/NOTICE +7 -0
  5. package/README.md +471 -2
  6. package/dist/cli/args.d.ts +28 -0
  7. package/dist/cli/args.d.ts.map +1 -0
  8. package/dist/cli/args.js +148 -0
  9. package/dist/cli/args.js.map +1 -0
  10. package/dist/cli/argumentChunks.d.ts +3 -0
  11. package/dist/cli/argumentChunks.d.ts.map +1 -0
  12. package/dist/cli/argumentChunks.js +29 -0
  13. package/dist/cli/argumentChunks.js.map +1 -0
  14. package/dist/cli/collectFiles.d.ts +10 -0
  15. package/dist/cli/collectFiles.d.ts.map +1 -0
  16. package/dist/cli/collectFiles.js +53 -0
  17. package/dist/cli/collectFiles.js.map +1 -0
  18. package/dist/cli/commands.d.ts +8 -0
  19. package/dist/cli/commands.d.ts.map +1 -0
  20. package/dist/cli/commands.js +56 -0
  21. package/dist/cli/commands.js.map +1 -0
  22. package/dist/cli/componentName.d.ts +32 -0
  23. package/dist/cli/componentName.d.ts.map +1 -0
  24. package/dist/cli/componentName.js +43 -0
  25. package/dist/cli/componentName.js.map +1 -0
  26. package/dist/cli/deploy.d.ts +16 -0
  27. package/dist/cli/deploy.d.ts.map +1 -0
  28. package/dist/cli/deploy.js +283 -0
  29. package/dist/cli/deploy.js.map +1 -0
  30. package/dist/cli/deployEnvironment.d.ts +10 -0
  31. package/dist/cli/deployEnvironment.d.ts.map +1 -0
  32. package/dist/cli/deployEnvironment.js +12 -0
  33. package/dist/cli/deployEnvironment.js.map +1 -0
  34. package/dist/cli/index.d.ts +12 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +60 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/upload.d.ts +22 -0
  39. package/dist/cli/upload.d.ts.map +1 -0
  40. package/dist/cli/upload.js +630 -0
  41. package/dist/cli/upload.js.map +1 -0
  42. package/dist/client/_generated/_ignore.d.ts +1 -0
  43. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  44. package/dist/client/_generated/_ignore.js +3 -0
  45. package/dist/client/_generated/_ignore.js.map +1 -0
  46. package/dist/client/index.d.ts +119 -0
  47. package/dist/client/index.d.ts.map +1 -0
  48. package/dist/client/index.js +272 -0
  49. package/dist/client/index.js.map +1 -0
  50. package/dist/component/_generated/api.d.ts +38 -0
  51. package/dist/component/_generated/api.d.ts.map +1 -0
  52. package/dist/component/_generated/api.js +31 -0
  53. package/dist/component/_generated/api.js.map +1 -0
  54. package/dist/component/_generated/component.d.ts +43 -0
  55. package/dist/component/_generated/component.d.ts.map +1 -0
  56. package/dist/component/_generated/component.js +11 -0
  57. package/dist/component/_generated/component.js.map +1 -0
  58. package/dist/component/_generated/dataModel.d.ts +46 -0
  59. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  60. package/dist/component/_generated/dataModel.js +11 -0
  61. package/dist/component/_generated/dataModel.js.map +1 -0
  62. package/dist/component/_generated/server.d.ts +121 -0
  63. package/dist/component/_generated/server.d.ts.map +1 -0
  64. package/dist/component/_generated/server.js +78 -0
  65. package/dist/component/_generated/server.js.map +1 -0
  66. package/dist/component/convex.config.d.ts +3 -0
  67. package/dist/component/convex.config.d.ts.map +1 -0
  68. package/dist/component/convex.config.js +3 -0
  69. package/dist/component/convex.config.js.map +1 -0
  70. package/dist/component/http.d.ts +4 -0
  71. package/dist/component/http.d.ts.map +1 -0
  72. package/dist/component/http.js +125 -0
  73. package/dist/component/http.js.map +1 -0
  74. package/dist/component/lib.d.ts +164 -0
  75. package/dist/component/lib.d.ts.map +1 -0
  76. package/dist/component/lib.js +768 -0
  77. package/dist/component/lib.js.map +1 -0
  78. package/dist/component/schema.d.ts +84 -0
  79. package/dist/component/schema.d.ts.map +1 -0
  80. package/dist/component/schema.js +69 -0
  81. package/dist/component/schema.js.map +1 -0
  82. package/dist/component/serving.d.ts +17 -0
  83. package/dist/component/serving.d.ts.map +1 -0
  84. package/dist/component/serving.js +150 -0
  85. package/dist/component/serving.js.map +1 -0
  86. package/dist/react/index.d.ts +59 -0
  87. package/dist/react/index.d.ts.map +1 -0
  88. package/dist/react/index.js +137 -0
  89. package/dist/react/index.js.map +1 -0
  90. package/package.json +78 -3
  91. package/src/cli/args.test.ts +79 -0
  92. package/src/cli/args.ts +153 -0
  93. package/src/cli/argumentChunks.test.ts +27 -0
  94. package/src/cli/argumentChunks.ts +40 -0
  95. package/src/cli/collectFiles.test.ts +26 -0
  96. package/src/cli/collectFiles.ts +59 -0
  97. package/src/cli/commands.ts +68 -0
  98. package/src/cli/componentName.test.ts +41 -0
  99. package/src/cli/componentName.ts +46 -0
  100. package/src/cli/deploy.ts +336 -0
  101. package/src/cli/deployEnvironment.test.ts +27 -0
  102. package/src/cli/deployEnvironment.ts +17 -0
  103. package/src/cli/index.ts +65 -0
  104. package/src/cli/upload.ts +837 -0
  105. package/src/client/_generated/_ignore.ts +1 -0
  106. package/src/client/index.test.ts +510 -0
  107. package/src/client/index.ts +355 -0
  108. package/src/client/setup.test.ts +22 -0
  109. package/src/component/_generated/api.ts +54 -0
  110. package/src/component/_generated/component.ts +55 -0
  111. package/src/component/_generated/dataModel.ts +60 -0
  112. package/src/component/_generated/server.ts +156 -0
  113. package/src/component/convex.config.ts +3 -0
  114. package/src/component/http.test.ts +223 -0
  115. package/src/component/http.ts +144 -0
  116. package/src/component/lib.test.ts +1007 -0
  117. package/src/component/lib.ts +862 -0
  118. package/src/component/schema.ts +75 -0
  119. package/src/component/serving.ts +158 -0
  120. package/src/component/setup.test.ts +11 -0
  121. package/src/react/index.tsx +197 -0
  122. package/src/test.ts +23 -0
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * One-shot deployment command that deploys both Convex backend and static files.
4
+ *
5
+ * Usage:
6
+ * npx @samebase/convex-hosting deploy [options]
7
+ *
8
+ * This command:
9
+ * 1. Builds the frontend with the correct VITE_CONVEX_URL
10
+ * 2. Deploys the Convex backend (npx convex deploy)
11
+ * 3. Deploys static files to Convex storage
12
+ *
13
+ * The goal is to minimize the inconsistency window between backend and frontend.
14
+ */
15
+ import { existsSync } from "fs";
16
+ import { resolve } from "path";
17
+ import { runConvex, spawnConvex, spawnShell, spawnStaticHostingCli } from "./commands.js";
18
+ import { buildDeployUploadArgs, parseDeployArgs } from "./args.js";
19
+ import { buildEnvironment, buildEnvironmentChanged, } from "./deployEnvironment.js";
20
+ import { componentNameCandidates, isLegacyAutoDetected, legacyComponentNameWarning, } from "./componentName.js";
21
+ function showHelp() {
22
+ console.log(`
23
+ Usage: npx @samebase/convex-hosting deploy [options]
24
+
25
+ One-shot deployment: builds frontend, deploys Convex backend, then deploys static files.
26
+ Minimizes the inconsistency window between backend and frontend updates.
27
+
28
+ Options:
29
+ -d, --dist <path> Path to dist directory (default: ./dist)
30
+ -c, --component <name> Convex component name (default: hosting)
31
+ --skip-build Skip the build step (use existing dist)
32
+ --skip-convex Skip Convex backend deployment
33
+ --build-command <cmd> Build command to run (default: 'npm run build')
34
+ --no-spa Disable SPA fallback (404 instead of /index.html)
35
+ --spa Enable SPA fallback (default)
36
+ --cdn Use the legacy convex-fs integration
37
+ --cdn-delete-function <name> Legacy app function that deletes CDN blobs
38
+ -h, --help Show this help message
39
+
40
+ Deployment Flow:
41
+ 1. Build frontend with production VITE_CONVEX_URL
42
+ 2. Deploy Convex backend (npx convex deploy)
43
+ 3. Rebuild if the backend changed the static mount path
44
+ 4. Deploy static files to Convex storage
45
+
46
+ Examples:
47
+ # Full deployment
48
+ npx @samebase/convex-hosting deploy
49
+
50
+ # Skip build (if already built)
51
+ npx @samebase/convex-hosting deploy --skip-build
52
+
53
+ # Only deploy static files (skip Convex backend)
54
+ npx @samebase/convex-hosting deploy --skip-convex
55
+ `);
56
+ }
57
+ /**
58
+ * Resolve the component's deployment URLs (siteUrl + cloudUrl). Returns null
59
+ * if the component isn't reachable yet; on first deploy the backend may not
60
+ * exist, in which case the caller should deploy it first and retry.
61
+ */
62
+ function tryFetchUrls(componentName) {
63
+ try {
64
+ const out = runConvex([
65
+ "run",
66
+ "--component",
67
+ componentName,
68
+ "lib:getUrls",
69
+ "{}",
70
+ "--prod",
71
+ "--typecheck=disable",
72
+ "--codegen=disable",
73
+ ]);
74
+ return JSON.parse(out);
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ // The legacy-name warning is printed at most once per invocation.
81
+ let warnedLegacyName = false;
82
+ /**
83
+ * Resolve the deployment URLs and the instance name that answered. When the
84
+ * caller relied on the default name we also probe the @convex-dev/static-hosting
85
+ * name, so an app that kept that instance works without `--component staticHosting`. Returns
86
+ * null if no candidate is deployed yet (the caller may deploy the backend and
87
+ * retry).
88
+ */
89
+ function tryResolveComponent(requested) {
90
+ for (const componentName of componentNameCandidates(requested)) {
91
+ const urls = tryFetchUrls(componentName);
92
+ if (urls) {
93
+ if (isLegacyAutoDetected(requested, componentName) && !warnedLegacyName) {
94
+ console.warn(legacyComponentNameWarning(componentName));
95
+ warnedLegacyName = true;
96
+ }
97
+ return { urls, componentName };
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ function resolveComponentOrExit(requested) {
103
+ const resolved = tryResolveComponent(requested);
104
+ if (!resolved) {
105
+ const names = componentNameCandidates(requested)
106
+ .map((name) => `"${name}"`)
107
+ .join(" or ");
108
+ console.error(`Could not reach component ${names}. Deploy the Convex backend first (npx convex deploy) and ensure --component matches the name in convex.config.ts.`);
109
+ process.exit(1);
110
+ }
111
+ return resolved;
112
+ }
113
+ /**
114
+ * Run the Convex storage upload flow
115
+ */
116
+ async function uploadToConvexStorage(args) {
117
+ console.log("");
118
+ console.log(args.cdn
119
+ ? "📦 Uploading static files (HTML to Convex, assets to CDN)..."
120
+ : "📦 Uploading static files to Convex storage...");
121
+ console.log("");
122
+ const result = spawnStaticHostingCli(buildDeployUploadArgs(args));
123
+ return result === 0;
124
+ }
125
+ function runFrontendBuild(args, urls) {
126
+ const environment = buildEnvironment(urls);
127
+ console.log(` Build command: ${args.buildCommand}`);
128
+ console.log(` VITE_CONVEX_URL=${environment.cloudUrl}`);
129
+ console.log(` CONVEX_HOSTING_BASE_PATH=${environment.basePath}`);
130
+ console.log("");
131
+ const buildResult = spawnShell(args.buildCommand, {
132
+ ...process.env,
133
+ VITE_CONVEX_URL: environment.cloudUrl,
134
+ CONVEX_HOSTING_BASE_PATH: environment.basePath,
135
+ });
136
+ if (buildResult !== 0) {
137
+ throw new Error("Frontend build failed");
138
+ }
139
+ }
140
+ async function main() {
141
+ const args = parseDeployArgs(process.argv.slice(2));
142
+ if (args.help) {
143
+ showHelp();
144
+ process.exit(0);
145
+ }
146
+ console.log("");
147
+ console.log("🚀 Convex + Static Files Deployment");
148
+ console.log("═══════════════════════════════════════════════════════════");
149
+ const startTime = Date.now();
150
+ // Step 1: Get deployment URLs (needed for build)
151
+ console.log("");
152
+ console.log("Step 1: Getting deployment URLs...");
153
+ let resolved = tryResolveComponent(args.component);
154
+ let urls = resolved?.urls ?? null;
155
+ // Falls back to the requested name until the backend is deployed and a real
156
+ // instance answers; re-resolved after each deploy below.
157
+ let componentName = resolved?.componentName ?? args.component;
158
+ const shouldDeployBackend = !args.skipConvex;
159
+ let backendAlreadyDeployed = false;
160
+ if (!urls && !args.skipConvex) {
161
+ console.log(" Component not yet deployed. Will fetch URLs after deploying backend.");
162
+ }
163
+ else if (urls) {
164
+ console.log(` ✓ ${urls.siteUrl}`);
165
+ }
166
+ // Step 2: Build frontend
167
+ if (!args.skipBuild) {
168
+ console.log("");
169
+ console.log("Step 2: Building frontend...");
170
+ // If the component isn't deployed yet, deploy the backend first so we
171
+ // can ask it for the URLs.
172
+ if (!urls && shouldDeployBackend) {
173
+ console.log(" Deploying Convex backend first to get URLs...");
174
+ console.log("");
175
+ const convexResult = spawnConvex(["deploy"]);
176
+ if (convexResult !== 0) {
177
+ console.error("");
178
+ console.error("❌ Convex deployment failed");
179
+ process.exit(1);
180
+ }
181
+ resolved = resolveComponentOrExit(args.component);
182
+ urls = resolved.urls;
183
+ componentName = resolved.componentName;
184
+ console.log("");
185
+ console.log(` ✓ Site URL: ${urls.siteUrl}`);
186
+ backendAlreadyDeployed = true;
187
+ }
188
+ if (!urls) {
189
+ console.error("");
190
+ console.error("❌ Could not determine deployment URLs for build");
191
+ console.error(" Run 'npx convex deploy' first or remove --skip-convex");
192
+ process.exit(1);
193
+ }
194
+ try {
195
+ runFrontendBuild(args, urls);
196
+ }
197
+ catch {
198
+ console.error("");
199
+ console.error("❌ Build failed");
200
+ process.exit(1);
201
+ }
202
+ console.log("");
203
+ console.log(" ✓ Build complete");
204
+ }
205
+ else {
206
+ console.log("");
207
+ console.log("Step 2: Skipping build (--skip-build)");
208
+ }
209
+ // Step 3: Deploy Convex backend
210
+ if (shouldDeployBackend && !backendAlreadyDeployed) {
211
+ console.log("");
212
+ console.log("Step 3: Deploying Convex backend...");
213
+ console.log("");
214
+ const convexResult = spawnConvex(["deploy"]);
215
+ if (convexResult !== 0) {
216
+ console.error("");
217
+ console.error("❌ Convex deployment failed");
218
+ process.exit(1);
219
+ }
220
+ console.log("");
221
+ console.log(" ✓ Convex backend deployed");
222
+ const deployedComponent = resolveComponentOrExit(args.component);
223
+ const deployedUrls = deployedComponent.urls;
224
+ componentName = deployedComponent.componentName;
225
+ if (!args.skipBuild) {
226
+ if (!urls || buildEnvironmentChanged(urls, deployedUrls)) {
227
+ console.log("");
228
+ console.log(" Site URL changed after backend deployment. Rebuilding with the new environment...");
229
+ try {
230
+ runFrontendBuild(args, deployedUrls);
231
+ }
232
+ catch {
233
+ console.error("");
234
+ console.error("❌ Rebuild failed after backend URL change");
235
+ process.exit(1);
236
+ }
237
+ console.log("");
238
+ console.log(" ✓ Rebuild complete");
239
+ }
240
+ }
241
+ urls = deployedUrls;
242
+ }
243
+ else {
244
+ console.log("");
245
+ console.log("Step 3: Skipping Convex deployment (--skip-convex or already deployed)");
246
+ }
247
+ // Step 4: Deploy static files
248
+ console.log("");
249
+ console.log("Step 4: Deploying static files to Convex storage...");
250
+ const distDir = resolve(args.dist);
251
+ if (!existsSync(distDir)) {
252
+ console.error("");
253
+ console.error(`❌ Dist directory not found: ${distDir}`);
254
+ console.error(" Run build first or check --dist path");
255
+ process.exit(1);
256
+ }
257
+ // Pass the resolved instance name to the upload subprocess so it targets the
258
+ // same component (and doesn't re-probe or re-warn).
259
+ const staticDeploySuccess = await uploadToConvexStorage({
260
+ ...args,
261
+ dist: distDir,
262
+ component: componentName,
263
+ });
264
+ if (!staticDeploySuccess) {
265
+ console.error("");
266
+ console.error("❌ Static file upload failed");
267
+ process.exit(1);
268
+ }
269
+ // Done!
270
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
271
+ console.log("");
272
+ console.log("═══════════════════════════════════════════════════════════");
273
+ console.log(`✨ Deployment complete! (${duration}s)`);
274
+ console.log("");
275
+ const finalUrls = urls ?? resolveComponentOrExit(args.component).urls;
276
+ console.log(`Frontend: ${finalUrls.siteUrl}`);
277
+ console.log("");
278
+ }
279
+ main().catch((error) => {
280
+ console.error("Deployment failed:", error);
281
+ process.exit(1);
282
+ });
283
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/cli/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface DeploymentUrls {
2
+ siteUrl: string;
3
+ cloudUrl: string;
4
+ }
5
+ export declare function buildEnvironment(urls: DeploymentUrls): {
6
+ cloudUrl: string;
7
+ basePath: string;
8
+ };
9
+ export declare function buildEnvironmentChanged(before: DeploymentUrls, after: DeploymentUrls): boolean;
10
+ //# sourceMappingURL=deployEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployEnvironment.d.ts","sourceRoot":"","sources":["../../src/cli/deployEnvironment.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc;;;EAKpD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAI9F"}
@@ -0,0 +1,12 @@
1
+ export function buildEnvironment(urls) {
2
+ return {
3
+ cloudUrl: urls.cloudUrl,
4
+ basePath: new URL(urls.siteUrl).pathname || "/",
5
+ };
6
+ }
7
+ export function buildEnvironmentChanged(before, after) {
8
+ const previous = buildEnvironment(before);
9
+ const next = buildEnvironment(after);
10
+ return previous.cloudUrl !== next.cloudUrl || previous.basePath !== next.basePath;
11
+ }
12
+ //# sourceMappingURL=deployEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployEnvironment.js","sourceRoot":"","sources":["../../src/cli/deployEnvironment.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACnD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,IAAI,GAAG;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAsB,EAAE,KAAqB;IACnF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC;AACpF,CAAC"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for Convex Hosting
4
+ *
5
+ * Commands:
6
+ * deploy One-shot deployment (Convex backend + static files)
7
+ * upload Upload static files to Convex storage
8
+ */
9
+ declare const command: string;
10
+ declare function main(): Promise<void>;
11
+ declare function printHelp(): void;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,QAAA,MAAM,OAAO,QAAkB,CAAC;AAEhC,iBAAe,IAAI,kBA0BlB;AAED,iBAAS,SAAS,SAoBjB"}
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * CLI for Convex Hosting
5
+ *
6
+ * Commands:
7
+ * deploy One-shot deployment (Convex backend + static files)
8
+ * upload Upload static files to Convex storage
9
+ */
10
+ const command = process.argv[2];
11
+ async function main() {
12
+ switch (command) {
13
+ case "deploy":
14
+ // Pass remaining args to deploy command
15
+ process.argv.splice(2, 1);
16
+ await import("./deploy.js");
17
+ break;
18
+ case "upload":
19
+ // Pass remaining args to upload command
20
+ process.argv.splice(2, 1);
21
+ await import("./upload.js");
22
+ break;
23
+ case "--help":
24
+ case "-h":
25
+ case undefined:
26
+ printHelp();
27
+ break;
28
+ default:
29
+ console.error(`Unknown command: ${command}`);
30
+ console.log("");
31
+ printHelp();
32
+ process.exit(1);
33
+ }
34
+ }
35
+ function printHelp() {
36
+ console.log(`
37
+ Convex Hosting CLI
38
+
39
+ Usage:
40
+ npx @samebase/convex-hosting <command> [options]
41
+
42
+ Commands:
43
+ deploy One-shot deployment (Convex backend + static files)
44
+ upload Upload static files to Convex storage
45
+
46
+ Examples:
47
+ # One-shot deployment
48
+ npx @samebase/convex-hosting deploy
49
+
50
+ # Upload only (no Convex backend deploy)
51
+ npx @samebase/convex-hosting upload --build --prod
52
+
53
+ Run '<command> --help' for more information on a specific command.
54
+ `);
55
+ }
56
+ main().catch((err) => {
57
+ console.error("Error:", err);
58
+ process.exit(1);
59
+ });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;;;;GAMG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,wCAAwC;YACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC5B,MAAM;QAER,KAAK,QAAQ;YACX,wCAAwC;YACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC5B,MAAM;QAER,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,SAAS,EAAE,CAAC;YACZ,MAAM;QAER;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;CAkBb,CAAC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI tool to upload static files to a Convex convex-hosting component.
4
+ *
5
+ * Usage:
6
+ * npx @samebase/convex-hosting upload [options]
7
+ *
8
+ * Options:
9
+ * --dist <path> Path to dist directory (default: ./dist)
10
+ * --component <name> Component instance name (default: hosting)
11
+ * --prod Deploy to production deployment
12
+ * --preview-name <name> Upload to the named preview deployment
13
+ * --build Run the frontend build before uploading
14
+ * --build-command <cmd> Override the frontend build command
15
+ * --spa / --no-spa Enable or disable SPA fallback
16
+ * --cdn Use the legacy convex-fs integration
17
+ * --cdn-delete-function App function that deletes old CDN blobs
18
+ * --concurrency <n> Parallel upload workers (default: 5)
19
+ * --help Show help
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/cli/upload.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG"}