@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,376 @@
1
+ /*
2
+ * Row scopes: the per-resource row filters a server-owned policy supplies,
3
+ * captured within fixed limits, and the scoped relations a read or write is
4
+ * compiled against. Shared so views and breakdowns compile under a scope
5
+ * through the same builder as a plain read.
6
+ */
7
+ import { buildWhere, OPS } from './filter.js';
8
+ import { Refusal } from './refusal.js';
9
+ import { findTable } from './schema.js';
10
+ import { isFixedScopeCatalog } from './scopeCatalog.js';
11
+ import { qualifiedTable } from './sqlRelation.js';
12
+ import { tryResolvePath } from './viewPaths.js';
13
+ /** Composition must budget expanded data against the same capture limits. */
14
+ export const ROW_SCOPE_LIMITS = Object.freeze({
15
+ resources: 256,
16
+ conditions: 2048,
17
+ array: 4096,
18
+ nodes: 16_384,
19
+ string: 16_384,
20
+ characters: 262_144,
21
+ });
22
+ const invalid = () => {
23
+ throw new Refusal('Invalid row scope.');
24
+ };
25
+ /** Copy before validation so accessors, prototypes and later mutation cannot
26
+ * change what was checked. Bounds apply to the entire scope, not each table.
27
+ * Frozen nested values stay private; Readonly<Record> alone is not a snapshot.
28
+ */
29
+ export function captureRowScope(input) {
30
+ let nodes = 0;
31
+ let characters = 0;
32
+ const copy = (value, depth = 0) => {
33
+ if (++nodes > ROW_SCOPE_LIMITS.nodes || depth > 8)
34
+ return invalid();
35
+ if (typeof value === 'string') {
36
+ characters += value.length;
37
+ if (value.length > ROW_SCOPE_LIMITS.string || characters > ROW_SCOPE_LIMITS.characters)
38
+ return invalid();
39
+ return value;
40
+ }
41
+ if (typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value)))
42
+ return value;
43
+ if (!value || typeof value !== 'object')
44
+ return invalid();
45
+ const array = Array.isArray(value);
46
+ const proto = Object.getPrototypeOf(value);
47
+ if (array ? proto !== Array.prototype : proto !== Object.prototype && proto !== null)
48
+ return invalid();
49
+ const keys = Reflect.ownKeys(value);
50
+ if (keys.length > ROW_SCOPE_LIMITS.array + 1)
51
+ return invalid();
52
+ if (array) {
53
+ const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
54
+ if (!Number.isInteger(length) || length > ROW_SCOPE_LIMITS.array || keys.length !== length + 1)
55
+ return invalid();
56
+ const result = [];
57
+ for (let i = 0; i < length; i++) {
58
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(i));
59
+ if (!descriptor || !('value' in descriptor) || !descriptor.enumerable)
60
+ return invalid();
61
+ result.push(copy(descriptor.value, depth + 1));
62
+ }
63
+ return Object.freeze(result);
64
+ }
65
+ const result = Object.create(null);
66
+ for (const key of keys) {
67
+ if (typeof key !== 'string')
68
+ return invalid();
69
+ characters += key.length;
70
+ if (key.length > ROW_SCOPE_LIMITS.string || characters > ROW_SCOPE_LIMITS.characters)
71
+ return invalid();
72
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
73
+ if (!('value' in descriptor) || !descriptor.enumerable)
74
+ return invalid();
75
+ result[key] = copy(descriptor.value, depth + 1);
76
+ }
77
+ return Object.freeze(result);
78
+ };
79
+ const scope = copy(input);
80
+ if (!scope || typeof scope !== 'object' || Array.isArray(scope) || Object.keys(scope).length > ROW_SCOPE_LIMITS.resources)
81
+ return invalid();
82
+ return scope;
83
+ }
84
+ /* The scopes this module copied, froze and checked, each with the catalogs it
85
+ was checked against. A tenant read snapshotted one request's scope again at
86
+ every layer it crossed — composed, authorized, bound, and once more per
87
+ statement — each a full copy and a scan of the catalog for every resource:
88
+ a field report's profile put it among the largest costs of a page. A
89
+ snapshot is frozen all the way down and was made here, never by a caller,
90
+ so checking it again against the same catalog object could only pass and
91
+ copy it to an equal value: it is handed back as it is. A catalog that can
92
+ still change is checked afresh every time, as before; anything a caller
93
+ built, however frozen, is copied every time and then found by its text
94
+ (below), never handed back as itself. */
95
+ const snapshots = new WeakMap();
96
+ const checkedAgainst = (scope, schema) => snapshots.get(scope)?.has(schema) === true;
97
+ /* And by what they say. A policy that names its reader (`owner_account_id = <the account>`) builds its scope afresh
98
+ on every request: a new object each time, equal to the last, so every request copied and checked it again, and
99
+ every cache keyed by a scope's identity downstream (tenantReadScope.ts compositions, the scoped reads' kept
100
+ statements) missed, composing and compiling afresh too — a field report's tenant App, whose staff scope names
101
+ two hundred tables and the reader, spent a sixth of a tenant enter there. The copy is still made, so nothing the
102
+ caller holds can change what is checked; it is then looked up by its text against a catalog nothing can change,
103
+ and an equal scope already checked against it is handed back. The text is the copy's own — plain strings,
104
+ booleans, finite numbers, arrays and records, nothing else survives captureRowScope — so equal text is an equal
105
+ scope. Bounded per catalog; a reader past the bound is checked as before. */
106
+ const byText = new WeakMap();
107
+ const BY_TEXT_HELD = 256;
108
+ /** A scope's text, where the text says all of it: undefined for anything JSON would say the same as something else
109
+ * (an undefined value, which it drops; a non-finite number; an object that is not a plain record). Only for data
110
+ * nothing can intercept — a copy this module or the tenant capture made — never a caller's live object, whose
111
+ * accessors JSON.stringify would run. */
112
+ export function rowScopeText(value) {
113
+ let plain = true;
114
+ const text = JSON.stringify(value, (_key, item) => {
115
+ if (item === undefined ||
116
+ (typeof item === 'number' && !Number.isFinite(item)) ||
117
+ (item !== null && typeof item === 'object' && !Array.isArray(item) && ![null, Object.prototype].includes(Object.getPrototypeOf(item))))
118
+ plain = false;
119
+ return item;
120
+ });
121
+ return plain ? text : undefined;
122
+ }
123
+ /** Test-only: how many row scopes were copied and checked in full rather than handed back. */
124
+ export const rowScopeCounters = { checked: 0 };
125
+ /** Whether `value` is a row scope snapshotRowScope made: plain data, frozen all the way down, that nothing can change. */
126
+ export function isRowScopeSnapshot(value) {
127
+ return value !== null && typeof value === 'object' && snapshots.has(value);
128
+ }
129
+ /** Capture can precede an async catalog load; catalog validation cannot. */
130
+ export function snapshotRowScope(schema, input) {
131
+ if (input !== null && typeof input === 'object' && checkedAgainst(input, schema))
132
+ return input;
133
+ const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
134
+ /* A snapshot checked against another catalog — the same policy's constant scope under a second deployment of the
135
+ App in this process, after a reload — is already plain frozen data this module made, so it is checked as it is
136
+ and kept against this catalog too. Copied, its copy was a new object each time, which the caches keyed by a
137
+ scope (tenantReadScope.ts) never found again: every request after a reload checked and composed afresh. */
138
+ const scope = isRowScopeSnapshot(input) ? input : captureRowScope(input);
139
+ const fixed = isFixedScopeCatalog(schema);
140
+ const text = fixed && scope !== input ? rowScopeText(scope) : undefined;
141
+ const held = text === undefined ? undefined : byText.get(schema);
142
+ const known = text === undefined ? undefined : held?.get(text);
143
+ if (known)
144
+ return known;
145
+ rowScopeCounters.checked++;
146
+ let conditions = 0;
147
+ for (const [id, policy] of Object.entries(scope)) {
148
+ const table = findTable(schema, id);
149
+ if (!table)
150
+ return invalid();
151
+ if (typeof policy === 'boolean')
152
+ continue;
153
+ if (!record(policy) ||
154
+ Object.keys(policy).some((key) => key !== 'groups' && key !== 'binary') ||
155
+ !Array.isArray(policy.groups) ||
156
+ !policy.groups.length)
157
+ return invalid();
158
+ if (Object.hasOwn(policy, 'binary')) {
159
+ if (schema.dialect !== 'sqlite' ||
160
+ !Array.isArray(policy.binary) ||
161
+ policy.binary.some((name) => typeof name !== 'string' || !table.columns.some((column) => column.name === name)) ||
162
+ new Set(policy.binary).size !== policy.binary.length)
163
+ return invalid();
164
+ }
165
+ for (const group of policy.groups) {
166
+ if (!Array.isArray(group) || !group.length)
167
+ return invalid();
168
+ for (const condition of group) {
169
+ if (++conditions > ROW_SCOPE_LIMITS.conditions || !record(condition))
170
+ return invalid();
171
+ if (Object.keys(condition).some((key) => !['column', 'op', 'value'].includes(key)))
172
+ return invalid();
173
+ if (typeof condition.column !== 'string' || !table.columns.some((column) => column.name === condition.column))
174
+ return invalid();
175
+ if (typeof condition.op !== 'string' || !OPS.has(condition.op))
176
+ return invalid();
177
+ if (condition.op === 'isNull' || condition.op === 'isNotNull') {
178
+ if (Object.hasOwn(condition, 'value'))
179
+ return invalid();
180
+ }
181
+ else if (condition.op === 'in') {
182
+ if (!Array.isArray(condition.value) || condition.value.some((value) => typeof value !== 'string' && typeof value !== 'number'))
183
+ return invalid();
184
+ }
185
+ else if (['contains', 'startsWith', 'endsWith', 'like'].includes(condition.op)) {
186
+ if (typeof condition.value !== 'string')
187
+ return invalid();
188
+ }
189
+ else if (!['string', 'number', 'boolean'].includes(typeof condition.value))
190
+ return invalid();
191
+ }
192
+ }
193
+ }
194
+ // Kept only against a catalog nothing can change; checked against one that can, it is checked again next time.
195
+ if (fixed) {
196
+ const against = snapshots.get(scope);
197
+ if (against)
198
+ against.add(schema);
199
+ else
200
+ snapshots.set(scope, new WeakSet([schema]));
201
+ if (text !== undefined) {
202
+ let kept = held;
203
+ if (!kept)
204
+ byText.set(schema, (kept = new Map()));
205
+ if (kept.size >= BY_TEXT_HELD)
206
+ kept.delete(kept.keys().next().value);
207
+ kept.set(text, scope);
208
+ }
209
+ }
210
+ return scope;
211
+ }
212
+ /**
213
+ * A scope with each group's repeated conditions said once. Composed scopes
214
+ * repeat themselves — a tenant's ownership condition and a membership rule
215
+ * that names the same column and value — and `"tenant_id" = $1 AND
216
+ * "tenant_id" = $2` is the same rows as either half, while the planner
217
+ * estimates it as two independent predicates and misjudges every join above
218
+ * it. Only a condition identical in every field is dropped:
219
+ * a conjunction of one condition with itself is that condition, so no row
220
+ * the scope admits or refuses changes.
221
+ */
222
+ function withoutRepeats(policy) {
223
+ return {
224
+ groups: policy.groups.map((group) => {
225
+ const seen = new Set();
226
+ return group.filter((condition) => {
227
+ // Every field, in a fixed order: a collation or a column comparison is a different condition.
228
+ const key = JSON.stringify(Object.keys(condition)
229
+ .sort()
230
+ .map((name) => [name, condition[name]]));
231
+ if (seen.has(key))
232
+ return false;
233
+ seen.add(key);
234
+ return true;
235
+ });
236
+ }),
237
+ };
238
+ }
239
+ /* A catalog's table names, lower-cased: what a scoped relation's name must not
240
+ shadow. The same for every statement compiled over a catalog nothing can
241
+ change, so it is listed once for such a catalog, not once per statement. */
242
+ const reservedOf = new WeakMap();
243
+ function reservedNames(schema) {
244
+ const kept = reservedOf.get(schema);
245
+ if (kept)
246
+ return kept;
247
+ const names = schema.tables.map((table) => table.name.toLowerCase());
248
+ if (isFixedScopeCatalog(schema))
249
+ reservedOf.set(schema, names);
250
+ return names;
251
+ }
252
+ /** Every occurrence of a resource reads the same filtered relation, including
253
+ * LEFT JOIN targets and correlated aggregate children. CTE bindings precede
254
+ * outer filters, independent of SQL SELECT/FROM expression order. Call finish
255
+ * only after all relations have been discovered, then number outer bindings.
256
+ */
257
+ export class ScopedRelations {
258
+ schema;
259
+ style;
260
+ scope;
261
+ names = new Map();
262
+ reserved;
263
+ definitions = [];
264
+ params = [];
265
+ finished = false;
266
+ ordinal = 0;
267
+ constructor(schema, style, scope) {
268
+ this.schema = schema;
269
+ this.style = style;
270
+ this.scope = scope === undefined ? undefined : snapshotRowScope(schema, scope);
271
+ this.reserved = new Set(reservedNames(schema));
272
+ }
273
+ table = (id) => {
274
+ if (this.scope === undefined)
275
+ return qualifiedTable(this.schema, id, this.style);
276
+ const existing = this.names.get(id);
277
+ if (existing)
278
+ return this.style.quote(existing);
279
+ if (this.finished)
280
+ throw new Error('Row scope relations must be planned before outer parameters.');
281
+ const table = findTable(this.schema, id);
282
+ if (!table || !table.columns.length)
283
+ return invalid();
284
+ // '$' cannot occur in JoinPlan's sanitized aliases; catalog names still
285
+ // need a case-insensitive collision check to avoid CTE self-shadowing.
286
+ let name;
287
+ do {
288
+ name = `_tw_scope$${++this.ordinal}`;
289
+ } while (this.reserved.has(name.toLowerCase()));
290
+ this.reserved.add(name.toLowerCase());
291
+ this.names.set(id, name);
292
+ const policy = this.scope[id] ?? false;
293
+ const where = typeof policy === 'boolean'
294
+ ? { text: policy ? '' : ' WHERE 1 = 0', params: [] }
295
+ : buildWhere(withoutRepeats(policy), this.style, this.params.length + 1, (column) => this.style.quote(column) + (policy.binary?.includes(column) ? ' COLLATE BINARY' : ''));
296
+ const columns = table.columns.map((column) => this.style.quote(column.name)).join(', ');
297
+ // The style's hint (cteHint) goes between AS and the body: Postgres inlines the CTE, so the
298
+ // scope's predicate meets the read's own filter, sort and limit instead of a copied slice.
299
+ this.definitions.push(`${this.style.quote(name)} AS${this.style.cteHint ?? ''} (SELECT ${columns} FROM ${qualifiedTable(this.schema, id, this.style)}${where.text})`);
300
+ this.params.push(...where.params);
301
+ return this.style.quote(name);
302
+ };
303
+ narrowed = new Map();
304
+ /**
305
+ * A table's rows narrowed by an authored filter over its own columns — the
306
+ * rows a rollup counts (rollups.ts) — as one more definition here. A CTE
307
+ * rather than a WHERE inside the correlated subquery, for the parameters:
308
+ * a subquery can sit in the SELECT list, the WHERE and the ORDER BY at
309
+ * once, and `?` placeholders bind by position, so values written there
310
+ * would interleave with the outer filter's. Here they bind first, with the
311
+ * scope's, and the subquery names the relation with no values of its own.
312
+ * Read from the scoped relation where there is a scope, so the filter
313
+ * narrows within the reader's rows, never beside them.
314
+ */
315
+ filtered = (id, filter, written) => {
316
+ const key = `${id}\u0000${JSON.stringify(filter)}\u0000${Object.keys(written ?? {}).join(',')}`;
317
+ const existing = this.narrowed.get(key);
318
+ if (existing)
319
+ return this.style.quote(existing);
320
+ if (this.finished)
321
+ throw new Error('Filtered relations must be planned before outer parameters.');
322
+ const source = this.table(id);
323
+ const table = findTable(this.schema, id);
324
+ if (!table || !table.columns.length)
325
+ return invalid();
326
+ let name;
327
+ do {
328
+ name = `_tw_scope$${++this.ordinal}`;
329
+ } while (this.reserved.has(name.toLowerCase()));
330
+ this.reserved.add(name.toLowerCase());
331
+ this.narrowed.set(key, name);
332
+ const q = this.style.quote;
333
+ /* A path (`sales_order_id.status`) is the column it lands on, read by one scalar subquery that walks
334
+ its references from this row through the statement's relations — so a row policy on the order
335
+ narrows what the path can see, as it does a list's join. Planned before the WHERE is written, for
336
+ the parameters: a relation's own scope binds ahead of this filter's values. */
337
+ const named = filter.groups.flatMap((group) => group.flatMap((c) => [c.column, ...(c.other === undefined ? [] : [c.other])]));
338
+ const row = named.some((column) => column.includes('.')) ? '_tw_row' : undefined;
339
+ const own = (column) => (row ? `${q(row)}.${q(column)}` : q(column));
340
+ const paths = new Map();
341
+ for (const path of named) {
342
+ // A computed column of the row (a rollup's query, rollups.ts `computed`): its expression over this row's columns.
343
+ if (written && Object.hasOwn(written, path)) {
344
+ if (!paths.has(path))
345
+ paths.set(path, `(${written[path](own)})`);
346
+ continue;
347
+ }
348
+ if (!path.includes('.') || paths.has(path))
349
+ continue;
350
+ const { resolved } = tryResolvePath(this.schema, id, path);
351
+ if (!resolved || !resolved.hops.length || resolved.rollup || resolved.computed || resolved.tags || resolved.jsonKey)
352
+ return invalid();
353
+ const aliases = resolved.hops.map(() => `_tw_hop$${++this.ordinal}`);
354
+ const joins = resolved.hops.map((hop, at) => {
355
+ const on = hop.to.columns
356
+ .map((to, i) => `${q(aliases[at])}.${q(to)} = ${at ? `${q(aliases[at - 1])}.${q(hop.from.columns[i])}` : own(hop.from.columns[i])}`)
357
+ .join(' AND ');
358
+ return { relation: `${this.table(hop.to.table)} ${q(aliases[at])}`, on };
359
+ });
360
+ const [first, ...rest] = joins;
361
+ paths.set(path, `(SELECT ${q(aliases[aliases.length - 1])}.${q(resolved.column.name)} FROM ${first.relation}` +
362
+ rest.map((join) => ` JOIN ${join.relation} ON ${join.on}`).join('') +
363
+ ` WHERE ${first.on})`);
364
+ }
365
+ const local = (column) => paths.get(column) ?? own(column);
366
+ const where = buildWhere(filter, this.style, this.params.length + 1, local, local);
367
+ const columns = table.columns.map((column) => q(column.name)).join(', ');
368
+ this.definitions.push(`${q(name)} AS (SELECT ${columns} FROM ${source}${row ? ` ${q(row)}` : ''}${where.text})`);
369
+ this.params.push(...where.params);
370
+ return this.style.quote(name);
371
+ };
372
+ finish() {
373
+ this.finished = true;
374
+ return { text: this.definitions.length ? `WITH ${this.definitions.join(',\n ')}\n` : '', params: [...this.params] };
375
+ }
376
+ }
@@ -0,0 +1,44 @@
1
+ export declare const RUNTIME_TABLE_PREFIXES: readonly ["__mistri_"];
2
+ /** Reserved physical table names are runtime state, never App resources.
3
+ * Pass an unqualified table name, not a SQL fragment or logical alias. */
4
+ export declare const isRuntimeTable: (name: string) => boolean;
5
+ export type RuntimeDialect = 'postgres' | 'sqlite';
6
+ /** The PostgreSQL schema every runtime table lives in, under its plain name: the command journal,
7
+ * the tenant store, sign-in (Better Auth's tables, renamed `auth_*`), flags (`flag_*`),
8
+ * experiments (`experiment_*`), analytics (`analytics_*`) and a suite's stores (`suite_*`).
9
+ * A schema rather than a prefix in `public` because a grant on `public` then reaches none of it,
10
+ * `pg_dump -n` splits the App from the runtime, and the migration diff, scoped to the App's
11
+ * schema, never sees it. The database browser and the App catalog hide it by this name. */
12
+ export declare const RUNTIME_SCHEMA = "mistri";
13
+ /** The one placement function: a runtime table's qualified, quoted SQL name. Postgres
14
+ * `mistri."x"`, SQLite `main."__mistri_x"`. */
15
+ export declare const runtimeTable: (dialect: RuntimeDialect, name: string) => string;
16
+ /** The schema a dialect's runtime tables sit in: for the pinned layouts and catalog readers that
17
+ * name a schema without a table. */
18
+ export declare const runtimeSchema: (dialect: 'postgres' | 'sqlite') => string;
19
+ /** The same placement as catalog coordinates: what `information_schema`, `pg_class` and
20
+ * `sqlite_schema` readers compare against. Postgres names the table plainly; the others keep the prefix. */
21
+ export declare const runtimeRelation: (dialect: RuntimeDialect, name: string) => {
22
+ schema: string;
23
+ relname: string;
24
+ };
25
+ /** A runtime name as this dialect spells it, unqualified: an index, a sequence or a key a store
26
+ * pins beside its tables, or a store's name prefix for a catalog scan (`__mistri_job_` is
27
+ * `job_` inside the Postgres schema). */
28
+ export declare const runtimeName: (dialect: RuntimeDialect, name: string) => string;
29
+ /** Whether a catalog relation is runtime state on this dialect: on Postgres anything in the
30
+ * runtime schema, whatever it is called; elsewhere a prefixed name (in `main` on SQLite). */
31
+ export declare const isRuntimeRelation: (dialect: RuntimeDialect, schema: string | null, name: string) => boolean;
32
+ /** The functions the runtime schema may hold beside its tables, each a store's own (the epoch
33
+ * trigger's, and the append-only triggers of flags, experiments and analytics). Ownership checks
34
+ * count anything else there, a function, operator or type, as planted: Better Auth resolves its
35
+ * unqualified names through this schema. */
36
+ export declare const RUNTIME_SCHEMA_FUNCTIONS: readonly string[];
37
+ /** The store prefixes whose owner may be a role other than the schema's: a suite's flag or
38
+ * experiment control can run as its own role, granted USAGE and CREATE on the runtime schema.
39
+ * Such a grant is not a foreign one (adapters/postgresRuntimeSchema.ts). */
40
+ export declare const RUNTIME_CONTROL_PREFIXES: readonly string[];
41
+ /** A store's table names (each as its SQLite layout pins it) as PostgreSQL spells them
42
+ * inside the runtime schema: what its pinned PostgreSQL layout and the names derived from a
43
+ * table's (`<table>_pkey`, `<table>_id_seq`) are built from. */
44
+ export declare const postgresRuntimeNames: <T extends Readonly<Record<string, string>>>(tables: T) => { readonly [K in keyof T]: string; };
@@ -0,0 +1,79 @@
1
+ /** The prefix every table of the App framework's own runtime state carries on SQLite, in
2
+ * the App's own database. On PostgreSQL the runtime has a schema of its own instead (`RUNTIME_SCHEMA`),
3
+ * but an App table named with the prefix is still refused there (adapters/reservedSql.ts), so one
4
+ * rule about names holds on every engine. */
5
+ const RUNTIME_TABLE_PREFIX = '__mistri_';
6
+ export const RUNTIME_TABLE_PREFIXES = Object.freeze([RUNTIME_TABLE_PREFIX]);
7
+ /** Reserved physical table names are runtime state, never App resources.
8
+ * Pass an unqualified table name, not a SQL fragment or logical alias. */
9
+ export const isRuntimeTable = (name) => {
10
+ const lower = name.toLowerCase();
11
+ return RUNTIME_TABLE_PREFIXES.some((prefix) => lower.startsWith(prefix));
12
+ };
13
+ /** The PostgreSQL schema every runtime table lives in, under its plain name: the command journal,
14
+ * the tenant store, sign-in (Better Auth's tables, renamed `auth_*`), flags (`flag_*`),
15
+ * experiments (`experiment_*`), analytics (`analytics_*`) and a suite's stores (`suite_*`).
16
+ * A schema rather than a prefix in `public` because a grant on `public` then reaches none of it,
17
+ * `pg_dump -n` splits the App from the runtime, and the migration diff, scoped to the App's
18
+ * schema, never sees it. The database browser and the App catalog hide it by this name. */
19
+ export const RUNTIME_SCHEMA = 'mistri';
20
+ /** Where each dialect puts the runtime tables. */
21
+ const PLACEMENT = Object.freeze({
22
+ postgres: RUNTIME_SCHEMA,
23
+ sqlite: 'main',
24
+ });
25
+ /** A runtime table's logical name, whether the caller holds it bare (`history_change`) or as the
26
+ * physical name its store pins on SQLite (`__mistri_history_change`). Anything else is not
27
+ * a table name, so it is refused here instead of being quoted. */
28
+ const logicalName = (name) => {
29
+ const bare = name.startsWith(RUNTIME_TABLE_PREFIX) ? name.slice(RUNTIME_TABLE_PREFIX.length) : name;
30
+ if (bare === '' || /[^a-z0-9_$]/i.test(bare))
31
+ throw new Error(`Not a runtime table name: ${JSON.stringify(name)}.`);
32
+ return bare;
33
+ };
34
+ /** The one placement function: a runtime table's qualified, quoted SQL name. Postgres
35
+ * `mistri."x"`, SQLite `main."__mistri_x"`. */
36
+ export const runtimeTable = (dialect, name) => {
37
+ const { schema, relname } = runtimeRelation(dialect, name);
38
+ return `${schema}."${relname}"`;
39
+ };
40
+ /** The schema a dialect's runtime tables sit in: for the pinned layouts and catalog readers that
41
+ * name a schema without a table. */
42
+ export const runtimeSchema = (dialect) => PLACEMENT[dialect];
43
+ /** The same placement as catalog coordinates: what `information_schema`, `pg_class` and
44
+ * `sqlite_schema` readers compare against. Postgres names the table plainly; the others keep the prefix. */
45
+ export const runtimeRelation = (dialect, name) => ({
46
+ schema: PLACEMENT[dialect],
47
+ relname: dialect === 'postgres' ? logicalName(name) : `${RUNTIME_TABLE_PREFIX}${logicalName(name)}`,
48
+ });
49
+ /** A runtime name as this dialect spells it, unqualified: an index, a sequence or a key a store
50
+ * pins beside its tables, or a store's name prefix for a catalog scan (`__mistri_job_` is
51
+ * `job_` inside the Postgres schema). */
52
+ export const runtimeName = (dialect, name) => runtimeRelation(dialect, name).relname;
53
+ /** Whether a catalog relation is runtime state on this dialect: on Postgres anything in the
54
+ * runtime schema, whatever it is called; elsewhere a prefixed name (in `main` on SQLite). */
55
+ export const isRuntimeRelation = (dialect, schema, name) => {
56
+ if (dialect === 'postgres')
57
+ return schema !== null && schema.toLowerCase() === RUNTIME_SCHEMA;
58
+ if (dialect === 'sqlite' && schema !== PLACEMENT.sqlite)
59
+ return false;
60
+ return isRuntimeTable(name);
61
+ };
62
+ /** The functions the runtime schema may hold beside its tables, each a store's own (the epoch
63
+ * trigger's, and the append-only triggers of flags, experiments and analytics). Ownership checks
64
+ * count anything else there, a function, operator or type, as planted: Better Auth resolves its
65
+ * unqualified names through this schema. */
66
+ export const RUNTIME_SCHEMA_FUNCTIONS = Object.freeze([
67
+ 'schema_epoch_bump',
68
+ 'flag_immutable',
69
+ 'experiment_immutable',
70
+ 'analytics_append_only',
71
+ ]);
72
+ /** The store prefixes whose owner may be a role other than the schema's: a suite's flag or
73
+ * experiment control can run as its own role, granted USAGE and CREATE on the runtime schema.
74
+ * Such a grant is not a foreign one (adapters/postgresRuntimeSchema.ts). */
75
+ export const RUNTIME_CONTROL_PREFIXES = Object.freeze(['flag_', 'experiment_']);
76
+ /** A store's table names (each as its SQLite layout pins it) as PostgreSQL spells them
77
+ * inside the runtime schema: what its pinned PostgreSQL layout and the names derived from a
78
+ * table's (`<table>_pkey`, `<table>_id_seq`) are built from. */
79
+ export const postgresRuntimeNames = (tables) => Object.freeze(Object.fromEntries(Object.entries(tables).map(([key, name]) => [key, runtimeName('postgres', name)])));