@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,305 @@
1
+ /**
2
+ * Rich text: what a stored value may hold, and its plain words.
3
+ *
4
+ * A rich text value is HTML, kept to one small allowlist — paragraphs and
5
+ * line breaks, bold, italic, strike and underline, links, three heading
6
+ * levels, bullet, numbered and task lists, a quote, inline code and a code
7
+ * block, simple tables, an @-mention, and a picture that is one of this App's
8
+ * own attachments. Nothing else: no style, no script, no event handler, no
9
+ * class but a code block's language.
10
+ *
11
+ * Two sides read this one list. The server writes nothing else
12
+ * (server/richText.ts, on every write of a rich text column or input), and
13
+ * the browser draws nothing else (components/RichText.tsx), whatever the
14
+ * database holds: a value written outside the App — by SQL, by another
15
+ * program, before the column was declared rich — is drawn through the same
16
+ * allowlist, never trusted for being in the database.
17
+ *
18
+ * The plain text twin is derived, never stored: `richTextPlain` reads the
19
+ * words out of a value, for a list cell's excerpt, a notice, a plain email
20
+ * and an export. A search of the column matches the stored HTML's words, so
21
+ * a word reads the same; a tag name is not a word anyone searches for.
22
+ */
23
+ /** Where a rich text value is said in one line: a list cell, a card, a timeline row's excerpt. */
24
+ const RICH_TEXT_EXCERPT = 160;
25
+ /**
26
+ * A stored mention's handle (`data-id`): the value of the people's `by`
27
+ * column — a word, a number, a UUID, or an email. An email's `@` and `+` are
28
+ * in it: a people resource keyed by email was offered nobody, and a mention
29
+ * of one was dropped on save and never told.
30
+ */
31
+ export const MENTION_HANDLE = /^[A-Za-z0-9_][A-Za-z0-9_.+@-]{0,253}$/;
32
+ /** The most words after an @ that are each looked for (shared/mentionLookup.ts): "@Morgan Tr" narrows two Morgans,
33
+ and a space after the second word ends the name, so the list the editor offers closes there. */
34
+ export const MENTION_QUERY_WORDS = 2;
35
+ /** The most characters a rich text value holds, as stored HTML, unless its field says fewer. */
36
+ export const RICH_TEXT_MOST = 200_000;
37
+ /**
38
+ * The elements a value may hold, each with the attributes it keeps. An
39
+ * attribute's value is judged by `richTextAttribute` below.
40
+ */
41
+ export const RICH_TEXT_ELEMENTS = Object.freeze({
42
+ p: [],
43
+ br: [],
44
+ strong: [],
45
+ b: [],
46
+ em: [],
47
+ i: [],
48
+ s: [],
49
+ u: [],
50
+ a: ['href'],
51
+ h2: [],
52
+ h3: [],
53
+ h4: [],
54
+ ul: ['data-type'],
55
+ ol: ['start'],
56
+ li: ['data-type', 'data-checked'],
57
+ blockquote: [],
58
+ code: ['class'],
59
+ pre: [],
60
+ table: [],
61
+ thead: [],
62
+ tbody: [],
63
+ tr: [],
64
+ th: ['colspan', 'rowspan'],
65
+ td: ['colspan', 'rowspan'],
66
+ span: ['data-type', 'data-id', 'data-kind'],
67
+ img: ['src', 'alt'],
68
+ });
69
+ /** Elements dropped with everything inside them: their content is code or chrome, never words. */
70
+ export const RICH_TEXT_DROPPED = Object.freeze([
71
+ 'script',
72
+ 'style',
73
+ 'template',
74
+ 'iframe',
75
+ 'object',
76
+ 'embed',
77
+ 'noscript',
78
+ 'textarea',
79
+ 'select',
80
+ 'button',
81
+ 'svg',
82
+ 'math',
83
+ 'head',
84
+ 'title',
85
+ ]);
86
+ /** A link's address: the web, or mail. Everything else (javascript:, data:, a relative path) is no link. */
87
+ export function richTextHref(raw) {
88
+ const value = raw.trim();
89
+ if (!value || value.length > 2048 || /[\s\p{Cc}]/u.test(value))
90
+ return undefined;
91
+ try {
92
+ const url = new URL(value);
93
+ if (url.protocol === 'mailto:')
94
+ return value;
95
+ if ((url.protocol === 'http:' || url.protocol === 'https:') && url.hostname)
96
+ return value;
97
+ }
98
+ catch {
99
+ /* not an absolute address */
100
+ }
101
+ return undefined;
102
+ }
103
+ /** The parameters an attachment's picture address may carry, and nothing else. */
104
+ const IMAGE_PARAMS = new Set(['table', 'key', 'inline', 'variant']);
105
+ /**
106
+ * A picture's address, when it is one of this App's own attachments: the file
107
+ * route's inline mode for one row of a file resource,
108
+ * `/api/file?table=<resource>&key=<the row's key as JSON>&inline=1`. Relative
109
+ * to the App, so a mount point or a proxy's base path is the page's to add
110
+ * (`served`). `tables` narrows it to the App's file resources where the
111
+ * caller knows them (the server does). Anything else is no picture.
112
+ */
113
+ export function richTextImage(raw, tables) {
114
+ const value = raw.trim();
115
+ if (!value.startsWith('/api/file?') || value.length > 1024)
116
+ return undefined;
117
+ const params = new URLSearchParams(value.slice('/api/file?'.length));
118
+ const names = [...params.keys()];
119
+ if (names.some((name) => !IMAGE_PARAMS.has(name)) || new Set(names).size !== names.length)
120
+ return undefined;
121
+ const table = params.get('table');
122
+ if (!table || !/^[A-Za-z_][A-Za-z0-9_.]{0,127}$/.test(table) || (tables && !tables.has(table)))
123
+ return undefined;
124
+ if (params.get('inline') !== '1')
125
+ return undefined;
126
+ const variant = params.get('variant');
127
+ if (variant !== null && variant !== 'thumb')
128
+ return undefined;
129
+ let key;
130
+ try {
131
+ key = JSON.parse(params.get('key') ?? '');
132
+ }
133
+ catch {
134
+ return undefined;
135
+ }
136
+ if (!key ||
137
+ typeof key !== 'object' ||
138
+ Array.isArray(key) ||
139
+ !Object.keys(key).length ||
140
+ Object.keys(key).length > 4 ||
141
+ Object.entries(key).some(([column, item]) => !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(column) ||
142
+ !((typeof item === 'string' && item.length <= 256) || (typeof item === 'number' && Number.isFinite(item)))))
143
+ return undefined;
144
+ return { table, key: key };
145
+ }
146
+ /** The address a picture of one attachment row is stored as: the same form `richTextImage` reads. */
147
+ export function richTextImageAddress(table, key) {
148
+ return `/api/file?${new URLSearchParams({ table, key: JSON.stringify(key), inline: '1' })}`;
149
+ }
150
+ /**
151
+ * Whether an attribute's value is kept on an element: a link's address, a
152
+ * picture's, a task item's state, a list's kind, a mention's handle and
153
+ * whether it names a group, a code block's language, a cell's span. Undefined drops it. The caller has already
154
+ * checked the attribute is one the element keeps.
155
+ */
156
+ export function richTextAttribute(element, name, value, images) {
157
+ if (name === 'href')
158
+ return richTextHref(value);
159
+ if (name === 'src')
160
+ return richTextImage(value, images) ? value.trim() : undefined;
161
+ if (name === 'alt')
162
+ return value.slice(0, 300);
163
+ if (name === 'data-type') {
164
+ if (element === 'ul')
165
+ return value === 'taskList' ? value : undefined;
166
+ if (element === 'li')
167
+ return value === 'taskItem' ? value : undefined;
168
+ if (element === 'span')
169
+ return value === 'mention' ? value : undefined;
170
+ return undefined;
171
+ }
172
+ if (name === 'data-checked')
173
+ return value === 'true' || value === 'false' ? value : undefined;
174
+ if (name === 'data-kind')
175
+ return element === 'span' && value === 'group' ? value : undefined;
176
+ if (name === 'data-id')
177
+ return MENTION_HANDLE.test(value) ? value : undefined;
178
+ if (name === 'class')
179
+ return element === 'code' && /^language-[A-Za-z0-9_+-]{1,32}$/.test(value) ? value : undefined;
180
+ if (name === 'start' || name === 'colspan' || name === 'rowspan')
181
+ return /^[1-9][0-9]{0,2}$/.test(value) ? value : undefined;
182
+ return undefined;
183
+ }
184
+ /** Elements that end a line of the plain text: blocks, list items, a table's cells and rows. */
185
+ const BLOCK = /^(?:p|h[1-6]|li|blockquote|pre|tr|div|ul|ol|table|thead|tbody)$/i;
186
+ const ENTITIES = Object.freeze({
187
+ amp: '&',
188
+ lt: '<',
189
+ gt: '>',
190
+ quot: '"',
191
+ apos: "'",
192
+ nbsp: ' ',
193
+ });
194
+ function decode(text) {
195
+ return text.replace(/&(#x[0-9a-f]{1,6}|#[0-9]{1,7}|[a-z]{2,8});/gi, (whole, name) => {
196
+ if (name[0] === '#') {
197
+ const code = name[1] === 'x' || name[1] === 'X' ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);
198
+ return Number.isFinite(code) && code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff) ? String.fromCodePoint(code) : '';
199
+ }
200
+ return ENTITIES[name.toLowerCase()] ?? whole;
201
+ });
202
+ }
203
+ /* Text that ends in a list item's dash or box: the item's first paragraph goes on that line. */
204
+ const ITEM_MARK = /\n(?:- |\[[ x]\] )[^\S\n]*$/;
205
+ /**
206
+ * A rich text value's words: tags out, entities read, one line per block, a
207
+ * list item after a dash, a task with its box, a picture as its description.
208
+ * Pure text, never markup, whatever the value held — it is drawn as text.
209
+ */
210
+ export function richTextPlain(html) {
211
+ if (typeof html !== 'string' || !html)
212
+ return '';
213
+ let text = '';
214
+ const tag = /<(\/?)([A-Za-z][A-Za-z0-9]*)\b((?:[^>"']|"[^"]*"|'[^']*')*)>|<!--[\s\S]*?-->/g;
215
+ let at = 0;
216
+ const dropped = new Set(RICH_TEXT_DROPPED);
217
+ let skipping;
218
+ /* Outside a code block a line break in the source is a space, as a browser draws it. */
219
+ let pre = 0;
220
+ const words = (part) => (pre ? part : part.replace(/\s+/g, ' '));
221
+ for (const match of html.matchAll(tag)) {
222
+ if (!skipping)
223
+ text += words(html.slice(at, match.index));
224
+ at = match.index + match[0].length;
225
+ const [, closing, rawName, attributes = ''] = match;
226
+ if (!rawName)
227
+ continue;
228
+ const name = rawName.toLowerCase();
229
+ if (skipping) {
230
+ if (closing && name === skipping)
231
+ skipping = undefined;
232
+ continue;
233
+ }
234
+ if (!closing && dropped.has(name)) {
235
+ if (!/\/\s*$/.test(attributes))
236
+ skipping = name;
237
+ continue;
238
+ }
239
+ if (name === 'pre')
240
+ pre = Math.max(0, pre + (closing ? -1 : 1));
241
+ if (name === 'br')
242
+ text += '\n';
243
+ else if (!closing && name === 'li') {
244
+ const checked = /\bdata-checked\s*=\s*["']?(true|false)/i.exec(attributes)?.[1];
245
+ text += `\n${checked === 'true' ? '[x] ' : checked === 'false' ? '[ ] ' : '- '}`;
246
+ }
247
+ else if (!closing && name === 'img') {
248
+ const alt = /\balt\s*=\s*"([^"]*)"|\balt\s*=\s*'([^']*)'/i.exec(attributes);
249
+ const said = (alt?.[1] ?? alt?.[2] ?? '').trim();
250
+ if (said)
251
+ text += ` ${said} `;
252
+ }
253
+ else if ((name === 'td' || name === 'th') && closing)
254
+ text += '\t';
255
+ else if (BLOCK.test(name) && (closing || !ITEM_MARK.test(text)))
256
+ text += '\n';
257
+ }
258
+ if (!skipping)
259
+ text += words(html.slice(at));
260
+ return decode(text)
261
+ .replace(/[^\S\n\t]+/g, ' ')
262
+ .split('\n')
263
+ .map((line) => line
264
+ .replace(/[\t ]+$/, '')
265
+ .replace(/^[\t ]+/, '')
266
+ .replace(/\s*\t\s*/g, ' · '))
267
+ .filter(Boolean)
268
+ .join('\n');
269
+ }
270
+ /** A value's words in one line, cut at a word near `most` characters with an ellipsis: a cell, a card, an excerpt. */
271
+ export function richTextExcerpt(html, most = RICH_TEXT_EXCERPT) {
272
+ const line = richTextPlain(html).replace(/\s*\n\s*/g, ' · ');
273
+ if (line.length <= most)
274
+ return line;
275
+ const cut = line.slice(0, most);
276
+ const space = cut.lastIndexOf(' ');
277
+ return `${(space > most * 0.6 ? cut.slice(0, space) : cut).replace(/[\s·.,;:]+$/, '')}…`;
278
+ }
279
+ /** How many people and groups one value may @-mention: past it, it is a broadcast. */
280
+ const MOST_MENTIONED = 20;
281
+ /**
282
+ * Who a value @-mentions, as the editor stores them: a person as
283
+ * `<span data-type="mention" data-id="ada">`, a group (a team) with
284
+ * `data-kind="group"` beside it. Each once, in order, at most twenty in all.
285
+ * A mention is its stored handle, never the words drawn in it: the text
286
+ * `@Ada` inside the span is how it reads, and nobody is found by it.
287
+ */
288
+ export function richTextMentioned(html) {
289
+ const people = new Set(), groups = new Set();
290
+ if (typeof html !== 'string')
291
+ return { people: [], groups: [] };
292
+ for (const match of html.matchAll(/<span\b[^>]*\bdata-type\s*=\s*"mention"[^>]*>/gi)) {
293
+ if (people.size + groups.size >= MOST_MENTIONED)
294
+ break;
295
+ const id = /\bdata-id\s*=\s*"([^"]*)"/i.exec(match[0])?.[1];
296
+ if (!id || !MENTION_HANDLE.test(id))
297
+ continue;
298
+ (/\bdata-kind\s*=\s*"group"/i.test(match[0]) ? groups : people).add(id);
299
+ }
300
+ return { people: [...people], groups: [...groups] };
301
+ }
302
+ /** The people's handles a value @-mentions (`<span data-type="mention" data-id="ada">`), each once, in order; a group's are `richTextMentioned`'s. */
303
+ export function richTextMentions(html) {
304
+ return richTextMentioned(html).people;
305
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Rollups: one number about the rows that point at a record — an order's
3
+ * line total, an account's open deals — declared once on the resource
4
+ * (`rollups: { line_total: sum('order_line', 'amount') }`) and read wherever
5
+ * a column of the record is: a list's `show`, a sort, a tab's condition, a
6
+ * record page's fields, a card's figure and facts, a queue's facts, a
7
+ * picker's query, a dashboard's measure and a breakdown's key — and through
8
+ * a reference, as `sales_order_id.lines`, wherever a path is.
9
+ *
10
+ * A rollup is never a column of the table. It is not in `TableMeta.columns`,
11
+ * so every path that reads one table by its own columns — an insert form, a
12
+ * plain `/api/query`, an export of the table, a filter box built from the
13
+ * schema — never sees it and never sends it to a single-table read, which
14
+ * would be a statement naming a column the database does not have. It lives
15
+ * beside the columns (`TableMeta.rollups`), where the path resolver finds it
16
+ * by name, and it is compiled only by the view compiler, as a correlated
17
+ * scalar subquery through one reference: the same construction as a view's
18
+ * aggregates (viewPaths.ts says why a subquery rather than a grouped join),
19
+ * so a list still has one row per record however many rollups it shows.
20
+ *
21
+ * The child rows are read through the statement's own relations
22
+ * (rowScope.ts), so a row policy or a tenant scope on the child narrows the
23
+ * number exactly as it narrows a related list of the same rows, and a reader
24
+ * whose catalog cannot see the child table, its column or the reference is
25
+ * served no rollup at all (appRollupRules), rather than a number built from
26
+ * rows they may not read.
27
+ */
28
+ import type { Filter } from './filter.js';
29
+ import type { ComputedColumn } from './computed.js';
30
+ import type { ColumnMeta } from './schema.js';
31
+ export declare const ROLLUP_FNS: readonly ['count', 'sum', 'min', 'max', 'latest'];
32
+ export type RollupFn = (typeof ROLLUP_FNS)[number];
33
+ /** A rollup as the catalog serves it and a view carries it: no request ever supplies one. */
34
+ export interface Rollup {
35
+ fn: RollupFn;
36
+ /**
37
+ * The reference from the child rows to the record, as `child.column`
38
+ * (`+`-joined for a composite key): endpoints rather than a constraint
39
+ * name, so a layer that renames tables (an App's logical names, a
40
+ * source's prefix) can rewrite it without resolving anything.
41
+ */
42
+ via: string;
43
+ /** The child's column; absent for a count. */
44
+ column?: string;
45
+ /**
46
+ * A `latest`'s order: the child's column whose greatest value is the latest row (its key breaks a tie), and
47
+ * whose `column` the rollup reads — a payment's status, the last visit's outcome. A word about the rows, not a
48
+ * figure, so it is never summed. Through two references it is the inner level's: the outer reads the newest of
49
+ * all the rows joined to their middle record, not the newest of each middle's newest (viewLabels.ts).
50
+ */
51
+ by?: string;
52
+ /**
53
+ * A `latest` that reads a reference column (the newest lease's `resident_id`): the record it points at, so the value
54
+ * is drawn as that record's name and link and never as its key (referenceModel.ts).
55
+ */
56
+ references?: {
57
+ table: string;
58
+ column: string;
59
+ };
60
+ /**
61
+ * Set only on a rollup a path reads *through* (`resident.name`, viewPaths.ts): the value wanted is this column of the
62
+ * record the rollup's key names, read through that table's own relation, so a row policy narrows it as it narrows a
63
+ * join to the same record. The reader must be able to read both (rollupReads).
64
+ */
65
+ through?: {
66
+ table: string;
67
+ key: string;
68
+ column: string;
69
+ };
70
+ /** A `latest`'s vocabulary: the child column's own, so the word it reads is drawn, filtered and typed as that column is. */
71
+ allowed?: string[];
72
+ /**
73
+ * Set when `column` names a computed column of the child (computed.ts)
74
+ * rather than a stored one: its expression, constants folded, written
75
+ * inline over the child's row inside the aggregate — the same SQL a list
76
+ * of the child writes for it. It reads the child's own columns only, never
77
+ * a rollup or a reference (appRollupRules refuses those), so a rollup over
78
+ * it is still one subquery, and no rollup can come to read itself.
79
+ */
80
+ expression?: Pick<ComputedColumn, 'type' | 'expr' | 'reads'>;
81
+ /** Which child rows count — the rollup's `query`, over the child's own columns and paths through its references. */
82
+ filter?: Filter;
83
+ /**
84
+ * The computed columns of the child that `filter` names (`breached = true`), each its expression, constants
85
+ * and `now` folded: written over the row inside the narrowed relation, as `expression` is inside the aggregate.
86
+ * Each reads the child's own columns only (appRollupRules), so the figure is still one subquery.
87
+ */
88
+ computed?: Record<string, Pick<ComputedColumn, 'type' | 'expr' | 'reads'>>;
89
+ /**
90
+ * The tables a path in `filter` walks to, with the columns read there (`sales_order_id.status` reads
91
+ * `sales_order.id` and `sales_order.status`): what a reader must be able to read for the figure to be
92
+ * served (rollupReads), as the child's own columns are.
93
+ */
94
+ reach?: Array<{
95
+ table: string;
96
+ fields: string[];
97
+ }>;
98
+ /** The value's type: an integer for a count, the column's own otherwise. */
99
+ type: string;
100
+ /**
101
+ * Set when `column` names a rollup of the child rather than one of its
102
+ * columns — a customer's `lines: sum('sales_order', 'lines')`, the count
103
+ * of its orders' lines, which is how a rollup reaches two hops. The inner
104
+ * rollup is compiled inside the outer one's aggregate, each through its own
105
+ * child's relation, so a row policy narrows both levels. One level only:
106
+ * the inner one reads a column (appRollupRules says so when it does not).
107
+ *
108
+ * A rollup whose `whose` walks two references (`sum('time_entry', 'hours',
109
+ * { whose: 'task_id.project_id' })`) is served in the same shape: the outer
110
+ * reads the middle table (`task.project_id`) with no column of its own,
111
+ * the inner the rows and column declared, with the declared query. A count
112
+ * so built is the sum of the inner counts, and 0 where there are none; a
113
+ * max of maxes and a min of mins are the max and min of the rows; a latest
114
+ * is one ordered read over the rows joined to the middle table. The
115
+ * access layer holds a reader to both levels' tables and fields
116
+ * (rollupReads), as it does a rollup of a rollup.
117
+ */
118
+ of?: Rollup;
119
+ }
120
+ /**
121
+ * A rollup a view names, keyed by its path in `ViewDef.computed`: the rollup
122
+ * and the path prefix of the record it hangs off ('' for the view's base).
123
+ */
124
+ export interface ComputedPath extends Rollup {
125
+ on: string;
126
+ }
127
+ /** A rollup read as a column: never written, null only where there are no rows to read (a count is 0). */
128
+ export declare function rollupColumnMeta(name: string, rollup: Pick<Rollup, 'fn' | 'type' | 'allowed' | 'references'>): ColumnMeta;
129
+ /** A view's or a breakdown's `computed` with every child table renamed. */
130
+ export declare function renamedComputed<T extends {
131
+ computed?: Record<string, ComputedPath>;
132
+ }>(def: T, rename: (table: string) => string): T;
133
+ /**
134
+ * Every table a rollup reads rows of, with the fields it reads there: the
135
+ * reference it walks, the column it sums (not an inner rollup's name, which
136
+ * is no field, nor a computed column's, whose own reads stand for it) and
137
+ * the columns its query narrows by — the inner rollup's too. What an access
138
+ * layer holds a reader's grants against.
139
+ */
140
+ export declare function rollupReads(rollup: Rollup): Array<{
141
+ table: string;
142
+ fields: string[];
143
+ }>;
@@ -0,0 +1,64 @@
1
+ export const ROLLUP_FNS = ['count', 'sum', 'min', 'max', 'latest'];
2
+ /** A rollup read as a column: never written, null only where there are no rows to read (a count is 0). */
3
+ export function rollupColumnMeta(name, rollup) {
4
+ return {
5
+ name,
6
+ type: rollup.type,
7
+ nullable: rollup.fn !== 'count',
8
+ primaryKey: false,
9
+ writable: false,
10
+ ...(rollup.allowed ? { allowed: rollup.allowed } : {}),
11
+ ...(rollup.references ? { references: rollup.references } : {}),
12
+ };
13
+ }
14
+ /** The child table a rollup's `via` names. */
15
+ function rollupChild(via) {
16
+ return via.slice(0, via.lastIndexOf('.'));
17
+ }
18
+ /** `via` with its child table renamed — a layer mapping logical names to physical ones. */
19
+ function renamedVia(via, rename) {
20
+ const dot = via.lastIndexOf('.');
21
+ return `${rename(via.slice(0, dot))}${via.slice(dot)}`;
22
+ }
23
+ /** A rollup with every child table it reads renamed, the inner one's too. */
24
+ function renamedRollup(rollup, rename) {
25
+ return {
26
+ ...rollup,
27
+ via: renamedVia(rollup.via, rename),
28
+ ...(rollup.reach ? { reach: rollup.reach.map((read) => ({ ...read, table: rename(read.table) })) } : {}),
29
+ ...(rollup.references ? { references: { ...rollup.references, table: rename(rollup.references.table) } } : {}),
30
+ ...(rollup.through ? { through: { ...rollup.through, table: rename(rollup.through.table) } } : {}),
31
+ ...(rollup.of ? { of: renamedRollup(rollup.of, rename) } : {}),
32
+ };
33
+ }
34
+ /** A view's or a breakdown's `computed` with every child table renamed. */
35
+ export function renamedComputed(def, rename) {
36
+ return def.computed
37
+ ? { ...def, computed: Object.fromEntries(Object.entries(def.computed).map(([path, rollup]) => [path, renamedRollup(rollup, rename)])) }
38
+ : def;
39
+ }
40
+ /**
41
+ * Every table a rollup reads rows of, with the fields it reads there: the
42
+ * reference it walks, the column it sums (not an inner rollup's name, which
43
+ * is no field, nor a computed column's, whose own reads stand for it) and
44
+ * the columns its query narrows by — the inner rollup's too. What an access
45
+ * layer holds a reader's grants against.
46
+ */
47
+ export function rollupReads(rollup) {
48
+ const table = rollupChild(rollup.via);
49
+ const fields = [
50
+ ...rollup.via.slice(table.length + 1).split('+'),
51
+ ...(rollup.expression ? rollup.expression.reads : rollup.column && !rollup.of ? [rollup.column] : []),
52
+ ...(rollup.by === undefined ? [] : [rollup.by]),
53
+ // A path's first hop is the child's own reference column; the rest is in `reach`.
54
+ ...(rollup.filter?.groups ?? []).flatMap((group) => group.flatMap((c) => [c.column, ...(c.other === undefined ? [] : [c.other])].flatMap((name) =>
55
+ // A computed column's own reads stand for it, as `expression`'s do.
56
+ rollup.computed && Object.hasOwn(rollup.computed, name) ? rollup.computed[name].reads : name.split('.')[0].split('+')))),
57
+ ];
58
+ return [
59
+ { table, fields },
60
+ ...(rollup.reach ?? []),
61
+ ...(rollup.of ? rollupReads(rollup.of) : []),
62
+ ...(rollup.through ? [{ table: rollup.through.table, fields: [rollup.through.key, rollup.through.column] }] : []),
63
+ ];
64
+ }
@@ -0,0 +1,72 @@
1
+ import { type Filter, type SqlFragment, type SqlStyle } from './filter.js';
2
+ import { type DatabaseSchema } from './schema.js';
3
+ /** Internal, server-owned compiler input; never a member of a request definition.
4
+ * Exact catalog IDs only. With a scope present, missing resources deny rows.
5
+ * `true` explicitly allows all rows; filters address local columns, not paths.
6
+ * This primitive alone does not enable App authorization or tenant isolation.
7
+ */
8
+ export interface RowScopeFilter extends Filter {
9
+ /** Private SQLite comparison metadata, never SQL or a request filter field.
10
+ * Applies BINARY collation to these local columns; LIKE keeps its own semantics. */
11
+ readonly binary?: readonly string[];
12
+ }
13
+ export type RowScope = Readonly<Record<string, boolean | RowScopeFilter>>;
14
+ /** Composition must budget expanded data against the same capture limits. */
15
+ export declare const ROW_SCOPE_LIMITS: Readonly<{
16
+ resources: 256;
17
+ conditions: 2048;
18
+ array: 4096;
19
+ nodes: 16384;
20
+ string: 16384;
21
+ characters: 262144;
22
+ }>;
23
+ /** Copy before validation so accessors, prototypes and later mutation cannot
24
+ * change what was checked. Bounds apply to the entire scope, not each table.
25
+ * Frozen nested values stay private; Readonly<Record> alone is not a snapshot.
26
+ */
27
+ export declare function captureRowScope(input: RowScope): RowScope;
28
+ /** A scope's text, where the text says all of it: undefined for anything JSON would say the same as something else
29
+ * (an undefined value, which it drops; a non-finite number; an object that is not a plain record). Only for data
30
+ * nothing can intercept — a copy this module or the tenant capture made — never a caller's live object, whose
31
+ * accessors JSON.stringify would run. */
32
+ export declare function rowScopeText(value: unknown): string | undefined;
33
+ /** Test-only: how many row scopes were copied and checked in full rather than handed back. */
34
+ export declare const rowScopeCounters: {
35
+ checked: number;
36
+ };
37
+ /** Whether `value` is a row scope snapshotRowScope made: plain data, frozen all the way down, that nothing can change. */
38
+ export declare function isRowScopeSnapshot(value: unknown): boolean;
39
+ /** Capture can precede an async catalog load; catalog validation cannot. */
40
+ export declare function snapshotRowScope(schema: DatabaseSchema, input: RowScope): RowScope;
41
+ /** Every occurrence of a resource reads the same filtered relation, including
42
+ * LEFT JOIN targets and correlated aggregate children. CTE bindings precede
43
+ * outer filters, independent of SQL SELECT/FROM expression order. Call finish
44
+ * only after all relations have been discovered, then number outer bindings.
45
+ */
46
+ export declare class ScopedRelations {
47
+ private schema;
48
+ private style;
49
+ private readonly scope;
50
+ private readonly names;
51
+ private readonly reserved;
52
+ private readonly definitions;
53
+ private readonly params;
54
+ private finished;
55
+ private ordinal;
56
+ constructor(schema: DatabaseSchema, style: SqlStyle, scope?: RowScope);
57
+ table: (id: string) => string;
58
+ private readonly narrowed;
59
+ /**
60
+ * A table's rows narrowed by an authored filter over its own columns — the
61
+ * rows a rollup counts (rollups.ts) — as one more definition here. A CTE
62
+ * rather than a WHERE inside the correlated subquery, for the parameters:
63
+ * a subquery can sit in the SELECT list, the WHERE and the ORDER BY at
64
+ * once, and `?` placeholders bind by position, so values written there
65
+ * would interleave with the outer filter's. Here they bind first, with the
66
+ * scope's, and the subquery names the relation with no values of its own.
67
+ * Read from the scoped relation where there is a scope, so the filter
68
+ * narrows within the reader's rows, never beside them.
69
+ */
70
+ filtered: (id: string, filter: Filter, written?: Readonly<Record<string, (own: (column: string) => string) => string>>) => string;
71
+ finish(): SqlFragment;
72
+ }