@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,409 @@
1
+ /**
2
+ * The migration runner: status, up, validate, baseline and repair over one
3
+ * database, with no opinion about how they are printed (migrate/cli.ts says
4
+ * them; `@mistriwork/mistri/maintenance` hands `migrateUp` to a seed).
5
+ *
6
+ * Forward only. Each file runs once, in version order, in its own
7
+ * transaction on SQLite and PostgreSQL, then its history row is written in
8
+ * that same transaction, so a file is either applied and recorded or neither.
9
+ * A file that must run outside a transaction (CREATE INDEX CONCURRENTLY) has
10
+ * a failure recorded as failed that stops the run, as Flyway does, because
11
+ * what ran before the failing statement is in the database and only a person
12
+ * can say whether to finish it or undo it.
13
+ */
14
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { openMigrationDb, quoteIdent, splitPostgres } from './database.js';
17
+ import { readMigrations } from './files.js';
18
+ import { BASELINE_DESCRIPTION, historyDdl, historyExists, insertHistory, plan, qualified, readHistory, readRows, } from './history.js';
19
+ import { carryForward, drift, readSchema, readSnapshot, sorted, writeSnapshot, } from './snapshot.js';
20
+ import { product } from '../product.js';
21
+ /** The baseline's snapshot file, beside the migrations. Never run: no V or R, and not .sql. */
22
+ const BASELINE_FILE = 'baseline.schema.json';
23
+ /** How long a run waits for another to finish before it gives up, as Flyway's default retries do. */
24
+ const LOCK_WAIT_MS = 60_000;
25
+ async function withDb(target, create, run) {
26
+ const db = await openMigrationDb(target.url, target.schemas, create);
27
+ try {
28
+ return await run(db);
29
+ }
30
+ finally {
31
+ await db.close();
32
+ }
33
+ }
34
+ const refuseNonTransactional = (db, directory) => {
35
+ const file = directory.files.find((each) => !each.transactional);
36
+ if (file && db.dialect === 'sqlite') {
37
+ throw new Error(`${file.script}.conf says executeInTransaction=false, and SQLite runs every migration in a transaction: its write lock is what keeps two runs apart. Remove the .conf.`);
38
+ }
39
+ };
40
+ async function readStatus(db, target) {
41
+ const directory = readMigrations(target.dir);
42
+ const started = await historyExists(db, target.table);
43
+ const history = readRows(await readHistory(db, target.table));
44
+ const snapshot = started ? await readSnapshot(db, target.table) : undefined;
45
+ const live = snapshot ? await readSchema(db, target.schemas, target.table) : undefined;
46
+ const behind = snapshot
47
+ ? history.rows.filter((row) => row.installed_rank > snapshot.rank && row.success && row.type !== 'DELETE').length
48
+ : 0;
49
+ const holds = started
50
+ ? 0
51
+ : Object.keys(await readSchema(db, target.schemas, target.table)).filter((key) => /^(table|view|materialized view) /.test(key)).length;
52
+ return {
53
+ dialect: db.dialect,
54
+ home: db.home,
55
+ directory,
56
+ plan: plan(directory.files, history),
57
+ started,
58
+ ...(snapshot && live ? { drift: drift(snapshot.objects, live), snapshot } : {}),
59
+ behind,
60
+ holds,
61
+ };
62
+ }
63
+ export function migrationStatus(target) {
64
+ return withDb(target, false, (db) => readStatus(db, target));
65
+ }
66
+ /**
67
+ * Apply every pending migration. Under the run's lock the plan is read again
68
+ * before each file, so a second deploy that waited finds the first's work
69
+ * done and applies nothing twice.
70
+ */
71
+ export function migrateUp(target, options = {}) {
72
+ return withDb(target, !options.dryRun, async (db) => {
73
+ const directory = readMigrations(target.dir);
74
+ refuseNonTransactional(db, directory);
75
+ await db.lock(target.table, LOCK_WAIT_MS, options.waiting ?? (() => { }));
76
+ const initial = await readStatus(db, target);
77
+ /* R7, and Flyway's rule: a database with tables and no history is
78
+ recorded as it is before anything runs on it. */
79
+ if (initial.holds) {
80
+ return {
81
+ status: initial,
82
+ applied: [],
83
+ refused: `the database already holds ${initial.holds} table${initial.holds === 1 ? '' : 's'} or view${initial.holds === 1 ? '' : 's'} and no migration history. Record it as it is first: ${product()} migrate baseline`,
84
+ };
85
+ }
86
+ if (initial.plan.problems.length)
87
+ return { status: initial, applied: [] };
88
+ if (options.dryRun)
89
+ return { status: initial, applied: [], wouldRun: initial.plan.pending };
90
+ const expected = initial.snapshot?.objects;
91
+ const before = await readSchema(db, target.schemas, target.table);
92
+ if (!initial.started) {
93
+ if (db.dialect === 'postgres' && target.schemas.length)
94
+ await db.run(`CREATE SCHEMA IF NOT EXISTS ${quoteIdent('postgres', db.home)}`);
95
+ await ensureHistory(db, target.table);
96
+ }
97
+ const applied = [];
98
+ let failure;
99
+ for (;;) {
100
+ if (db.dialect === 'sqlite')
101
+ await db.run('BEGIN IMMEDIATE');
102
+ const now = plan(directory.files, readRows(await readHistory(db, target.table)));
103
+ const next = now.pending[0];
104
+ if (now.problems.length || !next) {
105
+ if (db.dialect === 'sqlite')
106
+ await db.run('COMMIT');
107
+ break;
108
+ }
109
+ const result = await apply(db, target.table, next);
110
+ if ('message' in result) {
111
+ failure = { file: next, ...result };
112
+ break;
113
+ }
114
+ applied.push({ file: next, ms: result.ms });
115
+ }
116
+ /* Recorded after a failure too: what did apply is migrations' work, and
117
+ what had drifted before the run stays drift. */
118
+ if (applied.length || !initial.snapshot) {
119
+ const after = await readSchema(db, target.schemas, target.table);
120
+ const lastRank = readRows(await readHistory(db, target.table)).lastRank;
121
+ await writeSnapshot(db, target.table, lastRank, expected
122
+ ? carryForward(expected, before, after, applied.map(({ file }) => file.sql))
123
+ : after);
124
+ }
125
+ return { status: await readStatus(db, target), applied, ...(failure ? { failure } : {}) };
126
+ });
127
+ }
128
+ /* Created under the write lock and looked for again inside it: on SQLite two
129
+ first runs can both have seen no table before either took the lock. */
130
+ function ensureHistory(db, table) {
131
+ return transaction(db, async () => {
132
+ if (!(await historyExists(db, table)))
133
+ for (const ddl of historyDdl(db, table))
134
+ await db.run(ddl);
135
+ });
136
+ }
137
+ async function transaction(db, run) {
138
+ await db.run(db.dialect === 'sqlite' ? 'BEGIN IMMEDIATE' : 'BEGIN');
139
+ try {
140
+ await run();
141
+ await db.run('COMMIT');
142
+ }
143
+ catch (error) {
144
+ await db.run('ROLLBACK').catch(() => { });
145
+ throw error;
146
+ }
147
+ }
148
+ const sayError = (error) => (error instanceof Error ? error.message : String(error)).split('\n')[0];
149
+ /* A transactional PostgreSQL file whose statement waited out its lock
150
+ (database.ts MIGRATION_LOCK_TIMEOUT_MS) rolled back whole, so it is tried
151
+ again after a pause that grows: a long transaction on the table may end.
152
+ Five tries, about half a minute in all, and then it says so. */
153
+ const LOCK_ATTEMPTS = 5;
154
+ const lockWaited = (error) => error?.code === '55P03';
155
+ const pause = (ms) => new Promise((done) => setTimeout(done, ms));
156
+ /** One file and its history row. On SQLite the caller's BEGIN IMMEDIATE is already open. */
157
+ async function apply(db, table, file) {
158
+ const started = performance.now();
159
+ const row = (success) => ({
160
+ version: file.version ?? null,
161
+ description: file.description,
162
+ type: 'SQL',
163
+ script: file.script,
164
+ checksum: file.checksum,
165
+ executionTime: Math.round(performance.now() - started),
166
+ success,
167
+ });
168
+ if (file.transactional && db.dialect === 'postgres') {
169
+ for (let attempt = 1;; attempt++) {
170
+ const tried = await applyInTransaction(db, table, file, row);
171
+ if (!('locked' in tried))
172
+ return tried;
173
+ if (attempt === LOCK_ATTEMPTS) {
174
+ return {
175
+ message: `${tried.locked}. It waited for another transaction's lock ${LOCK_ATTEMPTS} times; nothing of it was applied. ` +
176
+ 'Run it again when the transaction holding the table has finished.',
177
+ recorded: false,
178
+ };
179
+ }
180
+ await pause(attempt * 1_000);
181
+ }
182
+ }
183
+ if (file.transactional) {
184
+ try {
185
+ await db.script(file.sql);
186
+ if (db.dialect === 'sqlite') {
187
+ /* Foreign keys are off while a migration runs, so a table can be
188
+ rebuilt the way SQLite's manual says; they are checked here, before
189
+ the commit, so none is left pointing nowhere. */
190
+ const broken = await db.all('PRAGMA foreign_key_check');
191
+ if (broken.length) {
192
+ const first = broken[0];
193
+ throw new Error(`it leaves ${broken.length} row${broken.length === 1 ? '' : 's'} of ${first.table} pointing at no row of ${first.parent}`);
194
+ }
195
+ }
196
+ await insertHistory(db, table, row(true));
197
+ await db.run('COMMIT');
198
+ return { ms: row(true).executionTime };
199
+ }
200
+ catch (error) {
201
+ await db.run('ROLLBACK').catch(() => { });
202
+ return { message: `${sayError(error)}. Nothing of it was applied.`, recorded: false };
203
+ }
204
+ }
205
+ try {
206
+ if (db.dialect === 'postgres')
207
+ for (const statement of splitPostgres(file.sql))
208
+ await db.script(statement);
209
+ else
210
+ await db.script(file.sql);
211
+ await insertHistory(db, table, row(true));
212
+ return { ms: row(true).executionTime };
213
+ }
214
+ catch (error) {
215
+ await insertHistory(db, table, row(false)).catch(() => { });
216
+ return {
217
+ message: `${sayError(error)}. It ran outside a transaction, so the statements before the failing one are applied: finish or undo them by hand, then ${product()} migrate repair.`,
218
+ recorded: true,
219
+ };
220
+ }
221
+ }
222
+ /** One PostgreSQL file in its own transaction: applied, refused, or rolled back after a lock wait ran out. */
223
+ async function applyInTransaction(db, table, file, row) {
224
+ await db.run('BEGIN');
225
+ try {
226
+ await db.script(file.sql);
227
+ await insertHistory(db, table, row(true));
228
+ await db.run('COMMIT');
229
+ return { ms: row(true).executionTime };
230
+ }
231
+ catch (error) {
232
+ await db.run('ROLLBACK').catch(() => { });
233
+ if (lockWaited(error))
234
+ return { locked: sayError(error) };
235
+ return { message: `${sayError(error)}. Nothing of it was applied.`, recorded: false };
236
+ }
237
+ }
238
+ /**
239
+ * Flyway's validate — every applied file unchanged and present, nothing
240
+ * pending, nothing failed — and one thing Flyway cannot see: the database
241
+ * is still what its migrations made it.
242
+ */
243
+ export async function migrateValidate(target) {
244
+ const status = await migrationStatus(target);
245
+ const valid = status.started && !status.plan.problems.length && !status.plan.pending.length && !status.drift?.length;
246
+ return { status, valid };
247
+ }
248
+ /**
249
+ * Record the database as it is as version 0: nothing that exists is touched,
250
+ * and history starts here. The schema as read is written beside the
251
+ * migrations, read-only, and kept as the one migrations start from.
252
+ */
253
+ export function migrateBaseline(target, options = {}) {
254
+ return withDb(target, false, async (db) => {
255
+ await db.lock(target.table, LOCK_WAIT_MS, () => { });
256
+ const history = readRows(await readHistory(db, target.table));
257
+ const file = join(target.dir, BASELINE_FILE);
258
+ const objects = await readSchema(db, target.schemas, target.table);
259
+ if (history.baseline)
260
+ return {
261
+ already: `baselined as version ${history.baseline.version} on ${history.baseline.installed_on}`,
262
+ objects,
263
+ file,
264
+ wrote: false,
265
+ };
266
+ const applied = history.rows.filter((row) => row.type !== 'DELETE').length;
267
+ if (applied)
268
+ return {
269
+ refused: `${target.table} already records ${applied} migration${applied === 1 ? '' : 's'}; a baseline starts a history, it does not join one`,
270
+ objects,
271
+ file,
272
+ wrote: false,
273
+ };
274
+ if (options.dryRun)
275
+ return { objects, file, wrote: false };
276
+ await ensureHistory(db, target.table);
277
+ await transaction(db, async () => {
278
+ await insertHistory(db, target.table, {
279
+ version: '0',
280
+ description: BASELINE_DESCRIPTION,
281
+ type: 'BASELINE',
282
+ script: BASELINE_DESCRIPTION,
283
+ checksum: null,
284
+ executionTime: 0,
285
+ success: true,
286
+ });
287
+ await writeSnapshot(db, target.table, readRows(await readHistory(db, target.table)).lastRank, objects);
288
+ });
289
+ let wrote = false;
290
+ if (!existsSync(file)) {
291
+ mkdirSync(target.dir, { recursive: true });
292
+ writeFileSync(file, `${JSON.stringify({
293
+ about: 'The schema as it was when ' +
294
+ product() +
295
+ ' migrate baseline recorded it as version 0: a record, never run. Migrations after it start from here.',
296
+ dialect: db.dialect,
297
+ schemas: target.schemas.length ? target.schemas : db.home ? [db.home] : [],
298
+ taken: new Date().toISOString().slice(0, 19).replace('T', ' '),
299
+ objects: sorted(objects),
300
+ }, null, 2)}\n`, { mode: 0o444, flag: 'wx' });
301
+ wrote = true;
302
+ }
303
+ return { objects, file, wrote };
304
+ });
305
+ }
306
+ /**
307
+ * Make the history agree with the files again, as Flyway's repair does:
308
+ * failed entries removed, an applied file's checksum and description taken
309
+ * from the file as it is now, a file that is gone marked deleted. And the
310
+ * recorded schema retaken when another runner applied migrations after it,
311
+ * since their changes cannot be told from drift; drift itself is never
312
+ * repaired away.
313
+ */
314
+ export function migrateRepair(target, options = {}) {
315
+ return withDb(target, false, async (db) => {
316
+ await db.lock(target.table, LOCK_WAIT_MS, () => { });
317
+ const status = await readStatus(db, target);
318
+ const { history } = status.plan;
319
+ const name = qualified(db, target.table);
320
+ const actions = [];
321
+ const work = [];
322
+ const flag = (value) => (db.dialect === 'postgres' ? value : value ? 1 : 0);
323
+ if (history.failed.length) {
324
+ actions.push(...history.failed.map((row) => `removed the failed entry for ${row.script}`));
325
+ work.push(() => db.run(`DELETE FROM ${name} WHERE success = ?`, [flag(false)]));
326
+ }
327
+ const files = status.directory.files;
328
+ for (const [version, row] of history.versioned) {
329
+ const file = files.find((each) => each.version === version);
330
+ if (file) {
331
+ if (file.checksum !== row.checksum || file.description !== row.description) {
332
+ actions.push(`${file.script}: history now says checksum ${file.checksum}, "${file.description}"`);
333
+ work.push(() => db.run(`UPDATE ${name} SET checksum = ?, description = ? WHERE installed_rank = ?`, [
334
+ file.checksum,
335
+ file.description,
336
+ row.installed_rank,
337
+ ]));
338
+ }
339
+ }
340
+ else if (!status.plan.notes.some((note) => note.startsWith(`version ${version} `))) {
341
+ actions.push(`marked ${row.script} deleted`);
342
+ work.push(() => insertHistory(db, target.table, {
343
+ version: row.version,
344
+ description: row.description,
345
+ type: 'DELETE',
346
+ script: row.script,
347
+ checksum: row.checksum,
348
+ executionTime: 0,
349
+ success: true,
350
+ }));
351
+ }
352
+ }
353
+ for (const [description, row] of history.repeatable) {
354
+ if (files.some((file) => file.kind === 'repeatable' && file.description === description))
355
+ continue;
356
+ actions.push(`marked ${row.script} deleted`);
357
+ work.push(() => insertHistory(db, target.table, {
358
+ version: null,
359
+ description,
360
+ type: 'DELETE',
361
+ script: row.script,
362
+ checksum: row.checksum,
363
+ executionTime: 0,
364
+ success: true,
365
+ }));
366
+ }
367
+ if (status.started && (!status.snapshot || status.behind)) {
368
+ actions.push(status.snapshot
369
+ ? `recorded the schema again: ${status.behind} migration${status.behind === 1 ? ' was' : 's were'} applied after it by another runner, so what they changed is now what migrations made`
370
+ : 'recorded the schema as it is now: drift is measured from here');
371
+ work.push(async () => writeSnapshot(db, target.table, readRows(await readHistory(db, target.table)).lastRank, await readSchema(db, target.schemas, target.table)));
372
+ }
373
+ if (!options.dryRun && work.length)
374
+ await transaction(db, async () => {
375
+ for (const step of work)
376
+ await step();
377
+ });
378
+ return { actions };
379
+ });
380
+ }
381
+ /**
382
+ * Around a run another tool makes (`--tool flyway`): the schema read before
383
+ * it, and recorded after it as tablewalk's own runs record it, so drift stays
384
+ * measured whichever tool applied the files.
385
+ */
386
+ export async function recordAround(target, run) {
387
+ const before = await withDb(target, false, async (db) => ({
388
+ expected: (await readSnapshot(db, target.table))?.objects,
389
+ objects: await readSchema(db, target.schemas, target.table),
390
+ rank: readRows(await readHistory(db, target.table)).lastRank,
391
+ })).catch(() => undefined);
392
+ const code = await run();
393
+ await withDb(target, false, async (db) => {
394
+ if (!(await historyExists(db, target.table)))
395
+ return;
396
+ const lastRank = readRows(await readHistory(db, target.table)).lastRank;
397
+ if (before && lastRank === before.rank && before.expected)
398
+ return;
399
+ const after = await readSchema(db, target.schemas, target.table);
400
+ // What the other tool applied, read back from the files its history rows name.
401
+ const { files } = readMigrations(target.dir);
402
+ const scripts = new Set(readRows(await readHistory(db, target.table))
403
+ .rows.filter((row) => row.installed_rank > (before?.rank ?? 0))
404
+ .map((row) => row.script));
405
+ const applied = files.filter((file) => scripts.has(file.script)).map((file) => file.sql);
406
+ await writeSnapshot(db, target.table, lastRank, before?.expected ? carryForward(before.expected, before.objects, after, applied) : after);
407
+ }).catch(() => { });
408
+ return code;
409
+ }
@@ -0,0 +1,30 @@
1
+ import type { MigrationDb } from './database.js';
2
+ export type Objects = Record<string, string>;
3
+ export declare function readSchema(db: MigrationDb, scope: readonly string[], history: string): Promise<Objects>;
4
+ export interface Change {
5
+ readonly key: string;
6
+ readonly was?: string;
7
+ readonly now?: string;
8
+ }
9
+ /** What differs between the schema migrations left and the one there now. A new or dropped table is one line, not one per column. */
10
+ export declare function drift(expected: Objects, live: Objects): Change[];
11
+ export declare function sayChange(change: Change): string;
12
+ /**
13
+ * The schema to record after a run: what the database is now, except where
14
+ * it had drifted before the run and the run left that alone — that stays
15
+ * drift, so a run never quietly blesses a column someone added by hand. A
16
+ * migration that changed the drifted object (putting it back, or altering
17
+ * it) settles it, and so does one that names it: adopting a hand-made column
18
+ * is `ADD COLUMN IF NOT EXISTS note`, which changes nothing here and makes
19
+ * the column everywhere else. `applied` is the text of the files the run
20
+ * applied.
21
+ */
22
+ export declare function carryForward(expected: Objects, before: Objects, after: Objects, applied?: readonly string[]): Objects;
23
+ export interface StoredSnapshot {
24
+ readonly rank: number;
25
+ readonly takenOn: string;
26
+ readonly objects: Objects;
27
+ }
28
+ export declare function readSnapshot(db: MigrationDb, history: string): Promise<StoredSnapshot | undefined>;
29
+ export declare function writeSnapshot(db: MigrationDb, history: string, rank: number, objects: Objects): Promise<void>;
30
+ export declare const sorted: (objects: Objects) => Objects;