@mistriwork/engine 0.0.0 → 1.0.0-rc.9

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 +16 -1
  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 +62 -0
  386. package/dist/shared/keysetPage.js +159 -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 +262 -3
  545. package/schema/model.d.ts +298 -0
  546. package/schema/theme.d.ts +587 -0
@@ -0,0 +1,43 @@
1
+ import { TransactionOutcomeUnknown } from '../adapters/adapter.js';
2
+ import { snapshotScopedData } from '../adapters/scoped/scopedReads.js';
3
+ /** Owns completion/publication only. The supplied transaction and work retain
4
+ * their original authorization, record fences and image-capture contracts.
5
+ * No registry, fallback writer or way to upgrade a scoped capability exists. */
6
+ export async function runRecordedTransaction(options) {
7
+ if (options.mode === 'preview') {
8
+ const transaction = options.transaction.bind(options), work = options.work.bind(options);
9
+ return { result: await transaction(work) };
10
+ }
11
+ const transaction = options.transaction.bind(options), work = options.work.bind(options);
12
+ const history = options.history;
13
+ const publish = history.publish.bind(history), quarantine = history.quarantine.bind(history);
14
+ const isRejection = options.isRejection.bind(options);
15
+ // Validate without accessors/prototypes, then retain the journal's ordinary
16
+ // data-object shape while detaching every nested value.
17
+ const uncertainty = structuredClone(snapshotScopedData(options.uncertainty));
18
+ let committed = false;
19
+ try {
20
+ const stored = await transaction(async (tx) => {
21
+ const prepared = await work(tx);
22
+ // Malformed evidence must fail inside the transaction, not after COMMIT.
23
+ // Detach before the writer's completion wait so retained callback objects
24
+ // cannot rewrite the history that will be published after commit.
25
+ return { result: prepared.result, entry: structuredClone(snapshotScopedData(prepared.entry)) };
26
+ });
27
+ committed = true;
28
+ const entry = publish(stored.entry);
29
+ return { result: stored.result, ...(entry.revertible ? { undoId: entry.id } : {}) };
30
+ }
31
+ catch (error) {
32
+ if (committed || error instanceof TransactionOutcomeUnknown || !isRejection(error)) {
33
+ try {
34
+ publish(uncertainty);
35
+ }
36
+ catch {
37
+ quarantine();
38
+ }
39
+ throw error instanceof TransactionOutcomeUnknown ? error : new TransactionOutcomeUnknown(error);
40
+ }
41
+ throw error;
42
+ }
43
+ }
@@ -0,0 +1,111 @@
1
+ import { Refusal, type Adapter, type DeleteRequest, type DeleteResult, type InsertRequest, type InsertResult, type UpdateRequest, type UpdateResult, type WriteTransaction } from '../adapters/adapter.js';
2
+ import { recordWrite } from './journal.js';
3
+ import { type DatabaseSchema, type ForeignKey } from '../shared/schema.js';
4
+ interface RecordWriteOptions {
5
+ adapter: Adapter;
6
+ connection: string;
7
+ /** Owns logical/physical mapping and verified account attribution for every entry. */
8
+ record?: typeof recordWrite;
9
+ /** Verified history ownership, paired with the exact physical connection.
10
+ * Used to fail closed if publishing even an uncertainty barrier fails. */
11
+ historyOwner?: {
12
+ principal?: string;
13
+ app?: string;
14
+ };
15
+ completeInverse?: boolean;
16
+ by?: string;
17
+ /** False where an App writes: it has no Undo, so nothing is journaled (unrecorded). */
18
+ journal?: boolean;
19
+ }
20
+ type Recorded<Result> = {
21
+ result: Result;
22
+ undoId?: number;
23
+ };
24
+ /** What else a deletion may change: see recordedDelete. */
25
+ interface Dependents {
26
+ references?: readonly ForeignKey[];
27
+ unseen?: boolean;
28
+ }
29
+ /** One row of a new record's lines as a save sends it: the values the reader set. */
30
+ export interface LineRow {
31
+ values: Record<string, string | number | boolean | null>;
32
+ }
33
+ /**
34
+ * One collection of a record's lines, judged by the route (formLinesWrite.ts):
35
+ * the child table, the reference that joins a row to the record and the
36
+ * record's column it holds, the column the rows' places
37
+ * fill, and every row, in order.
38
+ */
39
+ export interface LineCollection {
40
+ table: string;
41
+ whose: string;
42
+ refers: string;
43
+ order?: string;
44
+ rows: readonly LineRow[];
45
+ /** Filled as the lines are written: the key of every row inserted, for the search index to follow once the transaction commits. */
46
+ written?: Record<string, string | number>[];
47
+ }
48
+ /**
49
+ * A record's lines, written in its transaction once the record is: each row
50
+ * the insert the reader could make of it alone, so the
51
+ * App's adapter judges every one (grants, validation, transitions) and a
52
+ * refusal of any rolls back the record with them. A refused row's fields
53
+ * cross as `table[i].field`, so the form marks the line, not the record.
54
+ */
55
+ /**
56
+ * A refusal that names the fields it turned down — the App framework's
57
+ * validation (app/appValidationDenied.ts) — said again by a line with each
58
+ * field at the line's place, so the form marks the line, not the record.
59
+ */
60
+ export interface FieldRefusal extends Refusal {
61
+ readonly fields: readonly string[];
62
+ renamed(rename: (field: string) => string): Refusal;
63
+ }
64
+ /**
65
+ * What writes a record's lines: the transaction itself where its adapter
66
+ * judges every row, or, under a row policy or a tenant lease, that writer's
67
+ * own facade — its transitions, its stamps, its deletion policy — so a line
68
+ * is held to exactly what the same row would be held to alone.
69
+ */
70
+ export type LineWriter = Pick<WriteTransaction, 'query' | 'insert' | 'lockRecord'> & {
71
+ update(request: UpdateRequest): Promise<unknown>;
72
+ remove(request: DeleteRequest): Promise<unknown>;
73
+ };
74
+ export declare function writeLines(tx: LineWriter, lines: readonly LineCollection[], record: Readonly<Record<string, unknown>> | undefined): Promise<void>;
75
+ export declare function recordedUpdate(options: RecordWriteOptions, input: UpdateRequest): Promise<Recorded<UpdateResult>>;
76
+ export declare function recordedInsert(options: RecordWriteOptions, input: InsertRequest,
77
+ /** Rows that go with the new one, in its transaction, made from it: a record's tag links (tagLists.ts). */
78
+ alongside?: (result: InsertResult) => readonly InsertRequest[],
79
+ /** The new record's lines (`form.lines`), inserted in its transaction and joined to it (formLinesWrite.ts). */
80
+ lines?: readonly LineCollection[]): Promise<Recorded<InsertResult>>;
81
+ /**
82
+ * Many new rows of one table in one transaction, recorded as one entry: an
83
+ * import. Undo removes every row it added or none, as a single insert's
84
+ * does, and only when each row's whole stored image could be captured; one
85
+ * that could not makes the entry a barrier that says why.
86
+ */
87
+ export declare function recordedImport(options: RecordWriteOptions, inputs: readonly InsertRequest[], checkpoint?: () => void): Promise<Recorded<InsertResult[]>>;
88
+ /**
89
+ * Captures this row only. A database-owned cascade (or `set null`) is not a
90
+ * graph Undo: putting the parent back would leave its children gone or
91
+ * emptied, which is half an undo. So when one of `dependents.references` —
92
+ * the incoming references whose rule changes the rows behind them, named as
93
+ * this writer names them — has a row pointing at this one, read on the same
94
+ * writer before the delete, the entry is a barrier that says why, and the
95
+ * deletion is undone whole or not at all. `dependents.unseen` says such a
96
+ * reference exists from a table this writer cannot read (one an App does not
97
+ * declare): it cannot be counted here, so it is a barrier whatever it holds.
98
+ */
99
+ export declare function recordedDelete(options: RecordWriteOptions, input: DeleteRequest, dependents?: Dependents): Promise<Recorded<DeleteResult>>;
100
+ /** The incoming references a deletion of `table` would change rows through:
101
+ * every rule but a refusal, an unreported one included. */
102
+ export declare function changingReferences(schema: DatabaseSchema, table: string): ForeignKey[];
103
+ /**
104
+ * A deletion's dependents read off the database's own catalog, never an
105
+ * App's reduced one: a cascade into a table the App does not declare still
106
+ * happens. `physical` is the connection's catalog and `table` its name there;
107
+ * `writerName` gives the name the writer reads a physical table by, or
108
+ * undefined when it cannot read it — which makes the reference unseen.
109
+ */
110
+ export declare function deletionDependents(physical: DatabaseSchema, table: string, writerName: (physicalTable: string) => string | undefined): Dependents;
111
+ export {};
@@ -0,0 +1,329 @@
1
+ import { Refusal, WriteConflict, } from '../adapters/adapter.js';
2
+ import { snapshotScopedData } from '../adapters/scoped/scopedReads.js';
3
+ import { inRecordLane } from '../adapters/writeLanes.js';
4
+ import { withWriteAhead } from '../adapters/writeAhead.js';
5
+ import { isPoolBusy } from '../adapters/poolMetrics.js';
6
+ import { writeFailureOutcome } from './constraints.js';
7
+ import { journalFieldsMatch, journalImageMatches, quarantineHistory, recordWrite, summarise, } from './journal.js';
8
+ import { runRecordedTransaction } from './recordHistoryOperations.js';
9
+ import { referencesTo } from '../shared/schema.js';
10
+ import { carryServerRequest } from './serverRequests.js';
11
+ function barrier(kind, table, reason, unknown = false) {
12
+ const entry = {
13
+ kind,
14
+ summary: reason,
15
+ reason,
16
+ revertible: false,
17
+ ...(unknown ? { undoState: 'unknown' } : { blocksUndo: true }),
18
+ // Keep the logical resource for source attribution, but no record values.
19
+ steps: [{ table }],
20
+ };
21
+ return entry;
22
+ }
23
+ async function recorded(options, kind, table, run) {
24
+ const { adapter: writer, record = recordWrite, connection, by } = options;
25
+ const historyOwner = options.historyOwner ? { ...options.historyOwner } : undefined;
26
+ if (!writer.transaction)
27
+ throw new Refusal('Recorded writes require a supported transaction writer.');
28
+ return runRecordedTransaction({
29
+ mode: 'write',
30
+ transaction: writer.transaction.bind(writer),
31
+ work: run,
32
+ history: {
33
+ publish: (entry) => record(connection, { ...entry, ...(by ? { by } : {}) }),
34
+ quarantine: () => quarantineHistory(connection, historyOwner),
35
+ },
36
+ uncertainty: {
37
+ ...barrier(kind, table, 'Write outcome or history unconfirmed. Refresh and reconcile before further editing.', true),
38
+ revertible: false,
39
+ undoState: 'unknown',
40
+ },
41
+ // A refused checkout: no writer was leased, or the transaction rolled back (a failed rollback is an unknown outcome, which isPoolBusy does not claim).
42
+ isRejection: (error) => error instanceof Refusal || error instanceof WriteConflict || isPoolBusy(error) || writeFailureOutcome(error) === 'rejected',
43
+ });
44
+ }
45
+ /**
46
+ * An App's write. An App has no Undo, so it keeps no journal entry and
47
+ * captures no images for one; what it keeps is the transaction and the row
48
+ * lock the journal's capture ran in. Inside them the App's adapter judges
49
+ * transitions on the locked row and validates the stored row after the
50
+ * write, and a refusal there rolls the write back — the reasons a single
51
+ * statement would not do. The lane (writeLanes.ts) keeps saves of one
52
+ * record in the order they arrived, now that saves of different records
53
+ * run side by side.
54
+ */
55
+ async function unrecorded(options, request, run) {
56
+ const writer = options.adapter;
57
+ if (!writer.transaction)
58
+ throw new Refusal('Writes require a supported transaction writer.');
59
+ const work = () => writer.transaction(run);
60
+ return { result: await (request.key ? inRecordLane(request.table, request.key, work) : work()) };
61
+ }
62
+ async function original(tx, request, columns) {
63
+ // Merely using the writer handle is not enough under READ COMMITTED: another
64
+ // transaction could change the row between SELECT and mutation. The adapter
65
+ // owns the dialect-specific row lock (or SQLite's existing writer fence).
66
+ if (!tx.lockRecord)
67
+ throw new Refusal('Recorded writes require a transaction record-lock capability.');
68
+ await tx.lockRecord({ table: request.table, key: request.key });
69
+ return rowAt(tx, request, columns);
70
+ }
71
+ async function rowAt(tx, request, columns) {
72
+ const result = await tx.query({
73
+ table: request.table,
74
+ ...(columns ? { columns } : {}),
75
+ filter: { groups: [Object.entries(request.key).map(([column, value]) => ({ column, op: '=', value }))] },
76
+ limit: 2,
77
+ offset: 0,
78
+ });
79
+ return result.rows.length === 1 ? { ...snapshotScopedData(result.rows[0]) } : undefined;
80
+ }
81
+ const isFieldRefusal = (error) => error instanceof Refusal && typeof error.renamed === 'function';
82
+ export async function writeLines(tx, lines, record) {
83
+ for (const line of lines) {
84
+ /* A transaction tried again writes them again: only the last attempt's keys stand. */
85
+ const written = (line.written = []);
86
+ const bound = record?.[line.refers];
87
+ if (typeof bound !== 'string' && typeof bound !== 'number')
88
+ throw new Refusal("The record's key was not read back, so its lines cannot be joined to it.");
89
+ const marked = async (i, work) => {
90
+ try {
91
+ return await work();
92
+ }
93
+ catch (error) {
94
+ if (!isFieldRefusal(error))
95
+ throw error;
96
+ /* The table's own name, unqualified: a field crosses as one segment and a column (fieldErrors.ts). */
97
+ throw error.renamed((name) => `${line.table.slice(line.table.lastIndexOf('.') + 1)}[${i}].${name}`);
98
+ }
99
+ };
100
+ const placed = (row, i) => ({ ...row.values, ...(line.order ? { [line.order]: i + 1 } : {}) });
101
+ for (const [i, row] of line.rows.entries()) {
102
+ const made = await marked(i, () => tx.insert(snapshotScopedData({ table: line.table, values: { ...placed(row, i), [line.whose]: bound } })));
103
+ written.push(made.key);
104
+ }
105
+ }
106
+ }
107
+ export async function recordedUpdate(options, input) {
108
+ const request = snapshotScopedData(input);
109
+ if (!Object.keys(request.values).length)
110
+ throw new Refusal('Nothing to set.');
111
+ if (options.journal === false)
112
+ // The record it locks, reads and writes, told to the transaction so its lock and row go behind the BEGIN (writeAhead.ts).
113
+ return withWriteAhead({ targets: [{ table: request.table, key: request.key }], writes: true, locks: true }, () => unrecorded(options, request, async (tx) => {
114
+ // The row the App judges is the row the write replaces: a plain read would not hold it.
115
+ if (!tx.lockRecord)
116
+ throw new Refusal('Writes require a transaction record-lock capability.');
117
+ await tx.lockRecord({ table: request.table, key: request.key });
118
+ return tx.update(request);
119
+ }));
120
+ return recorded(options, 'update', request.table, async (tx) => {
121
+ // PK fields identify the predicate; they need not be readable projections.
122
+ const before = await original(tx, request, Object.keys(request.values));
123
+ const losslessBefore = Boolean(before && (await journalFieldsMatch(tx, request.table, request.key, before)));
124
+ const result = await tx.update(request);
125
+ const touched = Object.keys(result.applied);
126
+ // Store the database image, not its write-intent DTO (booleans, defaults
127
+ // and AFTER triggers can have a different stored representation).
128
+ const after = result.affected === 1 && touched.length ? await rowAt(tx, request, touched) : undefined;
129
+ if (!losslessBefore ||
130
+ !before ||
131
+ !after ||
132
+ !touched.length ||
133
+ touched.some((column) => !Object.hasOwn(before, column)) ||
134
+ !(await journalFieldsMatch(tx, request.table, request.key, after))) {
135
+ return { result, entry: barrier('update', request.table, 'The updated record has no complete original for Undo.') };
136
+ }
137
+ const steps = [
138
+ {
139
+ table: request.table,
140
+ key: { ...request.key },
141
+ before: Object.fromEntries(touched.map((column) => [column, before[column]])),
142
+ after,
143
+ exactFields: true,
144
+ },
145
+ ];
146
+ return { result, entry: { kind: 'update', summary: summarise('update', steps), revertible: true, steps } };
147
+ });
148
+ }
149
+ export async function recordedInsert(options, input,
150
+ /** Rows that go with the new one, in its transaction, made from it: a record's tag links (tagLists.ts). */
151
+ alongside,
152
+ /** The new record's lines (`form.lines`), inserted in its transaction and joined to it (formLinesWrite.ts). */
153
+ lines) {
154
+ // An upload's file columns are the server's to write (serverRequests.ts): the copy keeps the mark.
155
+ const request = carryServerRequest(input, snapshotScopedData(input));
156
+ const completeInverse = options.completeInverse !== false;
157
+ if (lines?.length && options.journal !== false)
158
+ throw new Refusal("A record's lines are saved with it in an App.");
159
+ const withRows = async (tx, result) => {
160
+ for (const row of alongside?.(result) ?? [])
161
+ await tx.insert(snapshotScopedData(row));
162
+ if (lines?.length)
163
+ await writeLines(tx, lines, { ...result.row, ...result.key });
164
+ return result;
165
+ };
166
+ if (options.journal === false)
167
+ return unrecorded(options, request, async (tx) => withRows(tx, await tx.insert(request)));
168
+ return recorded(options, 'insert', request.table, async (tx) => {
169
+ const result = await withRows(tx, await tx.insert(request));
170
+ /* An Undo of the record alone would leave its tags' link rows pointing at nothing. */
171
+ if (alongside && alongside(result).length) {
172
+ return {
173
+ result,
174
+ entry: barrier('insert', request.table, 'This creation added rows beside the record, which one Undo does not take back.'),
175
+ };
176
+ }
177
+ if (!tx.lockRecord ||
178
+ !completeInverse ||
179
+ !Object.keys(result.key ?? {}).length ||
180
+ !result.row ||
181
+ !Object.keys(result.row).length ||
182
+ !(await journalImageMatches(tx, request.table, result.row))) {
183
+ return {
184
+ result,
185
+ entry: barrier('insert', request.table, 'This creation has no complete identifiable inverse under the current permissions.'),
186
+ };
187
+ }
188
+ const steps = [
189
+ { table: request.table, key: { ...result.key }, after: { ...snapshotScopedData(result.row) }, wholeRow: true },
190
+ ];
191
+ return { result, entry: { kind: 'insert', summary: summarise('insert', steps), revertible: true, steps } };
192
+ });
193
+ }
194
+ /**
195
+ * Many new rows of one table in one transaction, recorded as one entry: an
196
+ * import. Undo removes every row it added or none, as a single insert's
197
+ * does, and only when each row's whole stored image could be captured; one
198
+ * that could not makes the entry a barrier that says why.
199
+ */
200
+ export async function recordedImport(options, inputs, checkpoint = () => { }) {
201
+ const requests = inputs.map((input) => snapshotScopedData(input));
202
+ const table = requests[0]?.table;
203
+ if (!table || requests.some((request) => request.table !== table))
204
+ throw new Refusal('An import writes rows of one table.');
205
+ if (options.journal === false)
206
+ return unrecorded(options, { table }, async (tx) => {
207
+ const results = [];
208
+ for (const request of requests) {
209
+ checkpoint();
210
+ results.push(await tx.insert(request));
211
+ }
212
+ checkpoint();
213
+ return results;
214
+ });
215
+ let complete = options.completeInverse !== false;
216
+ return recorded(options, 'insert', table, async (tx) => {
217
+ const results = [];
218
+ const steps = [];
219
+ for (const request of requests) {
220
+ checkpoint();
221
+ const result = await tx.insert(request);
222
+ results.push(result);
223
+ if (complete &&
224
+ (!tx.lockRecord ||
225
+ !Object.keys(result.key ?? {}).length ||
226
+ !result.row ||
227
+ !Object.keys(result.row).length ||
228
+ !(await journalImageMatches(tx, table, result.row))))
229
+ complete = false;
230
+ if (complete)
231
+ steps.push({ table, key: { ...result.key }, after: { ...snapshotScopedData(result.row) }, wholeRow: true });
232
+ }
233
+ checkpoint();
234
+ if (!complete)
235
+ return {
236
+ result: results,
237
+ entry: barrier('insert', table, 'This import has no complete identifiable inverse under the current permissions.'),
238
+ };
239
+ return { result: results, entry: { kind: 'insert', summary: summarise('insert', steps), revertible: true, steps } };
240
+ });
241
+ }
242
+ /**
243
+ * Captures this row only. A database-owned cascade (or `set null`) is not a
244
+ * graph Undo: putting the parent back would leave its children gone or
245
+ * emptied, which is half an undo. So when one of `dependents.references` —
246
+ * the incoming references whose rule changes the rows behind them, named as
247
+ * this writer names them — has a row pointing at this one, read on the same
248
+ * writer before the delete, the entry is a barrier that says why, and the
249
+ * deletion is undone whole or not at all. `dependents.unseen` says such a
250
+ * reference exists from a table this writer cannot read (one an App does not
251
+ * declare): it cannot be counted here, so it is a barrier whatever it holds.
252
+ */
253
+ export async function recordedDelete(options, input, dependents = {}) {
254
+ const request = snapshotScopedData(input);
255
+ const completeInverse = options.completeInverse !== false;
256
+ if (options.journal === false)
257
+ return unrecorded(options, request, (tx) => tx.remove(request));
258
+ return recorded(options, 'delete', request.table, async (tx) => {
259
+ const before = await original(tx, request);
260
+ const complete = completeInverse && Boolean(before && (await journalImageMatches(tx, request.table, before)));
261
+ const touches = complete && (dependents.unseen === true || (await touchesDependents(tx, request.key, dependents.references ?? [])));
262
+ const result = await tx.remove(request);
263
+ if (touches) {
264
+ return { result, entry: barrier('delete', request.table, 'Rows elsewhere depended on it, so this deletion cannot be undone.') };
265
+ }
266
+ if (!complete || result.affected !== 1 || !before || !Object.keys(before).length) {
267
+ return { result, entry: barrier('delete', request.table, 'The deleted record has no complete original for Undo.') };
268
+ }
269
+ /* The key as the row stored it, not as the request spelled it: an
270
+ address says `1` as text, and a restore is checked against the stored
271
+ row, whose integer 1 is not the string '1'. */
272
+ const key = Object.fromEntries(Object.entries(request.key).map(([column, value]) => [column, Object.hasOwn(before, column) ? before[column] : value]));
273
+ const steps = [{ table: request.table, key, before, wholeRow: true }];
274
+ return { result, entry: { kind: 'delete', summary: summarise('delete', steps), revertible: true, steps } };
275
+ });
276
+ }
277
+ /** Whether a row behind one of these references points at `key`. A count that
278
+ * cannot be taken is read as yes: an Undo that might be partial is not offered. */
279
+ async function touchesDependents(tx, key, dependents) {
280
+ for (const fk of dependents) {
281
+ const conditions = fk.to.columns.map((column, i) => ({
282
+ column: fk.from.columns[i] ?? fk.from.columns[0],
283
+ op: '=',
284
+ value: key[column],
285
+ }));
286
+ if (conditions.some((condition) => condition.value === undefined || condition.value === null))
287
+ return true;
288
+ try {
289
+ const found = await tx.query({
290
+ table: fk.from.table,
291
+ columns: fk.from.columns,
292
+ filter: { groups: [conditions] },
293
+ limit: 1,
294
+ offset: 0,
295
+ });
296
+ if (found.rows.length)
297
+ return true;
298
+ }
299
+ catch {
300
+ return true;
301
+ }
302
+ }
303
+ return false;
304
+ }
305
+ /** The incoming references a deletion of `table` would change rows through:
306
+ * every rule but a refusal, an unreported one included. */
307
+ export function changingReferences(schema, table) {
308
+ return referencesTo(schema, table).filter((fk) => !fk.declared && fk.onDelete !== 'restrict' && fk.onDelete !== 'no action');
309
+ }
310
+ /**
311
+ * A deletion's dependents read off the database's own catalog, never an
312
+ * App's reduced one: a cascade into a table the App does not declare still
313
+ * happens. `physical` is the connection's catalog and `table` its name there;
314
+ * `writerName` gives the name the writer reads a physical table by, or
315
+ * undefined when it cannot read it — which makes the reference unseen.
316
+ */
317
+ export function deletionDependents(physical, table, writerName) {
318
+ const references = [];
319
+ // A table the catalog does not know cannot be shown to have no dependents.
320
+ let unseen = !physical.tables.some((item) => item.id === table);
321
+ for (const fk of changingReferences(physical, table)) {
322
+ const name = writerName(fk.from.table);
323
+ if (name === undefined)
324
+ unseen = true;
325
+ else
326
+ references.push({ ...fk, from: { ...fk.from, table: name } });
327
+ }
328
+ return { references, unseen };
329
+ }
@@ -0,0 +1,81 @@
1
+ import { type Adapter, type SqlStyle } from '../adapters/adapter.js';
2
+ import { type DatabaseSchema } from '../shared/schema.js';
3
+ import { type QueryPerson } from '../shared/query.js';
4
+ import { type ViewDef } from '../shared/view.js';
5
+ /** A dashboard is at most a few dozen sections; a batch past this is not one. */
6
+ export declare const BREAKDOWN_BATCH = 48;
7
+ /** The furthest a list is paged by offset over HTTP: past it the rows skipped cost more than the page. */
8
+ export declare const MAX_PAGE_OFFSET = 10000;
9
+ /**
10
+ * What an App's reads are beside the database browser's, given by the App
11
+ * framework (app/appReads.ts) wherever an App is read: absent, a read is the
12
+ * browser's, which shows its SQL and its compiled columns and says a failure
13
+ * in the engine's own words.
14
+ */
15
+ export interface AppReads {
16
+ /** The adapter with every read of a union answered by its branches (app/unionReads.ts). */
17
+ reader(adapter: Adapter, schema: DatabaseSchema): Adapter;
18
+ /** A reply as an App is told it: rendering and mutation state, never compiler output (app/appResponses.ts). */
19
+ reply(body: Record<string, unknown>): Record<string, unknown>;
20
+ /** A structured read's failure as an App says it (app/appErrors.ts): never a driver's message. */
21
+ error(err: unknown): unknown;
22
+ /**
23
+ * Who `me` is in `texts`, with the memberships they read, through this
24
+ * request's reader (app/appMe.ts), or nothing where no text compares with
25
+ * the person.
26
+ */
27
+ person(me: () => Promise<QueryPerson | null>, texts: readonly unknown[], schema: DatabaseSchema, adapter: Adapter): Promise<{
28
+ me?: QueryPerson | null;
29
+ }>;
30
+ }
31
+ interface ResourceReadHttpOptions {
32
+ /** An App's reads (AppReads), or none: the database browser's. */
33
+ app: AppReads | undefined;
34
+ now: () => Date;
35
+ /**
36
+ * Who `me` is in this request's text, read from the verified session and
37
+ * asked only when the text says `me` (appMe.ts). Absent — the database
38
+ * browser, a tenant App — `me` is the word it is.
39
+ */
40
+ me?: () => Promise<QueryPerson | null>;
41
+ /**
42
+ * The ISO weekday an App's weeks start on (its `ui.locale`, weekStart.ts),
43
+ * set on every breakdown in place of whatever the request said. Absent —
44
+ * the database browser — a request may say its own, and Monday is the default.
45
+ */
46
+ weekStart?: number;
47
+ /**
48
+ * The most rows `/api/run` answers for a table, where its reader may not
49
+ * export it (dataRoutes.ts, by the product's `exports.may`); undefined is no
50
+ * bound past the ceiling. A list's own read of 100,000 rows was an export
51
+ * by another name.
52
+ */
53
+ rowsMost?: (table: string) => number | undefined;
54
+ }
55
+ interface ResourceReadHttpReply {
56
+ status: number;
57
+ body: unknown;
58
+ }
59
+ /**
60
+ * Parse and shape the five resource-read routes using an already-authorized
61
+ * adapter. This owns no source acquisition, response stream or HTTP error class:
62
+ * escaping service validation errors retain their identity for the host to map.
63
+ */
64
+ export declare function dispatchResourceReadHttp(path: string, body: Record<string, unknown>, adapter: Adapter, schema: DatabaseSchema, options: ResourceReadHttpOptions): Promise<ResourceReadHttpReply | undefined>;
65
+ /**
66
+ * Which dialect writes the SQL shown in the explain panel.
67
+ *
68
+ * The adapter picks its own style when it runs the statement; this is the
69
+ * copy the user reads, and it has to agree with what actually ran or the
70
+ * panel is teaching the wrong thing.
71
+ */
72
+ export declare function styleFor(schema: DatabaseSchema): SqlStyle;
73
+ /**
74
+ * Coerce a JSON body into a `ViewDef`.
75
+ *
76
+ * Shape only. Whether the paths mean anything is `compileView`'s job, and it
77
+ * refuses what it cannot resolve — so this does not need to know the schema,
78
+ * and there is no second, weaker validator to disagree with the first.
79
+ */
80
+ export declare function normaliseView(raw: unknown): ViewDef;
81
+ export {};