@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,101 @@
1
+ /**
2
+ * The schema as text — Mermaid, Markdown, JSON — with no DOM and no state.
3
+ *
4
+ * Split from schemaexport.js so the server can speak these formats too:
5
+ * `tablewalk --export md` prints the same brief the browser downloads, and a
6
+ * committed CLAUDE.md schema section costs one command. Pure on purpose, the
7
+ * way shape.js is pure — a schema in, text out, importable from anywhere.
8
+ */
9
+ /** The tables to export, and the keys wholly between them. */
10
+ export function selection(schema, only) {
11
+ const wanted = only?.size ? schema.tables.filter((t) => only.has(t.id)) : schema.tables;
12
+ const ids = new Set(wanted.map((t) => t.id));
13
+ /* Only keys with both ends in the selection. A reference to a table that is
14
+ not in the export is an edge pointing at nothing, which renders as a
15
+ dangling arrow and imports as a broken constraint. */
16
+ const keys = schema.foreignKeys.filter((fk) => ids.has(fk.from.table) && ids.has(fk.to.table));
17
+ return { tables: wanted, keys };
18
+ }
19
+ /* ---------- text formats ---------- */
20
+ /**
21
+ * Mermaid `erDiagram`.
22
+ *
23
+ * Cardinality is stated as far as the catalog knows it, which is not very far:
24
+ * a foreign key says the child *may* point at one parent, and says nothing
25
+ * about whether a parent must have children. So every relationship is written
26
+ * `}o--||` — many-optional to exactly-one — which is what a nullable foreign
27
+ * key actually guarantees. Claiming more precision would be inventing it.
28
+ *
29
+ * Mermaid identifiers cannot contain a dot, so `app.invoice` becomes
30
+ * `app_invoice`. Said in a comment at the top of the output rather than
31
+ * silently, because someone comparing the diagram to their database will
32
+ * notice.
33
+ */
34
+ export function toMermaid(schema, only) {
35
+ const { tables, keys } = selection(schema, only);
36
+ const safe = (id) => id.replace(/[^\w]/g, '_');
37
+ const lines = ['erDiagram'];
38
+ for (const table of tables) {
39
+ lines.push(` ${safe(table.id)} {`);
40
+ for (const column of table.columns) {
41
+ const type = (column.type || 'unknown').replace(/[^\w]/g, '_') || 'unknown';
42
+ const marks = [column.primaryKey ? 'PK' : '', column.references ? 'FK' : ''].filter(Boolean).join(',');
43
+ lines.push(` ${type} ${column.name}${marks ? ` ${marks}` : ''}`);
44
+ }
45
+ lines.push(' }');
46
+ }
47
+ for (const fk of keys) {
48
+ const label = fk.from.columns.join(', ');
49
+ lines.push(` ${safe(fk.to.table)} ||--o{ ${safe(fk.from.table)} : "${label}"`);
50
+ }
51
+ const renamed = tables.some((t) => safe(t.id) !== t.id);
52
+ return ((renamed ? '%% Names containing a dot are written with an underscore: Mermaid ids cannot hold one.\n' : '') + lines.join('\n') + '\n');
53
+ }
54
+ /** A readable reference document, of the kind that belongs in a repository. */
55
+ export function toMarkdown(schema, only) {
56
+ const { tables, keys } = selection(schema, only);
57
+ const out = [`# ${schema.label}`, ''];
58
+ out.push(`${tables.length} table${tables.length === 1 ? '' : 's'}, ` + `${keys.length} foreign key${keys.length === 1 ? '' : 's'}.`, '');
59
+ for (const table of tables) {
60
+ out.push(`## ${table.id}${table.isView ? ' *(view)*' : ''}`, '');
61
+ if (table.comment)
62
+ out.push(table.comment, '');
63
+ out.push('| Column | Type | | References |', '| --- | --- | --- | --- |');
64
+ for (const c of table.columns) {
65
+ const marks = [c.primaryKey ? '**key**' : '', c.nullable ? '' : 'required'].filter(Boolean).join(', ');
66
+ const ref = c.references ? `→ \`${c.references.table}.${c.references.column}\`` : '';
67
+ out.push(`| \`${c.name}\` | ${c.type} | ${marks} | ${ref} |`);
68
+ }
69
+ out.push('');
70
+ /* What points *at* this table, which is the half a schema document
71
+ usually leaves out and the half tablewalk exists to show. */
72
+ const incoming = keys.filter((fk) => fk.to.table === table.id);
73
+ if (incoming.length) {
74
+ out.push('Referenced by:', '');
75
+ for (const fk of incoming) {
76
+ out.push(`- \`${fk.from.table}\` via \`${fk.from.columns.join(', ')}\`` + (fk.onDelete ? ` — on delete ${fk.onDelete}` : ''));
77
+ }
78
+ out.push('');
79
+ }
80
+ }
81
+ return out.join('\n');
82
+ }
83
+ /**
84
+ * The structured form.
85
+ *
86
+ * Deliberately the shape tablewalk itself uses rather than a format invented
87
+ * for export — anything that reads it is reading the same model the tool
88
+ * reasons about, and there is no second definition to keep in step.
89
+ */
90
+ export function toSchemaJson(schema, only) {
91
+ const { tables, keys } = selection(schema, only);
92
+ return JSON.stringify({
93
+ label: schema.label,
94
+ dialect: schema.dialect,
95
+ readAt: schema.readAt,
96
+ exportedAt: new Date().toISOString(),
97
+ partial: Boolean(only?.size) && tables.length < schema.tables.length,
98
+ tables,
99
+ foreignKeys: keys,
100
+ }, null, 2);
101
+ }
@@ -0,0 +1,29 @@
1
+ import type { DatabaseSchema } from './schema.js';
2
+ /** Test-only: how many catalogs were copied and checked in full. */
3
+ export declare const scopeCatalogCounters: {
4
+ captured: number;
5
+ };
6
+ /** Whether `schema` is a catalog this module captured: detached, validated
7
+ * and deeply frozen, so nothing can change it after a reader binds to it. */
8
+ export declare function isCapturedScopeCatalog(schema: DatabaseSchema): boolean;
9
+ /** Whether nothing can change `schema` any more: a catalog this module
10
+ * captured, or one derived from a captured one that it froze all the way down. */
11
+ export declare function isFixedScopeCatalog(schema: DatabaseSchema): boolean;
12
+ /** Deeply freeze a catalog derived from a captured one, and remember that this
13
+ * module froze it: a later capture of it is then made once and kept. */
14
+ export declare function freezeDerivedCatalog(schema: DatabaseSchema): DatabaseSchema;
15
+ /** Detached evidence only: labels, estimates and editing affordances confer no authority. */
16
+ export declare function captureScopeCatalog(schema: DatabaseSchema): DatabaseSchema;
17
+ export declare function assertScopeCatalog(expected: DatabaseSchema, actual: DatabaseSchema): void;
18
+ /**
19
+ * Where two catalogs part, in words for the operator who deploys the App: the
20
+ * first table or column the App's catalog says otherwise than the database.
21
+ * Startup's own check only (appPolicyDeployment.ts): a request's refusal keeps
22
+ * the fixed sentence, which names nothing the caller was not shown.
23
+ */
24
+ export declare function scopeCatalogDifference(expected: DatabaseSchema, actual: DatabaseSchema): string | undefined;
25
+ /** Test-only: how many mappings were made rather than reused. */
26
+ export declare const mapScopeCounters: {
27
+ mapped: number;
28
+ };
29
+ export declare function mapScopeCatalog(actual: DatabaseSchema, ids: ReadonlyMap<string, string>): DatabaseSchema;
@@ -0,0 +1,468 @@
1
+ import { Refusal } from './refusal.js';
2
+ const refuse = () => {
3
+ throw new Refusal('The scoped catalog could not be verified. Refresh the catalog and permissions before continuing.');
4
+ };
5
+ /** The suffix declaredDates.ts gives a SQLite TEXT column the App declares a date. */
6
+ const DECLARED_DATE = /\s+as date(time)?$/;
7
+ const order = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
8
+ const identifier = (value) => typeof value === 'string' && value.length > 0 && !value.includes('\0');
9
+ /* Only this module adds an object after it has been detached, fully checked and
10
+ recursively frozen below. A caller cannot forge a WeakSet membership by
11
+ freezing a lookalike, so accepting one here never skips validation of a
12
+ database description or other boundary input. */
13
+ const capturedCatalogs = new WeakSet();
14
+ const authorityFingerprints = new WeakMap();
15
+ /* A catalog derived from a captured one (a grant's pruning, appAccess.ts) and
16
+ deeply frozen here, never by a caller: its capture can be kept by identity,
17
+ because nothing can change what it would capture to. */
18
+ const frozenDerived = new WeakSet();
19
+ const derivedCaptures = new WeakMap();
20
+ /** Test-only: how many catalogs were copied and checked in full. */
21
+ export const scopeCatalogCounters = { captured: 0 };
22
+ /** Validate descriptors before reading values, including non-authoritative metadata. */
23
+ function copyData(input) {
24
+ let nodes = 0;
25
+ let characters = 0;
26
+ const ancestors = new Set();
27
+ const copy = (value, depth = 0) => {
28
+ if (++nodes > 262_144 || depth > 16)
29
+ return refuse();
30
+ if (value === undefined || value === null || typeof value === 'boolean')
31
+ return value;
32
+ if (typeof value === 'string') {
33
+ if ((characters += value.length) > 16_777_216)
34
+ return refuse();
35
+ return value;
36
+ }
37
+ if (typeof value === 'number' && Number.isFinite(value))
38
+ return value;
39
+ if (typeof value !== 'object' || ancestors.has(value))
40
+ return refuse();
41
+ const array = Array.isArray(value);
42
+ const proto = Object.getPrototypeOf(value);
43
+ if (array ? proto !== Array.prototype : proto !== Object.prototype && proto !== null)
44
+ return refuse();
45
+ const keys = Reflect.ownKeys(value);
46
+ if (keys.length > 65_537)
47
+ return refuse();
48
+ ancestors.add(value);
49
+ try {
50
+ if (array) {
51
+ const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
52
+ if (!Number.isInteger(length) || length > 65_536 || keys.length !== length + 1)
53
+ return refuse();
54
+ return Array.from({ length }, (_, index) => {
55
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
56
+ if (!descriptor?.enumerable || !('value' in descriptor))
57
+ return refuse();
58
+ return copy(descriptor.value, depth + 1);
59
+ });
60
+ }
61
+ return Object.fromEntries(keys.map((key) => {
62
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
63
+ if (typeof key !== 'string' || !descriptor.enumerable || !('value' in descriptor))
64
+ return refuse();
65
+ if ((characters += key.length) > 16_777_216)
66
+ return refuse();
67
+ return [key, copy(descriptor.value, depth + 1)];
68
+ }));
69
+ }
70
+ finally {
71
+ ancestors.delete(value);
72
+ }
73
+ };
74
+ return copy(input);
75
+ }
76
+ function record(value, keys) {
77
+ if (!value || typeof value !== 'object' || Array.isArray(value) || Object.keys(value).some((key) => !keys.includes(key)))
78
+ refuse();
79
+ }
80
+ function unique(names) {
81
+ if (names.some((name) => !identifier(name)) || new Set(names).size !== names.length)
82
+ refuse();
83
+ }
84
+ function freeze(value) {
85
+ if (value && typeof value === 'object') {
86
+ for (const child of Object.values(value))
87
+ freeze(child);
88
+ Object.freeze(value);
89
+ }
90
+ return value;
91
+ }
92
+ const fkOrder = (a, b) => order(a.from.table, b.from.table) || order(a.name, b.name);
93
+ /** Whether `schema` is a catalog this module captured: detached, validated
94
+ * and deeply frozen, so nothing can change it after a reader binds to it. */
95
+ export function isCapturedScopeCatalog(schema) {
96
+ return !!schema && typeof schema === 'object' && capturedCatalogs.has(schema);
97
+ }
98
+ /** Whether nothing can change `schema` any more: a catalog this module
99
+ * captured, or one derived from a captured one that it froze all the way down. */
100
+ export function isFixedScopeCatalog(schema) {
101
+ return !!schema && typeof schema === 'object' && (capturedCatalogs.has(schema) || frozenDerived.has(schema));
102
+ }
103
+ /** Deeply freeze a catalog derived from a captured one, and remember that this
104
+ * module froze it: a later capture of it is then made once and kept. */
105
+ export function freezeDerivedCatalog(schema) {
106
+ freeze(schema);
107
+ frozenDerived.add(schema);
108
+ return schema;
109
+ }
110
+ /** Detached evidence only: labels, estimates and editing affordances confer no authority. */
111
+ export function captureScopeCatalog(schema) {
112
+ try {
113
+ if (schema && typeof schema === 'object' && capturedCatalogs.has(schema))
114
+ return schema;
115
+ const kept = schema && typeof schema === 'object' ? derivedCaptures.get(schema) : undefined;
116
+ if (kept)
117
+ return kept;
118
+ scopeCatalogCounters.captured++;
119
+ const data = copyData(schema);
120
+ record(data, ['label', 'dialect', 'readAt', 'tables', 'foreignKeys']);
121
+ if (!['sqlite', 'postgres', 'mssql'].includes(data.dialect) ||
122
+ typeof data.label !== 'string' ||
123
+ typeof data.readAt !== 'string' ||
124
+ !Array.isArray(data.tables) ||
125
+ !Array.isArray(data.foreignKeys))
126
+ return refuse();
127
+ for (const table of data.tables) {
128
+ record(table, [
129
+ 'id',
130
+ 'name',
131
+ 'schema',
132
+ 'isView',
133
+ 'columns',
134
+ 'approxRows',
135
+ 'comment',
136
+ 'indexed',
137
+ 'unique',
138
+ 'uniquePairs',
139
+ 'trigram',
140
+ 'deletable',
141
+ 'insertable',
142
+ 'sourceDialect',
143
+ ]);
144
+ if (!identifier(table.id) ||
145
+ /* A catalog of several connections says which engine reads each table
146
+ (appSourceCatalog.ts). It is the connection's, so it is carried and
147
+ left out of the fingerprint: one source's own catalog does not say it. */
148
+ (table.sourceDialect !== undefined && !['sqlite', 'postgres', 'mssql', 'http'].includes(table.sourceDialect)) ||
149
+ typeof table.name !== 'string' ||
150
+ typeof table.schema !== 'string' ||
151
+ typeof table.isView !== 'boolean' ||
152
+ !Array.isArray(table.columns) ||
153
+ !table.columns.length)
154
+ return refuse();
155
+ for (const column of table.columns) {
156
+ /* `flag` (an integer a CHECK pins to 0 and 1) is display evidence like
157
+ `allowed`: it says how to read a value and grants nothing, so it is
158
+ carried and left out of the fingerprint. */
159
+ /* `text` (a varchar's length, a simple CHECK's) is display evidence too: a form checks it as someone types. */
160
+ record(column, [
161
+ 'name',
162
+ 'type',
163
+ 'nullable',
164
+ 'primaryKey',
165
+ 'default',
166
+ 'identity',
167
+ 'references',
168
+ 'allowed',
169
+ 'flag',
170
+ 'text',
171
+ 'comment',
172
+ 'writable',
173
+ ]);
174
+ if (column.text !== undefined) {
175
+ record(column.text, ['min', 'max', 'pattern']);
176
+ const { min, max, pattern } = column.text;
177
+ if ([min, max].some((n) => n !== undefined && (typeof n !== 'number' || !Number.isInteger(n) || n < 1)) ||
178
+ (pattern !== undefined && typeof pattern !== 'string'))
179
+ return refuse();
180
+ }
181
+ if (!identifier(column.name) ||
182
+ typeof column.type !== 'string' ||
183
+ typeof column.nullable !== 'boolean' ||
184
+ typeof column.primaryKey !== 'boolean' ||
185
+ (column.default !== undefined && typeof column.default !== 'string') ||
186
+ (column.flag !== undefined && column.flag !== true) ||
187
+ (column.identity !== undefined && column.identity !== 'always' && column.identity !== 'by-default'))
188
+ return refuse();
189
+ if (column.references !== undefined) {
190
+ record(column.references, ['table', 'column']);
191
+ if (!identifier(column.references.table) || !identifier(column.references.column))
192
+ return refuse();
193
+ }
194
+ }
195
+ unique(table.columns.map((column) => column.name));
196
+ // Evidence for an App's natural-key address, never authority: only columns this table has.
197
+ if (table.unique !== undefined &&
198
+ (!Array.isArray(table.unique) ||
199
+ table.unique.some((name) => typeof name !== 'string' || !table.columns.some((column) => column.name === name))))
200
+ return refuse();
201
+ // The same evidence for a key unique within its tenant: pairs of columns this table has.
202
+ if (table.uniquePairs !== undefined &&
203
+ (!Array.isArray(table.uniquePairs) ||
204
+ table.uniquePairs.some((pair) => !Array.isArray(pair) ||
205
+ pair.length !== 2 ||
206
+ pair.some((name) => typeof name !== 'string' || !table.columns.some((column) => column.name === name)))))
207
+ return refuse();
208
+ // Index advice, as `unique` is address evidence: only columns this table has.
209
+ if (table.trigram !== undefined &&
210
+ (!Array.isArray(table.trigram) ||
211
+ table.trigram.some((name) => typeof name !== 'string' || !table.columns.some((column) => column.name === name))))
212
+ return refuse();
213
+ }
214
+ unique(data.tables.map((table) => table.id));
215
+ const captured = data;
216
+ const columns = new Map(captured.tables.map((table) => [table.id, new Set(table.columns.map((column) => column.name))]));
217
+ const endpoint = (table, names) => {
218
+ if (!columns.has(table) || names.some((name) => !columns.get(table).has(name)))
219
+ refuse();
220
+ };
221
+ const foreignKeys = new Set();
222
+ for (const fk of captured.foreignKeys) {
223
+ record(fk, ['name', 'from', 'to', 'onDelete', 'declared', 'stitched']);
224
+ if (!identifier(fk.name) ||
225
+ (fk.onDelete !== undefined && !['cascade', 'set null', 'set default', 'restrict', 'no action'].includes(fk.onDelete)))
226
+ return refuse();
227
+ /* An App's declared reference: evidence for a path, never authority, so
228
+ it is carried and left out of the fingerprint (authority below). */
229
+ if ((fk.declared !== undefined && fk.declared !== true) ||
230
+ (fk.stitched !== undefined && (fk.stitched !== true || fk.declared !== true)) ||
231
+ (fk.declared && (fk.onDelete !== undefined || fk.from.columns?.length !== 1)))
232
+ return refuse();
233
+ for (const side of [fk.from, fk.to]) {
234
+ record(side, ['table', 'columns']);
235
+ if (!identifier(side.table) || !Array.isArray(side.columns) || !side.columns.length)
236
+ return refuse();
237
+ unique(side.columns);
238
+ endpoint(side.table, side.columns);
239
+ }
240
+ if (fk.from.columns.length !== fk.to.columns.length)
241
+ return refuse();
242
+ // Constraint names are local to their referencing table, not the whole App.
243
+ const identity = JSON.stringify([fk.from.table, fk.name]);
244
+ if (foreignKeys.has(identity))
245
+ return refuse();
246
+ foreignKeys.add(identity);
247
+ }
248
+ for (const table of captured.tables) {
249
+ for (const column of table.columns) {
250
+ if (column.references)
251
+ endpoint(column.references.table, [column.references.column]);
252
+ }
253
+ }
254
+ const frozen = freeze(captured);
255
+ capturedCatalogs.add(frozen);
256
+ if (frozenDerived.has(schema))
257
+ derivedCaptures.set(schema, frozen);
258
+ return frozen;
259
+ }
260
+ catch {
261
+ return refuse();
262
+ }
263
+ }
264
+ /**
265
+ * The columns whose `references` an App's declared edge gave them, and no
266
+ * key of the database: `table\0column`. A declared edge is the App's word,
267
+ * not the database's, so a scoped catalog carries it for the paths through
268
+ * it and the database's own evidence never has it.
269
+ */
270
+ function declaredOnly(schema, stitchedOnly = false) {
271
+ /* A loop, not flatMap: the overflow preflight's test watches flatMap for
272
+ Cartesian materialization, and this runs before that preflight. */
273
+ const real = new Set();
274
+ for (const fk of schema.foreignKeys)
275
+ if (!fk.declared)
276
+ for (const column of fk.from.columns)
277
+ real.add(`${fk.from.table}\0${column}`);
278
+ return new Set(schema.foreignKeys
279
+ .filter((fk) => fk.declared && (!stitchedOnly || fk.stitched))
280
+ .map((fk) => `${fk.from.table}\0${fk.from.columns[0]}`)
281
+ .filter((key) => !real.has(key)));
282
+ }
283
+ function authority(schema) {
284
+ const declared = declaredOnly(schema);
285
+ return {
286
+ dialect: schema.dialect,
287
+ tables: schema.tables
288
+ .map((table) => ({
289
+ id: table.id,
290
+ isView: table.isView,
291
+ columns: table.columns
292
+ .map((column) => ({
293
+ name: column.name,
294
+ /* A SQLite TEXT column the App declares a date reads `TEXT as date` in the App's catalog
295
+ (declaredDates.ts): the App's word for how to read it, as a declared edge is, and never the
296
+ database's. The database still says TEXT, so the suffix is left out of the fingerprint; without
297
+ this every policy App with a write path and a declared date failed to load. */
298
+ type: schema.dialect === 'sqlite' ? column.type.replace(DECLARED_DATE, '') : column.type,
299
+ nullable: column.nullable,
300
+ primaryKey: column.primaryKey,
301
+ default: column.default,
302
+ identity: column.identity,
303
+ references: column.references && !declared.has(`${table.id}\0${column.name}`)
304
+ ? { table: column.references.table, column: column.references.column }
305
+ : undefined,
306
+ }))
307
+ .sort((a, b) => order(a.name, b.name)),
308
+ }))
309
+ .sort((a, b) => order(a.id, b.id)),
310
+ foreignKeys: schema.foreignKeys
311
+ .filter((fk) => !fk.declared)
312
+ .map((fk) => ({
313
+ name: fk.name,
314
+ from: { table: fk.from.table, columns: fk.from.columns },
315
+ to: { table: fk.to.table, columns: fk.to.columns },
316
+ onDelete: fk.onDelete,
317
+ }))
318
+ .sort(fkOrder),
319
+ };
320
+ }
321
+ export function assertScopeCatalog(expected, actual) {
322
+ const fingerprint = (schema) => {
323
+ const captured = captureScopeCatalog(schema);
324
+ const known = authorityFingerprints.get(captured);
325
+ if (known !== undefined)
326
+ return known;
327
+ const value = JSON.stringify(authority(captured));
328
+ authorityFingerprints.set(captured, value);
329
+ return value;
330
+ };
331
+ if (fingerprint(expected) !== fingerprint(actual))
332
+ refuse();
333
+ }
334
+ /**
335
+ * Where two catalogs part, in words for the operator who deploys the App: the
336
+ * first table or column the App's catalog says otherwise than the database.
337
+ * Startup's own check only (appPolicyDeployment.ts): a request's refusal keeps
338
+ * the fixed sentence, which names nothing the caller was not shown.
339
+ */
340
+ export function scopeCatalogDifference(expected, actual) {
341
+ let wanted, found;
342
+ try {
343
+ wanted = authority(captureScopeCatalog(expected));
344
+ found = authority(captureScopeCatalog(actual));
345
+ }
346
+ catch {
347
+ return undefined;
348
+ }
349
+ const say = (value) => (value === undefined ? 'nothing' : JSON.stringify(value));
350
+ for (const table of wanted.tables) {
351
+ const there = found.tables.find((each) => each.id === table.id);
352
+ if (!there)
353
+ return `table "${table.id}" is in the App's catalog and not in the database's`;
354
+ for (const column of table.columns) {
355
+ const other = there.columns.find((each) => each.name === column.name);
356
+ if (!other)
357
+ return `"${table.id}.${column.name}" is in the App's catalog and not in the database's`;
358
+ for (const key of Object.keys(column))
359
+ if (JSON.stringify(column[key]) !== JSON.stringify(other[key]))
360
+ return `"${table.id}.${column.name}" has ${key} ${say(column[key])} in the App's catalog and ${say(other[key])} in the database's`;
361
+ }
362
+ const extra = there.columns.find((column) => !table.columns.some((each) => each.name === column.name));
363
+ if (extra)
364
+ return `"${table.id}.${extra.name}" is in the database's catalog and not in the App's`;
365
+ }
366
+ const extra = found.tables.find((table) => !wanted.tables.some((each) => each.id === table.id));
367
+ if (extra)
368
+ return `table "${extra.id}" is in the database's catalog and not in the App's`;
369
+ return JSON.stringify(authority(captureScopeCatalog(expected))) === JSON.stringify(authority(captureScopeCatalog(actual)))
370
+ ? undefined
371
+ : 'their foreign keys differ';
372
+ }
373
+ /** Project exact known identities without dropping a relationship across the boundary. */
374
+ /* A mapping of a catalog nothing can change, by the mapping: a write
375
+ transaction's evidence catalog is the same mapping of the same cached
376
+ catalog every time (postgres.ts, sqlite.ts), and making it afresh copied and
377
+ checked the whole catalog twice per write (a field report: a tenth of a
378
+ loaded server's CPU). The result is captured and frozen, so it is shared. */
379
+ const mappings = new WeakMap();
380
+ /** Test-only: how many mappings were made rather than reused. */
381
+ export const mapScopeCounters = { mapped: 0 };
382
+ export function mapScopeCatalog(actual, ids) {
383
+ let key;
384
+ let kept;
385
+ try {
386
+ if (isFixedScopeCatalog(actual) && Object.getPrototypeOf(ids) === Map.prototype) {
387
+ key = JSON.stringify([...Map.prototype.entries.call(ids)]);
388
+ kept = mappings.get(actual);
389
+ const known = kept?.get(key);
390
+ if (known)
391
+ return known;
392
+ }
393
+ }
394
+ catch {
395
+ return refuse();
396
+ }
397
+ const made = mapScopeCatalogAfresh(actual, ids);
398
+ if (key !== undefined) {
399
+ if (!kept)
400
+ mappings.set(actual, (kept = new Map()));
401
+ kept.set(key, made);
402
+ }
403
+ return made;
404
+ }
405
+ function mapScopeCatalogAfresh(actual, ids) {
406
+ mapScopeCounters.mapped++;
407
+ try {
408
+ const whole = captureScopeCatalog(actual);
409
+ /* A stitched reference joins two connections, and a scoped catalog is
410
+ one connection's: it is left out here, never followed by a statement. */
411
+ const stitched = declaredOnly(whole, true);
412
+ const captured = !stitched.size
413
+ ? whole
414
+ : {
415
+ ...whole,
416
+ tables: whole.tables.map((table) => ({
417
+ ...table,
418
+ columns: table.columns.map((column) => {
419
+ if (!stitched.has(`${table.id}\0${column.name}`))
420
+ return column;
421
+ const { references: _elsewhere, ...kept } = column;
422
+ return kept;
423
+ }),
424
+ })),
425
+ foreignKeys: whole.foreignKeys.filter((fk) => !fk.stitched),
426
+ };
427
+ const mapped = new Map(Map.prototype.entries.call(ids));
428
+ unique([...mapped.keys()]);
429
+ unique([...mapped.values()]);
430
+ const known = new Set(captured.tables.map((table) => table.id));
431
+ if ([...mapped.keys()].some((id) => !known.has(id)))
432
+ return refuse();
433
+ const checkEdge = (from, to) => {
434
+ if (mapped.has(from) !== mapped.has(to))
435
+ refuse();
436
+ };
437
+ for (const table of captured.tables)
438
+ for (const column of table.columns) {
439
+ if (column.references)
440
+ checkEdge(table.id, column.references.table);
441
+ }
442
+ for (const fk of captured.foreignKeys)
443
+ checkEdge(fk.from.table, fk.to.table);
444
+ return captureScopeCatalog({
445
+ ...captured,
446
+ tables: captured.tables
447
+ .filter((table) => mapped.has(table.id))
448
+ .map((table) => ({
449
+ ...table,
450
+ id: mapped.get(table.id),
451
+ columns: table.columns.map((column) => ({
452
+ ...column,
453
+ ...(column.references ? { references: { ...column.references, table: mapped.get(column.references.table) } } : {}),
454
+ })),
455
+ })),
456
+ foreignKeys: captured.foreignKeys
457
+ .filter((fk) => mapped.has(fk.from.table))
458
+ .map((fk) => ({
459
+ ...fk,
460
+ from: { ...fk.from, table: mapped.get(fk.from.table) },
461
+ to: { ...fk.to, table: mapped.get(fk.to.table) },
462
+ })),
463
+ });
464
+ }
465
+ catch {
466
+ return refuse();
467
+ }
468
+ }