@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,12 @@
1
+ interface DateWindow {
2
+ label: string;
3
+ start: Date;
4
+ end: Date;
5
+ }
6
+ /**
7
+ * `now` is a parameter rather than a call to the clock, so the compiler is a
8
+ * pure function of its inputs. That is what makes the tests below able to
9
+ * assert on an exact timestamp instead of a range.
10
+ */
11
+ export declare function dateWindow(phrase: string, now: Date): DateWindow | undefined;
12
+ export {};
@@ -0,0 +1,101 @@
1
+ /*
2
+ * Relative dates for the query language: `today`, `last 30 days`,
3
+ * `previous 3 months` resolved to two concrete timestamps against a given
4
+ * now, so they bind as parameters and mean the same on every engine.
5
+ */
6
+ function startOfDay(d) {
7
+ const c = new Date(d);
8
+ c.setHours(0, 0, 0, 0);
9
+ return c;
10
+ }
11
+ function addDays(d, n) {
12
+ const c = new Date(d);
13
+ c.setDate(c.getDate() + n);
14
+ return c;
15
+ }
16
+ /**
17
+ * `now` is a parameter rather than a call to the clock, so the compiler is a
18
+ * pure function of its inputs. That is what makes the tests below able to
19
+ * assert on an exact timestamp instead of a range.
20
+ */
21
+ export function dateWindow(phrase, now) {
22
+ const p = phrase.toLowerCase().trim();
23
+ const today = startOfDay(now);
24
+ const fixed = {
25
+ today: [today, addDays(today, 1)],
26
+ yesterday: [addDays(today, -1), today],
27
+ tomorrow: [addDays(today, 1), addDays(today, 2)],
28
+ };
29
+ if (fixed[p])
30
+ return { label: p, start: fixed[p][0], end: fixed[p][1] };
31
+ if (p === 'this week' || p === 'last week') {
32
+ // Weeks start Monday, which is what a working calendar means by "this week".
33
+ const dow = (today.getDay() + 6) % 7;
34
+ const monday = addDays(today, -dow);
35
+ const start = p === 'this week' ? monday : addDays(monday, -7);
36
+ return { label: p, start, end: addDays(start, 7) };
37
+ }
38
+ if (p === 'this month' || p === 'last month') {
39
+ const base = new Date(today.getFullYear(), today.getMonth() + (p === 'last month' ? -1 : 0), 1);
40
+ const end = new Date(base.getFullYear(), base.getMonth() + 1, 1);
41
+ return { label: p, start: base, end };
42
+ }
43
+ if (p === 'this quarter' || p === 'last quarter' || p === 'next quarter') {
44
+ /* Calendar quarters, from January, April, July and October: an App declares no fiscal year, so a quarter is the
45
+ calendar's. `Date` carries a month before January or after December into the year beside it. */
46
+ const shift = p === 'last quarter' ? -3 : p === 'next quarter' ? 3 : 0;
47
+ const start = new Date(today.getFullYear(), Math.floor(today.getMonth() / 3) * 3 + shift, 1);
48
+ return { label: p, start, end: new Date(start.getFullYear(), start.getMonth() + 3, 1) };
49
+ }
50
+ if (p === 'this year' || p === 'last year') {
51
+ const year = today.getFullYear() + (p === 'last year' ? -1 : 0);
52
+ return { label: p, start: new Date(year, 0, 1), end: new Date(year + 1, 0, 1) };
53
+ }
54
+ const span = p.match(/^(last|next|previous)\s+(\d+)\s+(minute|hour|day|week|month|year)s?$/);
55
+ if (span) {
56
+ const [, dir, amountRaw, unit] = span;
57
+ const amount = Number(amountRaw);
58
+ const past = dir === 'last';
59
+ /* `previous N` is the window immediately before `last N`, the same
60
+ length, ending where `last N` starts. It exists so a metric's
61
+ "previous period" compare is equal-span *by construction*: `last 30
62
+ days` runs from thirty days ago to tomorrow (31 calendar days, today
63
+ included), and any rewrite in terms of `last` was a day short. */
64
+ const previous = dir === 'previous';
65
+ /* A span of the clock, from the instant: `last 30 minutes` is an update just now, `next 2 hours` what falls due
66
+ before then. */
67
+ if (unit === 'hour' || unit === 'minute') {
68
+ const ms = amount * (unit === 'hour' ? 3600_000 : 60_000);
69
+ if (previous)
70
+ return { label: p, start: new Date(now.getTime() - 2 * ms), end: new Date(now.getTime() - ms) };
71
+ return past
72
+ ? { label: p, start: new Date(now.getTime() - ms), end: now }
73
+ : { label: p, start: now, end: new Date(now.getTime() + ms) };
74
+ }
75
+ const days = unit === 'week' ? amount * 7 : amount;
76
+ if (unit === 'month' || unit === 'year') {
77
+ /* Counted in calendar units rather than in days, so `last 3 months`
78
+ from the 31st lands on a date that exists and `last 1 year` from a
79
+ leap day does not drift. `Date` normalises an overflowing day of the
80
+ month, which is the behaviour wanted here: three months before the
81
+ 31st of May is the 28th of February, not a date in March. */
82
+ const months = unit === 'year' ? amount * 12 : amount;
83
+ const other = new Date(today.getFullYear(), today.getMonth() + (past || previous ? -months : months), today.getDate());
84
+ if (previous) {
85
+ /* `last N months` is N months and a day (to tomorrow); the window
86
+ before it is the same: N months back from its start, less a day. */
87
+ const start = new Date(other.getFullYear(), other.getMonth() - months, other.getDate() - 1);
88
+ return { label: p, start, end: other };
89
+ }
90
+ return past ? { label: p, start: other, end: addDays(today, 1) } : { label: p, start: today, end: other };
91
+ }
92
+ if (previous) {
93
+ const end = addDays(today, -days);
94
+ return { label: p, start: addDays(end, -(days + 1)), end };
95
+ }
96
+ return past
97
+ ? { label: p, start: addDays(today, -days), end: addDays(today, 1) }
98
+ : { label: p, start: today, end: addDays(today, days) };
99
+ }
100
+ return undefined;
101
+ }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * What a condition's right-hand side can stand for besides a literal: another
3
+ * column (`on_hand < product_id.reorder_level`) or the signed-in person
4
+ * (`owner_id = me`). Kept beside the query language rather than in it, since
5
+ * each is a judgement about two columns or a session the grammar itself never
6
+ * needs; query.ts asks these where a value would otherwise be read.
7
+ */
8
+ import type { Condition, Op } from './filter.js';
9
+ import { type ColumnKind, type ColumnMeta, type MachineStates, type TableMeta } from './schema.js';
10
+ /**
11
+ * Who `me` is, for one request: the signed-in account, as the server's own
12
+ * session says. Absent from a parse, `me` is refused rather than read as the
13
+ * two letters, which made `owner != me` every row wherever a path forgot the
14
+ * person; `"me"` quoted is the word.
15
+ */
16
+ export interface QueryPerson {
17
+ /** The account's email; null when nobody is signed in. */
18
+ email: string | null;
19
+ /** Signed in, with an email not yet proven where anyone may sign up: someone, and no one's `me` (appMe.ts unprovenPerson). */
20
+ unproven?: true;
21
+ /**
22
+ * Nobody in particular: a catalog asking whether a segment reads at all, before
23
+ * any request (appSegments.ts servedSegments). `me` and `me.<table>.<column>` are
24
+ * read as no one's, so a segment about the person is judged by the rest of what it says.
25
+ */
26
+ anyone?: true;
27
+ /**
28
+ * The table people are rows of (an App's `auth.me`), and the signed-in
29
+ * account's row key there — null when no row carries their email, which
30
+ * then matches nothing rather than failing the list.
31
+ */
32
+ person?: {
33
+ table: string;
34
+ key: string | number | null;
35
+ };
36
+ /**
37
+ * `me.<table>.<column>` in a value list, by `table.column`:
38
+ * the values of `column` in the rows of `table` that point at the person —
39
+ * their teams, their territories — read for this request through its own
40
+ * reader, so a row its grants, row policy or tenant hide is none of them;
41
+ * or why they cannot be read.
42
+ */
43
+ sets?: Readonly<Record<string, MeSet>>;
44
+ }
45
+ /** Nobody in particular (`anyone` above): what a check that runs before any request reads `me` as. */
46
+ export declare const ANYONE: QueryPerson;
47
+ /** One `me.<table>.<column>`: its values and their kind, or the sentence that refuses it. */
48
+ export type MeSet = {
49
+ values: readonly (string | number)[];
50
+ kind: ColumnKind;
51
+ } | {
52
+ error: string;
53
+ };
54
+ /** `me.<table>.<column>`, written as one item of a value list. */
55
+ export declare const ME_SET: RegExp;
56
+ export interface CompileContext {
57
+ table: TableMeta | undefined;
58
+ now: Date;
59
+ /** Admit a column on the right-hand side (a view's compiler resolves it). */
60
+ columnValues: boolean;
61
+ me?: QueryPerson | null;
62
+ /** A machine's states by column, where the catalog does not carry them (a parse with no schema). */
63
+ states?: Readonly<Record<string, MachineStates>>;
64
+ }
65
+ /**
66
+ * The column an unquoted right-hand side names, when it names one.
67
+ *
68
+ * A reference path always does, on any column: no value is spelled
69
+ * `product_id.reorder_level`, and reading it as text was a comparison
70
+ * between a number and a word that SQLite answers "less" for every row. A
71
+ * bare word does only beside a number, date or flag, which it could never
72
+ * be the value of; beside text, `source = email` is the value "email" even
73
+ * where the table has an `email` column, because that is what a status tab
74
+ * means by it. Quoted, it is text everywhere.
75
+ */
76
+ export declare function columnOperand(ctx: CompileContext, left: ColumnMeta | undefined, op: Op, value: string): {
77
+ other?: ColumnMeta;
78
+ error?: string;
79
+ };
80
+ /**
81
+ * What `me.<table>.<column>` stands for in a value list beside one column:
82
+ * the values read for this request, of the column's own kind. An empty set
83
+ * leaves the list holding nothing of the person's, which matches nothing.
84
+ */
85
+ export declare function meSetOperand(ctx: CompileContext, column: ColumnMeta | undefined, word: string): {
86
+ values?: (string | number)[];
87
+ error?: string;
88
+ };
89
+ /**
90
+ * What `me` stands for beside one column: the person's row key where the
91
+ * column points at the table people are rows of (or is that table's key),
92
+ * their email where it holds text. Anything else is refused by name —
93
+ * comparing a date with an email is the silent empty tab this exists to stop.
94
+ */
95
+ export declare function meOperand(ctx: CompileContext, column: ColumnMeta | undefined, op: Op): {
96
+ value?: string | number;
97
+ conditions?: Condition[];
98
+ error?: string;
99
+ };
@@ -0,0 +1,131 @@
1
+ import { columnKind } from './schema.js';
2
+ /** Nobody in particular (`anyone` above): what a check that runs before any request reads `me` as. */
3
+ export const ANYONE = Object.freeze({ email: null, anyone: true });
4
+ /** `me.<table>.<column>`, written as one item of a value list. */
5
+ export const ME_SET = /^me\.([A-Za-z_]\w*)\.([A-Za-z_]\w*)$/;
6
+ const COMPARISON_OPS = new Set(['=', '!=', '<', '<=', '>', '>=']);
7
+ const BARE_WORD = /^[A-Za-z_$][\w$]*$/;
8
+ const PATH_WORD = /^[A-Za-z_$][\w$+]*(?:\.[A-Za-z_$][\w$+]*)+$/;
9
+ /**
10
+ * The column an unquoted right-hand side names, when it names one.
11
+ *
12
+ * A reference path always does, on any column: no value is spelled
13
+ * `product_id.reorder_level`, and reading it as text was a comparison
14
+ * between a number and a word that SQLite answers "less" for every row. A
15
+ * bare word does only beside a number, date or flag, which it could never
16
+ * be the value of; beside text, `source = email` is the value "email" even
17
+ * where the table has an `email` column, because that is what a status tab
18
+ * means by it. Quoted, it is text everywhere.
19
+ */
20
+ export function columnOperand(ctx, left, op, value) {
21
+ const table = ctx.table;
22
+ if (!table)
23
+ return {};
24
+ const path = PATH_WORD.test(value);
25
+ if (!path && !BARE_WORD.test(value))
26
+ return {};
27
+ const named = table.columns.find((c) => c.name === value);
28
+ if (!path) {
29
+ const kind = left ? columnKind(left.type) : 'other';
30
+ if (!named || kind === 'text' || kind === 'other')
31
+ return {};
32
+ }
33
+ else if (!named) {
34
+ /* A dotted word whose first hop is a column is a path that did not
35
+ resolve here — in a plain query because paths need a view, in a view
36
+ because it goes nowhere (the view parser reports which). */
37
+ if (!table.columns.some((c) => c.name === value.split('.')[0].split('+')[0]))
38
+ return {};
39
+ return {
40
+ error: `"${value}" is a path, and a condition here compares ${table.name}'s own columns with a value. Quote it ("${value}") to mean the text.`,
41
+ };
42
+ }
43
+ if (!ctx.columnValues) {
44
+ return {
45
+ error: `"${value}" is a column, and a condition here compares a column with a value. Quote it ("${value}") to mean the text.`,
46
+ };
47
+ }
48
+ if (!COMPARISON_OPS.has(op))
49
+ return { error: `"${value}" is a column; compare it with =, !=, <, <=, > or >=.` };
50
+ const a = left ? columnKind(left.type) : 'other';
51
+ const b = columnKind(named.type);
52
+ if (a !== 'other' && b !== 'other' && a !== b) {
53
+ return {
54
+ error: `"${left.name}" is ${left.type || 'untyped'} and "${value}" is ${named.type || 'untyped'}, so comparing them says nothing. Compare columns of one kind.`,
55
+ };
56
+ }
57
+ return { other: named };
58
+ }
59
+ /**
60
+ * What `me.<table>.<column>` stands for in a value list beside one column:
61
+ * the values read for this request, of the column's own kind. An empty set
62
+ * leaves the list holding nothing of the person's, which matches nothing.
63
+ */
64
+ export function meSetOperand(ctx, column, word) {
65
+ const me = ctx.me ?? { email: null };
66
+ if (me.anyone)
67
+ return { values: [] };
68
+ if (me.email === null && !me.unproven)
69
+ return { error: 'me is the signed-in person, and nobody is signed in.' };
70
+ const set = me.sets?.[word.slice(3)];
71
+ if (!set)
72
+ return { error: `${word} is read only where a request names the signed-in person: a list, a tab, a count or an export of an App.` };
73
+ if ('error' in set)
74
+ return { error: set.error };
75
+ const kind = column ? columnKind(column.type) : 'other';
76
+ if (kind !== 'other' && set.kind !== 'other' && kind !== set.kind)
77
+ return {
78
+ error: `"${column.name}" is ${column.type || 'untyped'}, and ${word} holds ${set.kind} values, so comparing them says nothing.`,
79
+ };
80
+ return { values: [...set.values] };
81
+ }
82
+ /**
83
+ * What `me` stands for beside one column: the person's row key where the
84
+ * column points at the table people are rows of (or is that table's key),
85
+ * their email where it holds text. Anything else is refused by name —
86
+ * comparing a date with an email is the silent empty tab this exists to stop.
87
+ */
88
+ export function meOperand(ctx, column, op) {
89
+ const me = ctx.me ?? { email: null };
90
+ /* Anyone's, for a check before any request: the word, which every column takes. */
91
+ if (me.anyone)
92
+ return { value: 'me' };
93
+ const table = ctx.table;
94
+ const name = column?.name ?? 'this column';
95
+ const person = me.person;
96
+ const points = person && column && (column.references?.table === person.table || (table?.id === person.table && column.primaryKey));
97
+ /* Signed in, but nothing they said is proven: nothing is theirs. As for a person without a row. */
98
+ const nothing = () => op === '='
99
+ ? { conditions: [{ column: name, op: 'in', value: [] }] }
100
+ : op === '!='
101
+ ? { conditions: [{ column: name, op: 'isNotNull' }] }
102
+ : { error: `me is compared with ${name} by = or != only.` };
103
+ if (points) {
104
+ if (me.email === null)
105
+ return me.unproven ? nothing() : { error: 'me is the signed-in person, and nobody is signed in.' };
106
+ if (person.key !== null)
107
+ return { value: person.key };
108
+ /* Signed in, but no row carries the email: nothing is theirs. Said as
109
+ conditions the builder already speaks, so no engine binds a null. */
110
+ if (op === '=')
111
+ return { conditions: [{ column: name, op: 'in', value: [] }] };
112
+ if (op === '!=')
113
+ return { conditions: [{ column: name, op: 'isNotNull' }] };
114
+ return { error: `me is compared with ${name} by = or != only.` };
115
+ }
116
+ if (column?.references) {
117
+ return {
118
+ error: person
119
+ ? `"${name}" references ${column.references.table}, and me is a row of ${person.table} or the signed-in account's email. Compare a column that points at ${person.table}, or a text column like ${name}.email.`
120
+ : `"${name}" references ${column.references.table}, and me is the signed-in account's email. Say which table people are rows of — auth: { me: { from: '${column.references.table}', column: 'email' } } — or compare a text column (${name}.email = me).`,
121
+ };
122
+ }
123
+ if (column && columnKind(column.type) !== 'text') {
124
+ return {
125
+ error: `"${name}" is ${column.type || 'untyped'}, and me is the signed-in account's email${person ? ` or their ${person.table} row` : ''}, which only a text column${person ? ' or a reference to it' : ''} holds.`,
126
+ };
127
+ }
128
+ if (me.email === null)
129
+ return me.unproven ? nothing() : { error: 'me is the signed-in person, and nobody is signed in.' };
130
+ return { value: me.email };
131
+ }
@@ -0,0 +1,103 @@
1
+ import { type Filter, type SqlStyle } from './filter.js';
2
+ /** What a caller gets when it does not say. Small on purpose: the first page
3
+ of a browse should be instant, and paging is one click. */
4
+ export declare const DEFAULT_LIMIT = 20;
5
+ /** The hard ceiling. Nothing may exceed it, including an explicit request. */
6
+ export declare const MAX_LIMIT = 100000;
7
+ /** The most rows one read answers for a table its reader may not export: the largest a screen reads (a tree list,
8
+ read whole, is 2,000), so the list is never the way round an export grant (resourceReadHttp.ts). */
9
+ export declare const UNEXPORTED_MOST = 2000;
10
+ /**
11
+ * Above this many rows, an exact count is not worth what it costs.
12
+ *
13
+ * `COUNT(*)` is a scan. On a table of a few thousand rows that is free and the
14
+ * exact number is strictly better; on a table of fifty million it is seconds of
15
+ * work to compute a number that is stale before it is rendered, and it runs on
16
+ * *every* query — the header stat is not something anyone asked for.
17
+ *
18
+ * The threshold is deliberately well above anything a person would notice the
19
+ * difference on. Below it you get the true number; above it you get the
20
+ * catalog's estimate and are told that is what it is.
21
+ */
22
+ export declare const ESTIMATE_ABOVE = 50000;
23
+ /** A row count, and whether it is the real one. */
24
+ export interface CountResult {
25
+ count: number;
26
+ /** False when this came from the catalog's statistics rather than a scan. */
27
+ exact: boolean;
28
+ /** Only when a bounded count stopped: `count` is the bound, and more rows match. */
29
+ capped?: true;
30
+ }
31
+ /**
32
+ * A count over one relation and its WHERE clause, optionally stopped.
33
+ *
34
+ * With `limit`, the inner SELECT reads at most that many matching rows, so
35
+ * "how many, up to ten thousand" costs ten thousand rows however large the
36
+ * table is. The relation and WHERE are the caller's own and unchanged: the
37
+ * bound wraps the plan that already carries the row scope and the filter,
38
+ * it never builds a second one. Without a limit the text is the plain
39
+ * COUNT(*) it always was.
40
+ *
41
+ * The bound is written as digits, not bound as a parameter: it is an integer
42
+ * checked here, and one statement shape then serves both drivers and the
43
+ * scoped compiler — a driver may send a bound number as a DOUBLE, which
44
+ * `LIMIT` refuses, and the scoped compiler does not know its driver.
45
+ */
46
+ export declare function countStatement(relation: string, limit?: number): string;
47
+ /** Most counts one statement answers: a list's tabs, a record's references. */
48
+ export declare const COUNT_EACH_MAX = 64;
49
+ /** The most a menu row counts (`countLimit`); past it the row says 10,000+ (client navCounts.ts, and a first page's counts, server/http/firstPaintRooms.ts). */
50
+ export declare const NAV_COUNT_LIMIT = 10000;
51
+ /** One count of a `countEach`: a relation the adapter has already checked
52
+ against its catalog and quoted, and the filter over it. */
53
+ interface CountEachItem {
54
+ relation: string;
55
+ filter?: Filter;
56
+ }
57
+ /**
58
+ * Several counts in one statement, each as `countStatement` would say it.
59
+ *
60
+ * Two shapes, both one round trip and one plan:
61
+ *
62
+ * - `together`: every item reads one relation and the caller knows that
63
+ * relation is small (at most the bound, by the catalog's figure). One scan
64
+ * answers them all, a conditional aggregate each — `COUNT(*) FILTER
65
+ * (WHERE …)` on Postgres, `COUNT(CASE WHEN … THEN 1 END)` elsewhere — and
66
+ * no count can pass the bound by much, so none needs one.
67
+ * - otherwise, one bounded count per item joined by UNION ALL, each tagged
68
+ * with its position: a large table stops each scan at the bound instead of
69
+ * reading every row once for every tab.
70
+ *
71
+ * Rows come back as `{ i, n }` in either shape; `countEachRows` reads them.
72
+ */
73
+ export declare function countEachStatement(items: readonly CountEachItem[], style: SqlStyle, options?: {
74
+ limit?: number;
75
+ together?: boolean;
76
+ }): {
77
+ text: string;
78
+ params: unknown[];
79
+ };
80
+ /** The counts a `countEachStatement` answered, in the items' order. */
81
+ export declare function countEachRows(rows: readonly Record<string, unknown>[], length: number): number[];
82
+ export declare function clampLimit(value: unknown, fallback?: number): number;
83
+ /** Offsets have no ceiling but must be a real, non-negative integer. */
84
+ export declare function clampOffset(value: unknown): number;
85
+ export interface QueryResult {
86
+ columns: string[];
87
+ /** Values as returned by the driver, JSON-safe. */
88
+ rows: Array<Record<string, unknown>>;
89
+ /** Milliseconds the database took, for the "is this slow" question. */
90
+ ms: number;
91
+ /**
92
+ * The SQL that ran, with parameters shown separately.
93
+ *
94
+ * Surfaced deliberately: a tool that hides its query teaches nothing and
95
+ * cannot be trusted when the numbers look wrong. Seeing the statement is
96
+ * how you learn the database as well as read it.
97
+ */
98
+ sql: {
99
+ text: string;
100
+ params: unknown[];
101
+ };
102
+ }
103
+ export {};
@@ -0,0 +1,154 @@
1
+ /*
2
+ * The read contract both sides of the wire share: how many rows one read may
3
+ * return, how a count is bounded, and what a read answers. The adapters
4
+ * enforce it; the query language and the client page and export by the same
5
+ * numbers.
6
+ */
7
+ import { Refusal } from './refusal.js';
8
+ import { buildWhere } from './filter.js';
9
+ /* ---------- the limit policy ----------
10
+
11
+ One place, because a ceiling re-derived in four files is a ceiling that
12
+ disagrees with itself. Every read goes through `clampLimit`, so there is no
13
+ path to an unbounded query: a caller that omits a limit gets the default, a
14
+ caller that asks for too many gets the ceiling, and a caller that sends
15
+ nonsense gets the default rather than `LIMIT NaN`. */
16
+ /** What a caller gets when it does not say. Small on purpose: the first page
17
+ of a browse should be instant, and paging is one click. */
18
+ export const DEFAULT_LIMIT = 20;
19
+ /** The hard ceiling. Nothing may exceed it, including an explicit request. */
20
+ export const MAX_LIMIT = 100_000;
21
+ /** The most rows one read answers for a table its reader may not export: the largest a screen reads (a tree list,
22
+ read whole, is 2,000), so the list is never the way round an export grant (resourceReadHttp.ts). */
23
+ export const UNEXPORTED_MOST = 2_000;
24
+ /**
25
+ * Above this many rows, an exact count is not worth what it costs.
26
+ *
27
+ * `COUNT(*)` is a scan. On a table of a few thousand rows that is free and the
28
+ * exact number is strictly better; on a table of fifty million it is seconds of
29
+ * work to compute a number that is stale before it is rendered, and it runs on
30
+ * *every* query — the header stat is not something anyone asked for.
31
+ *
32
+ * The threshold is deliberately well above anything a person would notice the
33
+ * difference on. Below it you get the true number; above it you get the
34
+ * catalog's estimate and are told that is what it is.
35
+ */
36
+ export const ESTIMATE_ABOVE = 50_000;
37
+ /**
38
+ * A count over one relation and its WHERE clause, optionally stopped.
39
+ *
40
+ * With `limit`, the inner SELECT reads at most that many matching rows, so
41
+ * "how many, up to ten thousand" costs ten thousand rows however large the
42
+ * table is. The relation and WHERE are the caller's own and unchanged: the
43
+ * bound wraps the plan that already carries the row scope and the filter,
44
+ * it never builds a second one. Without a limit the text is the plain
45
+ * COUNT(*) it always was.
46
+ *
47
+ * The bound is written as digits, not bound as a parameter: it is an integer
48
+ * checked here, and one statement shape then serves both drivers and the
49
+ * scoped compiler — a driver may send a bound number as a DOUBLE, which
50
+ * `LIMIT` refuses, and the scoped compiler does not know its driver.
51
+ */
52
+ export function countStatement(relation, limit) {
53
+ if (limit === undefined)
54
+ return `SELECT COUNT(*) AS n FROM ${relation}`;
55
+ checkBound(limit);
56
+ return `SELECT COUNT(*) AS n FROM (SELECT 1 AS one FROM ${relation} LIMIT ${limit}) AS bounded`;
57
+ }
58
+ function checkBound(limit) {
59
+ if (!Number.isSafeInteger(limit) || limit < 1)
60
+ throw new Refusal('A count bound must be a positive whole number.');
61
+ }
62
+ /** Most counts one statement answers: a list's tabs, a record's references. */
63
+ export const COUNT_EACH_MAX = 64;
64
+ /** The most a menu row counts (`countLimit`); past it the row says 10,000+ (client navCounts.ts, and a first page's counts, server/http/firstPaintRooms.ts). */
65
+ export const NAV_COUNT_LIMIT = 10_000;
66
+ /**
67
+ * Several counts in one statement, each as `countStatement` would say it.
68
+ *
69
+ * Two shapes, both one round trip and one plan:
70
+ *
71
+ * - `together`: every item reads one relation and the caller knows that
72
+ * relation is small (at most the bound, by the catalog's figure). One scan
73
+ * answers them all, a conditional aggregate each — `COUNT(*) FILTER
74
+ * (WHERE …)` on Postgres, `COUNT(CASE WHEN … THEN 1 END)` elsewhere — and
75
+ * no count can pass the bound by much, so none needs one.
76
+ * - otherwise, one bounded count per item joined by UNION ALL, each tagged
77
+ * with its position: a large table stops each scan at the bound instead of
78
+ * reading every row once for every tab.
79
+ *
80
+ * Rows come back as `{ i, n }` in either shape; `countEachRows` reads them.
81
+ */
82
+ export function countEachStatement(items, style, options = {}) {
83
+ if (!items.length || items.length > COUNT_EACH_MAX)
84
+ throw new Refusal(`One statement counts 1 to ${COUNT_EACH_MAX} things.`);
85
+ const { limit, together = false } = options;
86
+ if (limit !== undefined)
87
+ checkBound(limit);
88
+ const params = [];
89
+ if (together && items.every((item) => item.relation === items[0].relation)) {
90
+ const measures = items.map((item, i) => {
91
+ const where = buildWhere(item.filter, style, params.length + 1);
92
+ params.push(...where.params);
93
+ const predicate = where.text.replace(/^ WHERE /, '');
94
+ const measure = predicate ? (style.countWhere?.(predicate) ?? `COUNT(CASE WHEN ${predicate} THEN 1 END)`) : 'COUNT(*)';
95
+ return `${measure} AS ${style.quote(`n${i}`)}`;
96
+ });
97
+ return { text: `SELECT ${measures.join(', ')} FROM ${items[0].relation}`, params };
98
+ }
99
+ const branches = items.map((item, i) => {
100
+ const where = buildWhere(item.filter, style, params.length + 1);
101
+ params.push(...where.params);
102
+ const counted = limit === undefined
103
+ ? `${item.relation}${where.text}`
104
+ : `(SELECT 1 AS one FROM ${item.relation}${where.text} LIMIT ${limit}) AS ${style.quote(`c${i}`)}`;
105
+ return `SELECT ${i} AS i, COUNT(*) AS n FROM ${counted}`;
106
+ });
107
+ return { text: branches.join('\nUNION ALL\n'), params };
108
+ }
109
+ /** The counts a `countEachStatement` answered, in the items' order. */
110
+ export function countEachRows(rows, length) {
111
+ const counts = Array.from({ length }, () => 0);
112
+ if (rows.length === 1 && !('i' in rows[0])) {
113
+ for (let i = 0; i < length; i++)
114
+ counts[i] = Number(rows[0][`n${i}`] ?? 0);
115
+ return counts;
116
+ }
117
+ for (const row of rows) {
118
+ const i = Number(row.i);
119
+ if (Number.isInteger(i) && i >= 0 && i < length)
120
+ counts[i] = Number(row.n ?? 0);
121
+ }
122
+ return counts;
123
+ }
124
+ /**
125
+ * Only a number or a numeric string counts as a request. Everything else —
126
+ * undefined, null, '', [], {}, 'abc' — means "not specified" and gets the
127
+ * default.
128
+ *
129
+ * The `null` case is why this cannot just be `Number(value)`: `Number(null)`
130
+ * is 0, not NaN, so a null limit passed a finite check and clamped to 1. A
131
+ * caller that omitted a limit would have got a single row and no error.
132
+ */
133
+ function asNumber(value) {
134
+ if (typeof value === 'number')
135
+ return Number.isFinite(value) ? value : undefined;
136
+ if (typeof value === 'string' && value.trim() !== '') {
137
+ const n = Number(value);
138
+ return Number.isFinite(n) ? n : undefined;
139
+ }
140
+ return undefined;
141
+ }
142
+ export function clampLimit(value, fallback = DEFAULT_LIMIT) {
143
+ const n = asNumber(value);
144
+ if (n === undefined)
145
+ return fallback;
146
+ return Math.min(Math.max(Math.floor(n), 1), MAX_LIMIT);
147
+ }
148
+ /** Offsets have no ceiling but must be a real, non-negative integer. */
149
+ export function clampOffset(value) {
150
+ const n = asNumber(value);
151
+ if (n === undefined || n < 0)
152
+ return 0;
153
+ return Math.floor(n);
154
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * A record's name as a template: `recordLabel: 'PO-{id}'`, `'{product_id.name} × {qty}'`.
3
+ *
4
+ * A record label used to be one column or one path, and a table with no name
5
+ * of its own — a purchase order, an order line — was titled by its key: "3".
6
+ * A template says the name in words around the columns that make it, and
7
+ * the name is computed where every other value is, in the statement: a list,
8
+ * a picker, a breadcrumb and a reference to the record all read the same
9
+ * `$label` path, sort by it and search it, on every engine, with nothing for
10
+ * the browser to assemble from columns it may not have fetched.
11
+ *
12
+ * `$label` is a path's last segment (`purchase_order_id.$label`), legal
13
+ * where a table carries a template (`TableMeta.labelTemplate`, which an App
14
+ * serves), and compiled from the view's `labels` (prefix → template), which
15
+ * the server's read fills from that catalog — never from a request.
16
+ */
17
+ /** The last segment that names a record's templated label. */
18
+ export declare const LABEL_SEGMENT = "$label";
19
+ type LabelPart = {
20
+ text: string;
21
+ } | {
22
+ path: string;
23
+ mask?: {
24
+ prefix?: string;
25
+ };
26
+ words?: Record<string, string>;
27
+ };
28
+ /** Whether an authored record label is a template rather than a path. */
29
+ export declare const isLabelTemplate: (text: unknown) => text is string;
30
+ /** The prefix a `$label` path hangs off ('' for the base's own), or undefined for any other path. */
31
+ export declare function labelPrefix(path: string): string | undefined;
32
+ /** A template's parts, or why it is not one. */
33
+ export declare function parseLabelTemplate(template: string): {
34
+ parts: LabelPart[];
35
+ paths: string[];
36
+ } | {
37
+ problem: string;
38
+ };
39
+ /** A template field for a path whose stored values are said as words, as the server writes it into a served template. */
40
+ export declare const wordedField: (path: string, words: Record<string, string>) => string;
41
+ /** A template field for a masked path, as the server writes it into a served template. */
42
+ export declare const maskedField: (path: string, prefix?: string) => string;
43
+ /** Whether an authored template writes a mask itself: that is the column's display rule's to say. */
44
+ export declare const writesMask: (template: string) => boolean;
45
+ /**
46
+ * The name a record with no name of its own is given: its noun and its key,
47
+ * "Purchase order #3", rather than the bare key a title and a breadcrumb
48
+ * used to show. One key column only: a composite key is not one number.
49
+ */
50
+ export declare function nounTemplate(noun: string, key: string): string;
51
+ export {};