@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,248 @@
1
+ import { type AnyRows, type Op } from './filter.js';
2
+ import { type ColumnMeta, type DatabaseSchema, type ForeignKey, type TableMeta } from './schema.js';
3
+ import { type ComputedPath, type Rollup } from './rollups.js';
4
+ import { type ComputedColumn, type ComputedPath as ExpressionPath } from './computed.js';
5
+ import { type TagPath, type TagSet } from './tagLists.js';
6
+ /** One column of a view: a path, and optionally what to call it. */
7
+ export interface ViewColumn {
8
+ path: string;
9
+ /** Output name. Defaults to the path itself, which is already unique. */
10
+ alias?: string;
11
+ }
12
+ /** One condition. Identical to `Condition` except that it addresses a path. */
13
+ export interface ViewCondition {
14
+ path: string;
15
+ op: Op;
16
+ value?: string | number | boolean | Array<string | number>;
17
+ /** As on `Condition`: compare by bytes; only comparisons take it. */
18
+ collation?: 'binary';
19
+ /** As on `Condition`: compare with this path's value rather than `value`. */
20
+ other?: string;
21
+ /**
22
+ * As on `Condition`: the rows that point at this one, asked whether any
23
+ * matches. `path` is then the condition as it is written (`any opportunity
24
+ * where stage = won`), for a reader to say back; the compiler reads `any`.
25
+ */
26
+ any?: AnyRows;
27
+ }
28
+ /** OR-of-ANDs over paths — the same shape as `Filter`, one level out. */
29
+ export interface ViewFilter {
30
+ groups: ViewCondition[][];
31
+ }
32
+ export interface ViewOrder {
33
+ path: string;
34
+ direction: 'asc' | 'desc';
35
+ /**
36
+ * When true, `path` names an aggregate's output alias rather than a
37
+ * column: `sort invoices desc` after `count invoice … as invoices`.
38
+ * Compiled as the quoted alias, which every dialect here accepts in an
39
+ * ORDER BY — the one clause that runs late enough to see it.
40
+ */
41
+ alias?: boolean;
42
+ /**
43
+ * Closest first: order by the distance of `path` from this number rather
44
+ * than by `path` itself — a similar list's nearest price. Written into the
45
+ * ORDER BY as a literal, so it must be a finite, safe number; anything
46
+ * else is refused, never quoted.
47
+ */
48
+ near?: number;
49
+ /**
50
+ * Order text by its bytes, not by the column's collation, so that a keyset
51
+ * cursor's comparison (`collation` on a condition) agrees with the order it
52
+ * resumes. A column only: an alias or a distance is refused with it.
53
+ */
54
+ collation?: 'binary';
55
+ /**
56
+ * Nulls after every value, in either direction, on every dialect: the order
57
+ * a keyset cursor over a nullable column resumes (apiReadBoundary).
58
+ */
59
+ nulls?: 'last';
60
+ }
61
+ export type AggregateFn = 'count' | 'sum' | 'min' | 'max' | 'avg';
62
+ export interface ViewAggregate {
63
+ fn: AggregateFn;
64
+ /**
65
+ * The foreign key pointing back at the parent, by constraint name.
66
+ *
67
+ * A name rather than a table, because a table can point at the same parent
68
+ * more than once — `work_order.parent_id` and `work_order.supersedes_id`
69
+ * are two different questions and "count of work_orders" is neither.
70
+ */
71
+ via: string;
72
+ /** Path prefix naming the parent the children point at. Empty is the base. */
73
+ on?: string;
74
+ /** Column on the child table. Required for everything except `count`. */
75
+ column?: string;
76
+ alias?: string;
77
+ }
78
+ export interface ViewDef {
79
+ id: string;
80
+ name: string;
81
+ /** Base table id. Every path in the view starts here. */
82
+ base: string;
83
+ columns: ViewColumn[];
84
+ /** Scalar summaries of many-valued relationships. */
85
+ aggregates?: ViewAggregate[];
86
+ filter?: ViewFilter;
87
+ orderBy?: ViewOrder[];
88
+ limit?: number;
89
+ /**
90
+ * The view written down, in the same language.
91
+ *
92
+ * When present it is the definition and the structure above is derived from
93
+ * it — a config file holding `work_order show reference, customer_id.name
94
+ * as customer count work_order_part via work_order_id as parts` is a file
95
+ * someone can review in a pull request, which a nest of JSON objects with
96
+ * `op: "contains"` in it is not.
97
+ */
98
+ text?: string;
99
+ /** Config-defined views may name the connection they belong to. */
100
+ connection?: string;
101
+ /** Where this came from. Absent means the client's own storage. */
102
+ source?: 'config' | 'saved';
103
+ /**
104
+ * The record-label templates its `$label` paths compile from, by the path
105
+ * prefix each hangs off ('' for the base's own). Filled by the server's
106
+ * read from the App's catalog (recordLabel.ts); a request never supplies it.
107
+ */
108
+ labels?: Record<string, string>;
109
+ /**
110
+ * The rollups its paths name (rollups.ts), by path: what makes `line_total`
111
+ * or `customer_id.open_deals` a correlated subquery rather than a column.
112
+ * Filled by the server's read from the App's catalog, like `labels`, and
113
+ * carried with the view so a layer whose catalog is the database's own
114
+ * (an adapter, a source) compiles the same statement; a request never
115
+ * supplies it.
116
+ */
117
+ computed?: Record<string, ComputedPath>;
118
+ /**
119
+ * The computed columns its paths name (computed.ts), by path, each with its
120
+ * expression and the prefix of the record it is on: filled from the App's
121
+ * catalog like `computed`, so an adapter writes the same expression; a
122
+ * request never supplies it.
123
+ */
124
+ expressions?: Record<string, ExpressionPath>;
125
+ /**
126
+ * The record tags its paths name (tagLists.ts), by path: filled from the
127
+ * App's catalog like `computed`, so an adapter writes the same subquery; a
128
+ * request never supplies them.
129
+ */
130
+ tagged?: Record<string, TagPath>;
131
+ /**
132
+ * The App's declared references (soft keys) the view may walk, as edges of
133
+ * the catalog it is compiled against (declaredReferences.ts). Attached by
134
+ * the App's resource layer, where a catalog that is the database's own
135
+ * does not have them; a request never supplies them.
136
+ */
137
+ references?: ForeignKey[];
138
+ }
139
+ /**
140
+ * How many foreign keys a path may follow.
141
+ *
142
+ * A cap is not a nicety: `work_order.parent_id` points at `work_order`, so the
143
+ * path space is infinite and any breadth-first enumeration of it runs forever.
144
+ * Four hops is past the point where anyone can still read the result, and the
145
+ * limit is stated in the error rather than left to be discovered.
146
+ */
147
+ export declare const MAX_PATH_DEPTH = 4;
148
+ /** What a `$label` path ends on: text, and empty where the row is missing. */
149
+ export declare const labelColumnMeta: () => ColumnMeta;
150
+ /**
151
+ * A path that does not resolve, with the segment that failed.
152
+ *
153
+ * The segment matters more than the path: `customer_id.country_code.nmae` is
154
+ * four words of which one is wrong, and an error that repeats the whole path
155
+ * makes you find the wrong one yourself.
156
+ */
157
+ export declare class PathError extends Error {
158
+ readonly path: string;
159
+ readonly segment: string;
160
+ /** Index of the failing segment within the path, 0-based. */
161
+ readonly index: number;
162
+ constructor(message: string, path: string, segment: string,
163
+ /** Index of the failing segment within the path, 0-based. */
164
+ index: number);
165
+ }
166
+ /**
167
+ * What a hop is called in a path.
168
+ *
169
+ * A single-column foreign key is named by its column, which is what anyone
170
+ * would write and what the composer shows. A composite key has no single
171
+ * column to name it, so its columns are joined with `+` — deterministic,
172
+ * derivable from the model alone, and impossible to confuse with a column
173
+ * name because `+` is not legal in one.
174
+ */
175
+ export declare function hopName(fk: ForeignKey): string;
176
+ export interface Hop {
177
+ /** What to write in a path. */
178
+ name: string;
179
+ fk: ForeignKey;
180
+ /** The table this hop lands on. */
181
+ target: string;
182
+ /** True when every column of the key is nullable — the row may not exist. */
183
+ optional: boolean;
184
+ }
185
+ /** Every forward hop available from a table, in a stable order. */
186
+ export declare function hopsFrom(schema: DatabaseSchema, tableId: string): Hop[];
187
+ export interface ResolvedPath {
188
+ path: string;
189
+ /** The foreign keys followed, in order. Empty for a plain column. */
190
+ hops: ForeignKey[];
191
+ hopNames: string[];
192
+ /** The table the final column lives on. */
193
+ table: TableMeta;
194
+ column: ColumnMeta;
195
+ /** Set when the path ends on a rollup of `table` rather than a column (rollups.ts). */
196
+ rollup?: Rollup;
197
+ /** With `rollup`: the prefix of the record the rollup is on, where that is not the path's own (a path read through the rollup, below). */
198
+ rollupAt?: string;
199
+ /** Set when the path ends on a computed column of `table` (computed.ts). */
200
+ computed?: ComputedColumn;
201
+ /** Set when the path ends on the record's tags (tagLists.ts). */
202
+ tags?: TagSet;
203
+ /** Set when the path reads one key of a JSON column (`specs.capacity`, definedFields.ts): the column and the key. */
204
+ jsonKey?: {
205
+ column: string;
206
+ key: string;
207
+ };
208
+ }
209
+ /**
210
+ * Resolve a path against the schema, or explain precisely why it does not.
211
+ *
212
+ * Every hop is checked against the foreign key graph, so an unknown segment is
213
+ * an error here rather than a database exception later — or, far worse, a
214
+ * silently empty result that looks like a table with nothing in it.
215
+ */
216
+ export declare function resolvePath(schema: DatabaseSchema, baseId: string, path: string): ResolvedPath;
217
+ interface Backref {
218
+ /** What to write in an aggregate's `via`. */
219
+ name: string;
220
+ fk: ForeignKey;
221
+ /** The table holding the key — the "many" end. */
222
+ child: string;
223
+ }
224
+ /** Every foreign key pointing at a table: the "what refers to me" direction. */
225
+ export declare function backrefsTo(schema: DatabaseSchema, tableId: string): Backref[];
226
+ interface ResolvedAggregate {
227
+ aggregate: ViewAggregate;
228
+ fk: ForeignKey;
229
+ /** The table the children live in. */
230
+ child: TableMeta;
231
+ /** The table the children point at. */
232
+ parent: TableMeta;
233
+ /** The path prefix of the parent, '' for the base table. */
234
+ on: string;
235
+ column?: ColumnMeta;
236
+ /** Default output name, e.g. `count(work_order_part)`. */
237
+ name: string;
238
+ }
239
+ export declare const AGGREGATE_FNS: AggregateFn[];
240
+ export declare function resolveAggregate(schema: DatabaseSchema, baseId: string, aggregate: ViewAggregate): ResolvedAggregate;
241
+ /** The table a chain of hop names lands on. Empty prefix is the base itself. */
242
+ export declare function tableAtPrefix(schema: DatabaseSchema, baseId: string, prefix: string): TableMeta | undefined;
243
+ /** Resolve without throwing — for callers collecting several errors at once. */
244
+ export declare function tryResolvePath(schema: DatabaseSchema, baseId: string, path: string): {
245
+ resolved?: ResolvedPath;
246
+ error?: PathError;
247
+ };
248
+ export {};
@@ -0,0 +1,294 @@
1
+ /*
2
+ * The view model and its reference paths: what a view holds, and how a path
3
+ * or an aggregate resolves against the foreign-key graph to the tables and
4
+ * columns it names. view.ts compiles what resolves here into SQL.
5
+ */
6
+ import {} from './filter.js';
7
+ import { findTable, isJsonType, referencesFrom } from './schema.js';
8
+ import { nearest, shortList } from './suggest.js';
9
+ import { LABEL_SEGMENT } from './recordLabel.js';
10
+ import { rollupColumnMeta } from './rollups.js';
11
+ import { computedColumnMeta } from './computed.js';
12
+ import { TAGS_COLUMN, tagsColumnMeta } from './tagLists.js';
13
+ import { DEFINED_KEY, definedColumnMeta } from './definedFields.js';
14
+ /**
15
+ * How many foreign keys a path may follow.
16
+ *
17
+ * A cap is not a nicety: `work_order.parent_id` points at `work_order`, so the
18
+ * path space is infinite and any breadth-first enumeration of it runs forever.
19
+ * Four hops is past the point where anyone can still read the result, and the
20
+ * limit is stated in the error rather than left to be discovered.
21
+ */
22
+ export const MAX_PATH_DEPTH = 4;
23
+ /** What a `$label` path ends on: text, and empty where the row is missing. */
24
+ export const labelColumnMeta = () => ({ name: LABEL_SEGMENT, type: 'TEXT', nullable: true, primaryKey: false });
25
+ /* ---------- errors ---------- */
26
+ /**
27
+ * A path that does not resolve, with the segment that failed.
28
+ *
29
+ * The segment matters more than the path: `customer_id.country_code.nmae` is
30
+ * four words of which one is wrong, and an error that repeats the whole path
31
+ * makes you find the wrong one yourself.
32
+ */
33
+ export class PathError extends Error {
34
+ path;
35
+ segment;
36
+ index;
37
+ constructor(message, path, segment,
38
+ /** Index of the failing segment within the path, 0-based. */
39
+ index) {
40
+ super(message);
41
+ this.path = path;
42
+ this.segment = segment;
43
+ this.index = index;
44
+ this.name = 'PathError';
45
+ }
46
+ }
47
+ /* ---------- hops ---------- */
48
+ /**
49
+ * What a hop is called in a path.
50
+ *
51
+ * A single-column foreign key is named by its column, which is what anyone
52
+ * would write and what the composer shows. A composite key has no single
53
+ * column to name it, so its columns are joined with `+` — deterministic,
54
+ * derivable from the model alone, and impossible to confuse with a column
55
+ * name because `+` is not legal in one.
56
+ */
57
+ export function hopName(fk) {
58
+ return fk.from.columns.length === 1 ? fk.from.columns[0] : fk.from.columns.join('+');
59
+ }
60
+ /** Every forward hop available from a table, in a stable order. */
61
+ export function hopsFrom(schema, tableId) {
62
+ const table = findTable(schema, tableId);
63
+ return referencesFrom(schema, tableId).map((fk) => ({
64
+ name: hopName(fk),
65
+ fk,
66
+ target: fk.to.table,
67
+ optional: fk.from.columns.some((c) => table?.columns.find((col) => col.name === c)?.nullable !== false),
68
+ }));
69
+ }
70
+ /** A table's rollup of that name where it is a latest of a reference column: the record it names can be read through it. */
71
+ function latestReference(table, name) {
72
+ const rollup = table.rollups && Object.hasOwn(table.rollups, name) ? table.rollups[name] : undefined;
73
+ return rollup?.fn === 'latest' && rollup.references && !rollup.of ? rollup : undefined;
74
+ }
75
+ /**
76
+ * Resolve a path against the schema, or explain precisely why it does not.
77
+ *
78
+ * Every hop is checked against the foreign key graph, so an unknown segment is
79
+ * an error here rather than a database exception later — or, far worse, a
80
+ * silently empty result that looks like a table with nothing in it.
81
+ */
82
+ export function resolvePath(schema, baseId, path) {
83
+ /* A path means the same against the same catalog, and a list asks for each
84
+ of its columns' paths on every request, per row's worth of fields. Kept
85
+ per schema object, so a reloaded App or a new catalog starts empty; a
86
+ refused path is not kept (it throws, and is the rare one). The result is
87
+ frozen, shared by every caller. */
88
+ let kept = resolved.get(schema);
89
+ if (!kept)
90
+ resolved.set(schema, (kept = new Map()));
91
+ const key = `${baseId}\u0000${path}`;
92
+ const hit = kept.get(key);
93
+ if (hit)
94
+ return hit;
95
+ const made = resolvePathFresh(schema, baseId, path);
96
+ Object.freeze(made.hops);
97
+ Object.freeze(made.hopNames);
98
+ // A reader can type paths (a query's `a.b.c`), and a path may loop through
99
+ // the graph, so what is kept is bounded; the declared ones come straight back.
100
+ if (kept.size >= MAX_KEPT_PATHS)
101
+ kept.clear();
102
+ kept.set(key, Object.freeze(made));
103
+ return made;
104
+ }
105
+ const resolved = new WeakMap();
106
+ const MAX_KEPT_PATHS = 2048;
107
+ function resolvePathFresh(schema, baseId, path) {
108
+ const raw = String(path ?? '').trim();
109
+ if (!raw)
110
+ throw new PathError('A path cannot be empty.', raw, '', 0);
111
+ const segments = raw.split('.');
112
+ const blank = segments.findIndex((s) => s.trim() === '');
113
+ if (blank !== -1) {
114
+ throw new PathError(`"${raw}" has an empty segment — two dots in a row, or a trailing dot.`, raw, '', blank);
115
+ }
116
+ const hopCount = segments.length - 1;
117
+ if (hopCount > MAX_PATH_DEPTH) {
118
+ throw new PathError(`"${raw}" follows ${hopCount} references; at most ${MAX_PATH_DEPTH} are allowed. ` +
119
+ 'Deeper walks are usually two views rather than one.', raw, segments[MAX_PATH_DEPTH], MAX_PATH_DEPTH);
120
+ }
121
+ let table = findTable(schema, baseId);
122
+ if (!table) {
123
+ throw new PathError(`No table called "${baseId}" in this database.`, raw, segments[0], 0);
124
+ }
125
+ const hops = [];
126
+ const hopNames = [];
127
+ for (let i = 0; i < segments.length - 1; i++) {
128
+ const segment = segments[i];
129
+ const available = hopsFrom(schema, table.id);
130
+ const matches = available.filter((h) => h.name === segment || h.fk.name === segment);
131
+ /* The last step after a latest that reads a reference is a column of the record it names (`resident.name`): the
132
+ rollup's key, read through that table's own relation (viewLabels.ts), so a list draws the name beside the key. */
133
+ const through = !matches.length && i === segments.length - 2 ? latestReference(table, segment) : undefined;
134
+ if (through) {
135
+ const target = findTable(schema, through.references.table);
136
+ const wanted = segments[i + 1];
137
+ const read = target?.columns.find((c) => c.name === wanted);
138
+ if (!target || !read) {
139
+ throw new PathError(`"${wanted}" is not a column on ${target?.name ?? through.references.table}.`, raw, wanted, i + 1);
140
+ }
141
+ return {
142
+ path: raw,
143
+ hops,
144
+ hopNames,
145
+ table,
146
+ column: read,
147
+ rollup: { ...through, through: { table: target.id, key: through.references.column, column: read.name } },
148
+ rollupAt: hopNames.join('.'),
149
+ };
150
+ }
151
+ /* The last step after a JSON column is one of its keys (`specs.capacity`):
152
+ a value the definition rows name (definedFields.ts), read, filtered and
153
+ sorted like a column. A reference of the same name wins. */
154
+ const json = !matches.length && i === segments.length - 2 ? table.columns.find((c) => c.name === segment && isJsonType(c.type)) : undefined;
155
+ if (json) {
156
+ const key = segments[i + 1];
157
+ if (!DEFINED_KEY.test(key))
158
+ throw new PathError(`"${key}" is not a key "${segment}" can hold; a key is a name of letters, digits and _.`, raw, key, i + 1);
159
+ return { path: raw, hops, hopNames, table, column: definedColumnMeta(key), jsonKey: { column: json.name, key } };
160
+ }
161
+ if (!matches.length) {
162
+ /* A real column that simply is not a reference is the commonest
163
+ mistake, and deserves its own sentence: "total is not a reference"
164
+ beats "total is not one of customer_id, sold_by". */
165
+ const isColumn = table.columns.some((c) => c.name === segment);
166
+ const names = available.map((h) => h.name);
167
+ const suggestion = nearest(segment, names);
168
+ const hint = suggestion
169
+ ? ` Did you mean "${suggestion}"?`
170
+ : names.length
171
+ ? ` ${table.name} references: ${shortList(names)}.`
172
+ : ` ${table.name} has no foreign keys.`;
173
+ throw new PathError(isColumn
174
+ ? `"${segment}" is a column on ${table.name}, not a reference, so nothing can follow it.${hint}`
175
+ : `"${segment}" is not a reference on ${table.name}.${hint}`, raw, segment, i);
176
+ }
177
+ if (matches.length > 1) {
178
+ throw new PathError(`"${segment}" is ambiguous on ${table.name} — ${matches.length} foreign keys match. ` +
179
+ `Name the constraint instead: ${shortList(matches.map((m) => m.fk.name))}.`, raw, segment, i);
180
+ }
181
+ const next = findTable(schema, matches[0].target);
182
+ if (!next) {
183
+ throw new PathError(`"${segment}" points at "${matches[0].target}", which is not in this schema.`, raw, segment, i);
184
+ }
185
+ hops.push(matches[0].fk);
186
+ hopNames.push(matches[0].name);
187
+ table = next;
188
+ }
189
+ const last = segments[segments.length - 1];
190
+ if (last === LABEL_SEGMENT) {
191
+ if (!table.labelTemplate) {
192
+ throw new PathError(`${table.name} has no record label template, so "${LABEL_SEGMENT}" names nothing on it.`, raw, last, segments.length - 1);
193
+ }
194
+ return { path: raw, hops, hopNames, table, column: labelColumnMeta() };
195
+ }
196
+ const column = table.columns.find((c) => c.name === last) ?? table.columns.find((c) => c.name.toLowerCase() === last.toLowerCase());
197
+ /* A rollup is found by its exact name only, and after the columns: the
198
+ catalog never serves one that shares a column's name, so this order
199
+ only matters to a hand-made catalog, where the column wins. */
200
+ const rollup = column ? undefined : table.rollups && Object.hasOwn(table.rollups, last) ? table.rollups[last] : undefined;
201
+ if (rollup)
202
+ return { path: raw, hops, hopNames, table, column: rollupColumnMeta(last, rollup), rollup };
203
+ const computed = column ? undefined : table.computed && Object.hasOwn(table.computed, last) ? table.computed[last] : undefined;
204
+ if (computed)
205
+ return { path: raw, hops, hopNames, table, column: computedColumnMeta(last, computed), computed };
206
+ if (!column && last === TAGS_COLUMN && table.tags)
207
+ return { path: raw, hops, hopNames, table, column: tagsColumnMeta(), tags: table.tags };
208
+ if (!column) {
209
+ const suggestion = nearest(last, table.columns.map((c) => c.name));
210
+ throw new PathError(`"${last}" is not a column on ${table.name}.${suggestion ? ` Did you mean "${suggestion}"?` : ''}`, raw, last, segments.length - 1);
211
+ }
212
+ return { path: raw, hops, hopNames, table, column };
213
+ }
214
+ /** Every foreign key pointing at a table: the "what refers to me" direction. */
215
+ export function backrefsTo(schema, tableId) {
216
+ return schema.foreignKeys.filter((fk) => fk.to.table === tableId).map((fk) => ({ name: fk.name, fk, child: fk.from.table }));
217
+ }
218
+ export const AGGREGATE_FNS = ['count', 'sum', 'min', 'max', 'avg'];
219
+ export function resolveAggregate(schema, baseId, aggregate) {
220
+ const on = (aggregate.on ?? '').trim();
221
+ const fail = (message, segment) => {
222
+ throw new PathError(message, aggregate.via, segment, 0);
223
+ };
224
+ if (!AGGREGATE_FNS.includes(aggregate.fn)) {
225
+ fail(`"${String(aggregate.fn)}" is not a summary. Use one of: ${AGGREGATE_FNS.join(', ')}.`, String(aggregate.fn));
226
+ }
227
+ /* The parent is the base table, or whatever a path prefix reaches. Resolved
228
+ by resolving a path *through* it — the same code, so a prefix that is not
229
+ a real chain of keys fails here exactly as it would anywhere else. */
230
+ const parent = tableAtPrefix(schema, baseId, on);
231
+ if (!parent) {
232
+ fail(on ? `"${on}" is not a chain of references from ${baseId}.` : `No table called "${baseId}" in this database.`, on || baseId);
233
+ }
234
+ const candidates = backrefsTo(schema, parent.id);
235
+ // A qualified relationship spelling identifies endpoints, not a constraint.
236
+ // Prefer it when a physical constraint happens to have the same text; App
237
+ // logical-to-physical transfers use this form to preserve the selected edge.
238
+ const match = candidates.find((b) => `${b.child}.${b.fk.from.columns.join('+')}` === aggregate.via) ??
239
+ candidates.find((b) => b.name === aggregate.via);
240
+ if (!match) {
241
+ fail(`Nothing called "${aggregate.via}" points at ${parent.name}.` +
242
+ (candidates.length ? ` It is referred to by: ${shortList(candidates.map((c) => c.name))}.` : ' Nothing refers to it.'), aggregate.via);
243
+ }
244
+ const child = findTable(schema, match.child);
245
+ if (!child)
246
+ fail(`"${match.child}" is not in this schema.`, aggregate.via);
247
+ let column;
248
+ if (aggregate.fn !== 'count') {
249
+ if (!aggregate.column) {
250
+ fail(`${aggregate.fn} needs a column on ${child.name} to summarise.`, aggregate.via);
251
+ }
252
+ column = child.columns.find((c) => c.name === aggregate.column);
253
+ if (!column) {
254
+ const suggestion = nearest(aggregate.column, child.columns.map((c) => c.name));
255
+ fail(`"${aggregate.column}" is not a column on ${child.name}.${suggestion ? ` Did you mean "${suggestion}"?` : ''}`, aggregate.column);
256
+ }
257
+ }
258
+ const subject = `${on ? `${on}.` : ''}${child.name}${column ? `.${column.name}` : ''}`;
259
+ return {
260
+ aggregate,
261
+ fk: match.fk,
262
+ child: child,
263
+ parent: parent,
264
+ on,
265
+ column,
266
+ name: aggregate.alias?.trim() || `${aggregate.fn}(${subject})`,
267
+ };
268
+ }
269
+ /** The table a chain of hop names lands on. Empty prefix is the base itself. */
270
+ export function tableAtPrefix(schema, baseId, prefix) {
271
+ let table = findTable(schema, baseId);
272
+ if (!prefix)
273
+ return table;
274
+ for (const segment of prefix.split('.')) {
275
+ if (!table)
276
+ return undefined;
277
+ const hop = hopsFrom(schema, table.id).find((h) => h.name === segment || h.fk.name === segment);
278
+ if (!hop)
279
+ return undefined;
280
+ table = findTable(schema, hop.target);
281
+ }
282
+ return table;
283
+ }
284
+ /** Resolve without throwing — for callers collecting several errors at once. */
285
+ export function tryResolvePath(schema, baseId, path) {
286
+ try {
287
+ return { resolved: resolvePath(schema, baseId, path) };
288
+ }
289
+ catch (err) {
290
+ if (err instanceof PathError)
291
+ return { error: err };
292
+ throw err;
293
+ }
294
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * A view, written down.
3
+ *
4
+ * The composer builds views by clicking, and a view built by clicking is UI
5
+ * state: it can be saved and loaded, and that is all. Everything else in
6
+ * tablewalk holds that the *query text* is the single source of truth — it is
7
+ * why filters compose into the bar, why sorting edits the query, why a link
8
+ * carries the whole walk. A view that cannot be written down cannot be
9
+ * hand-edited, diffed in a config file, pasted into a conversation, or
10
+ * explained to someone who does not have the UI open.
11
+ *
12
+ * So a view has a text form, and it is the same language:
13
+ *
14
+ * work_order
15
+ * show reference, total_cost, customer_id.name as customer
16
+ * count work_order_part via work_order_id as parts
17
+ * sum work_order_part.quantity via work_order_id as units
18
+ * where customer_id.country_code = AU and total_cost > 500
19
+ * sort total_cost desc
20
+ * limit 20
21
+ *
22
+ * Only two things here are new: the base table on the front, and the
23
+ * aggregate clauses. Paths, conditions, sort and limit are parsed by
24
+ * `parseViewQuery`, which the composer's filter box already uses — one
25
+ * grammar, not two that drift.
26
+ *
27
+ * Aggregates name the child table and the foreign key column rather than the
28
+ * constraint, because a constraint name is a database artefact nobody reads
29
+ * (`work_order_part_work_order_id_fkey`) and `work_order_part via
30
+ * work_order_id` says the same thing in words that appear in the schema. The
31
+ * pair is unambiguous: two foreign keys from one child to one parent must sit
32
+ * on different columns.
33
+ */
34
+ import { type ViewDef } from './view.js';
35
+ import { type DatabaseSchema } from './schema.js';
36
+ import type { QueryError, QueryPerson } from './query.js';
37
+ interface ParsedViewText {
38
+ view?: ViewDef;
39
+ errors: QueryError[];
40
+ }
41
+ /** Render with a schema, so aggregates name real tables and columns. */
42
+ export declare function viewToTextWithSchema(schema: DatabaseSchema, view: ViewDef): string;
43
+ /**
44
+ * Parse a written view.
45
+ *
46
+ * The base table and the aggregates are handled here; everything else is
47
+ * handed to `parseViewQuery`, which the composer's filter box already uses.
48
+ * Two parsers for one language is how a language starts disagreeing with
49
+ * itself.
50
+ */
51
+ export declare function textToView(schema: DatabaseSchema, text: string, options?: {
52
+ id?: string;
53
+ name?: string;
54
+ now?: Date;
55
+ me?: QueryPerson | null;
56
+ }): ParsedViewText;
57
+ export {};