@mistriwork/engine 0.0.0-stage → 1.0.0-rc.10

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 (546) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -2
  3. package/dist/adapters/adapter.d.ts +693 -0
  4. package/dist/adapters/adapter.js +444 -0
  5. package/dist/adapters/cache/cacheStore.d.ts +75 -0
  6. package/dist/adapters/cache/cacheStore.js +160 -0
  7. package/dist/adapters/cache/resp.d.ts +52 -0
  8. package/dist/adapters/cache/resp.js +237 -0
  9. package/dist/adapters/commands/canonicalJson.d.ts +19 -0
  10. package/dist/adapters/commands/canonicalJson.js +154 -0
  11. package/dist/adapters/connect.d.ts +29 -0
  12. package/dist/adapters/connect.js +40 -0
  13. package/dist/adapters/connectionBudget.d.ts +101 -0
  14. package/dist/adapters/connectionBudget.js +128 -0
  15. package/dist/adapters/dbLatency.d.ts +35 -0
  16. package/dist/adapters/dbLatency.js +79 -0
  17. package/dist/adapters/epochCache.d.ts +50 -0
  18. package/dist/adapters/epochCache.js +85 -0
  19. package/dist/adapters/http/egress.d.ts +48 -0
  20. package/dist/adapters/http/egress.js +175 -0
  21. package/dist/adapters/http/httpAdapter.d.ts +71 -0
  22. package/dist/adapters/http/httpAdapter.js +512 -0
  23. package/dist/adapters/http/httpDescription.d.ts +32 -0
  24. package/dist/adapters/http/httpDescription.js +246 -0
  25. package/dist/adapters/http/openapi.d.ts +98 -0
  26. package/dist/adapters/http/openapi.js +487 -0
  27. package/dist/adapters/layoutRefusal.d.ts +24 -0
  28. package/dist/adapters/layoutRefusal.js +35 -0
  29. package/dist/adapters/net/networkPolicy.d.ts +44 -0
  30. package/dist/adapters/net/networkPolicy.js +123 -0
  31. package/dist/adapters/net/untrustedDatabase.d.ts +18 -0
  32. package/dist/adapters/net/untrustedDatabase.js +120 -0
  33. package/dist/adapters/poolAdmission.d.ts +43 -0
  34. package/dist/adapters/poolAdmission.js +184 -0
  35. package/dist/adapters/poolMetrics.d.ts +121 -0
  36. package/dist/adapters/poolMetrics.js +185 -0
  37. package/dist/adapters/postgres.d.ts +436 -0
  38. package/dist/adapters/postgres.js +1890 -0
  39. package/dist/adapters/postgresCatalog.d.ts +96 -0
  40. package/dist/adapters/postgresCatalog.js +387 -0
  41. package/dist/adapters/postgresCatalogDigest.d.ts +30 -0
  42. package/dist/adapters/postgresCatalogDigest.js +87 -0
  43. package/dist/adapters/postgresCatalogRows.d.ts +62 -0
  44. package/dist/adapters/postgresCatalogRows.js +37 -0
  45. package/dist/adapters/postgresDates.d.ts +1 -0
  46. package/dist/adapters/postgresDates.js +39 -0
  47. package/dist/adapters/postgresMaintenance.d.ts +33 -0
  48. package/dist/adapters/postgresMaintenance.js +179 -0
  49. package/dist/adapters/postgresPool.d.ts +255 -0
  50. package/dist/adapters/postgresPool.js +838 -0
  51. package/dist/adapters/postgresPooler.d.ts +28 -0
  52. package/dist/adapters/postgresPooler.js +267 -0
  53. package/dist/adapters/postgresReadCatalog.d.ts +31 -0
  54. package/dist/adapters/postgresReadCatalog.js +226 -0
  55. package/dist/adapters/postgresReadSnapshot.d.ts +46 -0
  56. package/dist/adapters/postgresReadSnapshot.js +133 -0
  57. package/dist/adapters/postgresSchemaEpoch.d.ts +24 -0
  58. package/dist/adapters/postgresSchemaEpoch.js +149 -0
  59. package/dist/adapters/postgresTransactionHandle.d.ts +173 -0
  60. package/dist/adapters/postgresTransactionHandle.js +524 -0
  61. package/dist/adapters/postgresValues.d.ts +30 -0
  62. package/dist/adapters/postgresValues.js +75 -0
  63. package/dist/adapters/replicas.d.ts +70 -0
  64. package/dist/adapters/replicas.js +208 -0
  65. package/dist/adapters/reservedSql.d.ts +38 -0
  66. package/dist/adapters/reservedSql.js +264 -0
  67. package/dist/adapters/rolePrivileges.d.ts +17 -0
  68. package/dist/adapters/rolePrivileges.js +22 -0
  69. package/dist/adapters/scoped/keyRows.d.ts +65 -0
  70. package/dist/adapters/scoped/keyRows.js +173 -0
  71. package/dist/adapters/scoped/postgresScopeCatalog.d.ts +16 -0
  72. package/dist/adapters/scoped/postgresScopeCatalog.js +117 -0
  73. package/dist/adapters/scoped/scopedCommandOperations.d.ts +5 -0
  74. package/dist/adapters/scoped/scopedCommandOperations.js +48 -0
  75. package/dist/adapters/scoped/scopedReads.d.ts +20 -0
  76. package/dist/adapters/scoped/scopedReads.js +174 -0
  77. package/dist/adapters/scoped/scopedTransaction.d.ts +89 -0
  78. package/dist/adapters/scoped/scopedTransaction.js +303 -0
  79. package/dist/adapters/scoped/sqliteScopeCatalog.d.ts +16 -0
  80. package/dist/adapters/scoped/sqliteScopeCatalog.js +241 -0
  81. package/dist/adapters/scoped/updateGuard.d.ts +3 -0
  82. package/dist/adapters/scoped/updateGuard.js +40 -0
  83. package/dist/adapters/serverSettings.d.ts +45 -0
  84. package/dist/adapters/serverSettings.js +46 -0
  85. package/dist/adapters/sqlite.d.ts +262 -0
  86. package/dist/adapters/sqlite.js +1434 -0
  87. package/dist/adapters/sqliteCostlyReads.d.ts +33 -0
  88. package/dist/adapters/sqliteCostlyReads.js +49 -0
  89. package/dist/adapters/sqliteDecimals.d.ts +22 -0
  90. package/dist/adapters/sqliteDecimals.js +57 -0
  91. package/dist/adapters/sqliteHandles.d.ts +43 -0
  92. package/dist/adapters/sqliteHandles.js +143 -0
  93. package/dist/adapters/sqliteStatementProcess.d.ts +29 -0
  94. package/dist/adapters/sqliteStatementProcess.js +131 -0
  95. package/dist/adapters/statementControl.d.ts +34 -0
  96. package/dist/adapters/statementControl.js +90 -0
  97. package/dist/adapters/storeHost.d.ts +130 -0
  98. package/dist/adapters/storeHost.js +13 -0
  99. package/dist/adapters/telemetry/drivers.d.ts +21 -0
  100. package/dist/adapters/telemetry/drivers.js +321 -0
  101. package/dist/adapters/telemetry/metrics.d.ts +63 -0
  102. package/dist/adapters/telemetry/metrics.js +122 -0
  103. package/dist/adapters/telemetry/otlp.d.ts +12 -0
  104. package/dist/adapters/telemetry/otlp.js +320 -0
  105. package/dist/adapters/telemetry/otlpEncode.d.ts +48 -0
  106. package/dist/adapters/telemetry/otlpEncode.js +366 -0
  107. package/dist/adapters/telemetry/otlpEnv.d.ts +1 -0
  108. package/dist/adapters/telemetry/otlpEnv.js +12 -0
  109. package/dist/adapters/telemetry/serverTiming.d.ts +83 -0
  110. package/dist/adapters/telemetry/serverTiming.js +503 -0
  111. package/dist/adapters/telemetry/start.d.ts +10 -0
  112. package/dist/adapters/telemetry/start.js +25 -0
  113. package/dist/adapters/telemetry/statement.d.ts +16 -0
  114. package/dist/adapters/telemetry/statement.js +134 -0
  115. package/dist/adapters/telemetry/trace.d.ts +127 -0
  116. package/dist/adapters/telemetry/trace.js +295 -0
  117. package/dist/adapters/writeAhead.d.ts +27 -0
  118. package/dist/adapters/writeAhead.js +46 -0
  119. package/dist/adapters/writeAttribution.d.ts +18 -0
  120. package/dist/adapters/writeAttribution.js +23 -0
  121. package/dist/adapters/writeCapture.d.ts +73 -0
  122. package/dist/adapters/writeCapture.js +20 -0
  123. package/dist/adapters/writeLanes.d.ts +94 -0
  124. package/dist/adapters/writeLanes.js +232 -0
  125. package/dist/engine.d.ts +15 -0
  126. package/dist/engine.js +13 -0
  127. package/dist/server/auth/credentials.d.ts +61 -0
  128. package/dist/server/auth/credentials.js +260 -0
  129. package/dist/server/cacheService.d.ts +50 -0
  130. package/dist/server/cacheService.js +110 -0
  131. package/dist/server/cli/args.d.ts +176 -0
  132. package/dist/server/cli/args.js +342 -0
  133. package/dist/server/cli/bin.d.ts +5 -0
  134. package/dist/server/cli/bin.js +66 -0
  135. package/dist/server/cli/browser.d.ts +15 -0
  136. package/dist/server/cli/browser.js +37 -0
  137. package/dist/server/cli/config.d.ts +50 -0
  138. package/dist/server/cli/config.js +206 -0
  139. package/dist/server/cli/startup.d.ts +36 -0
  140. package/dist/server/cli/startup.js +128 -0
  141. package/dist/server/cli/startupOptions.d.ts +63 -0
  142. package/dist/server/cli/startupOptions.js +143 -0
  143. package/dist/server/cli/subcommand.d.ts +28 -0
  144. package/dist/server/cli/subcommand.js +32 -0
  145. package/dist/server/cli/usage.d.ts +13 -0
  146. package/dist/server/cli/usage.js +31 -0
  147. package/dist/server/clientHttp.d.ts +184 -0
  148. package/dist/server/clientHttp.js +700 -0
  149. package/dist/server/clientSurface.d.ts +128 -0
  150. package/dist/server/clientSurface.js +182 -0
  151. package/dist/server/columnGrants.d.ts +103 -0
  152. package/dist/server/columnGrants.js +730 -0
  153. package/dist/server/compileCache.d.ts +1 -0
  154. package/dist/server/compileCache.js +30 -0
  155. package/dist/server/config/locations.d.ts +1 -0
  156. package/dist/server/config/locations.js +15 -0
  157. package/dist/server/configPaths.d.ts +7 -0
  158. package/dist/server/configPaths.js +34 -0
  159. package/dist/server/configSections.d.ts +64 -0
  160. package/dist/server/configSections.js +72 -0
  161. package/dist/server/connectionRedaction.d.ts +30 -0
  162. package/dist/server/connectionRedaction.js +77 -0
  163. package/dist/server/connections.d.ts +353 -0
  164. package/dist/server/connections.js +978 -0
  165. package/dist/server/constraints.d.ts +82 -0
  166. package/dist/server/constraints.js +169 -0
  167. package/dist/server/demo.d.ts +9 -0
  168. package/dist/server/demo.js +554 -0
  169. package/dist/server/devclient.d.ts +108 -0
  170. package/dist/server/devclient.js +361 -0
  171. package/dist/server/evidence.d.ts +55 -0
  172. package/dist/server/evidence.js +323 -0
  173. package/dist/server/hiddenColumns.d.ts +32 -0
  174. package/dist/server/hiddenColumns.js +238 -0
  175. package/dist/server/http/baselineHeaders.d.ts +24 -0
  176. package/dist/server/http/baselineHeaders.js +12 -0
  177. package/dist/server/http/captured.d.ts +35 -0
  178. package/dist/server/http/captured.js +73 -0
  179. package/dist/server/http/clock.d.ts +1 -0
  180. package/dist/server/http/clock.js +14 -0
  181. package/dist/server/http/connectionSource.d.ts +4 -0
  182. package/dist/server/http/connectionSource.js +48 -0
  183. package/dist/server/http/context.d.ts +189 -0
  184. package/dist/server/http/context.js +11 -0
  185. package/dist/server/http/crawlerText.d.ts +15 -0
  186. package/dist/server/http/crawlerText.js +32 -0
  187. package/dist/server/http/dataRoutes.d.ts +88 -0
  188. package/dist/server/http/dataRoutes.js +137 -0
  189. package/dist/server/http/door.d.ts +57 -0
  190. package/dist/server/http/door.js +39 -0
  191. package/dist/server/http/exportRoute.d.ts +15 -0
  192. package/dist/server/http/exportRoute.js +320 -0
  193. package/dist/server/http/firstPaint.d.ts +108 -0
  194. package/dist/server/http/firstPaint.js +262 -0
  195. package/dist/server/http/httpOperationRoutes.d.ts +11 -0
  196. package/dist/server/http/httpOperationRoutes.js +50 -0
  197. package/dist/server/http/pageReads.d.ts +20 -0
  198. package/dist/server/http/pageReads.js +205 -0
  199. package/dist/server/http/pageRoutes.d.ts +39 -0
  200. package/dist/server/http/pageRoutes.js +291 -0
  201. package/dist/server/http/probes.d.ts +22 -0
  202. package/dist/server/http/probes.js +27 -0
  203. package/dist/server/http/rateLimit.d.ts +131 -0
  204. package/dist/server/http/rateLimit.js +351 -0
  205. package/dist/server/http/readRoutes.d.ts +9 -0
  206. package/dist/server/http/readRoutes.js +131 -0
  207. package/dist/server/http/readRouting.d.ts +20 -0
  208. package/dist/server/http/readRouting.js +80 -0
  209. package/dist/server/http/recordCompose.d.ts +67 -0
  210. package/dist/server/http/recordCompose.js +167 -0
  211. package/dist/server/http/recordWrites.d.ts +89 -0
  212. package/dist/server/http/recordWrites.js +298 -0
  213. package/dist/server/http/refusalReport.d.ts +38 -0
  214. package/dist/server/http/refusalReport.js +63 -0
  215. package/dist/server/http/reply.d.ts +130 -0
  216. package/dist/server/http/reply.js +394 -0
  217. package/dist/server/http/requestOrigin.d.ts +11 -0
  218. package/dist/server/http/requestOrigin.js +8 -0
  219. package/dist/server/http/router.d.ts +45 -0
  220. package/dist/server/http/router.js +22 -0
  221. package/dist/server/http/serverCore.d.ts +68 -0
  222. package/dist/server/http/serverCore.js +177 -0
  223. package/dist/server/http/traceRequest.d.ts +30 -0
  224. package/dist/server/http/traceRequest.js +224 -0
  225. package/dist/server/http/trust.d.ts +261 -0
  226. package/dist/server/http/trust.js +472 -0
  227. package/dist/server/http/writeRefusal.d.ts +33 -0
  228. package/dist/server/http/writeRefusal.js +24 -0
  229. package/dist/server/httpConnection.d.ts +49 -0
  230. package/dist/server/httpConnection.js +170 -0
  231. package/dist/server/impact.d.ts +55 -0
  232. package/dist/server/impact.js +47 -0
  233. package/dist/server/journal.d.ts +134 -0
  234. package/dist/server/journal.js +398 -0
  235. package/dist/server/keysetReadHttp.d.ts +52 -0
  236. package/dist/server/keysetReadHttp.js +85 -0
  237. package/dist/server/layouts.d.ts +49 -0
  238. package/dist/server/layouts.js +192 -0
  239. package/dist/server/migrate/cli.d.ts +55 -0
  240. package/dist/server/migrate/cli.js +517 -0
  241. package/dist/server/migrate/database.d.ts +37 -0
  242. package/dist/server/migrate/database.js +247 -0
  243. package/dist/server/migrate/desired.d.ts +76 -0
  244. package/dist/server/migrate/desired.js +292 -0
  245. package/dist/server/migrate/files.d.ts +34 -0
  246. package/dist/server/migrate/files.js +141 -0
  247. package/dist/server/migrate/flyway.d.ts +7 -0
  248. package/dist/server/migrate/flyway.js +69 -0
  249. package/dist/server/migrate/history.d.ts +70 -0
  250. package/dist/server/migrate/history.js +211 -0
  251. package/dist/server/migrate/runner.d.ts +100 -0
  252. package/dist/server/migrate/runner.js +409 -0
  253. package/dist/server/migrate/snapshot.d.ts +30 -0
  254. package/dist/server/migrate/snapshot.js +239 -0
  255. package/dist/server/migrate/target.d.ts +33 -0
  256. package/dist/server/migrate/target.js +82 -0
  257. package/dist/server/openapiDraft.d.ts +25 -0
  258. package/dist/server/openapiDraft.js +171 -0
  259. package/dist/server/operations/diagnostics.d.ts +101 -0
  260. package/dist/server/operations/diagnostics.js +284 -0
  261. package/dist/server/operations/requestMetrics.d.ts +33 -0
  262. package/dist/server/operations/requestMetrics.js +94 -0
  263. package/dist/server/packageVersion.d.ts +1 -0
  264. package/dist/server/packageVersion.js +11 -0
  265. package/dist/server/poolConfig.d.ts +34 -0
  266. package/dist/server/poolConfig.js +114 -0
  267. package/dist/server/product.d.ts +20 -0
  268. package/dist/server/product.js +12 -0
  269. package/dist/server/recordHistoryOperations.d.ts +39 -0
  270. package/dist/server/recordHistoryOperations.js +43 -0
  271. package/dist/server/recordWriteOperations.d.ts +111 -0
  272. package/dist/server/recordWriteOperations.js +329 -0
  273. package/dist/server/resourceReadHttp.d.ts +81 -0
  274. package/dist/server/resourceReadHttp.js +606 -0
  275. package/dist/server/resourceReadOperations.d.ts +147 -0
  276. package/dist/server/resourceReadOperations.js +452 -0
  277. package/dist/server/scaffoldMachine.d.ts +54 -0
  278. package/dist/server/scaffoldMachine.js +184 -0
  279. package/dist/server/seed/cli.d.ts +20 -0
  280. package/dist/server/seed/cli.js +164 -0
  281. package/dist/server/seed/lexicon.d.ts +26 -0
  282. package/dist/server/seed/lexicon.js +585 -0
  283. package/dist/server/seed/seed.d.ts +70 -0
  284. package/dist/server/seed/seed.js +779 -0
  285. package/dist/server/seed/words.d.ts +21 -0
  286. package/dist/server/seed/words.js +164 -0
  287. package/dist/server/serverRequests.d.ts +6 -0
  288. package/dist/server/serverRequests.js +33 -0
  289. package/dist/server/serverTimeouts.d.ts +33 -0
  290. package/dist/server/serverTimeouts.js +32 -0
  291. package/dist/server/shapeonly.d.ts +32 -0
  292. package/dist/server/shapeonly.js +110 -0
  293. package/dist/server/startupWarnings.d.ts +32 -0
  294. package/dist/server/startupWarnings.js +92 -0
  295. package/dist/shared/addressParams.d.ts +28 -0
  296. package/dist/shared/addressParams.js +47 -0
  297. package/dist/shared/appCards.d.ts +123 -0
  298. package/dist/shared/appCards.js +385 -0
  299. package/dist/shared/appComponents.d.ts +177 -0
  300. package/dist/shared/appComponents.js +422 -0
  301. package/dist/shared/appDocuments.d.ts +43 -0
  302. package/dist/shared/appDocuments.js +131 -0
  303. package/dist/shared/appEmbeds.d.ts +21 -0
  304. package/dist/shared/appEmbeds.js +24 -0
  305. package/dist/shared/appIcons.d.ts +28 -0
  306. package/dist/shared/appIcons.js +223 -0
  307. package/dist/shared/appLinks.d.ts +17 -0
  308. package/dist/shared/appLinks.js +124 -0
  309. package/dist/shared/appListColumns.d.ts +3 -0
  310. package/dist/shared/appListColumns.js +66 -0
  311. package/dist/shared/appLocale.d.ts +36 -0
  312. package/dist/shared/appLocale.js +86 -0
  313. package/dist/shared/appMessages.d.ts +44 -0
  314. package/dist/shared/appMessages.js +78 -0
  315. package/dist/shared/appNoun.d.ts +21 -0
  316. package/dist/shared/appNoun.js +32 -0
  317. package/dist/shared/autoBucket.d.ts +98 -0
  318. package/dist/shared/autoBucket.js +305 -0
  319. package/dist/shared/autoValues.d.ts +25 -0
  320. package/dist/shared/autoValues.js +25 -0
  321. package/dist/shared/breakdown.d.ts +228 -0
  322. package/dist/shared/breakdown.js +557 -0
  323. package/dist/shared/breakdowntext.d.ts +41 -0
  324. package/dist/shared/breakdowntext.js +400 -0
  325. package/dist/shared/builtInThemes.d.ts +2 -0
  326. package/dist/shared/builtInThemes.js +771 -0
  327. package/dist/shared/chartSeparation.d.ts +11 -0
  328. package/dist/shared/chartSeparation.js +58 -0
  329. package/dist/shared/clauses.d.ts +22 -0
  330. package/dist/shared/clauses.js +97 -0
  331. package/dist/shared/columnCaption.d.ts +16 -0
  332. package/dist/shared/columnCaption.js +90 -0
  333. package/dist/shared/commandFieldPath.d.ts +2 -0
  334. package/dist/shared/commandFieldPath.js +7 -0
  335. package/dist/shared/commandWire.d.ts +26 -0
  336. package/dist/shared/commandWire.js +41 -0
  337. package/dist/shared/computed.d.ts +161 -0
  338. package/dist/shared/computed.js +378 -0
  339. package/dist/shared/computedParse.d.ts +13 -0
  340. package/dist/shared/computedParse.js +278 -0
  341. package/dist/shared/computedValue.d.ts +47 -0
  342. package/dist/shared/computedValue.js +191 -0
  343. package/dist/shared/connection.d.ts +30 -0
  344. package/dist/shared/connection.js +1 -0
  345. package/dist/shared/csv.d.ts +20 -0
  346. package/dist/shared/csv.js +63 -0
  347. package/dist/shared/dashLayout.d.ts +30 -0
  348. package/dist/shared/dashLayout.js +132 -0
  349. package/dist/shared/dashboardAsks.d.ts +93 -0
  350. package/dist/shared/dashboardAsks.js +129 -0
  351. package/dist/shared/dashboardTrend.d.ts +20 -0
  352. package/dist/shared/dashboardTrend.js +50 -0
  353. package/dist/shared/declaredReferences.d.ts +50 -0
  354. package/dist/shared/declaredReferences.js +202 -0
  355. package/dist/shared/definedFields.d.ts +63 -0
  356. package/dist/shared/definedFields.js +103 -0
  357. package/dist/shared/definedValues.d.ts +63 -0
  358. package/dist/shared/definedValues.js +184 -0
  359. package/dist/shared/displayDefaults.d.ts +135 -0
  360. package/dist/shared/displayDefaults.js +529 -0
  361. package/dist/shared/dueDate.d.ts +6 -0
  362. package/dist/shared/dueDate.js +6 -0
  363. package/dist/shared/duration.d.ts +4 -0
  364. package/dist/shared/duration.js +23 -0
  365. package/dist/shared/fileBounds.d.ts +9 -0
  366. package/dist/shared/fileBounds.js +9 -0
  367. package/dist/shared/filter.d.ts +217 -0
  368. package/dist/shared/filter.js +305 -0
  369. package/dist/shared/firstPaint.d.ts +24 -0
  370. package/dist/shared/firstPaint.js +33 -0
  371. package/dist/shared/form.d.ts +21 -0
  372. package/dist/shared/form.js +25 -0
  373. package/dist/shared/formValues.d.ts +104 -0
  374. package/dist/shared/formValues.js +352 -0
  375. package/dist/shared/funnel.d.ts +45 -0
  376. package/dist/shared/funnel.js +108 -0
  377. package/dist/shared/httpOperations.d.ts +48 -0
  378. package/dist/shared/httpOperations.js +9 -0
  379. package/dist/shared/iconGlyphs.d.ts +4 -0
  380. package/dist/shared/iconGlyphs.js +151 -0
  381. package/dist/shared/iconWeights.d.ts +3 -0
  382. package/dist/shared/iconWeights.js +162 -0
  383. package/dist/shared/imageWidths.d.ts +32 -0
  384. package/dist/shared/imageWidths.js +38 -0
  385. package/dist/shared/keysetPage.d.ts +64 -0
  386. package/dist/shared/keysetPage.js +161 -0
  387. package/dist/shared/like.d.ts +20 -0
  388. package/dist/shared/like.js +29 -0
  389. package/dist/shared/listEmpty.d.ts +12 -0
  390. package/dist/shared/listEmpty.js +36 -0
  391. package/dist/shared/listFilters.d.ts +28 -0
  392. package/dist/shared/listFilters.js +84 -0
  393. package/dist/shared/listPresentations.d.ts +199 -0
  394. package/dist/shared/listPresentations.js +7 -0
  395. package/dist/shared/listQuestion.d.ts +52 -0
  396. package/dist/shared/listQuestion.js +137 -0
  397. package/dist/shared/lookPalettes.d.ts +62 -0
  398. package/dist/shared/lookPalettes.js +306 -0
  399. package/dist/shared/maskQuoted.d.ts +24 -0
  400. package/dist/shared/maskQuoted.js +48 -0
  401. package/dist/shared/mentionLabel.d.ts +19 -0
  402. package/dist/shared/mentionLabel.js +38 -0
  403. package/dist/shared/mentionLookup.d.ts +17 -0
  404. package/dist/shared/mentionLookup.js +64 -0
  405. package/dist/shared/menuCounts.d.ts +16 -0
  406. package/dist/shared/menuCounts.js +74 -0
  407. package/dist/shared/model.d.ts +79 -0
  408. package/dist/shared/model.js +153 -0
  409. package/dist/shared/money.d.ts +44 -0
  410. package/dist/shared/money.js +81 -0
  411. package/dist/shared/moneyEntry.d.ts +7 -0
  412. package/dist/shared/moneyEntry.js +27 -0
  413. package/dist/shared/mount.d.ts +118 -0
  414. package/dist/shared/mount.js +248 -0
  415. package/dist/shared/niceTicks.d.ts +26 -0
  416. package/dist/shared/niceTicks.js +50 -0
  417. package/dist/shared/order.d.ts +59 -0
  418. package/dist/shared/order.js +133 -0
  419. package/dist/shared/page.d.ts +135 -0
  420. package/dist/shared/page.js +1187 -0
  421. package/dist/shared/pageAnatomy.d.ts +99 -0
  422. package/dist/shared/pageAnatomy.js +370 -0
  423. package/dist/shared/pageConfig.d.ts +25 -0
  424. package/dist/shared/pageConfig.js +1308 -0
  425. package/dist/shared/pageEmptyActions.d.ts +12 -0
  426. package/dist/shared/pageEmptyActions.js +20 -0
  427. package/dist/shared/pageLayouts.d.ts +72 -0
  428. package/dist/shared/pageLayouts.js +205 -0
  429. package/dist/shared/pageModel.d.ts +785 -0
  430. package/dist/shared/pageModel.js +121 -0
  431. package/dist/shared/pagePaths.d.ts +180 -0
  432. package/dist/shared/pagePaths.js +869 -0
  433. package/dist/shared/pagePlans.d.ts +52 -0
  434. package/dist/shared/pagePlans.js +108 -0
  435. package/dist/shared/pageRoutes.d.ts +9 -0
  436. package/dist/shared/pageRoutes.js +9 -0
  437. package/dist/shared/query.d.ts +166 -0
  438. package/dist/shared/query.js +1302 -0
  439. package/dist/shared/queryDates.d.ts +12 -0
  440. package/dist/shared/queryDates.js +101 -0
  441. package/dist/shared/queryOperands.d.ts +99 -0
  442. package/dist/shared/queryOperands.js +131 -0
  443. package/dist/shared/reads.d.ts +103 -0
  444. package/dist/shared/reads.js +154 -0
  445. package/dist/shared/recordLabel.d.ts +51 -0
  446. package/dist/shared/recordLabel.js +123 -0
  447. package/dist/shared/recordReadKeys.d.ts +30 -0
  448. package/dist/shared/recordReadKeys.js +51 -0
  449. package/dist/shared/recordReads.d.ts +268 -0
  450. package/dist/shared/recordReads.js +368 -0
  451. package/dist/shared/recordview.d.ts +198 -0
  452. package/dist/shared/recordview.js +356 -0
  453. package/dist/shared/referenceModel.d.ts +58 -0
  454. package/dist/shared/referenceModel.js +194 -0
  455. package/dist/shared/refusal.d.ts +64 -0
  456. package/dist/shared/refusal.js +144 -0
  457. package/dist/shared/relatedCreate.d.ts +30 -0
  458. package/dist/shared/relatedCreate.js +162 -0
  459. package/dist/shared/resourceHttp.d.ts +464 -0
  460. package/dist/shared/resourceHttp.js +1 -0
  461. package/dist/shared/richText.d.ts +85 -0
  462. package/dist/shared/richText.js +305 -0
  463. package/dist/shared/rollups.d.ts +143 -0
  464. package/dist/shared/rollups.js +64 -0
  465. package/dist/shared/rowScope.d.ts +72 -0
  466. package/dist/shared/rowScope.js +376 -0
  467. package/dist/shared/runtimeTables.d.ts +44 -0
  468. package/dist/shared/runtimeTables.js +79 -0
  469. package/dist/shared/schema.d.ts +523 -0
  470. package/dist/shared/schema.js +627 -0
  471. package/dist/shared/schematext.d.ts +38 -0
  472. package/dist/shared/schematext.js +101 -0
  473. package/dist/shared/scopeCatalog.d.ts +29 -0
  474. package/dist/shared/scopeCatalog.js +468 -0
  475. package/dist/shared/servedApp.d.ts +681 -0
  476. package/dist/shared/servedApp.js +45 -0
  477. package/dist/shared/sessionLease.d.ts +34 -0
  478. package/dist/shared/sessionLease.js +3 -0
  479. package/dist/shared/shape.d.ts +55 -0
  480. package/dist/shared/shape.js +168 -0
  481. package/dist/shared/slug.d.ts +1 -0
  482. package/dist/shared/slug.js +12 -0
  483. package/dist/shared/sortText.d.ts +14 -0
  484. package/dist/shared/sortText.js +26 -0
  485. package/dist/shared/sqlRelation.d.ts +4 -0
  486. package/dist/shared/sqlRelation.js +8 -0
  487. package/dist/shared/sqlsaved.d.ts +44 -0
  488. package/dist/shared/sqlsaved.js +63 -0
  489. package/dist/shared/stitchedPaths.d.ts +27 -0
  490. package/dist/shared/stitchedPaths.js +38 -0
  491. package/dist/shared/structuredFilter.d.ts +22 -0
  492. package/dist/shared/structuredFilter.js +1 -0
  493. package/dist/shared/subtitlePath.d.ts +20 -0
  494. package/dist/shared/subtitlePath.js +24 -0
  495. package/dist/shared/suggest.d.ts +18 -0
  496. package/dist/shared/suggest.js +59 -0
  497. package/dist/shared/tableSizing.d.ts +4 -0
  498. package/dist/shared/tableSizing.js +9 -0
  499. package/dist/shared/tagLists.d.ts +57 -0
  500. package/dist/shared/tagLists.js +34 -0
  501. package/dist/shared/textRules.d.ts +54 -0
  502. package/dist/shared/textRules.js +133 -0
  503. package/dist/shared/theme.d.ts +94 -0
  504. package/dist/shared/theme.js +800 -0
  505. package/dist/shared/themeColor.d.ts +34 -0
  506. package/dist/shared/themeColor.js +109 -0
  507. package/dist/shared/themeFaces.d.ts +30 -0
  508. package/dist/shared/themeFaces.js +42 -0
  509. package/dist/shared/themeInk.d.ts +20 -0
  510. package/dist/shared/themeInk.js +52 -0
  511. package/dist/shared/themeLooks.d.ts +9 -0
  512. package/dist/shared/themeLooks.js +572 -0
  513. package/dist/shared/themeParts.d.ts +26 -0
  514. package/dist/shared/themeParts.js +71 -0
  515. package/dist/shared/themePartsCheck.d.ts +21 -0
  516. package/dist/shared/themePartsCheck.js +91 -0
  517. package/dist/shared/themePresets.d.ts +85 -0
  518. package/dist/shared/themePresets.js +139 -0
  519. package/dist/shared/themeRecipeWords.d.ts +156 -0
  520. package/dist/shared/themeRecipeWords.js +156 -0
  521. package/dist/shared/themeRecipes.d.ts +213 -0
  522. package/dist/shared/themeRecipes.js +234 -0
  523. package/dist/shared/themeResolve.d.ts +55 -0
  524. package/dist/shared/themeResolve.js +52 -0
  525. package/dist/shared/themeTokens.d.ts +107 -0
  526. package/dist/shared/themeTokens.js +116 -0
  527. package/dist/shared/themeType.d.ts +38 -0
  528. package/dist/shared/themeType.js +205 -0
  529. package/dist/shared/unitWord.d.ts +4 -0
  530. package/dist/shared/unitWord.js +37 -0
  531. package/dist/shared/view.d.ts +195 -0
  532. package/dist/shared/view.js +987 -0
  533. package/dist/shared/viewLabels.d.ts +47 -0
  534. package/dist/shared/viewLabels.js +459 -0
  535. package/dist/shared/viewPaths.d.ts +248 -0
  536. package/dist/shared/viewPaths.js +294 -0
  537. package/dist/shared/viewtext.d.ts +57 -0
  538. package/dist/shared/viewtext.js +282 -0
  539. package/dist/shared/vocabulary.d.ts +71 -0
  540. package/dist/shared/vocabulary.js +249 -0
  541. package/dist/shared/weekStart.d.ts +7 -0
  542. package/dist/shared/weekStart.js +36 -0
  543. package/mark.svg +1 -0
  544. package/package.json +261 -4
  545. package/schema/model.d.ts +298 -0
  546. package/schema/theme.d.ts +587 -0
@@ -0,0 +1,147 @@
1
+ import { type Adapter, type CountResult, type Filter, type QueryRequest } from '../adapters/adapter.js';
2
+ import { type DatabaseSchema, type Order } from '../shared/schema.js';
3
+ import { type ViewDef } from '../shared/view.js';
4
+ import { type BreakdownDef } from '../shared/breakdown.js';
5
+ import type { StructuredFilter } from '../shared/structuredFilter.js';
6
+ /** An already authorized, invocation-owned reader. No registry, credentials,
7
+ * writer, or fallback adapter can be obtained through this service. */
8
+ export type ResourceReader = Pick<Adapter, 'query' | 'count' | 'estimateCount' | 'runView' | 'countView' | 'runBreakdown' | 'countBreakdown'> & Partial<Pick<Adapter, 'countEach'>>;
9
+ type ReadCountMode = 'none' | 'exact' | 'estimate';
10
+ type RecordReadInput = Omit<QueryRequest, 'limit' | 'offset'> & {
11
+ limit?: unknown;
12
+ offset?: unknown;
13
+ };
14
+ interface ReadPagination {
15
+ limit?: unknown;
16
+ offset?: unknown;
17
+ }
18
+ /**
19
+ * A page read by key (keysetPage.ts): the rows past a boundary, or read the
20
+ * other way and turned round — the page before one, or the list's end. The
21
+ * total is still the question's own; the offset is only what the page is
22
+ * called, never skipped.
23
+ */
24
+ export interface RecordsContinuation {
25
+ groups?: Filter['groups'];
26
+ reverse: boolean;
27
+ }
28
+ export interface ViewContinuation {
29
+ groups?: NonNullable<ViewDef['filter']>['groups'];
30
+ orderBy: NonNullable<ViewDef['orderBy']>;
31
+ reverse: boolean;
32
+ }
33
+ export declare class ResourceReadError extends Error {
34
+ readonly status: 400 | 404 | 501;
35
+ constructor(status: 400 | 404 | 501, message: string);
36
+ }
37
+ /** The most a bounded count counts. Asking for more is clamped, not refused:
38
+ * the bound is what keeps the count cheap, so the server has the last word. */
39
+ export declare const MAX_COUNT_LIMIT = 100000;
40
+ /**
41
+ * The bound a list's total, a tab's badge and a record's references are
42
+ * counted to when the request names none: past it the answer is "10,000+".
43
+ * A filtered total is a COUNT(*) that cannot be estimated, and on a large
44
+ * table it was most of the read — a million-row Postgres list spent 64 ms
45
+ * counting what 7 ms bounded said as well as anyone reads it. The exact
46
+ * number stays one explicit request away (`exactCount`).
47
+ */
48
+ export declare const DEFAULT_COUNT_LIMIT = 10000;
49
+ /**
50
+ * A request's `countLimit`. Absent (undefined or null) is the count the route
51
+ * always gave; otherwise a positive whole number, clamped to MAX_COUNT_LIMIT.
52
+ * Anything else is refused rather than read as absent: an unreadable bound
53
+ * quietly becoming no bound is the full scan the caller asked to avoid.
54
+ */
55
+ export declare function countLimitOf(value: unknown): number | undefined;
56
+ /** Validate already captured data. Shared by operation services and private
57
+ * capability boundaries; malformed predicates must never become an absent one. */
58
+ export declare function assertStructuredReadFilter<Field extends 'column' | 'path'>(filter: unknown, field: Field): asserts filter is StructuredFilter<Field> | null | undefined;
59
+ export declare function readCount(reader: ResourceReader, schema: DatabaseSchema, input: {
60
+ table: string;
61
+ filter?: Filter;
62
+ exact?: boolean;
63
+ countLimit?: unknown;
64
+ }): Promise<CountResult>;
65
+ /**
66
+ * Several bounded counts, in one statement where the reader can say them in
67
+ * one (Adapter.countEach) and one by one where it cannot — a row-scoped or
68
+ * tenant reader, whose counts compile under its scope. Either way each is
69
+ * counted to `countLimit` (DEFAULT_COUNT_LIMIT when absent) and said as
70
+ * `capped` past it. An unfiltered count of a table the catalog calls large is
71
+ * the catalog's estimate instead, as a list's own total is.
72
+ */
73
+ export declare function readCounts(reader: ResourceReader, schema: DatabaseSchema, inputs: ReadonlyArray<{
74
+ table: string;
75
+ filter?: Filter;
76
+ }>, countLimit?: unknown): Promise<CountResult[]>;
77
+ export declare function readRecords(reader: ResourceReader, schema: DatabaseSchema, input: RecordReadInput, countMode?: ReadCountMode, countLimit?: unknown, continuation?: RecordsContinuation): Promise<{
78
+ request: QueryRequest;
79
+ result: import("@mistriwork/engine/adapters/adapter.js").QueryResult;
80
+ order: {
81
+ order: Order[];
82
+ implicit: boolean;
83
+ };
84
+ total: CountResult | undefined;
85
+ }>;
86
+ /** How many rows a view matches, bounded as readCounts bounds a table's, with
87
+ * no rows read: a tab whose question walks a reference. */
88
+ export declare function readViewCount(reader: ResourceReader, schema: DatabaseSchema, input: ViewDef, countLimit?: unknown): Promise<CountResult>;
89
+ export declare function readView(reader: ResourceReader, schema: DatabaseSchema, input: ViewDef, pagination?: ReadPagination, countMode?: 'none' | 'exact', countLimit?: unknown, continuation?: ViewContinuation): Promise<{
90
+ view: {
91
+ id: string;
92
+ name: string;
93
+ base: string;
94
+ columns: import("../shared/viewPaths.js").ViewColumn[];
95
+ aggregates?: import("../shared/viewPaths.js").ViewAggregate[];
96
+ filter?: (import("../shared/viewPaths.js").ViewFilter & StructuredFilter<"path">) | undefined;
97
+ orderBy?: import("../shared/viewPaths.js").ViewOrder[];
98
+ limit?: number;
99
+ text?: string;
100
+ connection?: string;
101
+ source?: 'config' | 'saved';
102
+ labels: Record<string, string> | undefined;
103
+ computed: Record<string, import("../shared/rollups.js").ComputedPath> | undefined;
104
+ expressions: Record<string, import("../shared/computed.js").ComputedPath> | undefined;
105
+ tagged: Record<string, import("../shared/tagLists.js").TagPath> | undefined;
106
+ };
107
+ result: import("@mistriwork/engine/adapters/adapter.js").ViewResult;
108
+ total: number | undefined;
109
+ capped?: true | undefined;
110
+ more: boolean;
111
+ limit: number;
112
+ offset: number;
113
+ }>;
114
+ export declare function readBreakdown(reader: ResourceReader, schema: DatabaseSchema, input: BreakdownDef, pagination?: ReadPagination, countLimit?: unknown): Promise<{
115
+ breakdown: {
116
+ base: string;
117
+ by: import("../shared/breakdown.js").BreakdownKey[];
118
+ dateColumns?: string[];
119
+ measures: import("../shared/breakdown.js").Measure[];
120
+ filter?: (import("../shared/viewPaths.js").ViewFilter & StructuredFilter<"path">) | undefined;
121
+ orderBy?: import("../shared/breakdown.js").BreakdownOrder[];
122
+ text?: string;
123
+ weekStart?: number;
124
+ computed?: Record<string, import("../shared/rollups.js").ComputedPath>;
125
+ expressions?: ViewDef['expressions'];
126
+ tagged?: ViewDef['tagged'];
127
+ names?: Record<string, string>;
128
+ labels?: Record<string, string>;
129
+ limit: number;
130
+ };
131
+ result: {
132
+ columns: string[];
133
+ rows: Array<Record<string, unknown>>;
134
+ ms: number;
135
+ sql: {
136
+ text: string;
137
+ params: unknown[];
138
+ };
139
+ resolved: import("../shared/breakdown.js").CompiledMeasure[];
140
+ };
141
+ names?: import("../shared/breakdown.js").GroupNames | undefined;
142
+ total: number | undefined;
143
+ capped?: true | undefined;
144
+ limit: number;
145
+ offset: number;
146
+ }>;
147
+ export {};
@@ -0,0 +1,452 @@
1
+ import { ESTIMATE_ABOVE, OPS, Refusal, clampLimit, clampOffset, } from '../adapters/adapter.js';
2
+ import { snapshotScopedData } from '../adapters/scoped/scopedReads.js';
3
+ import { findTable, resolveOrder } from '../shared/schema.js';
4
+ import { withViewComputed, withViewLabels } from '../shared/view.js';
5
+ import { measureConditions, withBreakdownComputed, withGroupNames } from '../shared/breakdown.js';
6
+ import { reversedOrder } from '../shared/keysetPage.js';
7
+ export class ResourceReadError extends Error {
8
+ status;
9
+ constructor(status, message) {
10
+ super(message);
11
+ this.status = status;
12
+ this.name = 'ResourceReadError';
13
+ }
14
+ }
15
+ /** The most a bounded count counts. Asking for more is clamped, not refused:
16
+ * the bound is what keeps the count cheap, so the server has the last word. */
17
+ export const MAX_COUNT_LIMIT = 100_000;
18
+ /**
19
+ * The bound a list's total, a tab's badge and a record's references are
20
+ * counted to when the request names none: past it the answer is "10,000+".
21
+ * A filtered total is a COUNT(*) that cannot be estimated, and on a large
22
+ * table it was most of the read — a million-row Postgres list spent 64 ms
23
+ * counting what 7 ms bounded said as well as anyone reads it. The exact
24
+ * number stays one explicit request away (`exactCount`).
25
+ */
26
+ export const DEFAULT_COUNT_LIMIT = 10_000;
27
+ /**
28
+ * A request's `countLimit`. Absent (undefined or null) is the count the route
29
+ * always gave; otherwise a positive whole number, clamped to MAX_COUNT_LIMIT.
30
+ * Anything else is refused rather than read as absent: an unreadable bound
31
+ * quietly becoming no bound is the full scan the caller asked to avoid.
32
+ */
33
+ export function countLimitOf(value) {
34
+ if (value === undefined || value === null)
35
+ return undefined;
36
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {
37
+ throw new ResourceReadError(400, 'countLimit must be a positive whole number.');
38
+ }
39
+ return Math.min(value, MAX_COUNT_LIMIT);
40
+ }
41
+ function capture(reader, needs) {
42
+ // Capture methods as well as their receiver before any driver wait. Replacing
43
+ // an adapter property during a read cannot redirect its count to another one.
44
+ try {
45
+ const query = needs.records ? reader.query?.bind(reader) : undefined;
46
+ const count = needs.count ? reader.count?.bind(reader) : undefined;
47
+ const estimateCount = needs.estimate ? reader.estimateCount?.bind(reader) : undefined;
48
+ const runView = needs.view ? reader.runView?.bind(reader) : undefined;
49
+ const countView = needs.viewCount ? reader.countView?.bind(reader) : undefined;
50
+ const runBreakdown = needs.breakdown ? reader.runBreakdown?.bind(reader) : undefined;
51
+ const countBreakdown = needs.breakdownCount ? reader.countBreakdown?.bind(reader) : undefined;
52
+ const countEach = needs.countEach ? reader.countEach?.bind(reader) : undefined;
53
+ return {
54
+ countEach: countEach && ((items, limit) => provider(() => countEach(items, limit))),
55
+ query: query && ((request) => provider(() => query(request))),
56
+ count: count && ((table, filter, limit) => provider(() => (limit === undefined ? count(table, filter) : count(table, filter, limit)))),
57
+ estimateCount: estimateCount && ((table) => provider(() => estimateCount(table))),
58
+ runView: runView && ((view, offset) => provider(() => runView(view, offset))),
59
+ countView: countView && ((view, limit) => provider(() => (limit === undefined ? countView(view) : countView(view, limit)))),
60
+ runBreakdown: runBreakdown && ((definition, offset) => provider(() => runBreakdown(definition, offset))),
61
+ countBreakdown: countBreakdown &&
62
+ ((definition, limit) => provider(() => (limit === undefined ? countBreakdown(definition) : countBreakdown(definition, limit)))),
63
+ };
64
+ }
65
+ catch (error) {
66
+ throw providerError(error);
67
+ }
68
+ }
69
+ function providerError(error) {
70
+ // The class alone is not proof of a safe, request-derived diagnostic. Strip
71
+ // it at the provider boundary; ordinary database callers retain the message,
72
+ // while App HTTP applies its normal private-error projection.
73
+ return error instanceof ResourceReadError ? new Error(error.message, { cause: error }) : error;
74
+ }
75
+ async function provider(work) {
76
+ try {
77
+ return await work();
78
+ }
79
+ catch (error) {
80
+ throw providerError(error);
81
+ }
82
+ }
83
+ /** Validate already captured data. Shared by operation services and private
84
+ * capability boundaries; malformed predicates must never become an absent one. */
85
+ export function assertStructuredReadFilter(filter, field) {
86
+ if (filter === undefined || filter === null)
87
+ return;
88
+ const fail = () => {
89
+ throw new ResourceReadError(400, 'Invalid structured filter.');
90
+ };
91
+ if (typeof filter !== 'object' || Array.isArray(filter))
92
+ fail();
93
+ const given = filter;
94
+ if (Object.keys(given).some((key) => key !== 'groups') || !Array.isArray(given.groups))
95
+ fail();
96
+ const scalar = (value) => value === null || typeof value === 'string' || typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value));
97
+ for (const group of given.groups) {
98
+ if (!Array.isArray(group))
99
+ fail();
100
+ for (const raw of group) {
101
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
102
+ fail();
103
+ const condition = raw;
104
+ /* A column on the right is a path only a view resolves: a plain
105
+ table read has no way to check it against its reader's grants. */
106
+ const other = field === 'path' && condition.other !== undefined;
107
+ /* The rows that point at the record (`any opportunity where …`): asked
108
+ is (not) empty of the record, their own condition one level down,
109
+ judged by the same rule. A view checks the hop against its grants. */
110
+ if (field === 'path' && condition.any !== undefined) {
111
+ const any = condition.any;
112
+ if (Object.keys(condition).some((key) => !['path', 'op', 'any'].includes(key)) ||
113
+ typeof condition.path !== 'string' ||
114
+ (condition.op !== 'isNull' && condition.op !== 'isNotNull') ||
115
+ !any ||
116
+ typeof any !== 'object' ||
117
+ Array.isArray(any) ||
118
+ Object.keys(any).some((key) => key !== 'via' && key !== 'filter') ||
119
+ typeof any.via !== 'string' ||
120
+ !any.via.includes('.'))
121
+ fail();
122
+ assertStructuredReadFilter(any.filter, 'column');
123
+ continue;
124
+ }
125
+ if (Object.keys(condition).some((key) => ![field, 'op', 'value', 'collation', ...(other ? ['other'] : [])].includes(key)) ||
126
+ typeof condition[field] !== 'string' ||
127
+ !condition[field].length)
128
+ fail();
129
+ if (typeof condition.op !== 'string')
130
+ fail();
131
+ if (other) {
132
+ if (typeof condition.other !== 'string' ||
133
+ !condition.other.length ||
134
+ condition.value !== undefined ||
135
+ !['=', '!=', '>', '>=', '<', '<='].includes(condition.op))
136
+ fail();
137
+ continue;
138
+ }
139
+ // A byte comparison (an API cursor's boundary) narrows, never widens.
140
+ if (condition.collation !== undefined &&
141
+ (condition.collation !== 'binary' || !['=', '!=', '>', '>=', '<', '<='].includes(condition.op)))
142
+ fail();
143
+ if (!OPS.has(condition.op)) {
144
+ throw new ResourceReadError(400, `"${condition.op}" is not an operator this tool knows.`);
145
+ }
146
+ if (condition.op === 'in' || condition.op === 'has') {
147
+ if (!Array.isArray(condition.value) || !condition.value.every(scalar))
148
+ fail();
149
+ }
150
+ else if (condition.op === 'isNull' || condition.op === 'isNotNull') {
151
+ if (condition.value !== undefined && !scalar(condition.value))
152
+ fail();
153
+ }
154
+ else if (!scalar(condition.value))
155
+ fail();
156
+ }
157
+ }
158
+ }
159
+ function checkedPathFilter(definition) {
160
+ assertStructuredReadFilter(definition.filter, 'path');
161
+ }
162
+ function checkedTable(schema, tableId, request) {
163
+ const table = findTable(schema, tableId);
164
+ if (!table)
165
+ throw new ResourceReadError(404, `Unknown table "${tableId}"`);
166
+ const filter = request.filter;
167
+ assertStructuredReadFilter(filter, 'column');
168
+ const known = new Set(table.columns.map((column) => column.name));
169
+ const named = [];
170
+ for (const group of filter?.groups ?? []) {
171
+ if (!Array.isArray(group))
172
+ continue;
173
+ for (const condition of group)
174
+ if (condition && typeof condition.column === 'string')
175
+ named.push(condition.column);
176
+ }
177
+ for (const column of request.columns ?? [])
178
+ if (typeof column === 'string')
179
+ named.push(column);
180
+ for (const order of request.orderBy ?? [])
181
+ if (order && typeof order.column === 'string')
182
+ named.push(order.column);
183
+ const unknown = [...new Set(named.filter((column) => !known.has(column)))];
184
+ if (unknown.length)
185
+ throw new ResourceReadError(400, `"${table.name}" has no column ${unknown.map((column) => `"${column}"`).join(', ')}.`);
186
+ return table;
187
+ }
188
+ async function counted(reader, table, filter, exact, bound) {
189
+ if (bound !== undefined) {
190
+ /* Counted, never estimated: the bound is what makes the count cheap, and
191
+ its answer is about the rows this reader may see, which a catalog
192
+ figure is not. One row past the bound is enough to know there are more. */
193
+ if (!reader.count)
194
+ throw new ResourceReadError(501, 'This connection cannot count records.');
195
+ const n = await reader.count(table, filter, bound + 1);
196
+ return n > bound ? { count: bound, exact: true, capped: true } : { count: n, exact: true };
197
+ }
198
+ if (!exact && !filter?.groups?.length && reader.estimateCount) {
199
+ let estimate;
200
+ try {
201
+ estimate = await reader.estimateCount(table);
202
+ }
203
+ catch (error) {
204
+ // Statistics may be unavailable, but a policy/lifetime refusal is not
205
+ // permission to start another read after the capability has refused.
206
+ if (error instanceof Refusal)
207
+ throw error;
208
+ }
209
+ if (typeof estimate === 'number' && Number.isFinite(estimate) && estimate >= ESTIMATE_ABOVE) {
210
+ return { count: estimate, exact: false };
211
+ }
212
+ }
213
+ if (!reader.count)
214
+ throw new ResourceReadError(501, 'This connection cannot count records.');
215
+ return { count: await reader.count(table, filter), exact: true };
216
+ }
217
+ /** Settle both accepted reads, including synchronous throws. A failed count
218
+ * must not return partial rows or release an invocation while rows still run.
219
+ * This is completion ownership, not a shared database snapshot. */
220
+ async function together(rows, count) {
221
+ const [result, total] = await Promise.allSettled([Promise.resolve().then(rows), Promise.resolve().then(count)]);
222
+ if (result.status === 'rejected')
223
+ throw result.reason;
224
+ if (total.status === 'rejected')
225
+ throw total.reason;
226
+ return [result.value, total.value];
227
+ }
228
+ export async function readCount(reader, schema, input) {
229
+ const request = snapshotScopedData(input);
230
+ const table = checkedTable(schema, request.table, request);
231
+ const bound = countLimitOf(request.countLimit);
232
+ return counted(capture(reader, { count: true, estimate: bound === undefined && request.exact !== true && !request.filter?.groups?.length }), table.id, request.filter, request.exact === true, bound);
233
+ }
234
+ /**
235
+ * Several bounded counts, in one statement where the reader can say them in
236
+ * one (Adapter.countEach) and one by one where it cannot — a row-scoped or
237
+ * tenant reader, whose counts compile under its scope. Either way each is
238
+ * counted to `countLimit` (DEFAULT_COUNT_LIMIT when absent) and said as
239
+ * `capped` past it. An unfiltered count of a table the catalog calls large is
240
+ * the catalog's estimate instead, as a list's own total is.
241
+ */
242
+ export async function readCounts(reader, schema, inputs, countLimit) {
243
+ const given = snapshotScopedData(inputs);
244
+ const bound = countLimitOf(countLimit) ?? DEFAULT_COUNT_LIMIT;
245
+ const items = given.map((item) => ({ table: checkedTable(schema, item.table, item).id, filter: item.filter }));
246
+ const results = Array.from({ length: items.length });
247
+ const large = (table) => (findTable(schema, table)?.approxRows ?? 0) >= ESTIMATE_ABOVE;
248
+ const estimates = items.map((item, i) => ({ item, i })).filter(({ item }) => !item.filter?.groups?.length && large(item.table));
249
+ if (estimates.length) {
250
+ const bound = capture(reader, { count: true, estimate: true });
251
+ for (const { item, i } of estimates)
252
+ results[i] = await counted(bound, item.table, undefined, false);
253
+ }
254
+ const rest = items.map((item, i) => ({ item, i })).filter(({ i }) => !results[i]);
255
+ const said = (n) => (n > bound ? { count: bound, exact: true, capped: true } : { count: n, exact: true });
256
+ const each = rest.length > 1 ? capture(reader, { countEach: true }).countEach : undefined;
257
+ if (each) {
258
+ const counts = await each(rest.map(({ item }) => item), bound + 1);
259
+ rest.forEach(({ i }, at) => {
260
+ results[i] = said(counts[at]);
261
+ });
262
+ }
263
+ else if (rest.length) {
264
+ const { count } = capture(reader, { count: true });
265
+ if (!count)
266
+ throw new ResourceReadError(501, 'This connection cannot count records.');
267
+ await inWindows(rest, async ({ item, i }) => {
268
+ results[i] = said(await count(item.table, item.filter, bound + 1));
269
+ });
270
+ }
271
+ return results;
272
+ }
273
+ /* Counts one at a time, a few at once, as a record's references always were
274
+ on a reader that cannot say them in one statement: all of them together is
275
+ a dozen scans against the connection serving the page, and strictly one
276
+ after another lets one slow count hold every other. A window settles
277
+ whole before a failure is thrown, so no count is still running when the
278
+ request answers, and no further window starts after one. */
279
+ const COUNT_WINDOW = 4;
280
+ async function inWindows(items, run) {
281
+ for (let at = 0; at < items.length; at += COUNT_WINDOW) {
282
+ const settled = await Promise.allSettled(items.slice(at, at + COUNT_WINDOW).map(run));
283
+ const failed = settled.find((result) => result.status === 'rejected');
284
+ if (failed)
285
+ throw failed.reason;
286
+ }
287
+ }
288
+ export async function readRecords(reader, schema, input, countMode = 'none', countLimit, continuation) {
289
+ const given = snapshotScopedData(input);
290
+ const table = checkedTable(schema, given.table, given);
291
+ const countBound = countMode === 'none' ? undefined : countLimitOf(countLimit);
292
+ /* An API answers in its own order. With none asked for, none is sent: the
293
+ key as a default sort is one most APIs do not document, and would turn
294
+ every plain list into a refusal (adapters/http). */
295
+ const order = snapshotScopedData(schema.dialect === 'http' && !given.orderBy?.length ? { order: [], implicit: true } : resolveOrder(table, given.orderBy));
296
+ const request = {
297
+ ...given,
298
+ table: table.id,
299
+ orderBy: order.order,
300
+ limit: clampLimit(given.limit),
301
+ offset: clampOffset(given.offset),
302
+ };
303
+ const bound = capture(reader, {
304
+ records: true,
305
+ count: countMode !== 'none',
306
+ estimate: countMode === 'estimate' && countBound === undefined && !request.filter?.groups?.length,
307
+ });
308
+ if (!bound.query)
309
+ throw new ResourceReadError(501, 'This connection cannot query records.');
310
+ const countFilter = snapshotScopedData(request.filter);
311
+ const page = continuation && snapshotScopedData(continuation);
312
+ const rowsRequest = !page
313
+ ? request
314
+ : {
315
+ ...request,
316
+ offset: 0,
317
+ orderBy: page.reverse ? reversedOrder(request.orderBy ?? []) : request.orderBy,
318
+ ...(page.groups ? { filter: { groups: page.groups } } : {}),
319
+ };
320
+ const [read, total] = await together(() => bound.query(snapshotScopedData(rowsRequest)), () => countMode === 'none' ? Promise.resolve(undefined) : counted(bound, request.table, countFilter, countMode === 'exact', countBound));
321
+ const result = page?.reverse ? { ...read, rows: [...read.rows].reverse() } : read;
322
+ return { request, result, order, total };
323
+ }
324
+ /** How many rows a view matches, bounded as readCounts bounds a table's, with
325
+ * no rows read: a tab whose question walks a reference. */
326
+ export async function readViewCount(reader, schema, input, countLimit) {
327
+ const { references: _requested, ...given } = snapshotScopedData(input);
328
+ checkedTable(schema, given.base, {});
329
+ checkedPathFilter(given);
330
+ /* The catalog's rollups too, as readView takes them: a tab whose question
331
+ names one ("replies = 0") was counted without them and refused the whole
332
+ batch of tab counts. */
333
+ const pinned = withViewComputed(schema, given);
334
+ const view = {
335
+ ...given,
336
+ labels: withViewLabels(schema, given).labels,
337
+ computed: pinned.computed,
338
+ expressions: pinned.expressions,
339
+ tagged: pinned.tagged,
340
+ };
341
+ if (!view.labels)
342
+ delete view.labels;
343
+ if (!view.computed)
344
+ delete view.computed;
345
+ if (!view.expressions)
346
+ delete view.expressions;
347
+ if (!view.tagged)
348
+ delete view.tagged;
349
+ const bound = countLimitOf(countLimit) ?? DEFAULT_COUNT_LIMIT;
350
+ const { countView } = capture(reader, { viewCount: true });
351
+ if (!countView)
352
+ throw new ResourceReadError(501, `${schema.dialect} connections cannot count views in this build.`);
353
+ const n = await countView(snapshotScopedData(view), bound + 1);
354
+ return n > bound ? { count: bound, exact: true, capped: true } : { count: n, exact: true };
355
+ }
356
+ /** A count read one past its bound, said the way `counted` says it: the bound, and `capped`. */
357
+ function boundedTotal(n, bound) {
358
+ return n !== undefined && bound !== undefined && n > bound ? { total: bound, capped: true } : { total: n };
359
+ }
360
+ export async function readView(reader, schema, input, pagination = {}, countMode = 'exact', countLimit, continuation) {
361
+ // Declared references are attached below this read by the App's resource layer, never taken from a request.
362
+ const { references: _requested, ...given } = snapshotScopedData(input);
363
+ checkedTable(schema, given.base, {});
364
+ checkedPathFilter(given);
365
+ // A `$label` path's template, and a rollup's rows, are this catalog's (an
366
+ // App's), never the request's.
367
+ const pinned = withViewComputed(schema, given);
368
+ const view = {
369
+ ...given,
370
+ labels: withViewLabels(schema, given).labels,
371
+ computed: pinned.computed,
372
+ expressions: pinned.expressions,
373
+ tagged: pinned.tagged,
374
+ };
375
+ if (!view.labels)
376
+ delete view.labels;
377
+ if (!view.computed)
378
+ delete view.computed;
379
+ if (!view.expressions)
380
+ delete view.expressions;
381
+ if (!view.tagged)
382
+ delete view.tagged;
383
+ const page = snapshotScopedData(pagination);
384
+ const limit = clampLimit(page.limit ?? view.limit);
385
+ const offset = clampOffset(page.offset);
386
+ const countBound = countMode === 'none' ? undefined : countLimitOf(countLimit);
387
+ const bound = capture(reader, { view: true, viewCount: countMode === 'exact' });
388
+ const run = bound.runView;
389
+ const count = countMode === 'none' ? undefined : bound.countView;
390
+ if (!run)
391
+ throw new ResourceReadError(501, `${schema.dialect} connections cannot run views in this build.`);
392
+ const step = continuation && snapshotScopedData(continuation);
393
+ const rowsView = !step ? view : { ...view, orderBy: step.orderBy, ...(step.groups ? { filter: { groups: step.groups } } : {}) };
394
+ const [read, counted] = await together(() => run({ ...snapshotScopedData(rowsView), limit }, step ? 0 : offset), () => (count ? count(snapshotScopedData(view), countBound === undefined ? undefined : countBound + 1) : Promise.resolve(undefined)));
395
+ const result = step?.reverse ? { ...read, rows: [...read.rows].reverse() } : read;
396
+ const { total, capped } = boundedTotal(counted, countBound);
397
+ /* A capped total is a floor, not the end: whether a page follows is the
398
+ page's own evidence, as it is when there is no total at all. */
399
+ const more = total === undefined || capped ? result.rows.length >= limit : offset + result.rows.length < total;
400
+ return { view, result, total, ...(capped ? { capped } : {}), more, limit, offset };
401
+ }
402
+ export async function readBreakdown(reader, schema, input, pagination = {}, countLimit) {
403
+ const { references: _requested, ...given } = snapshotScopedData(input);
404
+ checkedTable(schema, given.base, {});
405
+ checkedPathFilter(given);
406
+ /* A `count when [...]` carries a filter of its own; it is held to the same shape as the section's. */
407
+ for (const where of measureConditions(given.measures))
408
+ assertStructuredReadFilter(where, 'path');
409
+ const page = snapshotScopedData(pagination);
410
+ const limit = clampLimit(page.limit ?? given.limit);
411
+ const offset = clampOffset(page.offset);
412
+ const countBound = countLimitOf(countLimit);
413
+ const breakdown = { ...given, limit };
414
+ /* What runs carries the rollups a measure, a key or a condition names:
415
+ this catalog's, never the request's. The answer echoes the def asked. */
416
+ const ran = withBreakdownComputed(schema, breakdown);
417
+ const grouped = Boolean(breakdown.by?.length);
418
+ const bound = capture(reader, { breakdown: true, breakdownCount: grouped });
419
+ const run = bound.runBreakdown;
420
+ if (!run)
421
+ throw new ResourceReadError(501, `${schema.dialect} connections cannot group in this build.`);
422
+ /* No `by` is one group, always: an aggregate with no GROUP BY answers with
423
+ exactly one row, even over no rows at all. Its count was a second
424
+ statement — `SELECT COUNT(*) FROM (SELECT SUM(…))` — whose answer could
425
+ only ever be 1, run beside every metric on every dashboard. */
426
+ if (!grouped) {
427
+ const result = await run(snapshotScopedData(ran), offset);
428
+ return { breakdown, result, total: 1, limit, offset };
429
+ }
430
+ /* Grouped, the page itself usually says how many groups there are: one
431
+ group past the page is asked for, and when it does not come back the
432
+ groups ended on this page. Only a full page (or one past the end) still
433
+ needs the count, and then it runs after the rows rather than beside them
434
+ — a dashboard's charts and a rail's facets nearly never pay for it. */
435
+ const peek = clampLimit(limit + 1);
436
+ const read = await run(snapshotScopedData({ ...ran, limit: peek }), offset);
437
+ const beyond = read.rows.length > limit;
438
+ /* Each reference key's names beside the groups, out of the columns
439
+ (withGroupNames), read off the page after the peek row is dropped: the
440
+ group past the page is not in the answer, so neither is its name. */
441
+ const result = withGroupNames(beyond ? { ...read, rows: read.rows.slice(0, limit) } : read);
442
+ const settled = peek > limit && !beyond && (result.rows.length > 0 || offset === 0);
443
+ let counted;
444
+ if (settled)
445
+ counted = offset + result.rows.length;
446
+ else if (bound.countBreakdown) {
447
+ counted = await bound.countBreakdown(snapshotScopedData(ran), countBound === undefined ? undefined : countBound + 1);
448
+ }
449
+ const { total, capped } = boundedTotal(counted, countBound);
450
+ const { names, ...answer } = result;
451
+ return { breakdown, result: answer, ...(names ? { names } : {}), total, ...(capped ? { capped } : {}), limit, offset };
452
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * A record's life read off its status vocabulary: the one inference the
3
+ * scaffold writes as a `machine()` and `tablewalk seed` walks when no App
4
+ * says otherwise.
5
+ *
6
+ * A CHECK or enum list of plain words on a column named like a state is the
7
+ * work's states in their order. Most of them are a path — received, in
8
+ * progress, ready, collected — walked one verb at a time to the last, which
9
+ * is final. A word that calls the work off (cancelled, rejected, lost) is an
10
+ * exit: final, reached from every open state by a verb that asks first. A
11
+ * word that parks the work (on hold, waiting for parts) is a side state: one
12
+ * verb into it from the step before it, one back. That is a draft of how the
13
+ * work moves, not a rule about the business: the author adds the skips and
14
+ * the commands.
15
+ *
16
+ * Stamps follow: a date column named for a state (`ready_at`) is the
17
+ * platform's to write as the record enters it, so it is left alone; one
18
+ * named for what entering a state means (`completed_on` beside `collected`,
19
+ * `cancelled_at` beside a `cancel` verb) is set by the verbs that lead there.
20
+ */
21
+ import { type ColumnMeta, type TableMeta } from '../shared/schema.js';
22
+ /** One verb of the drafted machine: the states it leaves, where it goes, and what it writes beside the column. */
23
+ interface DraftedVerb {
24
+ verb: string;
25
+ from: string[];
26
+ to: string;
27
+ /** Asks first: it calls the work off. */
28
+ confirm?: true;
29
+ /** The text column that says why it was called off. */
30
+ reason?: string;
31
+ /** Date columns set to now as the record moves (never a state's own stamp, which the platform writes). */
32
+ stamps: string[];
33
+ }
34
+ /** A machine read off a status vocabulary. */
35
+ export interface DraftedMachine {
36
+ column: string;
37
+ /** Every state, in the vocabulary's order. */
38
+ states: string[];
39
+ /** The forward path, first state to the final one. */
40
+ path: string[];
41
+ /** Side states, each with the path state it is entered from and returns to. */
42
+ holds: Map<string, string>;
43
+ /** The final states that call the work off. */
44
+ exits: string[];
45
+ /** Each verb once, forward ones first, the exits last. */
46
+ verbs: DraftedVerb[];
47
+ /** The timestamp the platform stamps whenever the state changes. */
48
+ since?: string;
49
+ }
50
+ /** Whether a vocabulary reads as a lifecycle: three or more plain words, at least two of them steps forward. */
51
+ export declare function draftMachine(table: TableMeta, column: ColumnMeta): DraftedMachine | undefined;
52
+ /** Every column the machine writes: its column, its `since`, each state's own stamp and each verb's. */
53
+ export declare function machineWrites(table: TableMeta, machine: DraftedMachine): Set<string>;
54
+ export {};