convex 1.42.2 → 1.43.0-alpha.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 (276) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/bin/main-dev +6 -1
  3. package/dist/browser.bundle.js +49 -10
  4. package/dist/browser.bundle.js.map +2 -2
  5. package/dist/cjs/browser/index.js.map +2 -2
  6. package/dist/cjs/browser/simple_client-node.js +35 -35
  7. package/dist/cjs/browser/simple_client-node.js.map +2 -2
  8. package/dist/cjs/browser/sync/client.js.map +1 -1
  9. package/dist/cjs/browser/sync/paginated_query_client.js +20 -9
  10. package/dist/cjs/browser/sync/paginated_query_client.js.map +2 -2
  11. package/dist/cjs/cli/codegen_templates/component_api.js +2 -2
  12. package/dist/cjs/cli/codegen_templates/component_api.js.map +2 -2
  13. package/dist/cjs/cli/codegen_templates/validator_helpers.js +2 -0
  14. package/dist/cjs/cli/codegen_templates/validator_helpers.js.map +2 -2
  15. package/dist/cjs/cli/deployment.js +2 -1
  16. package/dist/cjs/cli/deployment.js.map +2 -2
  17. package/dist/cjs/cli/deploymentCreate.js.map +2 -2
  18. package/dist/cjs/cli/generatedApi.js.map +1 -1
  19. package/dist/cjs/cli/lib/deployApi/validator.js +1 -0
  20. package/dist/cjs/cli/lib/deployApi/validator.js.map +2 -2
  21. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  22. package/dist/cjs/cli/lib/generateDocs.js +1 -1
  23. package/dist/cjs/cli/lib/generateDocs.js.map +2 -2
  24. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  25. package/dist/cjs/cli/lib/localDeployment/projectMismatch.js.map +2 -2
  26. package/dist/cjs/cli/lib/login.js +23 -23
  27. package/dist/cjs/cli/lib/login.js.map +2 -2
  28. package/dist/cjs/cli/lib/typecheck.js +28 -25
  29. package/dist/cjs/cli/lib/typecheck.js.map +2 -2
  30. package/dist/cjs/cli/lib/usageLimits.js +164 -0
  31. package/dist/cjs/cli/lib/usageLimits.js.map +7 -0
  32. package/dist/cjs/cli/usageLimits.js +326 -0
  33. package/dist/cjs/cli/usageLimits.js.map +7 -0
  34. package/dist/cjs/index.js +1 -1
  35. package/dist/cjs/index.js.map +1 -1
  36. package/dist/cjs/react/client.js.map +2 -2
  37. package/dist/cjs/server/components/index.js.map +2 -2
  38. package/dist/cjs/server/cron.js +33 -29
  39. package/dist/cjs/server/cron.js.map +2 -2
  40. package/dist/cjs/server/database.js.map +1 -1
  41. package/dist/cjs/server/impl/database_impl.js +3 -0
  42. package/dist/cjs/server/impl/database_impl.js.map +2 -2
  43. package/dist/cjs/server/log.js +2 -1
  44. package/dist/cjs/server/log.js.map +2 -2
  45. package/dist/cjs/server/logVars.js +12 -1
  46. package/dist/cjs/server/logVars.js.map +2 -2
  47. package/dist/cjs/server/meta.js.map +1 -1
  48. package/dist/cjs/values/compare.js +5 -1
  49. package/dist/cjs/values/compare.js.map +2 -2
  50. package/dist/cjs/values/index.js +1 -0
  51. package/dist/cjs/values/index.js.map +2 -2
  52. package/dist/cjs/values/size.js +4 -0
  53. package/dist/cjs/values/size.js.map +2 -2
  54. package/dist/cjs/values/validator.js +11 -0
  55. package/dist/cjs/values/validator.js.map +2 -2
  56. package/dist/cjs/values/validators.js +20 -0
  57. package/dist/cjs/values/validators.js.map +2 -2
  58. package/dist/cjs/values/value.js +31 -0
  59. package/dist/cjs/values/value.js.map +2 -2
  60. package/dist/cjs-types/browser/index.d.ts.map +1 -1
  61. package/dist/cjs-types/browser/sync/paginated_query_client.d.ts +1 -38
  62. package/dist/cjs-types/browser/sync/paginated_query_client.d.ts.map +1 -1
  63. package/dist/cjs-types/cli/codegen_templates/component_api.d.ts.map +1 -1
  64. package/dist/cjs-types/cli/codegen_templates/validator_helpers.d.ts.map +1 -1
  65. package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts +2 -0
  66. package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts.map +1 -0
  67. package/dist/cjs-types/cli/deployment.d.ts.map +1 -1
  68. package/dist/cjs-types/cli/deploymentCreate.d.ts +2 -2
  69. package/dist/cjs-types/cli/generatedApi.d.ts +43 -43
  70. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  71. package/dist/cjs-types/cli/lib/deployApi/validator.d.ts +6 -0
  72. package/dist/cjs-types/cli/lib/deployApi/validator.d.ts.map +1 -1
  73. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -2
  74. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  75. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +45 -45
  76. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  77. package/dist/cjs-types/cli/lib/localDeployment/projectMismatch.d.ts +2 -2
  78. package/dist/cjs-types/cli/lib/localDeployment/projectMismatch.d.ts.map +1 -1
  79. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  80. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +24 -24
  81. package/dist/cjs-types/cli/lib/typecheck.d.ts +2 -0
  82. package/dist/cjs-types/cli/lib/typecheck.d.ts.map +1 -1
  83. package/dist/cjs-types/cli/lib/typecheck.test.d.ts +2 -0
  84. package/dist/cjs-types/cli/lib/typecheck.test.d.ts.map +1 -0
  85. package/dist/cjs-types/cli/lib/usageLimits.d.ts +46 -0
  86. package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -0
  87. package/dist/cjs-types/cli/usageLimits.d.ts +22 -0
  88. package/dist/cjs-types/cli/usageLimits.d.ts.map +1 -0
  89. package/dist/cjs-types/index.d.ts +1 -1
  90. package/dist/cjs-types/index.d.ts.map +1 -1
  91. package/dist/cjs-types/react/client.d.ts.map +1 -1
  92. package/dist/cjs-types/server/components/index.d.ts +26 -8
  93. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  94. package/dist/cjs-types/server/cron.d.ts +20 -11
  95. package/dist/cjs-types/server/cron.d.ts.map +1 -1
  96. package/dist/cjs-types/server/cron.test.d.ts +2 -0
  97. package/dist/cjs-types/server/cron.test.d.ts.map +1 -0
  98. package/dist/cjs-types/server/database.d.ts.map +1 -1
  99. package/dist/cjs-types/server/impl/database_impl.d.ts.map +1 -1
  100. package/dist/cjs-types/server/log.d.ts.map +1 -1
  101. package/dist/cjs-types/server/logVars.d.ts +14 -1
  102. package/dist/cjs-types/server/logVars.d.ts.map +1 -1
  103. package/dist/cjs-types/server/meta.d.ts +2 -2
  104. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  105. package/dist/cjs-types/values/compare.d.ts.map +1 -1
  106. package/dist/cjs-types/values/index.d.ts +2 -2
  107. package/dist/cjs-types/values/index.d.ts.map +1 -1
  108. package/dist/cjs-types/values/size.d.ts +1 -1
  109. package/dist/cjs-types/values/size.d.ts.map +1 -1
  110. package/dist/cjs-types/values/validator.d.ts +10 -1
  111. package/dist/cjs-types/values/validator.d.ts.map +1 -1
  112. package/dist/cjs-types/values/validators.d.ts +14 -3
  113. package/dist/cjs-types/values/validators.d.ts.map +1 -1
  114. package/dist/cjs-types/values/value.d.ts +18 -1
  115. package/dist/cjs-types/values/value.d.ts.map +1 -1
  116. package/dist/cli.bundle.cjs +2327 -1866
  117. package/dist/cli.bundle.cjs.map +4 -4
  118. package/dist/esm/browser/index.js.map +2 -2
  119. package/dist/esm/browser/simple_client-node.js +35 -35
  120. package/dist/esm/browser/simple_client-node.js.map +1 -1
  121. package/dist/esm/browser/sync/client.js.map +1 -1
  122. package/dist/esm/browser/sync/paginated_query_client.js +20 -9
  123. package/dist/esm/browser/sync/paginated_query_client.js.map +2 -2
  124. package/dist/esm/cli/codegen_templates/component_api.js +8 -3
  125. package/dist/esm/cli/codegen_templates/component_api.js.map +2 -2
  126. package/dist/esm/cli/codegen_templates/validator_helpers.js +2 -0
  127. package/dist/esm/cli/codegen_templates/validator_helpers.js.map +2 -2
  128. package/dist/esm/cli/deployment.js +2 -1
  129. package/dist/esm/cli/deployment.js.map +2 -2
  130. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  131. package/dist/esm/cli/lib/deployApi/validator.js +1 -0
  132. package/dist/esm/cli/lib/deployApi/validator.js.map +2 -2
  133. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  134. package/dist/esm/cli/lib/generateDocs.js +1 -1
  135. package/dist/esm/cli/lib/generateDocs.js.map +2 -2
  136. package/dist/esm/cli/lib/localDeployment/projectMismatch.js.map +2 -2
  137. package/dist/esm/cli/lib/login.js +23 -23
  138. package/dist/esm/cli/lib/login.js.map +2 -2
  139. package/dist/esm/cli/lib/typecheck.js +27 -25
  140. package/dist/esm/cli/lib/typecheck.js.map +2 -2
  141. package/dist/esm/cli/lib/usageLimits.js +129 -0
  142. package/dist/esm/cli/lib/usageLimits.js.map +7 -0
  143. package/dist/esm/cli/usageLimits.js +316 -0
  144. package/dist/esm/cli/usageLimits.js.map +7 -0
  145. package/dist/esm/index.js +1 -1
  146. package/dist/esm/index.js.map +1 -1
  147. package/dist/esm/react/client.js.map +2 -2
  148. package/dist/esm/server/components/index.js.map +2 -2
  149. package/dist/esm/server/cron.js +33 -29
  150. package/dist/esm/server/cron.js.map +2 -2
  151. package/dist/esm/server/impl/database_impl.js +4 -1
  152. package/dist/esm/server/impl/database_impl.js.map +2 -2
  153. package/dist/esm/server/log.js +3 -2
  154. package/dist/esm/server/log.js.map +2 -2
  155. package/dist/esm/server/logVars.js +11 -1
  156. package/dist/esm/server/logVars.js.map +2 -2
  157. package/dist/esm/values/compare.js +5 -1
  158. package/dist/esm/values/compare.js.map +2 -2
  159. package/dist/esm/values/index.js +1 -1
  160. package/dist/esm/values/index.js.map +2 -2
  161. package/dist/esm/values/size.js +4 -0
  162. package/dist/esm/values/size.js.map +2 -2
  163. package/dist/esm/values/validator.js +12 -0
  164. package/dist/esm/values/validator.js.map +2 -2
  165. package/dist/esm/values/validators.js +19 -0
  166. package/dist/esm/values/validators.js.map +2 -2
  167. package/dist/esm/values/value.js +29 -1
  168. package/dist/esm/values/value.js.map +2 -2
  169. package/dist/esm-types/browser/index.d.ts.map +1 -1
  170. package/dist/esm-types/browser/sync/paginated_query_client.d.ts +1 -38
  171. package/dist/esm-types/browser/sync/paginated_query_client.d.ts.map +1 -1
  172. package/dist/esm-types/cli/codegen_templates/component_api.d.ts.map +1 -1
  173. package/dist/esm-types/cli/codegen_templates/validator_helpers.d.ts.map +1 -1
  174. package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts +2 -0
  175. package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts.map +1 -0
  176. package/dist/esm-types/cli/deployment.d.ts.map +1 -1
  177. package/dist/esm-types/cli/deploymentCreate.d.ts +2 -2
  178. package/dist/esm-types/cli/generatedApi.d.ts +43 -43
  179. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  180. package/dist/esm-types/cli/lib/deployApi/validator.d.ts +6 -0
  181. package/dist/esm-types/cli/lib/deployApi/validator.d.ts.map +1 -1
  182. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -2
  183. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  184. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +45 -45
  185. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  186. package/dist/esm-types/cli/lib/localDeployment/projectMismatch.d.ts +2 -2
  187. package/dist/esm-types/cli/lib/localDeployment/projectMismatch.d.ts.map +1 -1
  188. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  189. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +24 -24
  190. package/dist/esm-types/cli/lib/typecheck.d.ts +2 -0
  191. package/dist/esm-types/cli/lib/typecheck.d.ts.map +1 -1
  192. package/dist/esm-types/cli/lib/typecheck.test.d.ts +2 -0
  193. package/dist/esm-types/cli/lib/typecheck.test.d.ts.map +1 -0
  194. package/dist/esm-types/cli/lib/usageLimits.d.ts +46 -0
  195. package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -0
  196. package/dist/esm-types/cli/usageLimits.d.ts +22 -0
  197. package/dist/esm-types/cli/usageLimits.d.ts.map +1 -0
  198. package/dist/esm-types/index.d.ts +1 -1
  199. package/dist/esm-types/index.d.ts.map +1 -1
  200. package/dist/esm-types/react/client.d.ts.map +1 -1
  201. package/dist/esm-types/server/components/index.d.ts +26 -8
  202. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  203. package/dist/esm-types/server/cron.d.ts +20 -11
  204. package/dist/esm-types/server/cron.d.ts.map +1 -1
  205. package/dist/esm-types/server/cron.test.d.ts +2 -0
  206. package/dist/esm-types/server/cron.test.d.ts.map +1 -0
  207. package/dist/esm-types/server/database.d.ts.map +1 -1
  208. package/dist/esm-types/server/impl/database_impl.d.ts.map +1 -1
  209. package/dist/esm-types/server/log.d.ts.map +1 -1
  210. package/dist/esm-types/server/logVars.d.ts +14 -1
  211. package/dist/esm-types/server/logVars.d.ts.map +1 -1
  212. package/dist/esm-types/server/meta.d.ts +2 -2
  213. package/dist/esm-types/server/meta.d.ts.map +1 -1
  214. package/dist/esm-types/values/compare.d.ts.map +1 -1
  215. package/dist/esm-types/values/index.d.ts +2 -2
  216. package/dist/esm-types/values/index.d.ts.map +1 -1
  217. package/dist/esm-types/values/size.d.ts +1 -1
  218. package/dist/esm-types/values/size.d.ts.map +1 -1
  219. package/dist/esm-types/values/validator.d.ts +10 -1
  220. package/dist/esm-types/values/validator.d.ts.map +1 -1
  221. package/dist/esm-types/values/validators.d.ts +14 -3
  222. package/dist/esm-types/values/validators.d.ts.map +1 -1
  223. package/dist/esm-types/values/value.d.ts +18 -1
  224. package/dist/esm-types/values/value.d.ts.map +1 -1
  225. package/dist/react.bundle.js +53 -11
  226. package/dist/react.bundle.js.map +2 -2
  227. package/package.json +8 -8
  228. package/schemas/convex.schema.json +2 -1
  229. package/src/browser/index.ts +2 -0
  230. package/src/browser/sync/client.test.ts +8 -1
  231. package/src/browser/sync/client.ts +63 -0
  232. package/src/browser/sync/paginated_query_client.test.ts +209 -1
  233. package/src/browser/sync/paginated_query_client.ts +29 -11
  234. package/src/cli/codegen_templates/component_api.ts +8 -3
  235. package/src/cli/codegen_templates/validator_helpers.test.ts +31 -0
  236. package/src/cli/codegen_templates/validator_helpers.ts +6 -0
  237. package/src/cli/deployment.ts +4 -1
  238. package/src/cli/deploymentCreate.test.ts +2 -2
  239. package/src/cli/deploymentCreate.ts +2 -2
  240. package/src/cli/generatedApi.ts +43 -43
  241. package/src/cli/lib/deployApi/validator.ts +1 -0
  242. package/src/cli/lib/deploymentSelection.ts +2 -2
  243. package/src/cli/lib/generateDocs.test.ts +1 -1
  244. package/src/cli/lib/generateDocs.ts +3 -3
  245. package/src/cli/lib/generatedFunctionLogsApi.ts +45 -45
  246. package/src/cli/lib/localDeployment/projectMismatch.ts +2 -2
  247. package/src/cli/lib/login.ts +33 -30
  248. package/src/cli/lib/typecheck.test.ts +71 -0
  249. package/src/cli/lib/typecheck.ts +33 -27
  250. package/src/cli/lib/usageLimits.ts +242 -0
  251. package/src/cli/usageLimits.ts +420 -0
  252. package/src/index.ts +1 -1
  253. package/src/react/ConvexAuthState.test.tsx +24 -8
  254. package/src/react/auth_websocket.test.tsx +39 -29
  255. package/src/react/client.ts +3 -2
  256. package/src/react/client_provided_base_client.test.tsx +154 -36
  257. package/src/server/audit_logging.test.ts +2 -0
  258. package/src/server/components/index.test.ts +33 -1
  259. package/src/server/components/index.ts +41 -14
  260. package/src/server/cron.test.ts +58 -0
  261. package/src/server/cron.ts +82 -21
  262. package/src/server/database.ts +17 -0
  263. package/src/server/impl/database_impl.ts +4 -1
  264. package/src/server/log.ts +4 -1
  265. package/src/server/logVars.ts +17 -1
  266. package/src/server/meta.ts +2 -2
  267. package/src/server/schema.test.ts +6 -1
  268. package/src/values/compare.ts +5 -2
  269. package/src/values/index.ts +2 -1
  270. package/src/values/size.test.ts +5 -0
  271. package/src/values/size.ts +5 -1
  272. package/src/values/validator.test.ts +16 -1
  273. package/src/values/validator.ts +13 -0
  274. package/src/values/validators.ts +29 -1
  275. package/src/values/value.test.ts +35 -0
  276. package/src/values/value.ts +56 -1
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var usageLimits_exports = {};
20
+ __export(usageLimits_exports, {
21
+ usage: () => usage,
22
+ usageLimits: () => usageLimits
23
+ });
24
+ module.exports = __toCommonJS(usageLimits_exports);
25
+ var import_extra_typings = require("@commander-js/extra-typings");
26
+ var import_log = require("../bundler/log.js");
27
+ var import_command = require("./lib/command.js");
28
+ var import_utils = require("./lib/utils/utils.js");
29
+ var import_run = require("./lib/localDeployment/run.js");
30
+ var import_env = require("./env.js");
31
+ var import_usageLimits = require("./lib/usageLimits.js");
32
+ async function parseLimit(ctx, value) {
33
+ const limit = Number(value);
34
+ if (!Number.isInteger(limit) || limit < 1) {
35
+ return ctx.crash({
36
+ exitCode: 1,
37
+ errorType: "fatal",
38
+ printedMessage: `error: --limit must be a positive integer, got "${value}".`
39
+ });
40
+ }
41
+ return limit;
42
+ }
43
+ function formatTable(header, rows, rightAlign = []) {
44
+ const right = new Set(rightAlign);
45
+ const widths = header.map(
46
+ (cell, i) => Math.max(cell.length, ...rows.map((row) => (row[i] ?? "").length))
47
+ );
48
+ const pad = (cell, i) => right.has(i) ? cell.padStart(widths[i]) : cell.padEnd(widths[i]);
49
+ const rule = (left, mid, r) => left + widths.map((w) => "\u2500".repeat(w + 2)).join(mid) + r;
50
+ const line = (cells) => "\u2502 " + cells.map((cell, i) => pad(cell ?? "", i)).join(" \u2502 ") + " \u2502";
51
+ return [
52
+ rule("\u250C", "\u252C", "\u2510"),
53
+ line(header),
54
+ rule("\u251C", "\u253C", "\u2524"),
55
+ ...rows.map(line),
56
+ rule("\u2514", "\u2534", "\u2518")
57
+ ].join("\n");
58
+ }
59
+ const NUMBER_FORMAT_COMPACT = new Intl.NumberFormat("en-US", {
60
+ notation: "compact",
61
+ compactDisplay: "short",
62
+ maximumFractionDigits: 3
63
+ });
64
+ function formatNumberCompact(value) {
65
+ const formatted = NUMBER_FORMAT_COMPACT.format(value);
66
+ return formatted === "-0" ? "0" : formatted;
67
+ }
68
+ const LIMIT_FORMAT = new Intl.NumberFormat("en-US");
69
+ function formatLimitAmount(value) {
70
+ return LIMIT_FORMAT.format(value);
71
+ }
72
+ const NUMBER_FORMAT = new Intl.NumberFormat("en-US");
73
+ function formatNumber(value) {
74
+ const formatted = NUMBER_FORMAT.format(value);
75
+ return formatted === "-0" ? "0" : formatted;
76
+ }
77
+ function unitFor(amount, unit) {
78
+ return amount === 1 && unit === "calls" ? "call" : unit;
79
+ }
80
+ function formatAmount(value, unit) {
81
+ return unit === null ? formatNumberCompact(value) : `${formatNumberCompact(value)} ${unitFor(value, unit)}`;
82
+ }
83
+ function usageLimitRow(limit) {
84
+ const currentUsage = limit.currentUsage === null ? "\u2014" : `${formatAmount(limit.currentUsage, limit.unit)} (${formatNumber(
85
+ Math.round(limit.currentUsage / limit.limit * 100)
86
+ )}%)`;
87
+ return [
88
+ (0, import_usageLimits.metricLabel)(limit.metric),
89
+ limit.window,
90
+ limit.limitType,
91
+ formatAmount(limit.limit, limit.unit),
92
+ currentUsage,
93
+ limit.enabled ? "yes" : "no",
94
+ limit.triggered ? "yes" : "no"
95
+ ];
96
+ }
97
+ const metricOption = new import_extra_typings.Option(
98
+ "--metric <metric>",
99
+ "The metric to limit."
100
+ ).choices(import_usageLimits.USAGE_LIMIT_METRICS);
101
+ const windowOption = new import_extra_typings.Option(
102
+ "--window <window>",
103
+ "The window the limit is measured over."
104
+ ).choices(import_usageLimits.USAGE_LIMIT_WINDOWS);
105
+ const typeOption = new import_extra_typings.Option(
106
+ "--type <type>",
107
+ "`warning` only notifies; `disable` pauses the deployment when exceeded."
108
+ ).choices(import_usageLimits.USAGE_LIMIT_TYPES);
109
+ function seedStatusMessage(seedStatus) {
110
+ return seedStatus === "failed" ? "We couldn't load this deployment's historical usage, so the usage shown below may understate its actual usage. Limits are still enforced going forward." : "Historical usage is still being loaded, so the usage shown below may understate this deployment's actual usage. Check back shortly for accurate totals.";
111
+ }
112
+ const listCmd = new import_extra_typings.Command("list").summary("List configured usage limits").description(
113
+ [
114
+ "List the usage limits configured on your deployment.",
115
+ "",
116
+ "\u2022 List all usage limits: `npx convex deployment usage-limits list`",
117
+ "\u2022 Print as JSON: `npx convex deployment usage-limits list --json`"
118
+ ].join("\n")
119
+ ).option("--json", "Output the usage limits as JSON.").configureHelp({ showGlobalOptions: true }).allowExcessArguments(false).action(async (cmdOptions, cmd) => {
120
+ const options = cmd.optsWithGlobals();
121
+ const { ctx, deployment } = await (0, import_env.selectEnvDeployment)(options);
122
+ await (0, import_utils.ensureHasConvexDependency)(ctx, "deployment usage-limits list");
123
+ await (0, import_run.withRunningBackend)({
124
+ ctx,
125
+ deployment,
126
+ action: async () => {
127
+ const { limits, seedStatus } = await (0, import_usageLimits.listUsageLimitsWithStatus)(
128
+ ctx,
129
+ deployment
130
+ );
131
+ if (cmdOptions.json) {
132
+ (0, import_log.logOutput)(JSON.stringify(limits, null, 2));
133
+ return;
134
+ }
135
+ if (limits.length === 0) {
136
+ (0, import_log.logMessage)(
137
+ `No usage limits configured${deployment.deploymentNotice}.`
138
+ );
139
+ return;
140
+ }
141
+ if (seedStatus !== "complete") {
142
+ (0, import_log.logMessage)(seedStatusMessage(seedStatus));
143
+ }
144
+ (0, import_log.logOutput)(
145
+ formatTable(
146
+ [
147
+ "Metric",
148
+ "Window",
149
+ "Type",
150
+ "Limit",
151
+ "Current Usage",
152
+ "Active",
153
+ "Triggered"
154
+ ],
155
+ limits.map(usageLimitRow),
156
+ [3, 4]
157
+ )
158
+ );
159
+ }
160
+ });
161
+ });
162
+ const setCmd = new import_extra_typings.Command("set").summary("Create or update a usage limit").description(
163
+ [
164
+ "Create a usage limit, or update the existing one for the same",
165
+ "(metric, window, type). At most one limit exists per combination.",
166
+ "",
167
+ "\u2022 Set the amount (creates or replaces it):",
168
+ " `npx convex deployment usage-limits set --metric functionCalls --window day --type disable --limit 1000000`",
169
+ "\u2022 Deactivate without deleting: add `--inactive` (use `--active` to re-enable).",
170
+ "\u2022 Toggle active state without changing the amount: omit `--limit`."
171
+ ].join("\n")
172
+ ).addOption(metricOption.makeOptionMandatory()).addOption(windowOption.makeOptionMandatory()).addOption(typeOption.makeOptionMandatory()).option(
173
+ "--limit <limit>",
174
+ "The limit amount, in the metric's native units. Required when creating; kept as-is when omitted while updating."
175
+ ).option("--active", "Enforce the limit (the default for a new limit).").option("--inactive", "Create or leave the limit unenforced.").configureHelp({ showGlobalOptions: true }).allowExcessArguments(false).action(async (cmdOptions, cmd) => {
176
+ const options = cmd.optsWithGlobals();
177
+ const { ctx, deployment } = await (0, import_env.selectEnvDeployment)(options);
178
+ await (0, import_utils.ensureHasConvexDependency)(ctx, "deployment usage-limits set");
179
+ if (cmdOptions.active && cmdOptions.inactive) {
180
+ return ctx.crash({
181
+ exitCode: 1,
182
+ errorType: "fatal",
183
+ printedMessage: "error: Pass at most one of --active and --inactive."
184
+ });
185
+ }
186
+ const newLimit = cmdOptions.limit === void 0 ? void 0 : await parseLimit(ctx, cmdOptions.limit);
187
+ await (0, import_run.withRunningBackend)({
188
+ ctx,
189
+ deployment,
190
+ action: async () => {
191
+ const existing = (await (0, import_usageLimits.listUsageLimits)(ctx, deployment)).find(
192
+ (l) => l.metric === cmdOptions.metric && l.window === cmdOptions.window && l.limitType === cmdOptions.type
193
+ );
194
+ const label = `${cmdOptions.type} usage limit on ${(0, import_usageLimits.metricLabel)(cmdOptions.metric)} per ${cmdOptions.window}`;
195
+ if (existing === void 0) {
196
+ if (newLimit === void 0) {
197
+ return ctx.crash({
198
+ exitCode: 1,
199
+ errorType: "fatal",
200
+ printedMessage: "error: --limit is required when creating a usage limit."
201
+ });
202
+ }
203
+ const enabled2 = !cmdOptions.inactive;
204
+ const created = await (0, import_usageLimits.createUsageLimit)(ctx, deployment, {
205
+ metric: cmdOptions.metric,
206
+ window: cmdOptions.window,
207
+ limitType: cmdOptions.type,
208
+ limit: newLimit,
209
+ enabled: enabled2
210
+ });
211
+ (0, import_log.logFinishedStep)(
212
+ `Created ${label}: ${formatLimitAmount(created.limit)}, ${created.enabled ? "active" : "inactive"}${deployment.deploymentNotice}.`
213
+ );
214
+ return;
215
+ }
216
+ const enabled = cmdOptions.active ? true : cmdOptions.inactive ? false : existing.enabled;
217
+ const limit = newLimit ?? existing.limit;
218
+ const changes = [];
219
+ if (limit !== existing.limit) {
220
+ changes.push(
221
+ `limit ${formatLimitAmount(existing.limit)} \u2192 ${formatLimitAmount(limit)}`
222
+ );
223
+ }
224
+ if (enabled !== existing.enabled) {
225
+ changes.push(
226
+ `${existing.enabled ? "active" : "inactive"} \u2192 ${enabled ? "active" : "inactive"}`
227
+ );
228
+ }
229
+ if (changes.length === 0) {
230
+ (0, import_log.logFinishedStep)(
231
+ `No changes to ${label} (${formatLimitAmount(existing.limit)}, ${existing.enabled ? "active" : "inactive"})${deployment.deploymentNotice}.`
232
+ );
233
+ return;
234
+ }
235
+ await (0, import_usageLimits.updateUsageLimit)(ctx, deployment, existing.id, {
236
+ metric: existing.metric,
237
+ window: existing.window,
238
+ limitType: existing.limitType,
239
+ limit,
240
+ enabled
241
+ });
242
+ (0, import_log.logFinishedStep)(
243
+ `Updated ${label}: ${changes.join(", ")}${deployment.deploymentNotice}.`
244
+ );
245
+ }
246
+ });
247
+ });
248
+ const removeCmd = new import_extra_typings.Command("remove").alias("rm").alias("delete").summary("Delete a usage limit").description(
249
+ [
250
+ "Delete a usage limit, identified by its (metric, window, type).",
251
+ "",
252
+ "\u2022 `npx convex deployment usage-limits remove --metric functionCalls --window day --type warning`"
253
+ ].join("\n")
254
+ ).addOption(metricOption.makeOptionMandatory()).addOption(windowOption.makeOptionMandatory()).addOption(typeOption.makeOptionMandatory()).configureHelp({ showGlobalOptions: true }).allowExcessArguments(false).action(async (cmdOptions, cmd) => {
255
+ const options = cmd.optsWithGlobals();
256
+ const { ctx, deployment } = await (0, import_env.selectEnvDeployment)(options);
257
+ await (0, import_utils.ensureHasConvexDependency)(ctx, "deployment usage-limits remove");
258
+ await (0, import_run.withRunningBackend)({
259
+ ctx,
260
+ deployment,
261
+ action: async () => {
262
+ const existing = await (0, import_usageLimits.findUsageLimitByKey)(ctx, deployment, {
263
+ metric: cmdOptions.metric,
264
+ window: cmdOptions.window,
265
+ limitType: cmdOptions.type
266
+ });
267
+ await (0, import_usageLimits.deleteUsageLimit)(ctx, deployment, existing.id);
268
+ (0, import_log.logFinishedStep)(
269
+ `Deleted ${existing.limitType} usage limit on ${(0, import_usageLimits.metricLabel)(existing.metric)} per ${existing.window}${deployment.deploymentNotice}.`
270
+ );
271
+ }
272
+ });
273
+ });
274
+ const usage = new import_extra_typings.Command("usage").summary("Show current usage for each metric").description(
275
+ [
276
+ "Show usage so far in the current day and calendar month for every metric.",
277
+ "",
278
+ "\u2022 Show current usage: `npx convex deployment usage`",
279
+ "\u2022 Print as JSON: `npx convex deployment usage --json`"
280
+ ].join("\n")
281
+ ).option("--json", "Output the usage as JSON.").configureHelp({ showGlobalOptions: true }).allowExcessArguments(false).addDeploymentSelectionOptions((0, import_command.actionDescription)("Show current usage for")).action(async (cmdOptions, cmd) => {
282
+ const options = cmd.optsWithGlobals();
283
+ const { ctx, deployment } = await (0, import_env.selectEnvDeployment)(options);
284
+ await (0, import_utils.ensureHasConvexDependency)(ctx, "deployment usage");
285
+ await (0, import_run.withRunningBackend)({
286
+ ctx,
287
+ deployment,
288
+ action: async () => {
289
+ const usage2 = await (0, import_usageLimits.getCurrentUsage)(ctx, deployment);
290
+ if (cmdOptions.json) {
291
+ (0, import_log.logOutput)(JSON.stringify(usage2, null, 2));
292
+ return;
293
+ }
294
+ if (usage2.seedStatus !== "complete") {
295
+ (0, import_log.logMessage)(seedStatusMessage(usage2.seedStatus));
296
+ }
297
+ (0, import_log.logOutput)(
298
+ formatTable(
299
+ ["Metric", "Day", "Month"],
300
+ Object.entries(usage2.metrics).sort(([a], [b]) => (0, import_usageLimits.compareMetricNames)(a, b)).map(([metric, m]) => [
301
+ (0, import_usageLimits.metricLabel)(metric),
302
+ formatAmount(m.usage.current_day, m.unit),
303
+ formatAmount(m.usage.current_month, m.unit)
304
+ ])
305
+ )
306
+ );
307
+ }
308
+ });
309
+ });
310
+ const usageLimits = new import_extra_typings.Command("usage-limits").summary("List and configure deployment usage limits").description(
311
+ [
312
+ "List and configure usage limits on your deployment.",
313
+ "",
314
+ "A usage limit either warns or pauses your deployment when a metric",
315
+ "(function calls, database bandwidth, \u2026) crosses a threshold within a",
316
+ "daily or monthly window. Each limit is identified by its",
317
+ "(metric, window, type).",
318
+ "",
319
+ "\u2022 List usage limits: `npx convex deployment usage-limits list`",
320
+ "\u2022 Create or update one: `npx convex deployment usage-limits set --metric functionCalls --window day --type disable --limit 1000000`",
321
+ "\u2022 Delete one: `npx convex deployment usage-limits remove --metric functionCalls --window day --type disable`"
322
+ ].join("\n")
323
+ ).addCommand(listCmd).addCommand(setCmd).addCommand(removeCmd).helpCommand(false).addDeploymentSelectionOptions(
324
+ (0, import_command.actionDescription)("List and configure usage limits on")
325
+ );
326
+ //# sourceMappingURL=usageLimits.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/usageLimits.ts"],
4
+ "sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport { Context } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, logOutput } from \"../bundler/log.js\";\nimport { DeploymentSelectionOptions } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport { withRunningBackend } from \"./lib/localDeployment/run.js\";\nimport { selectEnvDeployment } from \"./env.js\";\nimport {\n compareMetricNames,\n createUsageLimit,\n deleteUsageLimit,\n findUsageLimitByKey,\n getCurrentUsage,\n listUsageLimits,\n listUsageLimitsWithStatus,\n metricLabel,\n updateUsageLimit,\n USAGE_LIMIT_METRICS,\n USAGE_LIMIT_TYPES,\n USAGE_LIMIT_WINDOWS,\n UsageLimitStatus,\n} from \"./lib/usageLimits.js\";\n\nasync function parseLimit(ctx: Context, value: string): Promise<number> {\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit < 1) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: --limit must be a positive integer, got \"${value}\".`,\n });\n }\n return limit;\n}\n\nfunction formatTable(\n header: string[],\n rows: string[][],\n rightAlign: number[] = [],\n): string {\n const right = new Set(rightAlign);\n const widths = header.map((cell, i) =>\n Math.max(cell.length, ...rows.map((row) => (row[i] ?? \"\").length)),\n );\n const pad = (cell: string, i: number) =>\n right.has(i) ? cell.padStart(widths[i]) : cell.padEnd(widths[i]);\n const rule = (left: string, mid: string, r: string) =>\n left + widths.map((w) => \"\\u2500\".repeat(w + 2)).join(mid) + r;\n const line = (cells: string[]) =>\n \"\\u2502 \" +\n cells.map((cell, i) => pad(cell ?? \"\", i)).join(\" \\u2502 \") +\n \" \\u2502\";\n return [\n rule(\"\\u250c\", \"\\u252c\", \"\\u2510\"),\n line(header),\n rule(\"\\u251c\", \"\\u253c\", \"\\u2524\"),\n ...rows.map(line),\n rule(\"\\u2514\", \"\\u2534\", \"\\u2518\"),\n ].join(\"\\n\");\n}\n\nconst NUMBER_FORMAT_COMPACT = new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n compactDisplay: \"short\",\n maximumFractionDigits: 3,\n});\nfunction formatNumberCompact(value: number): string {\n const formatted = NUMBER_FORMAT_COMPACT.format(value);\n return formatted === \"-0\" ? \"0\" : formatted;\n}\n\n// Exact, thousands-separated amount for prose (success messages), where a\n// precise value reads clearer than the compact table form.\nconst LIMIT_FORMAT = new Intl.NumberFormat(\"en-US\");\nfunction formatLimitAmount(value: number): string {\n return LIMIT_FORMAT.format(value);\n}\n\nconst NUMBER_FORMAT = new Intl.NumberFormat(\"en-US\");\nfunction formatNumber(value: number): string {\n const formatted = NUMBER_FORMAT.format(value);\n return formatted === \"-0\" ? \"0\" : formatted;\n}\n\nfunction unitFor(amount: number, unit: string): string {\n return amount === 1 && unit === \"calls\" ? \"call\" : unit;\n}\n\nfunction formatAmount(value: number, unit: string | null): string {\n return unit === null\n ? formatNumberCompact(value)\n : `${formatNumberCompact(value)} ${unitFor(value, unit)}`;\n}\n\nfunction usageLimitRow(limit: UsageLimitStatus): string[] {\n const currentUsage =\n limit.currentUsage === null\n ? \"\\u2014\"\n : `${formatAmount(limit.currentUsage, limit.unit)} (${formatNumber(\n Math.round((limit.currentUsage / limit.limit) * 100),\n )}%)`;\n return [\n metricLabel(limit.metric),\n limit.window,\n limit.limitType,\n formatAmount(limit.limit, limit.unit),\n currentUsage,\n limit.enabled ? \"yes\" : \"no\",\n limit.triggered ? \"yes\" : \"no\",\n ];\n}\n\n// The (metric, window, type) triple uniquely identifies a usage limit. `set`\n// requires all three plus a limit; `update`/`remove` reuse them to locate an\n// existing limit without needing its opaque id.\nconst metricOption = new Option(\n \"--metric <metric>\",\n \"The metric to limit.\",\n).choices(USAGE_LIMIT_METRICS);\nconst windowOption = new Option(\n \"--window <window>\",\n \"The window the limit is measured over.\",\n).choices(USAGE_LIMIT_WINDOWS);\nconst typeOption = new Option(\n \"--type <type>\",\n \"`warning` only notifies; `disable` pauses the deployment when exceeded.\",\n).choices(USAGE_LIMIT_TYPES);\n\nfunction seedStatusMessage(\n seedStatus: \"pending\" | \"partial\" | \"failed\",\n): string {\n return seedStatus === \"failed\"\n ? \"We couldn't load this deployment's historical usage, so the usage shown below may understate its actual usage. Limits are still enforced going forward.\"\n : \"Historical usage is still being loaded, so the usage shown below may understate this deployment's actual usage. Check back shortly for accurate totals.\";\n}\n\nconst listCmd = new Command(\"list\")\n .summary(\"List configured usage limits\")\n .description(\n [\n \"List the usage limits configured on your deployment.\",\n \"\",\n \"\u2022 List all usage limits: `npx convex deployment usage-limits list`\",\n \"\u2022 Print as JSON: `npx convex deployment usage-limits list --json`\",\n ].join(\"\\n\"),\n )\n .option(\"--json\", \"Output the usage limits as JSON.\")\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (cmdOptions, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions & {\n json?: boolean;\n };\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"deployment usage-limits list\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const { limits, seedStatus } = await listUsageLimitsWithStatus(\n ctx,\n deployment,\n );\n if (cmdOptions.json) {\n logOutput(JSON.stringify(limits, null, 2));\n return;\n }\n if (limits.length === 0) {\n logMessage(\n `No usage limits configured${deployment.deploymentNotice}.`,\n );\n return;\n }\n // \"Triggered\" is derived from reported usage, which a non-`complete`\n // backfill may understate.\n if (seedStatus !== \"complete\") {\n logMessage(seedStatusMessage(seedStatus));\n }\n logOutput(\n formatTable(\n [\n \"Metric\",\n \"Window\",\n \"Type\",\n \"Limit\",\n \"Current Usage\",\n \"Active\",\n \"Triggered\",\n ],\n limits.map(usageLimitRow),\n [3, 4],\n ),\n );\n },\n });\n });\n\nconst setCmd = new Command(\"set\")\n .summary(\"Create or update a usage limit\")\n .description(\n [\n \"Create a usage limit, or update the existing one for the same\",\n \"(metric, window, type). At most one limit exists per combination.\",\n \"\",\n \"\u2022 Set the amount (creates or replaces it):\",\n \" `npx convex deployment usage-limits set --metric functionCalls --window day --type disable --limit 1000000`\",\n \"\u2022 Deactivate without deleting: add `--inactive` (use `--active` to re-enable).\",\n \"\u2022 Toggle active state without changing the amount: omit `--limit`.\",\n ].join(\"\\n\"),\n )\n .addOption(metricOption.makeOptionMandatory())\n .addOption(windowOption.makeOptionMandatory())\n .addOption(typeOption.makeOptionMandatory())\n .option(\n \"--limit <limit>\",\n \"The limit amount, in the metric's native units. Required when creating; kept as-is when omitted while updating.\",\n )\n .option(\"--active\", \"Enforce the limit (the default for a new limit).\")\n .option(\"--inactive\", \"Create or leave the limit unenforced.\")\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (cmdOptions, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions;\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"deployment usage-limits set\");\n if (cmdOptions.active && cmdOptions.inactive) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"error: Pass at most one of --active and --inactive.\",\n });\n }\n const newLimit =\n cmdOptions.limit === undefined\n ? undefined\n : await parseLimit(ctx, cmdOptions.limit);\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const existing = (await listUsageLimits(ctx, deployment)).find(\n (l) =>\n l.metric === cmdOptions.metric &&\n l.window === cmdOptions.window &&\n l.limitType === cmdOptions.type,\n );\n const label = `${cmdOptions.type} usage limit on ${metricLabel(cmdOptions.metric)} per ${cmdOptions.window}`;\n\n // No existing limit: create one. A limit amount is required.\n if (existing === undefined) {\n if (newLimit === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"error: --limit is required when creating a usage limit.\",\n });\n }\n const enabled = !cmdOptions.inactive;\n const created = await createUsageLimit(ctx, deployment, {\n metric: cmdOptions.metric,\n window: cmdOptions.window,\n limitType: cmdOptions.type,\n limit: newLimit,\n enabled,\n });\n logFinishedStep(\n `Created ${label}: ${formatLimitAmount(created.limit)}, ${created.enabled ? \"active\" : \"inactive\"}${deployment.deploymentNotice}.`,\n );\n return;\n }\n\n // Existing limit: update it, surfacing exactly which fields changed.\n const enabled = cmdOptions.active\n ? true\n : cmdOptions.inactive\n ? false\n : existing.enabled;\n const limit = newLimit ?? existing.limit;\n const changes: string[] = [];\n if (limit !== existing.limit) {\n changes.push(\n `limit ${formatLimitAmount(existing.limit)} \\u2192 ${formatLimitAmount(limit)}`,\n );\n }\n if (enabled !== existing.enabled) {\n changes.push(\n `${existing.enabled ? \"active\" : \"inactive\"} \\u2192 ${enabled ? \"active\" : \"inactive\"}`,\n );\n }\n if (changes.length === 0) {\n logFinishedStep(\n `No changes to ${label} (${formatLimitAmount(existing.limit)}, ${existing.enabled ? \"active\" : \"inactive\"})${deployment.deploymentNotice}.`,\n );\n return;\n }\n await updateUsageLimit(ctx, deployment, existing.id, {\n metric: existing.metric,\n window: existing.window,\n limitType: existing.limitType,\n limit,\n enabled,\n });\n logFinishedStep(\n `Updated ${label}: ${changes.join(\", \")}${deployment.deploymentNotice}.`,\n );\n },\n });\n });\n\nconst removeCmd = new Command(\"remove\")\n .alias(\"rm\")\n .alias(\"delete\")\n .summary(\"Delete a usage limit\")\n .description(\n [\n \"Delete a usage limit, identified by its (metric, window, type).\",\n \"\",\n \"\u2022 `npx convex deployment usage-limits remove --metric functionCalls --window day --type warning`\",\n ].join(\"\\n\"),\n )\n .addOption(metricOption.makeOptionMandatory())\n .addOption(windowOption.makeOptionMandatory())\n .addOption(typeOption.makeOptionMandatory())\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (cmdOptions, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions;\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"deployment usage-limits remove\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const existing = await findUsageLimitByKey(ctx, deployment, {\n metric: cmdOptions.metric,\n window: cmdOptions.window,\n limitType: cmdOptions.type,\n });\n await deleteUsageLimit(ctx, deployment, existing.id);\n logFinishedStep(\n `Deleted ${existing.limitType} usage limit on ${metricLabel(existing.metric)} per ${existing.window}${deployment.deploymentNotice}.`,\n );\n },\n });\n });\n\nexport const usage = new Command(\"usage\")\n .summary(\"Show current usage for each metric\")\n .description(\n [\n \"Show usage so far in the current day and calendar month for every metric.\",\n \"\",\n \"\u2022 Show current usage: `npx convex deployment usage`\",\n \"\u2022 Print as JSON: `npx convex deployment usage --json`\",\n ].join(\"\\n\"),\n )\n .option(\"--json\", \"Output the usage as JSON.\")\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .addDeploymentSelectionOptions(actionDescription(\"Show current usage for\"))\n .action(async (cmdOptions, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions & {\n json?: boolean;\n };\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"deployment usage\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const usage = await getCurrentUsage(ctx, deployment);\n if (cmdOptions.json) {\n logOutput(JSON.stringify(usage, null, 2));\n return;\n }\n // A non-`complete` backfill means the numbers can understate reality.\n if (usage.seedStatus !== \"complete\") {\n logMessage(seedStatusMessage(usage.seedStatus));\n }\n logOutput(\n formatTable(\n [\"Metric\", \"Day\", \"Month\"],\n Object.entries(usage.metrics)\n .sort(([a], [b]) => compareMetricNames(a, b))\n .map(([metric, m]) => [\n metricLabel(metric),\n formatAmount(m.usage.current_day, m.unit),\n formatAmount(m.usage.current_month, m.unit),\n ]),\n ),\n );\n },\n });\n });\n\nexport const usageLimits = new Command(\"usage-limits\")\n .summary(\"List and configure deployment usage limits\")\n .description(\n [\n \"List and configure usage limits on your deployment.\",\n \"\",\n \"A usage limit either warns or pauses your deployment when a metric\",\n \"(function calls, database bandwidth, \u2026) crosses a threshold within a\",\n \"daily or monthly window. Each limit is identified by its\",\n \"(metric, window, type).\",\n \"\",\n \"\u2022 List usage limits: `npx convex deployment usage-limits list`\",\n \"\u2022 Create or update one: `npx convex deployment usage-limits set --metric functionCalls --window day --type disable --limit 1000000`\",\n \"\u2022 Delete one: `npx convex deployment usage-limits remove --metric functionCalls --window day --type disable`\",\n ].join(\"\\n\"),\n )\n .addCommand(listCmd)\n .addCommand(setCmd)\n .addCommand(removeCmd)\n .helpCommand(false)\n .addDeploymentSelectionOptions(\n actionDescription(\"List and configure usage limits on\"),\n );\n"],
5
+ "mappings": "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",
6
+ "names": ["enabled", "usage"]
7
+ }
package/dist/cjs/index.js CHANGED
@@ -21,5 +21,5 @@ __export(index_exports, {
21
21
  version: () => version
22
22
  });
23
23
  module.exports = __toCommonJS(index_exports);
24
- const version = "1.42.2";
24
+ const version = "1.43.0-alpha.0";
25
25
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export const version = \"1.42.2\";\n"],
4
+ "sourcesContent": ["export const version = \"1.43.0-alpha.0\";"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,UAAU;",
6
6
  "names": []
7
7
  }