@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,206 @@
1
+ /**
2
+ * The config file at startup: its connections and services into the
3
+ * registry, and the sections beside them — views, saved SQL, pages, record
4
+ * layouts and app directories — read once, as the connections are. A config
5
+ * that exists but is wrong stops the start; a missing one is fine.
6
+ */
7
+ import { startupReport } from '../../shared/refusal.js';
8
+ import { readFile } from 'node:fs/promises';
9
+ import { dirname, resolve } from 'node:path';
10
+ import { loadConfig } from '../connections.js';
11
+ import { configLocations } from '../config/locations.js';
12
+ import { parsePagesConfig } from '../../shared/page.js';
13
+ import { parseLayoutsConfig } from '../../shared/recordview.js';
14
+ import { parseViewsConfig } from '../../shared/view.js';
15
+ import { parseQueriesConfig } from '../../shared/sqlsaved.js';
16
+ import { product } from '../product.js';
17
+ /* A name that reads like a credential. What a definition reads of the
18
+ environment can end up in what every browser is sent — a title, a link, a
19
+ query — so a password is refused unless the operator says, in so many
20
+ words, that the definition needs it. */
21
+ const SECRET_LOOKING = /PASS|SECRET|TOKEN|KEY|CREDENTIAL|DATABASE_URL|^PG/i;
22
+ /** One "apps" entry's `env`: names, or `{ "name": …, "secret": true }` for one that reads like a credential. */
23
+ export function parseAppEnv(raw, where) {
24
+ if (!Array.isArray(raw))
25
+ throw new Error(`${where} "env" must be a list of environment variable names.`);
26
+ const seen = new Set();
27
+ return raw.map((entry) => {
28
+ const named = typeof entry === 'string' ? { name: entry } : entry && typeof entry === 'object' ? entry : {};
29
+ const name = typeof named.name === 'string' ? named.name.trim() : '';
30
+ const extra = Object.keys(named).filter((key) => key !== 'name' && key !== 'secret');
31
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name) || extra.length || (named.secret !== undefined && named.secret !== true)) {
32
+ throw new Error(`${where} "env" takes names ("REGION") or { "name": "API_KEY", "secret": true }, not ${JSON.stringify(entry)}.`);
33
+ }
34
+ if (seen.has(name))
35
+ throw new Error(`${where} "env" names ${name} twice.`);
36
+ seen.add(name);
37
+ if (SECRET_LOOKING.test(name) && named.secret !== true) {
38
+ throw new Error(`${where} "env" names ${name}, which reads like a credential. Whatever the App's definition does with it can reach ` +
39
+ `the browser; if the definition truly needs it, write { "name": "${name}", "secret": true }. See \`mistri docs secrets\`.`);
40
+ }
41
+ return named.secret === true ? { name, secret: true } : { name };
42
+ });
43
+ }
44
+ /**
45
+ * Whether the config file a start would read names Apps: read raw, before anything is said of it, so the database
46
+ * browser's main can hand a start that serves Apps to the App framework's without both reading the file aloud. The
47
+ * file is the one `loadConfig` would read; one it cannot parse is left for that to refuse.
48
+ */
49
+ export async function configNamesApps(opts) {
50
+ if (opts.noConfig)
51
+ return false;
52
+ for (const path of configLocations(opts.config)) {
53
+ let text;
54
+ try {
55
+ text = await readFile(path, 'utf8');
56
+ }
57
+ catch {
58
+ continue;
59
+ }
60
+ try {
61
+ return JSON.parse(text)?.apps !== undefined;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ return false;
68
+ }
69
+ /** `sections` may be a promise's maker, so a start that reads no config file (`--no-config`) never loads them. */
70
+ export async function readStartupConfig(opts, registry, given) {
71
+ const read = { views: [], queries: [], pages: [], layouts: [], apps: [], appEnv: {} };
72
+ if (opts.noConfig)
73
+ return read;
74
+ const sections = typeof given === 'function' ? await given() : given;
75
+ try {
76
+ const config = await loadConfig(opts.config, sections);
77
+ if (config) {
78
+ // Remembered so "Save" writes back to the file this session was
79
+ // started from, rather than to whichever path happens to sort first.
80
+ read.configPath = config.path;
81
+ read.loadedConfigSignature = JSON.stringify(config);
82
+ read.loadedConfigText = await readFile(config.path, 'utf8');
83
+ for (const c of config.connections) {
84
+ registry.add({
85
+ name: c.name,
86
+ // Located against the file already (loadConfig); the spelling is kept for a save.
87
+ url: c.url,
88
+ ...(c.writtenUrl !== undefined ? { writtenUrl: c.writtenUrl } : {}),
89
+ schemas: c.schemas,
90
+ // Opt in, per connection. Absent means read-only, which is the
91
+ // right default for a file someone may have copied from a
92
+ // colleague without reading every line of.
93
+ writable: c.writable === true,
94
+ /* Opt *out*, per connection: the default is a normal connection,
95
+ and `"rows": false` is someone deciding this database's rows
96
+ must not leave the process. */
97
+ rows: c.rows === false ? false : undefined,
98
+ // Columns never served over it, checked by loadConfig.
99
+ ...(c.hidden ? { hidden: c.hidden } : {}),
100
+ // A PostgreSQL reader count, checked by loadConfig.
101
+ pool: c.pool,
102
+ // Read replicas' URLs, checked by loadConfig.
103
+ ...(c.replicas ? { replicas: c.replicas } : {}),
104
+ // A direct URL for LISTEN behind a pooler, checked by loadConfig.
105
+ ...(c.listen ? { listen: c.listen } : {}),
106
+ // An API's base URL, description and auth, checked by loadConfig.
107
+ http: c.http,
108
+ // Where its migrations are (tablewalk migrate), checked by loadConfig.
109
+ ...(c.migrations ? { migrations: c.migrations } : {}),
110
+ source: 'config',
111
+ });
112
+ }
113
+ // A cache and a search engine: services, not databases, opened when first used.
114
+ registry.sections = sections;
115
+ for (const service of config.services)
116
+ registry.addService(service);
117
+ for (const entry of config.kept ?? [])
118
+ registry.keep(entry);
119
+ const services = config.services.length ? `, plus ${config.services.map((s) => `${s.kind} "${s.name}"`).join(' and ')}` : '';
120
+ console.log(`${product()}: ${config.connections.length} connection(s)${services} from ${config.path}`);
121
+ /* DATABASE_URL is the default database of a start that names none. A
122
+ config that lists connections names them — usually "${DATABASE_URL}"
123
+ among them — and adding the variable as well opened the same database
124
+ a second time under a second name. The config wins; said when the
125
+ variable is not one of its connections, so nobody wonders which. */
126
+ if (opts.targetFromEnvironment && config.connections.length) {
127
+ opts.target = '';
128
+ opts.targetFromEnvironment = false;
129
+ if (!config.connections.some((c) => typeof c.url === 'string' && /\$(?:\{DATABASE_URL\}|DATABASE_URL(?!\w))/.test(c.url))) {
130
+ read.environmentTargetNote =
131
+ `DATABASE_URL is set, and ${config.path} names the connections, so it is not used; ` +
132
+ 'write "${DATABASE_URL}" as a connection\'s url to use it.';
133
+ console.log(`${product()}: ${read.environmentTargetNote}`);
134
+ }
135
+ }
136
+ /* Re-read rather than widening `loadConfig`'s return: connections are
137
+ the file's reason to exist and views are a second, independent
138
+ section of it. One extra read of a small file at startup buys the
139
+ connection loader staying exactly as it was. */
140
+ read.views = parseViewsConfig(JSON.parse(await readFile(config.path, 'utf8')), config.path);
141
+ if (read.views.length) {
142
+ console.log(`${product()}: ${read.views.length} view(s) from ${config.path}`);
143
+ }
144
+ read.queries = parseQueriesConfig(JSON.parse(await readFile(config.path, 'utf8')), config.path);
145
+ if (read.queries.length) {
146
+ console.log(`${product()}: ${read.queries.length} saved SQL statement(s) from ${config.path}`);
147
+ }
148
+ read.pages = parsePagesConfig(JSON.parse(await readFile(config.path, 'utf8')), config.path);
149
+ if (read.pages.length) {
150
+ console.log(`${product()}: ${read.pages.length} page(s) from ${config.path}`);
151
+ }
152
+ read.layouts = parseLayoutsConfig(JSON.parse(await readFile(config.path, 'utf8')), config.path);
153
+ if (read.layouts.length) {
154
+ console.log(`${product()}: ${read.layouts.length} record layout(s) from ${config.path}`);
155
+ }
156
+ /* "apps": [dir | { "dir": dir, "env": [name, …] }, …] — directories,
157
+ resolved against the config file's own location: the file travels,
158
+ and a path written next to it should keep pointing at the thing
159
+ next to it. `env` is what that App's definition may read of the
160
+ environment; nothing else reaches it (apps.ts, importFresh). */
161
+ const rawApps = JSON.parse(await readFile(config.path, 'utf8')).apps;
162
+ if (rawApps !== undefined) {
163
+ const entries = Array.isArray(rawApps) ? rawApps : [undefined];
164
+ read.apps = entries.map((entry, i) => {
165
+ const dir = typeof entry === 'string'
166
+ ? entry
167
+ : entry && typeof entry === 'object' && !Array.isArray(entry)
168
+ ? entry.dir
169
+ : undefined;
170
+ const extra = entry && typeof entry === 'object' ? Object.keys(entry).filter((key) => key !== 'dir' && key !== 'env') : [];
171
+ if (typeof dir !== 'string' || !dir.trim() || extra.length) {
172
+ throw new Error(`${config.path}: "apps" must be a list of app directory paths, or { "dir": …, "env": [names] }.`);
173
+ }
174
+ const resolved = resolve(dirname(config.path), dir.trim());
175
+ const env = entry.env;
176
+ if (typeof entry === 'object' && env !== undefined)
177
+ read.appEnv[resolved] = parseAppEnv(env, `${config.path}: apps[${i}]`);
178
+ return resolved;
179
+ });
180
+ }
181
+ /* Where the Apps are served, beside which Apps: a deployment's fact,
182
+ checked with the flags' own rule once the Apps are loaded (main). */
183
+ const { mount, basePath } = JSON.parse(await readFile(config.path, 'utf8'));
184
+ if (mount !== undefined) {
185
+ if (!mount || typeof mount !== 'object' || Array.isArray(mount) || Object.values(mount).some((at) => typeof at !== 'string')) {
186
+ throw new Error(`${config.path}: "mount" must name each App's place by its id, like { "main": "/", "billing": "/billing" }.`);
187
+ }
188
+ read.mount = mount;
189
+ }
190
+ if (basePath !== undefined) {
191
+ if (typeof basePath !== 'string')
192
+ throw new Error(`${config.path}: "basePath" must be a path, like "/tools".`);
193
+ read.basePath = basePath;
194
+ }
195
+ }
196
+ }
197
+ catch (err) {
198
+ // A config that exists but is wrong is reported, never skipped:
199
+ // silently ignoring a file someone wrote is worse than refusing.
200
+ console.error(`Config error: ${startupReport(err)}`);
201
+ if (opts.embedded)
202
+ throw err;
203
+ process.exit(1);
204
+ }
205
+ return read;
206
+ }
@@ -0,0 +1,36 @@
1
+ import { type Options } from './args.js';
2
+ /** A main: what a binary runs (bin.ts). Each binary has one, and a start that is the other's is refused by name. */
3
+ export type Main = () => Promise<void>;
4
+ /**
5
+ * The binary a start is answered by, in its own words: the name every line it says starts with, its usage (`--help
6
+ * all`) and first screen (`--help`), and the command and flag words a near miss is matched against.
7
+ */
8
+ export interface Product {
9
+ readonly bin: 'tablewalk' | 'mistri';
10
+ readonly usage: string;
11
+ readonly shortUsage: string;
12
+ readonly commandWords: readonly string[];
13
+ readonly flagWords: readonly string[];
14
+ }
15
+ /**
16
+ * `--help`, `--version`, a retired spelling, an unknown flag, a command one slip away: answered before anything
17
+ * else, and before any of it can start a server. True when answered.
18
+ *
19
+ * None of the first two was handled once. `--help` and `--version` were ignored and then rescued by the "nothing
20
+ * to open" gate, which printed the usage and exited 1 — the right text, the wrong exit code, and only ever by
21
+ * accident. Once a server started with no connection, the accident became `tablewalk --help` sitting on port 4111
22
+ * waiting for a browser.
23
+ */
24
+ export declare function answeredFirst(opts: Options, product: Product): Promise<boolean>;
25
+ /** The process's settings the flags make: the proxies whose addresses it believes, and its pools. Exits on a bad one. */
26
+ export declare function configureProcess(opts: Options, bin: Product['bin']): void;
27
+ /** The formats of `--export` the database browser prints (databaseOneShot.ts); the rest are an App's. */
28
+ export declare const SCHEMA_EXPORTS: ReadonlySet<string>;
29
+ /**
30
+ * Which product a start is the business of, on its flags alone: the App framework's when any flag names an App,
31
+ * serves or checks its API, scaffolds one or watches it; else the database browser's modes (`--mcp`, `--lint`,
32
+ * `--diff`, the schema in words); else neither yet — a server, which is the App framework's when the config file
33
+ * names Apps (configNamesApps). Both mains ask, and each refuses the other's start by the other's name: there is no
34
+ * handing over between the two binaries.
35
+ */
36
+ export declare function startFor(opts: Options): 'browser' | 'mistri' | undefined;
@@ -0,0 +1,128 @@
1
+ /**
2
+ * What every start does before its mode, whichever binary runs it: the questions answered without starting
3
+ * anything (`--help`, `--version`, a typo), and the process's settings the flags make (the proxies it believes,
4
+ * its pools). Both mains call these (packages/tablewalk/src/server/cli/browserMain.ts,
5
+ * packages/mistri/src/server/cli/mistriMain.ts), each with its own words (`Product`), and each binary runs its own
6
+ * main (bin.ts).
7
+ */
8
+ import { parseClientAddressPolicy, parseTrustedProxies } from '../http/trust.js';
9
+ import { configureServerSettings } from '../../adapters/serverSettings.js';
10
+ import { configurePostgresPools } from '../../adapters/postgresPool.js';
11
+ import { configureLockTimeout, configureWriterPool } from '../../adapters/writeLanes.js';
12
+ import { postgresPoolFlags, shutdownTimings } from './args.js';
13
+ import { didYouMean, packageVersion } from './usage.js';
14
+ import { envName } from '../product.js';
15
+ /**
16
+ * `--help`, `--version`, a retired spelling, an unknown flag, a command one slip away: answered before anything
17
+ * else, and before any of it can start a server. True when answered.
18
+ *
19
+ * None of the first two was handled once. `--help` and `--version` were ignored and then rescued by the "nothing
20
+ * to open" gate, which printed the usage and exited 1 — the right text, the wrong exit code, and only ever by
21
+ * accident. Once a server started with no connection, the accident became `tablewalk --help` sitting on port 4111
22
+ * waiting for a browser.
23
+ */
24
+ export async function answeredFirst(opts, product) {
25
+ const { bin } = product;
26
+ if (opts.help) {
27
+ console.log(opts.target === 'all' ? product.usage : product.shortUsage);
28
+ return true;
29
+ }
30
+ if (opts.version) {
31
+ console.log(await packageVersion());
32
+ return true;
33
+ }
34
+ if (opts.retired) {
35
+ console.error(`${bin}: ${opts.retired}`);
36
+ process.exit(1);
37
+ }
38
+ /* A typo is named with its near miss, and the help is one command away: the whole usage after it buried the one
39
+ line that said what was wrong. */
40
+ if (opts.unknown) {
41
+ const flag = opts.unknown.split(/[ =]/)[0];
42
+ console.error(`${bin}: unknown option "${opts.unknown}".${opts.unknown === flag ? await didYouMean(flag, product.flagWords) : ''} ${bin} --help lists the options.`);
43
+ process.exit(1);
44
+ }
45
+ /* A word that is no file and is one slip from a command (`tablewalk chek`) was opened as a SQLite file of that
46
+ name: a database that does not exist, said as a connection that would not open. */
47
+ if (opts.target && /^[a-z][a-z-]*$/.test(opts.target) && !product.commandWords.includes(opts.target)) {
48
+ const { existsSync } = await import('node:fs');
49
+ const near = existsSync(opts.target) ? '' : await didYouMean(opts.target, product.commandWords);
50
+ if (near) {
51
+ console.error(`${bin}: "${opts.target}" is not a command, and no file of that name is here.${near.replace('Did you mean ', `Did you mean ${bin} `)} ${bin} --help lists the commands.`);
52
+ process.exit(1);
53
+ }
54
+ }
55
+ return false;
56
+ }
57
+ /** The process's settings the flags make: the proxies whose addresses it believes, and its pools. Exits on a bad one. */
58
+ export function configureProcess(opts, bin) {
59
+ const proxies = parseTrustedProxies(opts.trustProxy);
60
+ if (proxies.invalid.length) {
61
+ console.error(`${bin}: --trust-proxy takes an IPv4 or IPv6 address or CIDR range (172.17.0.1, 10.0.0.0/8, fd00::/8); ` +
62
+ `${proxies.invalid.map((entry) => `"${entry}"`).join(', ')} is not one. It comes from the flag or ${envName('TRUST_PROXY')}.`);
63
+ process.exit(1);
64
+ }
65
+ opts.trustedProxies = proxies.ranges;
66
+ const identity = parseTrustedProxies(opts.authProxyFrom);
67
+ if (identity.invalid.length) {
68
+ console.error(`${bin}: --auth-proxy-from takes an IPv4 or IPv6 address or CIDR range (10.0.0.7, fd00::7); ` +
69
+ `${identity.invalid.map((entry) => `"${entry}"`).join(', ')} is not one. It comes from the flag or ${envName('AUTH_PROXY_FROM')}.`);
70
+ process.exit(1);
71
+ }
72
+ opts.authProxies = identity.ranges;
73
+ const client = parseClientAddressPolicy({ hops: opts.trustProxyHops, cloudflare: opts.trustProxyCloudflare });
74
+ if ('error' in client) {
75
+ console.error(`${bin}: ${client.error}`);
76
+ process.exit(1);
77
+ }
78
+ // One server per process: its settings are the process's (adapters/serverSettings.ts).
79
+ configureServerSettings({ clientAddress: client.policy });
80
+ const timings = shutdownTimings(opts);
81
+ if (typeof timings === 'string') {
82
+ console.error(`${bin}: ${timings}`);
83
+ process.exit(1);
84
+ }
85
+ const pools = postgresPoolFlags(opts);
86
+ if (typeof pools === 'string') {
87
+ console.error(`${bin}: ${pools}`);
88
+ process.exit(1);
89
+ }
90
+ // Before anything opens a pool: the registry's, a tenant source's, the job host's.
91
+ configurePostgresPools(pools);
92
+ configureWriterPool(pools.writers);
93
+ configureLockTimeout(pools.lockTimeoutMs);
94
+ }
95
+ /** The formats of `--export` the database browser prints (databaseOneShot.ts); the rest are an App's. */
96
+ export const SCHEMA_EXPORTS = new Set(['md', 'markdown', 'mermaid', 'json']);
97
+ /**
98
+ * Which product a start is the business of, on its flags alone: the App framework's when any flag names an App,
99
+ * serves or checks its API, scaffolds one or watches it; else the database browser's modes (`--mcp`, `--lint`,
100
+ * `--diff`, the schema in words); else neither yet — a server, which is the App framework's when the config file
101
+ * names Apps (configNamesApps). Both mains ask, and each refuses the other's start by the other's name: there is no
102
+ * handing over between the two binaries.
103
+ */
104
+ export function startFor(opts) {
105
+ if (opts.appMcp ||
106
+ opts.checkApp ||
107
+ opts.apiReads ||
108
+ opts.apiIntegers !== undefined ||
109
+ opts.apiRequestsPerMinute !== undefined ||
110
+ opts.apps?.length ||
111
+ opts.appEntry !== undefined ||
112
+ opts.commands !== undefined ||
113
+ opts.jobs !== undefined ||
114
+ opts.policy !== undefined ||
115
+ opts.writeAuthority ||
116
+ opts.bump ||
117
+ opts.reindex !== undefined ||
118
+ opts.scaffoldApp !== undefined ||
119
+ opts.dev ||
120
+ opts.fromOpenapi !== undefined ||
121
+ (opts.export !== undefined && !SCHEMA_EXPORTS.has(opts.export.toLowerCase())) ||
122
+ opts.mounts !== undefined ||
123
+ opts.embedded)
124
+ return 'mistri';
125
+ if (opts.mcp || opts.lint || opts.diff || opts.export !== undefined)
126
+ return 'browser';
127
+ return undefined;
128
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The API modes' own flags, checked before anything is read or loaded.
3
+ *
4
+ * Kept apart from the modes themselves (`api-read-startup-options.ts`,
5
+ * `appMcpMode.ts`) because `main` asks these questions on every start, and
6
+ * the modes import the auth store, the API owners and the tenant host: a
7
+ * check that lived beside them made `--help` and `--mcp` load all of that to
8
+ * learn that no API flag was given. This module imports nothing but types.
9
+ */
10
+ import type { Options } from './args.js';
11
+ import type { ProxyRange } from '../http/trust.js';
12
+ export declare const APP_MCP_TOKEN_VARIABLE = "MISTRI_API_TOKEN";
13
+ /** `--api-reads` and the flags that only mean something with it or an export. */
14
+ export declare function apiReadStartupOptions(opts: Options): Readonly<{
15
+ integers: 'decimal-string' | 'number';
16
+ requestsPerMinute: number;
17
+ network?: true | undefined;
18
+ }> | undefined;
19
+ /** The startup line for a served App API: where it answers, to whom, and at
20
+ * what rate — said where the operator is looking, so a network exposure is
21
+ * never a surprise. */
22
+ export declare function apiServingLine(app: Readonly<{
23
+ name: string;
24
+ id: string;
25
+ api?: Readonly<{
26
+ version: number;
27
+ }>;
28
+ }>, api: Readonly<{
29
+ requestsPerMinute: number;
30
+ network?: true;
31
+ }>, tenant?: boolean): string;
32
+ /**
33
+ * What a listener beyond loopback exposes, said once it listens. The Workbench, or an App that signs no one in,
34
+ * reads the database for whoever reaches the port; an App that signs people in reads for a signed-out visitor only
35
+ * what its `auth.public` opens, so the warning that "anyone can read the database" was not true of it (OP8).
36
+ * Behind `--auth-proxy-header` a request from beyond loopback must carry the proxy's identity, so nobody is read for
37
+ * without one and the warning would be false; without it, the warning names the three ways out, because the Docker
38
+ * image binds 0.0.0.0 by default and the person who started it never typed a host (SSRF-4).
39
+ */
40
+ export declare function exposureLines(host: string, apps: ReadonlyArray<Readonly<{
41
+ name: string;
42
+ auth?: Readonly<{
43
+ public?: Readonly<{
44
+ read: readonly string[];
45
+ }>;
46
+ }>;
47
+ }>>, authProxyHeader?: string): string[];
48
+ /**
49
+ * Who may set `--auth-proxy-header`, said once it listens: loopback and the `--auth-proxy-from` peers, nobody else
50
+ * (`identityFor`); `--trust-proxy` is a different question (which client) and never answers this one. A server beyond
51
+ * loopback with no peer listed believes the header only from this machine, so a proxy on another one has every request
52
+ * refused; that is said at start rather than learned from the first refusal. A range wider than one host is warned
53
+ * about, not refused: it is sometimes the only address a proxy has, but every peer in it can then name the person.
54
+ */
55
+ export declare function proxyIdentityLines(host: string, header: string | undefined, from?: readonly ProxyRange[]): string[];
56
+ /** `--app-mcp`'s own flags. */
57
+ export declare function appMcpStartupOptions(opts: Options): Readonly<{
58
+ integers: 'decimal-string' | 'number';
59
+ }> | undefined;
60
+ /** Taken once and removed from the environment before any App or command code
61
+ * loads, so neither can find it there and no child process inherits it.
62
+ * Never echoed: the message names the variable, not its value. */
63
+ export declare function readAppMcpToken(env: NodeJS.ProcessEnv): string;
@@ -0,0 +1,143 @@
1
+ import { product } from '../product.js';
2
+ export const APP_MCP_TOKEN_VARIABLE = 'MISTRI_API_TOKEN';
3
+ /** `--api-reads` and the flags that only mean something with it or an export. */
4
+ export function apiReadStartupOptions(opts) {
5
+ const exporting = ['openapi', 'asyncapi'].includes(opts.export?.toLowerCase() ?? '');
6
+ if (!opts.apiReads) {
7
+ if (opts.apiRequestsPerMinute !== undefined)
8
+ throw new Error('--api-requests-per-minute requires --api-reads.');
9
+ if (exporting || opts.appMcp ? !['decimal-string', 'number'].includes(opts.apiIntegers ?? '') : opts.apiIntegers !== undefined) {
10
+ throw new Error('--api-integers decimal-string or number is required with --export openapi or asyncapi, --api-reads or --app-mcp, and only valid with those modes.');
11
+ }
12
+ return undefined;
13
+ }
14
+ if (!['decimal-string', 'number'].includes(opts.apiIntegers ?? '') ||
15
+ !/^[1-9][0-9]*(?![\s\S])/.test(opts.apiRequestsPerMinute ?? '') ||
16
+ Number(opts.apiRequestsPerMinute) > 1000000)
17
+ throw new Error('--api-reads requires explicit --api-integers and --api-requests-per-minute (1–1000000).');
18
+ if (opts.export !== undefined ||
19
+ opts.fromOpenapi !== undefined ||
20
+ opts.openapi !== undefined ||
21
+ opts.mcp ||
22
+ opts.appMcp ||
23
+ opts.lint !== undefined ||
24
+ opts.diff !== undefined ||
25
+ opts.scaffoldApp !== undefined ||
26
+ opts.checkApp ||
27
+ opts.writeAuthority ||
28
+ opts.reindex !== undefined ||
29
+ opts.demo) {
30
+ throw new Error('--api-reads cannot be combined with one-shot, import, MCP or demo modes.');
31
+ }
32
+ // A client address read from an arbitrary header could be anyone's: the
33
+ // per-address budget trusts only X-Forwarded-For from a --trust-proxy peer.
34
+ if (opts.authProxyHeader)
35
+ throw new Error('--api-reads cannot be combined with --auth-proxy-header.');
36
+ /* Listening beyond loopback — another interface, a name other than this
37
+ machine's, or behind a proxy — is the operator's half of the network
38
+ opt-in; the App's `api.network: true` is the other, checked once the App
39
+ is loaded (assertApiReadStartupComposition). */
40
+ const network = !['127.0.0.1', 'localhost', '::1', '::ffff:127.0.0.1'].includes(opts.host) ||
41
+ opts.allowedHosts.length > 0 ||
42
+ opts.trustProxy.length > 0 ||
43
+ opts.trustProxyHops !== undefined ||
44
+ opts.trustProxyCloudflare ||
45
+ (opts.trustedProxies?.length ?? 0) > 0;
46
+ return Object.freeze({
47
+ integers: opts.apiIntegers,
48
+ requestsPerMinute: Number(opts.apiRequestsPerMinute),
49
+ ...(network ? { network: true } : {}),
50
+ });
51
+ }
52
+ /** The startup line for a served App API: where it answers, to whom, and at
53
+ * what rate — said where the operator is looking, so a network exposure is
54
+ * never a surprise. */
55
+ export function apiServingLine(app, api, tenant = false) {
56
+ const at = `/api/apps/${app.id}/v${app.api?.version ?? 1}`;
57
+ return (`${product()}: "${app.name}" API at ${at} (MCP at ${at}/$mcp) ` +
58
+ (api.network ? 'beyond loopback' : 'on loopback') +
59
+ `: scoped bearer tokens only${tenant ? ', each bound to one membership' : ''}; ` +
60
+ `${api.requestsPerMinute} requests a minute per token, counted in this process` +
61
+ (api.network ? '. Terminate TLS in front of it.' : '.'));
62
+ }
63
+ /**
64
+ * What a listener beyond loopback exposes, said once it listens. The Workbench, or an App that signs no one in,
65
+ * reads the database for whoever reaches the port; an App that signs people in reads for a signed-out visitor only
66
+ * what its `auth.public` opens, so the warning that "anyone can read the database" was not true of it (OP8).
67
+ * Behind `--auth-proxy-header` a request from beyond loopback must carry the proxy's identity, so nobody is read for
68
+ * without one and the warning would be false; without it, the warning names the three ways out, because the Docker
69
+ * image binds 0.0.0.0 by default and the person who started it never typed a host (SSRF-4).
70
+ */
71
+ export function exposureLines(host, apps, authProxyHeader) {
72
+ if (/^(localhost|127\.0\.0\.1|::1)$/i.test(host))
73
+ return [];
74
+ if (authProxyHeader)
75
+ return [];
76
+ const remedy = 'Bind --host 127.0.0.1, put it behind a proxy that signs people in (--auth-proxy-header), or give the App sign-in.';
77
+ if (!apps.length)
78
+ return [`Warning: bound to ${host}, beyond loopback, with no sign-in. Anyone who can reach this port can read the database. ${remedy}`];
79
+ return apps.map((app) => !app.auth
80
+ ? `Warning: bound to ${host}, beyond loopback, and "${app.name}" signs no one in: anyone who can reach this port reads what it shows. ${remedy}`
81
+ : app.auth.public?.read.length
82
+ ? `${product()}: bound beyond loopback; "${app.name}" signs people in, and a signed-out visitor reads only what auth.public opens (${app.auth.public.read.join(', ')}) and its public forms show.`
83
+ : `${product()}: bound beyond loopback; "${app.name}" signs people in, and a signed-out visitor reads nothing but what its public forms show.`);
84
+ }
85
+ /**
86
+ * Who may set `--auth-proxy-header`, said once it listens: loopback and the `--auth-proxy-from` peers, nobody else
87
+ * (`identityFor`); `--trust-proxy` is a different question (which client) and never answers this one. A server beyond
88
+ * loopback with no peer listed believes the header only from this machine, so a proxy on another one has every request
89
+ * refused; that is said at start rather than learned from the first refusal. A range wider than one host is warned
90
+ * about, not refused: it is sometimes the only address a proxy has, but every peer in it can then name the person.
91
+ */
92
+ export function proxyIdentityLines(host, header, from = []) {
93
+ if (!header)
94
+ return [];
95
+ const source = from.length ? `loopback and ${from.map((range) => range.text).join(', ')}` : 'loopback only';
96
+ const lines = [`${product()}: trusting ${header} for who is asking, from ${source}; a request from anywhere else is refused`];
97
+ if (!from.length && !/^(localhost|127\.0\.0\.1|::1)$/i.test(host))
98
+ lines.push(`Warning: bound to ${host} with --auth-proxy-header and no --auth-proxy-from: a proxy on another machine is refused on every request. Name its address with --auth-proxy-from.`);
99
+ /* IPv4 is held mapped (parseTrustedProxies), so /32 is 128 and a single host is 128 in both families.
100
+ This module imports types only, so the test is here rather than a helper in trust.ts. */
101
+ const wide = from.filter((range) => range.prefix < 128);
102
+ if (wide.length)
103
+ lines.push(`Warning: --auth-proxy-from ${wide.map((range) => range.text).join(', ')} is wider than one host: every peer in it can assert who is signed in through ${header}. Name the proxy's own address.`);
104
+ return lines;
105
+ }
106
+ /** `--app-mcp`'s own flags. */
107
+ export function appMcpStartupOptions(opts) {
108
+ if (!opts.appMcp)
109
+ return undefined;
110
+ if (opts.apiReads ||
111
+ opts.apiRequestsPerMinute !== undefined ||
112
+ opts.mcp ||
113
+ opts.export !== undefined ||
114
+ opts.fromOpenapi !== undefined ||
115
+ opts.openapi !== undefined ||
116
+ opts.lint !== undefined ||
117
+ opts.diff !== undefined ||
118
+ opts.scaffoldApp !== undefined ||
119
+ opts.checkApp ||
120
+ opts.writeAuthority ||
121
+ opts.reindex !== undefined ||
122
+ opts.demo ||
123
+ opts.jobs !== undefined ||
124
+ opts.open ||
125
+ opts.portGiven) {
126
+ throw new Error('--app-mcp has no listener: it cannot be combined with --api-reads, --mcp, --jobs, --port, --open, or an import, one-shot or demo mode.');
127
+ }
128
+ if (!['decimal-string', 'number'].includes(opts.apiIntegers ?? ''))
129
+ throw new Error('--app-mcp requires explicit --api-integers decimal-string or number.');
130
+ return Object.freeze({ integers: opts.apiIntegers });
131
+ }
132
+ /** Taken once and removed from the environment before any App or command code
133
+ * loads, so neither can find it there and no child process inherits it.
134
+ * Never echoed: the message names the variable, not its value. */
135
+ export function readAppMcpToken(env) {
136
+ const value = env[APP_MCP_TOKEN_VARIABLE];
137
+ delete env[APP_MCP_TOKEN_VARIABLE];
138
+ // Shape only; whether it is a token at all is the owners' decision, per call.
139
+ if (typeof value !== 'string' || !value || value.length > 4096 || /[\s\p{Cc}]/u.test(value)) {
140
+ throw new Error(`--app-mcp reads the App API token from ${APP_MCP_TOKEN_VARIABLE}; set it to a token from mistri api-token issue.`);
141
+ }
142
+ return value;
143
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A word of the command line that is a command of its own (`tablewalk migrate`, `mistri tenant`), not a
3
+ * database to open, and the one way each main runs one.
4
+ *
5
+ * Each main has a table of them (cli/browserCommands.ts, cli/mistriCommands.ts). They were some twenty-five
6
+ * copied blocks in one `main`, and they failed two ways: some caught a throw and said `tablewalk: …` with exit 1,
7
+ * the rest let it escape as a stack trace. `runSubcommand` is the one way now: a command returns its exit code,
8
+ * and whatever it throws is said in a line, exit 1.
9
+ *
10
+ * A command is read before the flags are, since parseArgs would take its word for a SQLite file, and nothing a
11
+ * start reads — a config, a connection, a server — is its business. A file of that name is still `./migrate`.
12
+ */
13
+ interface Subcommand {
14
+ /**
15
+ * Whether these arguments (the ones after the word) are this command's. Absent, the word alone is enough; a
16
+ * word that is a command only with a second word (`theme show`) or a flag (`new --api`) leaves the rest to the
17
+ * start, which opens a SQLite file of that name.
18
+ */
19
+ takes?(argv: readonly string[]): boolean;
20
+ /** The arguments after the word; the exit code, or nothing for 0. */
21
+ run(argv: string[]): Promise<number | void> | number | void;
22
+ }
23
+ export type Subcommands = Readonly<Record<string, Subcommand>>;
24
+ /** The command `argv` (the process's arguments after the script) names in `table`, or nothing. */
25
+ export declare function subcommandIn(table: Subcommands, argv: readonly string[]): Subcommand | undefined;
26
+ /** Runs one, as every main does: its exit code on the process, a throw said in a line, under the binary's name, with exit 1. */
27
+ export declare function runSubcommand(command: Subcommand, argv: string[], bin: 'tablewalk' | 'mistri'): Promise<void>;
28
+ export {};
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A word of the command line that is a command of its own (`tablewalk migrate`, `mistri tenant`), not a
3
+ * database to open, and the one way each main runs one.
4
+ *
5
+ * Each main has a table of them (cli/browserCommands.ts, cli/mistriCommands.ts). They were some twenty-five
6
+ * copied blocks in one `main`, and they failed two ways: some caught a throw and said `tablewalk: …` with exit 1,
7
+ * the rest let it escape as a stack trace. `runSubcommand` is the one way now: a command returns its exit code,
8
+ * and whatever it throws is said in a line, exit 1.
9
+ *
10
+ * A command is read before the flags are, since parseArgs would take its word for a SQLite file, and nothing a
11
+ * start reads — a config, a connection, a server — is its business. A file of that name is still `./migrate`.
12
+ */
13
+ /** The command `argv` (the process's arguments after the script) names in `table`, or nothing. */
14
+ export function subcommandIn(table, argv) {
15
+ const word = argv[0];
16
+ if (word === undefined || !Object.hasOwn(table, word))
17
+ return undefined;
18
+ const command = table[word];
19
+ return !command.takes || command.takes(argv.slice(1)) ? command : undefined;
20
+ }
21
+ /** Runs one, as every main does: its exit code on the process, a throw said in a line, under the binary's name, with exit 1. */
22
+ export async function runSubcommand(command, argv, bin) {
23
+ try {
24
+ const code = await command.run(argv);
25
+ if (typeof code === 'number')
26
+ process.exitCode = code;
27
+ }
28
+ catch (error) {
29
+ console.error(`${bin}: ${error.message}`);
30
+ process.exitCode = 1;
31
+ }
32
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * What both command lines share about their words: the near miss a typo is told, the version, and how a usage text
3
+ * is read for its command and flag words. Each binary keeps its own `USAGE` (packages/tablewalk/src/server/cli/usage.ts,
4
+ * packages/mistri/src/server/cli/usage.ts), and test/prose.test.ts holds each one to its own README.
5
+ */
6
+ /** The command words a usage names (`tablewalk migrate`, `mistri check`, …), for a near miss's suggestion. */
7
+ export declare function commandWordsOf(usage: string, bin: string): string[];
8
+ /** Every flag a usage spells, for an unknown option's suggestion. */
9
+ export declare function flagWordsOf(usage: string): string[];
10
+ /** What was probably meant, said the way a person would type it, or nothing when nothing is near. */
11
+ export declare function didYouMean(said: string, among: readonly string[]): Promise<string>;
12
+ /** What the package says it is, best effort. Every package of the workspace carries the one version. */
13
+ export declare function packageVersion(): Promise<string>;