@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,400 @@
1
+ /**
2
+ * A breakdown, written down.
3
+ *
4
+ * The same argument the view text form makes, and it applies harder here: a
5
+ * breakdown is the shape most likely to be pasted into a conversation, saved
6
+ * in a config file, or handed to an agent as a string. A grouping that can
7
+ * only be expressed as JSON is one nobody writes by hand.
8
+ *
9
+ * invoice count by status
10
+ * invoice count, sum total as billed by month invoice_date sort billed desc limit 12
11
+ * invoice where total > 100 count by customer_id.country_code.name as country
12
+ *
13
+ * The grammar is the query language plus two clauses. Measures come first —
14
+ * `count`, `count distinct sold_by`, `sum total`, each optionally `as name` —
15
+ * then `by`, then the things to group by, each optionally cut down to a period
16
+ * (`by month invoice_date`) and optionally named. Everything else in the line
17
+ * is the ordinary language: `where`, `sort`, `limit`, parsed by
18
+ * `parseViewQuery` exactly as the composer's filter box parses it. Two parsers
19
+ * for one language is how a language starts disagreeing with itself.
20
+ *
21
+ * One deliberate asymmetry with a view: **`sort` names an output column**, not
22
+ * a path. Every column of a breakdown is a key or a measure and both are in
23
+ * the answer under a name, so there is nothing else it could mean — and `sort
24
+ * total desc` on a grouped statement, where `total` is no longer a column,
25
+ * should not quietly compile into something else.
26
+ */
27
+ import { parseViewQuery, tryResolvePath } from './view.js';
28
+ import { findTable } from './schema.js';
29
+ import { DATE_UNITS, MEASURE_FUNCTIONS, MEASURE_OPS, measureName, measurePaths, measureRefusal, measureToText, } from './breakdown.js';
30
+ /** Whether a line is asking for a breakdown at all. */
31
+ export function looksLikeBreakdown(text) {
32
+ /* The `by` keyword, standing alone and not the tail of `order by`. That is
33
+ the whole tell: no other clause in the language uses it, which is why it
34
+ was available to mean this. */
35
+ return /(?<!\border\s)\bby\s+\S/i.test(String(text ?? ''));
36
+ }
37
+ const TERM_RE = new RegExp(String.raw `^(${MEASURE_FUNCTIONS.join('|')})` +
38
+ String.raw `(\s+distinct)?` +
39
+ /* `+` for a composite hop (`invoice_id+line_no.qty`); an operator stands apart, between spaces. */
40
+ String.raw `(?:\s+([\w.$+]+))?` +
41
+ /* `count when [status = open]`, its brackets already lifted out (liftWhens): the mark of the n-th. */
42
+ String.raw `(?:\s+when\s+\uE000(\d+)\uE001)?$`, 'i');
43
+ const NUMBER_RE = /^\d+(?:\.\d+)?$/;
44
+ /**
45
+ * The conditions of every `when [...]` lifted out of the line and replaced by a mark with no spaces, commas or keywords
46
+ * in it: a condition holds `in (a, b)`, `and`, even the word `by`, and the line is split on exactly those. Quotes are
47
+ * respected, so a `]` in a value does not close it. Nested brackets are not a thing the language has.
48
+ */
49
+ function liftWhens(text) {
50
+ const whens = [];
51
+ let out = '';
52
+ let from = 0;
53
+ for (const found of text.matchAll(/\bwhen\s*\[/gi)) {
54
+ const open = (found.index ?? 0) + found[0].length;
55
+ if (open <= from)
56
+ continue;
57
+ let quote = '';
58
+ let close = -1;
59
+ for (let i = open; i < text.length; i++) {
60
+ const c = text[i];
61
+ if (quote) {
62
+ if (c === '\\')
63
+ i++;
64
+ else if (c === quote)
65
+ quote = '';
66
+ }
67
+ else if (c === '"' || c === "'")
68
+ quote = c;
69
+ else if (c === ']') {
70
+ close = i;
71
+ break;
72
+ }
73
+ }
74
+ if (close < 0)
75
+ return { text, whens, error: '`when [` is not closed: end the conditions with `]`.' };
76
+ out += `${text.slice(from, found.index)}when \uE000${whens.length}\uE001`;
77
+ whens.push(text.slice(open, close).trim());
78
+ from = close + 1;
79
+ }
80
+ return { text: out + text.slice(from), whens };
81
+ }
82
+ /**
83
+ * One comma piece as a measure, or null when it is not one: an aggregate
84
+ * (`sum total`), or aggregates and numbers joined by `+ - * /` — a
85
+ * computed measure, `sum paid / sum total as rate`. The first term is an
86
+ * aggregate, so a condition's trailing number is never read as one.
87
+ */
88
+ function measureFrom(piece, whens) {
89
+ const aliased = /^(.*?)\s+as\s+([\w$]+)$/i.exec(piece);
90
+ const body = aliased ? aliased[1] : piece;
91
+ const parts = body.trim().split(/\s+([+\-*/])\s+/);
92
+ const term = (text) => {
93
+ const m = TERM_RE.exec(text.trim());
94
+ return m
95
+ ? {
96
+ fn: m[1].toLowerCase(),
97
+ ...(m[3] ? { path: m[3] } : {}),
98
+ ...(m[2] ? { distinct: true } : {}),
99
+ ...(m[4] !== undefined && whens[Number(m[4])] !== undefined ? { when: whens[Number(m[4])] } : {}),
100
+ }
101
+ : null;
102
+ };
103
+ const head = term(parts[0]);
104
+ if (!head)
105
+ return null;
106
+ const steps = [];
107
+ for (let i = 1; i < parts.length; i += 2) {
108
+ const op = parts[i];
109
+ const text = parts[i + 1]?.trim() ?? '';
110
+ const next = NUMBER_RE.test(text) ? Number(text) : term(text);
111
+ if (!MEASURE_OPS.includes(op) || next === null)
112
+ return null;
113
+ steps.push({ op, term: next });
114
+ }
115
+ return { ...head, ...(steps.length ? { steps } : {}), ...(aliased ? { alias: aliased[2] } : {}) };
116
+ }
117
+ const KEY_RE = new RegExp(String.raw `^(?:(${DATE_UNITS.join('|')})\s+)?([\w.$+]+)(?:\s+as\s+([\w$]+))?$`, 'i');
118
+ /** Where the clauses after the group keys begin. */
119
+ const TAIL_CLAUSE = /\b(sort|order\s+by|limit)\b/i;
120
+ /**
121
+ * Split `a, b, c` on commas, dropping the empties a trailing comma leaves.
122
+ */
123
+ const commas = (text) => text
124
+ .split(',')
125
+ .map((part) => part.trim())
126
+ .filter(Boolean);
127
+ /**
128
+ * Find the `by` that pivots the line.
129
+ *
130
+ * The *first* standalone `by` not preceded by `order`, because a breakdown's
131
+ * `sort` clause comes after the keys and may legitimately be written `order
132
+ * by`. Searching from the front means `invoice count by status order by count`
133
+ * splits where it should.
134
+ */
135
+ function pivot(text) {
136
+ for (const match of text.matchAll(/\bby\b/gi)) {
137
+ const at = match.index ?? 0;
138
+ if (/\border\s+$/i.test(text.slice(0, at)))
139
+ continue;
140
+ return at;
141
+ }
142
+ return -1;
143
+ }
144
+ export function textToBreakdown(schema, text, options = {}) {
145
+ const errors = [];
146
+ const written = String(text ?? '').trim();
147
+ if (!written)
148
+ return { errors: [{ message: 'Start with a table name.' }] };
149
+ const lifted = liftWhens(written);
150
+ if (lifted.error)
151
+ return { errors: [{ message: lifted.error }] };
152
+ /* What the line is split on has no `when [...]` in it; `text` below keeps it as it was written. */
153
+ const body = lifted.text;
154
+ const baseName = body.split(/\s+/)[0];
155
+ const base = findTable(schema, baseName) ?? schema.tables.find((t) => t.name === baseName);
156
+ if (!base) {
157
+ return { errors: [{ message: `No table called "${baseName}" in this database.`, at: 0 }] };
158
+ }
159
+ const rest = body.slice(baseName.length);
160
+ const at = pivot(rest);
161
+ /* No `by` is one group: "invoice sum total" is the whole answer as one
162
+ row. The head is then everything before the tail clauses, and the key
163
+ list is empty — the compiler skips GROUP BY for exactly this shape.
164
+ A line with no measures either still gets the needs-`by` guidance
165
+ below, because that line was not a breakdown at all. */
166
+ const head = at === -1 ? (rest.search(TAIL_CLAUSE) === -1 ? rest : rest.slice(0, rest.search(TAIL_CLAUSE))) : rest.slice(0, at);
167
+ const afterBy = at === -1 ? (rest.search(TAIL_CLAUSE) === -1 ? '' : rest.slice(rest.search(TAIL_CLAUSE))) : rest.slice(at + 2);
168
+ /* The keys run to the first clause that is not a key. Split here rather
169
+ than by counting commas, because a key list and a sort clause are both
170
+ comma-separated and only a keyword tells them apart. */
171
+ const tailAt = afterBy.search(TAIL_CLAUSE);
172
+ const keyText = tailAt === -1 ? afterBy : afterBy.slice(0, tailAt);
173
+ const tail = tailAt === -1 ? '' : afterBy.slice(tailAt);
174
+ /* The measures are the longest suffix of `head` that reads as a list of
175
+ them; everything before that is the ordinary language, and is handed on
176
+ untouched. Found by trying each word boundary from the left and keeping
177
+ the first that works, which is what makes `invoice where total > 100
178
+ count by status` split correctly without this module knowing what `where`
179
+ means.
180
+
181
+ Splitting on commas alone was the obvious version and it was wrong: `where
182
+ total > 100 count` holds no comma at all, so the whole clause read as one
183
+ piece, failed to match, and the line came back "nothing to measure" with
184
+ a `count` plainly in it. */
185
+ const words = [...head.matchAll(/\S+/g)].map((m) => ({ text: m[0], at: m.index ?? 0 }));
186
+ const measures = [];
187
+ let prefix = head;
188
+ for (const word of words) {
189
+ const candidate = head.slice(word.at);
190
+ const pieces = commas(candidate);
191
+ const read = pieces.map((piece) => measureFrom(piece, lifted.whens));
192
+ if (!pieces.length || read.some((m) => m === null))
193
+ continue;
194
+ measures.push(...read);
195
+ prefix = head.slice(0, word.at);
196
+ break;
197
+ }
198
+ if (!measures.length) {
199
+ errors.push({
200
+ message: at === -1
201
+ ? 'A breakdown needs `by` — try `count by status` — or a bare measure for the whole answer: `sum total`.'
202
+ : 'Nothing to measure before `by`. Try `count by …`, or `sum total by …`.',
203
+ });
204
+ }
205
+ for (const measure of measures) {
206
+ if (measure.when !== undefined) {
207
+ if (measure.fn !== 'count' || measure.path || measure.distinct) {
208
+ errors.push({ message: '`when` goes with a bare `count`: `count when [status = open]`.' });
209
+ continue;
210
+ }
211
+ if (!measure.when) {
212
+ errors.push({ message: '`when [` needs conditions before `]`, like `count when [status = open]`.' });
213
+ continue;
214
+ }
215
+ /* The same parser, the same segments and the same clock as the line's own conditions. */
216
+ const held = parseViewQuery(schema, base.id, measure.when, options.now, options.me !== undefined ? { me: options.me } : {});
217
+ errors.push(...held.errors);
218
+ if (!held.errors.length && (held.columns.length || held.orderBy.length || held.limit !== undefined))
219
+ errors.push({ message: `\`when [${measure.when}]\` takes conditions only, not show, sort or limit.` });
220
+ if (!held.errors.length)
221
+ measure.where = held.filter;
222
+ }
223
+ for (const fn of new Set([measure.fn, ...(measure.steps ?? []).flatMap(({ term }) => (typeof term === 'number' ? [] : [term.fn]))])) {
224
+ /* Judged against the source's dialect here, so `check` names it at startup rather than a query failing at read. */
225
+ const refused = measureRefusal(fn, schema.dialect);
226
+ if (refused)
227
+ errors.push({ message: refused });
228
+ }
229
+ for (const path of measurePaths(measure)) {
230
+ const { error } = tryResolvePath(schema, base.id, path);
231
+ if (error)
232
+ errors.push({ message: error.message });
233
+ }
234
+ }
235
+ const keys = [];
236
+ for (const piece of commas(keyText)) {
237
+ const match = KEY_RE.exec(piece);
238
+ if (!match) {
239
+ errors.push({
240
+ message: `"${piece}" is not something to group by. A column, a path like customer_id.name, ` +
241
+ `or a period like \`month invoice_date\` (day, week, month, quarter, year, weekday or hour).`,
242
+ });
243
+ continue;
244
+ }
245
+ const [, unit, path, alias] = match;
246
+ /* Resolved here rather than left to the compiler. This runs on a
247
+ keystroke and the compiler runs on a request, so a path caught here is
248
+ a message under the caret and a path caught there is a failed call. */
249
+ const { resolved, error } = tryResolvePath(schema, base.id, path);
250
+ if (error) {
251
+ errors.push({ message: error.message });
252
+ continue;
253
+ }
254
+ /* The compiler refuses a bucket of a non-date too, but it refuses at
255
+ request time; here is a keystroke, and an app manifest's startup,
256
+ where "errors name the fix" is the contract. Same rule as the
257
+ compiler's: the declared type, not the values. */
258
+ if (unit && resolved && !/date|time/i.test(resolved.column.type ?? '')) {
259
+ errors.push({
260
+ message: `"${path}" is ${resolved.column.type || 'untyped'}, so it cannot be grouped by ${unit.toLowerCase()}. Pick a date column.`,
261
+ });
262
+ continue;
263
+ }
264
+ keys.push({
265
+ path,
266
+ bucket: unit ? unit.toLowerCase() : undefined,
267
+ alias: alias || undefined,
268
+ });
269
+ }
270
+ /* With a `by` written, an empty key list is a mistake to name; with no
271
+ `by` at all it is the one-group whole answer. */
272
+ if (at !== -1 && !keys.length && !errors.length) {
273
+ errors.push({ message: '`by` needs something after it — a column, or `month <date column>`.' });
274
+ }
275
+ /* The names this breakdown will answer under, so `sort billed desc` parses.
276
+ Derived the same way the compiler derives them, because a sort that
277
+ validates against one spelling and compiles against another is a sort
278
+ that works until somebody adds an alias. */
279
+ const names = [
280
+ ...keys.map((k) => k.alias?.trim() || (k.bucket ? `${k.bucket}(${k.path})` : k.path)),
281
+ ...measures.map((m) => measureName(m)),
282
+ ];
283
+ const parsed = parseViewQuery(schema, base.id, `${prefix} ${tail}`.trim(), options.now, {
284
+ /* Every output name joins the synthetic table for the sort clause. A
285
+ breakdown has no `show`, so nothing else here can reach them.
286
+
287
+ Except a plain key: unbucketed, unaliased, its output name IS the
288
+ base column, and shadowing it refused `invoice status = paid count
289
+ by status` — the filter runs before the grouping exists, on the
290
+ column that very much does. Only names that exist solely as
291
+ aggregate outputs join the shadow list. */
292
+ aggregateAliases: names.filter((name) => !keys.some((k) => !k.alias && !k.bucket && k.path === name)),
293
+ ...(options.me !== undefined ? { me: options.me } : {}),
294
+ });
295
+ errors.push(...parsed.errors);
296
+ if (parsed.columns.length) {
297
+ errors.push({
298
+ message: '`show` does not apply to a breakdown — its columns are the things it groups by and measures.',
299
+ });
300
+ }
301
+ const orderBy = parsed.orderBy.map((o) => ({ name: o.path, direction: o.direction }));
302
+ const breakdown = {
303
+ base: base.id,
304
+ by: keys,
305
+ measures,
306
+ filter: parsed.filter.groups.length ? parsed.filter : undefined,
307
+ orderBy: orderBy.length ? orderBy : undefined,
308
+ limit: parsed.limit,
309
+ text: written,
310
+ };
311
+ return {
312
+ breakdown: errors.length ? undefined : breakdown,
313
+ conditions: prefix.trim() || undefined,
314
+ errors,
315
+ };
316
+ }
317
+ /**
318
+ * The line as an authored dashboard section, or null when it is not one:
319
+ * the workbench-to-config bridge. Compose in the query bar, copy the
320
+ * section, paste it into a dashboard — the kind is read off the shape
321
+ * (two keys cross a matrix, a bucketed key draws a chart, one plain key
322
+ * ranks a breakdown, none is a metric), and the conditions half survives
323
+ * exactly as typed, because only this parser knows where it ended.
324
+ */
325
+ export function sectionFromText(schema, text) {
326
+ const parsed = textToBreakdown(schema, text);
327
+ const def = parsed.breakdown;
328
+ if (!def || parsed.errors.length)
329
+ return null;
330
+ const by = def.by.map((k) => `${k.bucket ? `${k.bucket} ` : ''}${k.path}${k.alias ? ` as ${k.alias}` : ''}`).join(', ');
331
+ const m = def.measures[0];
332
+ const measure = m && !(m.fn === 'count' && !m.path && !m.alias && !m.steps) ? measureToText(m) : undefined;
333
+ const kind = def.by.length === 2 ? 'matrix' : def.by.length === 1 ? (def.by[0].bucket ? 'chart' : 'breakdown') : 'metric';
334
+ return {
335
+ kind,
336
+ table: def.base,
337
+ ...(parsed.conditions ? { query: parsed.conditions } : {}),
338
+ ...(measure ? { measure } : {}),
339
+ ...(by ? { by } : {}),
340
+ };
341
+ }
342
+ /**
343
+ * Render a breakdown as text — the inverse, and the round trip is tested.
344
+ *
345
+ * One line, unlike a view. A breakdown is a phrase: two measures and a key is
346
+ * the normal size of one, and the whole point of the form is that it fits in
347
+ * a query bar.
348
+ */
349
+ export function breakdownToText(schema, def) {
350
+ const base = findTable(schema, def.base);
351
+ const parts = [base?.name ?? def.base];
352
+ const conditions = (def.filter?.groups ?? []).filter((g) => g.length);
353
+ if (conditions.length) {
354
+ parts.push('where');
355
+ parts.push(conditions.map((group) => group.map(conditionToText).join(' and ')).join(' or '));
356
+ }
357
+ parts.push(def.measures.map(measureToText).join(', '));
358
+ // One group has no `by` to write back — the bare measure is the spelling.
359
+ if (def.by?.length) {
360
+ parts.push('by');
361
+ parts.push(def.by.map(keyToText).join(', '));
362
+ }
363
+ if (def.orderBy?.length) {
364
+ parts.push('sort');
365
+ parts.push(def.orderBy.map((o) => `${o.name}${o.direction === 'desc' ? ' desc' : ''}`).join(', '));
366
+ }
367
+ if (def.limit !== undefined)
368
+ parts.push(`limit ${def.limit}`);
369
+ return parts.join(' ');
370
+ }
371
+ const keyToText = (k) => {
372
+ const words = [];
373
+ if (k.bucket)
374
+ words.push(k.bucket);
375
+ words.push(k.path);
376
+ if (k.alias)
377
+ words.push('as', k.alias);
378
+ return words.join(' ');
379
+ };
380
+ /**
381
+ * One condition, back in words.
382
+ *
383
+ * Deliberately small: the operators a breakdown's filter uses are the ones the
384
+ * query language spells the same way in both directions. Anything else is
385
+ * rendered by its own name, which round-trips because that is how it parses.
386
+ */
387
+ function conditionToText(c) {
388
+ // The rows that point at the record keep the words they were asked in (`any opportunity where …`, `no task`).
389
+ if (c.any !== undefined)
390
+ return c.path;
391
+ if (c.op === 'isNull')
392
+ return `${c.path} is null`;
393
+ if (c.op === 'isNotNull')
394
+ return `${c.path} is not null`;
395
+ if (c.other !== undefined)
396
+ return `${c.path} ${c.op} ${c.other}`;
397
+ const value = Array.isArray(c.value) ? c.value.join(', ') : String(c.value ?? '');
398
+ const spelled = c.op === '=' ? '=' : c.op;
399
+ return `${c.path} ${spelled} ${value}`;
400
+ }
@@ -0,0 +1,2 @@
1
+ import type { ThemeDefinition } from '../../schema/theme.js';
2
+ export declare const THEME_PRESETS: readonly ThemeDefinition[];