@mistriwork/engine 0.0.0-stage → 1.0.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +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 +62 -0
  386. package/dist/shared/keysetPage.js +159 -0
  387. package/dist/shared/like.d.ts +20 -0
  388. package/dist/shared/like.js +29 -0
  389. package/dist/shared/listEmpty.d.ts +12 -0
  390. package/dist/shared/listEmpty.js +36 -0
  391. package/dist/shared/listFilters.d.ts +28 -0
  392. package/dist/shared/listFilters.js +84 -0
  393. package/dist/shared/listPresentations.d.ts +199 -0
  394. package/dist/shared/listPresentations.js +7 -0
  395. package/dist/shared/listQuestion.d.ts +52 -0
  396. package/dist/shared/listQuestion.js +137 -0
  397. package/dist/shared/lookPalettes.d.ts +62 -0
  398. package/dist/shared/lookPalettes.js +306 -0
  399. package/dist/shared/maskQuoted.d.ts +24 -0
  400. package/dist/shared/maskQuoted.js +48 -0
  401. package/dist/shared/mentionLabel.d.ts +19 -0
  402. package/dist/shared/mentionLabel.js +38 -0
  403. package/dist/shared/mentionLookup.d.ts +17 -0
  404. package/dist/shared/mentionLookup.js +64 -0
  405. package/dist/shared/menuCounts.d.ts +16 -0
  406. package/dist/shared/menuCounts.js +74 -0
  407. package/dist/shared/model.d.ts +79 -0
  408. package/dist/shared/model.js +153 -0
  409. package/dist/shared/money.d.ts +44 -0
  410. package/dist/shared/money.js +81 -0
  411. package/dist/shared/moneyEntry.d.ts +7 -0
  412. package/dist/shared/moneyEntry.js +27 -0
  413. package/dist/shared/mount.d.ts +118 -0
  414. package/dist/shared/mount.js +248 -0
  415. package/dist/shared/niceTicks.d.ts +26 -0
  416. package/dist/shared/niceTicks.js +50 -0
  417. package/dist/shared/order.d.ts +59 -0
  418. package/dist/shared/order.js +133 -0
  419. package/dist/shared/page.d.ts +135 -0
  420. package/dist/shared/page.js +1187 -0
  421. package/dist/shared/pageAnatomy.d.ts +99 -0
  422. package/dist/shared/pageAnatomy.js +370 -0
  423. package/dist/shared/pageConfig.d.ts +25 -0
  424. package/dist/shared/pageConfig.js +1308 -0
  425. package/dist/shared/pageEmptyActions.d.ts +12 -0
  426. package/dist/shared/pageEmptyActions.js +20 -0
  427. package/dist/shared/pageLayouts.d.ts +72 -0
  428. package/dist/shared/pageLayouts.js +205 -0
  429. package/dist/shared/pageModel.d.ts +785 -0
  430. package/dist/shared/pageModel.js +121 -0
  431. package/dist/shared/pagePaths.d.ts +180 -0
  432. package/dist/shared/pagePaths.js +869 -0
  433. package/dist/shared/pagePlans.d.ts +52 -0
  434. package/dist/shared/pagePlans.js +108 -0
  435. package/dist/shared/pageRoutes.d.ts +9 -0
  436. package/dist/shared/pageRoutes.js +9 -0
  437. package/dist/shared/query.d.ts +166 -0
  438. package/dist/shared/query.js +1302 -0
  439. package/dist/shared/queryDates.d.ts +12 -0
  440. package/dist/shared/queryDates.js +101 -0
  441. package/dist/shared/queryOperands.d.ts +99 -0
  442. package/dist/shared/queryOperands.js +131 -0
  443. package/dist/shared/reads.d.ts +103 -0
  444. package/dist/shared/reads.js +154 -0
  445. package/dist/shared/recordLabel.d.ts +51 -0
  446. package/dist/shared/recordLabel.js +123 -0
  447. package/dist/shared/recordReadKeys.d.ts +30 -0
  448. package/dist/shared/recordReadKeys.js +51 -0
  449. package/dist/shared/recordReads.d.ts +268 -0
  450. package/dist/shared/recordReads.js +368 -0
  451. package/dist/shared/recordview.d.ts +198 -0
  452. package/dist/shared/recordview.js +356 -0
  453. package/dist/shared/referenceModel.d.ts +58 -0
  454. package/dist/shared/referenceModel.js +194 -0
  455. package/dist/shared/refusal.d.ts +64 -0
  456. package/dist/shared/refusal.js +144 -0
  457. package/dist/shared/relatedCreate.d.ts +30 -0
  458. package/dist/shared/relatedCreate.js +162 -0
  459. package/dist/shared/resourceHttp.d.ts +464 -0
  460. package/dist/shared/resourceHttp.js +1 -0
  461. package/dist/shared/richText.d.ts +85 -0
  462. package/dist/shared/richText.js +305 -0
  463. package/dist/shared/rollups.d.ts +143 -0
  464. package/dist/shared/rollups.js +64 -0
  465. package/dist/shared/rowScope.d.ts +72 -0
  466. package/dist/shared/rowScope.js +376 -0
  467. package/dist/shared/runtimeTables.d.ts +44 -0
  468. package/dist/shared/runtimeTables.js +79 -0
  469. package/dist/shared/schema.d.ts +523 -0
  470. package/dist/shared/schema.js +627 -0
  471. package/dist/shared/schematext.d.ts +38 -0
  472. package/dist/shared/schematext.js +101 -0
  473. package/dist/shared/scopeCatalog.d.ts +29 -0
  474. package/dist/shared/scopeCatalog.js +468 -0
  475. package/dist/shared/servedApp.d.ts +681 -0
  476. package/dist/shared/servedApp.js +45 -0
  477. package/dist/shared/sessionLease.d.ts +34 -0
  478. package/dist/shared/sessionLease.js +3 -0
  479. package/dist/shared/shape.d.ts +55 -0
  480. package/dist/shared/shape.js +168 -0
  481. package/dist/shared/slug.d.ts +1 -0
  482. package/dist/shared/slug.js +12 -0
  483. package/dist/shared/sortText.d.ts +14 -0
  484. package/dist/shared/sortText.js +26 -0
  485. package/dist/shared/sqlRelation.d.ts +4 -0
  486. package/dist/shared/sqlRelation.js +8 -0
  487. package/dist/shared/sqlsaved.d.ts +44 -0
  488. package/dist/shared/sqlsaved.js +63 -0
  489. package/dist/shared/stitchedPaths.d.ts +27 -0
  490. package/dist/shared/stitchedPaths.js +38 -0
  491. package/dist/shared/structuredFilter.d.ts +22 -0
  492. package/dist/shared/structuredFilter.js +1 -0
  493. package/dist/shared/subtitlePath.d.ts +20 -0
  494. package/dist/shared/subtitlePath.js +24 -0
  495. package/dist/shared/suggest.d.ts +18 -0
  496. package/dist/shared/suggest.js +59 -0
  497. package/dist/shared/tableSizing.d.ts +4 -0
  498. package/dist/shared/tableSizing.js +9 -0
  499. package/dist/shared/tagLists.d.ts +57 -0
  500. package/dist/shared/tagLists.js +34 -0
  501. package/dist/shared/textRules.d.ts +54 -0
  502. package/dist/shared/textRules.js +133 -0
  503. package/dist/shared/theme.d.ts +94 -0
  504. package/dist/shared/theme.js +800 -0
  505. package/dist/shared/themeColor.d.ts +34 -0
  506. package/dist/shared/themeColor.js +109 -0
  507. package/dist/shared/themeFaces.d.ts +30 -0
  508. package/dist/shared/themeFaces.js +42 -0
  509. package/dist/shared/themeInk.d.ts +20 -0
  510. package/dist/shared/themeInk.js +52 -0
  511. package/dist/shared/themeLooks.d.ts +9 -0
  512. package/dist/shared/themeLooks.js +572 -0
  513. package/dist/shared/themeParts.d.ts +26 -0
  514. package/dist/shared/themeParts.js +71 -0
  515. package/dist/shared/themePartsCheck.d.ts +21 -0
  516. package/dist/shared/themePartsCheck.js +91 -0
  517. package/dist/shared/themePresets.d.ts +85 -0
  518. package/dist/shared/themePresets.js +139 -0
  519. package/dist/shared/themeRecipeWords.d.ts +156 -0
  520. package/dist/shared/themeRecipeWords.js +156 -0
  521. package/dist/shared/themeRecipes.d.ts +213 -0
  522. package/dist/shared/themeRecipes.js +234 -0
  523. package/dist/shared/themeResolve.d.ts +55 -0
  524. package/dist/shared/themeResolve.js +52 -0
  525. package/dist/shared/themeTokens.d.ts +107 -0
  526. package/dist/shared/themeTokens.js +116 -0
  527. package/dist/shared/themeType.d.ts +38 -0
  528. package/dist/shared/themeType.js +205 -0
  529. package/dist/shared/unitWord.d.ts +4 -0
  530. package/dist/shared/unitWord.js +37 -0
  531. package/dist/shared/view.d.ts +195 -0
  532. package/dist/shared/view.js +987 -0
  533. package/dist/shared/viewLabels.d.ts +47 -0
  534. package/dist/shared/viewLabels.js +459 -0
  535. package/dist/shared/viewPaths.d.ts +248 -0
  536. package/dist/shared/viewPaths.js +294 -0
  537. package/dist/shared/viewtext.d.ts +57 -0
  538. package/dist/shared/viewtext.js +282 -0
  539. package/dist/shared/vocabulary.d.ts +71 -0
  540. package/dist/shared/vocabulary.js +249 -0
  541. package/dist/shared/weekStart.d.ts +7 -0
  542. package/dist/shared/weekStart.js +36 -0
  543. package/mark.svg +1 -0
  544. package/package.json +261 -4
  545. package/schema/model.d.ts +298 -0
  546. package/schema/theme.d.ts +587 -0
@@ -0,0 +1,487 @@
1
+ /**
2
+ * An OpenAPI document read as a catalog of browsable resources.
3
+ *
4
+ * A resource is a collection an API lists (`GET /contacts`) together with the
5
+ * item it reads by key (`GET /contacts/{id}`), when both answer the same kind
6
+ * of row. For each one this says the columns a row carries and what the API
7
+ * can do with a list — filter, search, sort, page — as data, so tablewalk
8
+ * asks the API only what it can answer and refuses the rest by name.
9
+ *
10
+ * Pure: a parsed JSON document in, a catalog out. The spec is pinned locally
11
+ * and read at startup, as a database's catalog is read on connect, so there
12
+ * is no network here, no remote `$ref` and no YAML. Nothing outside the
13
+ * supported subset is guessed at: its operation is skipped with the reason,
14
+ * which `--check-openapi` prints. Paging is the one inference, and every
15
+ * inferred setting is listed under `guesses` for the author to confirm.
16
+ */
17
+ /** The whole document is outside what tablewalk reads; the message names the fix. */
18
+ export class OpenApiError extends Error {
19
+ code = 'openapi_unsupported';
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = 'OpenApiError';
23
+ }
24
+ }
25
+ const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
26
+ /* One operation outside the subset: skipped with this reason, never the whole document's failure. */
27
+ class Skip extends Error {
28
+ }
29
+ /* Bounds on what one document may ask of the reader, so a pathological spec
30
+ costs a refusal rather than a hung startup. */
31
+ const LIMITS = { paths: 2000, properties: 500, refDepth: 32, allOfDepth: 8 };
32
+ /* Parameter names that mean paging, search or sort rather than a column.
33
+ A name the author uses differently is corrected in the description the
34
+ import drafts; the reader only proposes. */
35
+ const SEARCH = ['q', 'search', 'query'];
36
+ const SORT = ['sort', 'sort_by', 'sortBy', 'order', 'order_by', 'orderBy'];
37
+ const PAGING = {
38
+ offset: ['offset', 'skip'],
39
+ limit: ['limit', 'per_page', 'page_size', 'pageSize', 'size'],
40
+ page: ['page', 'page_number', 'pageNumber'],
41
+ cursor: ['cursor', 'after', 'page_token', 'pageToken', 'starting_after', 'next_token'],
42
+ next: ['next_cursor', 'nextCursor', 'next_page_token', 'nextPageToken', 'next', 'cursor'],
43
+ };
44
+ const NAME = /^[A-Za-z_][A-Za-z0-9_-]*$/;
45
+ const pointer = (name) => name.replace(/~/g, '~0').replace(/\//g, '~1');
46
+ const typesOf = (schema) => Array.isArray(schema.type)
47
+ ? schema.type.filter((type) => typeof type === 'string')
48
+ : typeof schema.type === 'string'
49
+ ? [schema.type]
50
+ : [];
51
+ /** Follows local `$ref`s within this one document; a remote one is a Skip, never a fetch. */
52
+ function resolver(document) {
53
+ return function resolve(value) {
54
+ let current = value;
55
+ for (let depth = 0; isObject(current) && typeof current.$ref === 'string'; depth++) {
56
+ if (depth >= LIMITS.refDepth)
57
+ throw new Skip(`a $ref chain is longer than ${LIMITS.refDepth} links`);
58
+ const ref = current.$ref;
59
+ if (!ref.startsWith('#/'))
60
+ throw new Skip(`the remote $ref ${JSON.stringify(ref)} is not read: only one file is read`);
61
+ let target = document;
62
+ for (const raw of ref.slice(2).split('/')) {
63
+ const key = raw.replace(/~1/g, '/').replace(/~0/g, '~');
64
+ target = isObject(target) && Object.hasOwn(target, key) ? target[key] : undefined;
65
+ }
66
+ if (target === undefined)
67
+ throw new Skip(`the $ref ${JSON.stringify(ref)} names nothing in the document`);
68
+ current = target;
69
+ }
70
+ return current;
71
+ };
72
+ }
73
+ /* A row's properties, with `allOf` parts merged in order. A row that is one
74
+ of several shapes has no single set of columns, so it is skipped rather
75
+ than flattened into something no response actually is. */
76
+ function rowShape(resolve, raw, depth = 0) {
77
+ if (depth > LIMITS.allOfDepth)
78
+ throw new Skip(`allOf nests deeper than ${LIMITS.allOfDepth} levels`);
79
+ const schema = resolve(raw);
80
+ if (!isObject(schema))
81
+ throw new Skip('the row schema is not an object');
82
+ if (schema.oneOf !== undefined || schema.anyOf !== undefined || schema.discriminator !== undefined) {
83
+ throw new Skip('a row that is one of several shapes (oneOf, anyOf, discriminator) is not read yet');
84
+ }
85
+ const shape = { properties: new Map(), required: new Set() };
86
+ const add = (name, property) => {
87
+ const before = shape.properties.get(name);
88
+ if (before !== undefined && JSON.stringify(before) !== JSON.stringify(property)) {
89
+ throw new Skip(`the property "${name}" is declared twice with different schemas`);
90
+ }
91
+ shape.properties.set(name, property);
92
+ };
93
+ const parts = Array.isArray(schema.allOf) ? schema.allOf : [];
94
+ for (const part of parts) {
95
+ const inner = rowShape(resolve, part, depth + 1);
96
+ for (const [name, property] of inner.properties)
97
+ add(name, property);
98
+ for (const name of inner.required)
99
+ shape.required.add(name);
100
+ }
101
+ if (isObject(schema.properties))
102
+ for (const [name, property] of Object.entries(schema.properties))
103
+ add(name, property);
104
+ if (Array.isArray(schema.required))
105
+ for (const name of schema.required)
106
+ if (typeof name === 'string')
107
+ shape.required.add(name);
108
+ if (!parts.length && !isObject(schema.properties) && !typesOf(schema).includes('object'))
109
+ throw new Skip('the row schema is not an object');
110
+ if (shape.properties.size > LIMITS.properties)
111
+ throw new Skip(`a row has ${shape.properties.size} properties; at most ${LIMITS.properties} are read`);
112
+ return shape;
113
+ }
114
+ function column(resolve, name, raw, required) {
115
+ const resolved = resolve(raw);
116
+ let property = isObject(resolved) ? resolved : {};
117
+ // Only an exact scalar-or-null union has one column type. Other unions
118
+ // remain documents; annotations outside the union must not erase a constraint.
119
+ if (Array.isArray(property.anyOf) &&
120
+ property.anyOf.length === 2 &&
121
+ Object.keys(property).every((key) => ['anyOf', 'description', 'title', 'readOnly'].includes(key))) {
122
+ const arms = property.anyOf.map(resolve);
123
+ const nullIndex = arms.findIndex((arm) => isObject(arm) && arm.type === 'null' && Object.keys(arm).length === 1);
124
+ const scalar = arms[1 - nullIndex];
125
+ if (nullIndex !== -1 &&
126
+ isObject(scalar) &&
127
+ typeof scalar.type === 'string' &&
128
+ ['string', 'integer', 'number', 'boolean'].includes(scalar.type) &&
129
+ !['anyOf', 'oneOf', 'allOf', 'properties', 'items'].some((key) => Object.hasOwn(scalar, key))) {
130
+ const { anyOf: _union, ...annotations } = property;
131
+ property = { ...scalar, ...annotations, nullable: true };
132
+ }
133
+ }
134
+ const types = typesOf(property), base = types.filter((type) => type !== 'null');
135
+ const allowed = Array.isArray(property.enum) && property.enum.length && property.enum.every((value) => typeof value === 'string')
136
+ ? property.enum
137
+ : undefined;
138
+ let type;
139
+ /* A nested object, an array or a value of several shapes is one document:
140
+ shown whole, never filtered, never edited as a field. */
141
+ if (property.oneOf !== undefined ||
142
+ property.anyOf !== undefined ||
143
+ property.allOf !== undefined ||
144
+ isObject(property.properties) ||
145
+ base.length > 1 ||
146
+ base.includes('object') ||
147
+ base.includes('array'))
148
+ type = 'json';
149
+ else if (base[0] === 'string' || (!base.length && allowed)) {
150
+ type =
151
+ property.format === 'date' ? 'date' : property.format === 'date-time' ? 'datetime' : property.format === 'uuid' ? 'uuid' : 'string';
152
+ }
153
+ else if (base[0] === 'integer')
154
+ type = property.format === 'int64' ? 'bigint' : 'integer';
155
+ else if (base[0] === 'number')
156
+ type = 'number';
157
+ else if (base[0] === 'boolean')
158
+ type = 'boolean';
159
+ else
160
+ type = 'json';
161
+ const comment = typeof property.description === 'string' && property.description ? property.description : undefined;
162
+ return {
163
+ name,
164
+ type,
165
+ nullable: !required || types.includes('null') || property.nullable === true,
166
+ readOnly: property.readOnly === true || type === 'json',
167
+ ...(allowed ? { allowed } : {}),
168
+ ...(comment ? { comment } : {}),
169
+ };
170
+ }
171
+ /* Path-level parameters apply to every operation under the path; an
172
+ operation's own parameter of the same name and place replaces one. */
173
+ function parameters(resolve, pathItem, operation) {
174
+ const byKey = new Map();
175
+ for (const list of [pathItem.parameters, operation.parameters]) {
176
+ if (!Array.isArray(list))
177
+ continue;
178
+ for (const raw of list) {
179
+ const parameter = resolve(raw);
180
+ if (!isObject(parameter) || typeof parameter.name !== 'string' || typeof parameter.in !== 'string')
181
+ continue;
182
+ const schema = resolve(parameter.schema);
183
+ byKey.set(`${parameter.in}:${parameter.name}`, {
184
+ name: parameter.name,
185
+ in: parameter.in,
186
+ schema: isObject(schema) ? schema : {},
187
+ csv: parameter.style === 'form' && parameter.explode === false,
188
+ fields: parameter['x-mistri-fields'],
189
+ });
190
+ }
191
+ }
192
+ return [...byKey.values()];
193
+ }
194
+ /** The JSON schema of an operation's first success response, if it has one. */
195
+ function successSchema(resolve, operation) {
196
+ const responses = isObject(operation.responses) ? operation.responses : {};
197
+ const code = Object.keys(responses)
198
+ .filter((status) => /^2\d\d$/.test(status))
199
+ .sort()[0] ?? (Object.hasOwn(responses, '2XX') ? '2XX' : undefined);
200
+ if (code === undefined)
201
+ return undefined;
202
+ const response = resolve(responses[code]);
203
+ if (!isObject(response) || !isObject(response.content))
204
+ return undefined;
205
+ const media = Object.keys(response.content).find((type) => type === 'application/json' || /^application\/[\w.+-]*\+json$/.test(type));
206
+ const content = media === undefined ? undefined : response.content[media];
207
+ return isObject(content) ? content.schema : undefined;
208
+ }
209
+ /* Where a list response keeps its rows: the response itself, or the one
210
+ array in an object. Two arrays leave no honest answer, so that is a Skip. */
211
+ function listRows(resolve, raw) {
212
+ const schema = resolve(raw);
213
+ if (!isObject(schema))
214
+ throw new Skip("the list's success response has no JSON schema");
215
+ if (typesOf(schema).includes('array'))
216
+ return { rows: '', items: schema.items };
217
+ const properties = isObject(schema.properties) ? schema.properties : {};
218
+ const arrays = Object.entries(properties).filter(([, value]) => {
219
+ const property = resolve(value);
220
+ return isObject(property) && typesOf(property).includes('array');
221
+ });
222
+ if (arrays.length !== 1) {
223
+ throw new Skip(arrays.length
224
+ ? `the list response holds ${arrays.length} arrays (${arrays.map(([name]) => name).join(', ')}), so which one is the rows is not clear`
225
+ : 'the list response is neither an array nor an object holding one array of rows');
226
+ }
227
+ const [name, value] = arrays[0];
228
+ return { rows: `/${pointer(name)}`, items: resolve(value).items, body: schema };
229
+ }
230
+ /* A sparse list may omit properties that its full item requires, but must
231
+ describe exactly the same property types. Imported nullability remains
232
+ conservative because column() reads the list's required set. */
233
+ function sameRow(resolve, a, b) {
234
+ if (isObject(a) && isObject(b) && typeof a.$ref === 'string' && a.$ref === b.$ref)
235
+ return true;
236
+ const list = resolve(a), item = resolve(b);
237
+ if (JSON.stringify(list) === JSON.stringify(item))
238
+ return true;
239
+ const closed = (raw) => {
240
+ if (!isObject(raw) || raw.type !== 'object' || raw.additionalProperties !== false || !isObject(raw.properties))
241
+ return;
242
+ const metadata = ['x-mistri-primary-key', 'x-mistri-default-fields', 'x-mistri-projection-validation'];
243
+ if (Object.keys(raw).some((key) => !['type', 'properties', 'required', 'additionalProperties', ...metadata].includes(key)))
244
+ return;
245
+ const names = Object.keys(raw.properties);
246
+ const members = (value) => Array.isArray(value) &&
247
+ value.every((name) => typeof name === 'string' && names.includes(name)) &&
248
+ new Set(value).size === value.length;
249
+ if (!members(raw.required))
250
+ return;
251
+ const required = raw.required;
252
+ if (metadata.some((key) => Object.hasOwn(raw, key))) {
253
+ const key = raw['x-mistri-primary-key'], fields = raw['x-mistri-default-fields'];
254
+ if (!members(key) ||
255
+ !key.length ||
256
+ !members(fields) ||
257
+ fields.length !== names.length ||
258
+ key.length !== required.length ||
259
+ key.some((name) => !required.includes(name)) ||
260
+ raw['x-mistri-projection-validation'] !== 'request-codec-requires-exact-selected-fields-plus-complete-key')
261
+ return;
262
+ }
263
+ return { properties: raw.properties, required };
264
+ };
265
+ const left = closed(list), right = closed(item);
266
+ return Boolean(left &&
267
+ right &&
268
+ JSON.stringify(left.properties) === JSON.stringify(right.properties) &&
269
+ left.required.every((name) => right.required.includes(name)));
270
+ }
271
+ function readResource(resolve, path, pathItem, itemPath, itemItem) {
272
+ const segment = path.slice(path.lastIndexOf('/') + 1);
273
+ if (!NAME.test(segment))
274
+ throw new Skip(`"${segment}" is not a usable resource name`);
275
+ const list = pathItem.get, item = itemItem.get;
276
+ const listSchema = successSchema(resolve, list), itemSchema = successSchema(resolve, item);
277
+ if (listSchema === undefined)
278
+ throw new Skip("the list's success response has no JSON schema");
279
+ if (itemSchema === undefined)
280
+ throw new Skip(`GET ${itemPath} has no JSON success response`);
281
+ const { rows, items, body } = listRows(resolve, listSchema);
282
+ if (!sameRow(resolve, items, itemSchema))
283
+ throw new Skip(`GET ${path} and GET ${itemPath} answer different row shapes`);
284
+ const shape = rowShape(resolve, items);
285
+ const key = itemPath.slice(path.length + 2, -1);
286
+ const keyParameter = parameters(resolve, itemItem, item).find((parameter) => parameter.in === 'path' && parameter.name === key);
287
+ if (keyParameter && (typesOf(keyParameter.schema).includes('object') || isObject(keyParameter.schema.properties))) {
288
+ throw new Skip(`the item's path parameter {${key}} is a composite object key, which is not supported`);
289
+ }
290
+ if (!shape.properties.has(key))
291
+ throw new Skip(`the item's path parameter {${key}} names no property of the row`);
292
+ const columns = [...shape.properties]
293
+ .map(([name, property]) => column(resolve, name, property, shape.required.has(name)))
294
+ .map((each) => (each.name === key ? { ...each, nullable: false } : each));
295
+ if (columns.find((each) => each.name === key)?.type === 'json')
296
+ throw new Skip(`the key "${key}" is a document, not a value`);
297
+ const query = parameters(resolve, pathItem, list).filter((parameter) => parameter.in === 'query');
298
+ const byName = new Map(query.map((parameter) => [parameter.name, parameter]));
299
+ const first = (names) => names.find((name) => byName.has(name));
300
+ const used = new Set();
301
+ const [offset, limit, page, cursor] = [first(PAGING.offset), first(PAGING.limit), first(PAGING.page), first(PAGING.cursor)];
302
+ const next = body && isObject(body.properties) ? PAGING.next.find((name) => Object.hasOwn(body.properties, name)) : undefined;
303
+ let paging = { kind: 'none' };
304
+ let guess = 'paging: none found — the list is read as one page';
305
+ if (cursor && next) {
306
+ paging = { kind: 'cursor', param: cursor, next: `/${pointer(next)}`, ...(limit ? { limit } : {}) };
307
+ guess = `paging: cursor — sends "${cursor}", reads the next one at /${pointer(next)}${limit ? `, page size "${limit}"` : ''}`;
308
+ used.add(cursor);
309
+ if (limit)
310
+ used.add(limit);
311
+ }
312
+ else if (offset && limit) {
313
+ paging = { kind: 'offset', offset, limit };
314
+ guess = `paging: offset — "${offset}" and "${limit}"`;
315
+ used.add(offset);
316
+ used.add(limit);
317
+ }
318
+ else if (page && limit) {
319
+ paging = { kind: 'page', page, size: limit };
320
+ guess = `paging: page — "${page}" and "${limit}"`;
321
+ used.add(page);
322
+ used.add(limit);
323
+ }
324
+ const search = SEARCH.find((name) => {
325
+ const schema = byName.get(name)?.schema;
326
+ return schema !== undefined && (!typesOf(schema).length || typesOf(schema).includes('string'));
327
+ });
328
+ if (search)
329
+ used.add(search);
330
+ let sort;
331
+ for (const name of SORT) {
332
+ const schema = byName.get(name)?.schema;
333
+ if (!schema)
334
+ continue;
335
+ const values = [schema.enum, isObject(schema.items) ? schema.items.enum : undefined].find((list) => Array.isArray(list) && list.length && list.every((value) => typeof value === 'string'));
336
+ // Without its documented values a sort parameter's syntax is unknown, so it is not offered.
337
+ if (values) {
338
+ sort = { param: name, values };
339
+ used.add(name);
340
+ break;
341
+ }
342
+ const fields = byName.get(name)?.fields;
343
+ if (Array.isArray(fields) &&
344
+ fields.length &&
345
+ fields.every((field) => typeof field === 'string' && /^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(field)) &&
346
+ new Set(fields).size === fields.length) {
347
+ const field = `(?:${fields.map((field) => field.replaceAll('.', '\\.')).join('|')})`;
348
+ if (schema.type === 'string' && schema.pattern === `^-?${field}(?:,-?${field})*$(?![\\s\\S])`) {
349
+ sort = { param: name, values: fields.flatMap((field) => [field, `-${field}`]) };
350
+ used.add(name);
351
+ break;
352
+ }
353
+ }
354
+ }
355
+ const filters = {};
356
+ for (const parameter of query) {
357
+ if (used.has(parameter.name))
358
+ continue;
359
+ const target = columns.find((each) => each.name === parameter.name);
360
+ if (!target || target.type === 'json')
361
+ continue;
362
+ const array = typesOf(parameter.schema).includes('array') ||
363
+ (parameter.csv &&
364
+ Array.isArray(parameter.schema.anyOf) &&
365
+ parameter.schema.anyOf.length === 2 &&
366
+ parameter.schema.anyOf.some((arm) => isObject(arm) && arm.type === 'array') &&
367
+ parameter.schema.anyOf.some((arm) => isObject(arm) && arm.type === 'string'));
368
+ filters[target.name] = {
369
+ param: parameter.name,
370
+ ops: array ? ['=', 'in'] : ['='],
371
+ ...(array && parameter.csv ? { serialization: 'csv' } : {}),
372
+ };
373
+ }
374
+ const comment = typeof list.summary === 'string' && list.summary ? list.summary : undefined;
375
+ return {
376
+ name: segment,
377
+ list: path,
378
+ item: itemPath,
379
+ key,
380
+ rows,
381
+ columns,
382
+ filters,
383
+ ...(search ? { search } : {}),
384
+ ...(sort ? { sort } : {}),
385
+ paging,
386
+ guesses: [guess],
387
+ ...(comment ? { comment } : {}),
388
+ };
389
+ }
390
+ /* Two keys can hold the same value only when they are the same kind of value. */
391
+ const KEY_KIND = { string: 'text', uuid: 'text', integer: 'number', bigint: 'number' };
392
+ /* A spec has no foreign keys to read. What it has is names: a `carrier_id`
393
+ beside a `carriers` resource keyed by the same kind of value is guessed to
394
+ point at it, and said so under `guesses`, as the paging is — a draft to
395
+ confirm, because a name is a signal and not a promise. */
396
+ function guessReferences(resources) {
397
+ for (const resource of resources) {
398
+ for (const column of resource.columns) {
399
+ const stem = /^(.+)_id$/.exec(column.name)?.[1];
400
+ if (!stem || column.name === resource.key)
401
+ continue;
402
+ const names = [stem, `${stem}s`, `${stem}es`, stem.replace(/y$/, 'ies')];
403
+ const target = resources.find((each) => names.includes(each.name));
404
+ const key = target?.columns.find((each) => each.name === target.key);
405
+ if (!target || !key || !KEY_KIND[key.type] || KEY_KIND[key.type] !== KEY_KIND[column.type])
406
+ continue;
407
+ column.references = target.name;
408
+ resource.guesses.push(`references: ${column.name} → ${target.name}, by its name`);
409
+ }
410
+ }
411
+ }
412
+ /**
413
+ * Reads a parsed OpenAPI 3.0 or 3.1 document. Throws `OpenApiError` only for
414
+ * a document tablewalk cannot read at all; everything else becomes either a
415
+ * resource or a skipped operation with its reason.
416
+ */
417
+ export function readOpenApi(document) {
418
+ if (!isObject(document))
419
+ throw new OpenApiError('An OpenAPI document is a JSON object.');
420
+ if (typeof document.swagger === 'string') {
421
+ throw new OpenApiError(`This is a Swagger ${document.swagger} document. Only OpenAPI 3.0 and 3.1 are read; convert it first (swagger2openapi, or your framework's exporter).`);
422
+ }
423
+ if (typeof document.openapi !== 'string' || !/^3\.[01]\.\d+$/.test(document.openapi)) {
424
+ throw new OpenApiError(`Only OpenAPI 3.0 and 3.1 are read; this document says ${JSON.stringify(document.openapi ?? null)}.`);
425
+ }
426
+ if (!isObject(document.paths))
427
+ throw new OpenApiError('The document has no "paths" object.');
428
+ const paths = document.paths;
429
+ const keys = Object.keys(paths).sort();
430
+ if (keys.length > LIMITS.paths)
431
+ throw new OpenApiError(`The document has ${keys.length} paths; at most are read.`);
432
+ const resolve = resolver(document);
433
+ const withGet = (path) => {
434
+ try {
435
+ const pathItem = resolve(paths[path]);
436
+ return isObject(pathItem) && isObject(pathItem.get) ? pathItem : undefined;
437
+ }
438
+ catch {
439
+ return undefined;
440
+ }
441
+ };
442
+ const resources = [];
443
+ const skipped = [];
444
+ const claimed = new Set();
445
+ const names = new Set();
446
+ for (const path of keys) {
447
+ if (path.includes('{'))
448
+ continue;
449
+ const pathItem = withGet(path);
450
+ if (!pathItem)
451
+ continue;
452
+ try {
453
+ const itemPath = keys.find((candidate) => candidate.startsWith(`${path}/{`) && /^\{[^{}/]+\}$/.test(candidate.slice(path.length + 1)) && withGet(candidate));
454
+ if (!itemPath)
455
+ throw new Skip(`no item operation (GET ${path}/{id}) reads one row by its key`);
456
+ claimed.add(itemPath);
457
+ const resource = readResource(resolve, path, pathItem, itemPath, withGet(itemPath));
458
+ if (names.has(resource.name))
459
+ throw new Skip(`another collection is already called "${resource.name}"`);
460
+ names.add(resource.name);
461
+ resources.push(resource);
462
+ }
463
+ catch (error) {
464
+ if (!(error instanceof Skip))
465
+ throw error;
466
+ skipped.push({ operation: `GET ${path}`, reason: error.message });
467
+ }
468
+ }
469
+ for (const path of keys) {
470
+ if (!path.includes('{') || claimed.has(path) || !withGet(path))
471
+ continue;
472
+ const reason = /\{[^}]+\}\//.test(path)
473
+ ? 'nested collections (a list under an item) are not read yet'
474
+ : (path.match(/\{[^}]+\}/g) ?? []).length > 1
475
+ ? 'an item addressed by more than one path parameter is not read yet'
476
+ : `no list operation (GET ${path.slice(0, path.lastIndexOf('/'))}) lists these rows`;
477
+ skipped.push({ operation: `GET ${path}`, reason });
478
+ }
479
+ guessReferences(resources);
480
+ const info = isObject(document.info) ? document.info : {};
481
+ return {
482
+ title: typeof info.title === 'string' && info.title ? info.title : 'API',
483
+ version: typeof info.version === 'string' ? info.version : '',
484
+ resources: resources.sort((a, b) => a.name.localeCompare(b.name)),
485
+ skipped: skipped.sort((a, b) => a.operation.localeCompare(b.operation)),
486
+ };
487
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * What a store says when the layout it holds is not the one this build expects.
3
+ *
4
+ * Every store attests its layout at open, and an attestation compares a whole
5
+ * catalog, so on its own it can only say "missing or not the layout this
6
+ * version expects". The version row is read apart, after the comparison has
7
+ * failed, to say which way the difference runs: a newer build wrote it
8
+ * (upgrade to open it) or an older one did (`mistri migrate stores up`,
9
+ * which `migrate stores status` already reports in the same words). Nothing
10
+ * is altered either way. A store with no readable version row, or at the
11
+ * expected version, keeps the store's own generic message.
12
+ */
13
+ import type { DatabaseSync } from 'node:sqlite';
14
+ import type { PgQuery } from './postgresPool.js';
15
+ /** The message for a store found at `found` when `expected` was wanted; undefined when the version does not explain the refusal. */
16
+ export declare function layoutRefusal(store: string, found: unknown, expected: number): string | undefined;
17
+ /** The one version a meta table's rows hold, or null when there is not exactly one. */
18
+ export declare function versionOfRows(rows: readonly {
19
+ version?: unknown;
20
+ }[]): number | null;
21
+ /** Best effort, after a refusal: the version a SQLite meta table (in `main`) holds. */
22
+ export declare function sqliteLayoutVersion(db: DatabaseSync, metaTable: string): number | null;
23
+ /** Best effort, after a refusal: the version a PostgreSQL meta table holds (`qualified` is the quoted table name). */
24
+ export declare function postgresLayoutVersion(client: PgQuery, qualified: string): Promise<number | null>;
@@ -0,0 +1,35 @@
1
+ /** The message for a store found at `found` when `expected` was wanted; undefined when the version does not explain the refusal. */
2
+ export function layoutRefusal(store, found, expected) {
3
+ const version = typeof found === 'number' || typeof found === 'bigint' || typeof found === 'string' ? Number(found) : NaN;
4
+ if (!Number.isInteger(version) || version === expected)
5
+ return undefined;
6
+ if (version > expected)
7
+ return (`${store} is at layout version ${version}, newer than the version ${expected} this build expects. ` +
8
+ 'A newer build wrote it: upgrade to open it. It is refused, not altered.');
9
+ return (`${store} is at layout version ${version}, older than the version ${expected} this build expects. ` +
10
+ 'Stop the server and run `mistri migrate stores up` to bring it forward (`mistri migrate stores status` ' +
11
+ `says whether a step exists from version ${version}). It is refused, not altered.`);
12
+ }
13
+ /** The one version a meta table's rows hold, or null when there is not exactly one. */
14
+ export function versionOfRows(rows) {
15
+ const version = rows.length === 1 ? Number(rows[0].version) : NaN;
16
+ return Number.isInteger(version) ? version : null;
17
+ }
18
+ /** Best effort, after a refusal: the version a SQLite meta table (in `main`) holds. */
19
+ export function sqliteLayoutVersion(db, metaTable) {
20
+ try {
21
+ return versionOfRows(db.prepare(`SELECT version FROM main."${metaTable}"`).all());
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /** Best effort, after a refusal: the version a PostgreSQL meta table holds (`qualified` is the quoted table name). */
28
+ export async function postgresLayoutVersion(client, qualified) {
29
+ try {
30
+ return versionOfRows((await client.query(`SELECT version FROM ${qualified}`)).rows);
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Where a socket this process opens on the operator's behalf may go.
3
+ *
4
+ * Every outbound connection a config file can point somewhere — an API
5
+ * (egress.ts), a cache, a search service — resolves its host through
6
+ * `checkedLookup`, so the address checked is the address connected: a name
7
+ * that resolves somewhere else a moment later (DNS rebinding) changes
8
+ * nothing. One set of ranges, one rule, whichever protocol rides on top.
9
+ *
10
+ * Private networks are reachable by default, because internal services are
11
+ * the common case and these connections only ever come from the operator's
12
+ * config, never from a browser. Link-local addresses, where cloud metadata
13
+ * services answer, are not, unless the connection says so: they hand out
14
+ * credentials to whoever asks.
15
+ */
16
+ import { type LookupAddress } from 'node:dns';
17
+ type LookupCallback = (error: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void;
18
+ /** `node:dns` lookup with `{ all: true }`, injectable so a test can resolve a name to any address it likes. */
19
+ export type Resolver = (hostname: string, options: {
20
+ all: true;
21
+ }, callback: LookupCallback) => void;
22
+ export interface NetworkPolicy {
23
+ /** Loopback and private ranges (RFC 1918, CGNAT, ULA). Reachable unless a connection opts out. */
24
+ allowPrivate: boolean;
25
+ /** Link-local ranges, where cloud metadata services answer. Unreachable unless a connection opts in. */
26
+ allowLinkLocal: boolean;
27
+ resolver?: Resolver;
28
+ }
29
+ /**
30
+ * A host written as an address is never looked up, so it is checked before
31
+ * any socket opens: the address it names when that address is refused,
32
+ * undefined when it is a name or a reachable address.
33
+ */
34
+ export declare function refusedLiteral(hostname: string, policy: NetworkPolicy): string | undefined;
35
+ /**
36
+ * The lookup a socket uses: resolve, keep only reachable addresses, and hand
37
+ * those back, so the address checked is the address connected. Node asks for
38
+ * one address or for all (happy eyeballs); both are answered. `refuse` makes
39
+ * the caller's own error for a name that resolves only to refused addresses.
40
+ */
41
+ export declare function checkedLookup(policy: NetworkPolicy, refuse: (host: string, addresses: string[]) => Error): (hostname: string, options: {
42
+ all?: boolean;
43
+ }, callback: (...args: unknown[]) => void) => void;
44
+ export {};