@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,378 @@
1
+ import { noteRead } from './query.js';
2
+ export const COMPUTED_TYPES = ['boolean', 'number', 'date'];
3
+ /** What a computed column is to anything that reads columns: typed, never written, never a key. */
4
+ export function computedColumnMeta(name, computed) {
5
+ return {
6
+ name,
7
+ type: computed.type === 'number' ? 'numeric' : computed.type,
8
+ nullable: computed.type !== 'boolean',
9
+ primaryKey: false,
10
+ writable: false,
11
+ };
12
+ }
13
+ /**
14
+ * The catalog with each table's computed columns among its columns, typed and never written (`computed` by table id):
15
+ * what a rule judged of a stored row reads one through (a validation, a form's value from a referenced record), where
16
+ * the figure is worked out once the row is read rather than by the statement that reads it.
17
+ */
18
+ export function withComputedColumns(schema, computed) {
19
+ if (!computed.size)
20
+ return schema;
21
+ return {
22
+ ...schema,
23
+ tables: schema.tables.map((table) => {
24
+ const named = computed.get(table.id);
25
+ if (!named)
26
+ return table;
27
+ const extra = Object.entries(named)
28
+ .filter(([name]) => !table.columns.some((column) => column.name === name))
29
+ .map(([name, column]) => computedColumnMeta(name, column));
30
+ return extra.length ? { ...table, columns: [...table.columns, ...extra] } : table;
31
+ }),
32
+ };
33
+ }
34
+ /* ---------- the words (the parser is computedParse.ts) ---------- */
35
+ export class ComputedError extends Error {
36
+ at;
37
+ constructor(message, at) {
38
+ super(message);
39
+ this.at = at;
40
+ }
41
+ }
42
+ /** Every path an expression reads, once each, in order. */
43
+ export function computedReads(node) {
44
+ const out = [];
45
+ const walk = (n) => {
46
+ if (n.k === 'path') {
47
+ if (!out.includes(n.path))
48
+ out.push(n.path);
49
+ return;
50
+ }
51
+ if (n.k === 'op') {
52
+ walk(n.left);
53
+ walk(n.right);
54
+ return;
55
+ }
56
+ if (n.k === 'call')
57
+ n.args.forEach(walk);
58
+ if (n.k === 'not' || n.k === 'neg' || n.k === 'empty' || n.k === 'span')
59
+ walk(n.of);
60
+ };
61
+ walk(node);
62
+ return out;
63
+ }
64
+ /**
65
+ * What an expression is, or why it is none: each column's kind from the
66
+ * catalog (`kindOf`), a date minus a date a number of days, a date plus a
67
+ * number or a span a date. Said in the author's words, with the character
68
+ * the mistake stands at where a word locates it.
69
+ */
70
+ export function computedKind(node, kindOf) {
71
+ const kind = (n) => {
72
+ switch (n.k) {
73
+ case 'path': {
74
+ const found = kindOf(n.path);
75
+ if (!found)
76
+ throw new Error(`"${n.path}" is not a column here.`);
77
+ return found;
78
+ }
79
+ case 'number':
80
+ return 'number';
81
+ case 'text':
82
+ case 'me':
83
+ case 'nobody':
84
+ return 'text';
85
+ case 'bool':
86
+ return 'boolean';
87
+ case 'today':
88
+ case 'now':
89
+ case 'date':
90
+ case 'instant':
91
+ return 'date';
92
+ case 'not': {
93
+ if (kind(n.of) !== 'boolean')
94
+ throw new Error('"not" reads a yes-or-no.');
95
+ return 'boolean';
96
+ }
97
+ case 'neg': {
98
+ if (kind(n.of) !== 'number')
99
+ throw new Error('a minus sign reads a number.');
100
+ return 'number';
101
+ }
102
+ case 'empty':
103
+ kind(n.of);
104
+ return 'boolean';
105
+ case 'span': {
106
+ if (kind(n.of) !== 'number')
107
+ throw new Error(`"${n.unit}s" counts a number: "3 days", "term months".`);
108
+ return 'span';
109
+ }
110
+ case 'call': {
111
+ const kinds = n.args.map(kind);
112
+ if (n.fn === 'round' || n.fn === 'abs') {
113
+ if (kinds.some((each) => each !== 'number'))
114
+ throw new Error(`${n.fn}(…) reads numbers.`);
115
+ return 'number';
116
+ }
117
+ const first = kinds[0];
118
+ if (kinds.some((each) => each !== first))
119
+ throw new Error(`${n.fn}(…) takes values of one kind, and has a ${first} and a ${kinds.find((each) => each !== first)}.`);
120
+ if (first === 'span')
121
+ throw new Error(`${n.fn}(…) takes no span of days; add it to a date.`);
122
+ if (first === 'boolean')
123
+ throw new Error(`${n.fn}(…) takes numbers, dates or text, not yes-or-no conditions.`);
124
+ if (n.fn !== 'coalesce' && first === 'text')
125
+ throw new Error(`${n.fn}(…) takes numbers or dates.`);
126
+ return first;
127
+ }
128
+ case 'op': {
129
+ const l = kind(n.left), r = kind(n.right);
130
+ if (n.op === 'and' || n.op === 'or') {
131
+ if (l !== 'boolean' || r !== 'boolean')
132
+ throw new Error(`"${n.op}" joins two yes-or-no conditions.`);
133
+ return 'boolean';
134
+ }
135
+ if (['=', '!=', '<', '<=', '>', '>='].includes(n.op)) {
136
+ if (l !== r && !(l === 'text' && r === 'text'))
137
+ throw new Error(`"${n.op}" compares a ${l} with a ${r}.`);
138
+ if (l === 'span')
139
+ throw new Error('a span of days is not compared; add it to a date.');
140
+ return 'boolean';
141
+ }
142
+ /* A day has no hours: `today + 2 hours` would be a moment in no stated zone. */
143
+ const clockOnDay = (date, span) => span.k === 'span' && (span.unit === 'hour' || span.unit === 'minute') && (date.k === 'today' || date.k === 'date');
144
+ if (clockOnDay(n.left, n.right) || clockOnDay(n.right, n.left))
145
+ throw new Error(`today is a day, and hours and minutes move an instant: write now, or a timestamp column.`);
146
+ if (n.op === '+') {
147
+ if (l === 'number' && r === 'number')
148
+ return 'number';
149
+ if ((l === 'date' && (r === 'number' || r === 'span')) || (r === 'date' && (l === 'number' || l === 'span')))
150
+ return 'date';
151
+ throw new Error(`"+" adds numbers, or days to a date — not a ${l} and a ${r}.`);
152
+ }
153
+ if (n.op === '-') {
154
+ if (l === 'number' && r === 'number')
155
+ return 'number';
156
+ if (l === 'date' && r === 'date')
157
+ return 'number';
158
+ if (l === 'date' && (r === 'number' || r === 'span'))
159
+ return 'date';
160
+ throw new Error(`"-" takes numbers, a date from a date (days), or days from a date — not a ${r} from a ${l}.`);
161
+ }
162
+ if (l !== 'number' || r !== 'number')
163
+ throw new Error(`"${n.op}" reads numbers.`);
164
+ return 'number';
165
+ }
166
+ }
167
+ };
168
+ return kind(node);
169
+ }
170
+ /* The instant a statement writes for `now` where the catalog left it as written (foldConstants `keepNow`): the
171
+ request's own, read when the statement is written, from whoever serves the catalog (tenantServedSchema.ts). A
172
+ catalog that folded the instant in was a new object for every request, so nothing keyed by the catalog — a
173
+ parse, a path, a projection — was ever found again; one that leaves it is kept, and the instant travels with the
174
+ request instead. Nothing here keeps a statement, so no request's instant outlives it. */
175
+ let statementInstant = () => undefined;
176
+ /** A statement that writes `now` was compiled where no request says the instant: a missing wrapper, not a bad definition,
177
+ * so a caller that turns compile errors into "not shown" lets this one through rather than keep the answer it would give. */
178
+ export class StatementInstantMissing extends Error {
179
+ }
180
+ /** Who says the instant a statement is written at (an ISO string), or undefined where nobody does. */
181
+ export function readStatementInstantFrom(read) {
182
+ statementInstant = read;
183
+ }
184
+ /** The expression with its constants as this request's values: the App's day, the instant, the reader. `keepNow`
185
+ * leaves the instant as written, for the statement to write as its request's (statementInstant, above). */
186
+ export function foldConstants(node, values, keepNow = false) {
187
+ /* Each constant folded is told to whatever keeps the catalog it is folded into (query.ts readsOf). */
188
+ const fold = (n) => {
189
+ switch (n.k) {
190
+ case 'today':
191
+ noteRead(1);
192
+ return { k: 'date', value: values.today };
193
+ case 'now':
194
+ if (keepNow)
195
+ return n;
196
+ noteRead(2);
197
+ return { k: 'instant', value: values.now };
198
+ case 'me':
199
+ noteRead(0, true);
200
+ return values.me === null ? { k: 'nobody' } : { k: 'text', value: values.me };
201
+ case 'op':
202
+ return { ...n, left: fold(n.left), right: fold(n.right) };
203
+ case 'call':
204
+ return { ...n, args: n.args.map(fold) };
205
+ case 'not':
206
+ case 'neg':
207
+ case 'empty':
208
+ case 'span':
209
+ return { ...n, of: fold(n.of) };
210
+ default:
211
+ return n;
212
+ }
213
+ };
214
+ return fold(node);
215
+ }
216
+ const dialectOf = (style) => style.dialect ?? 'sqlite';
217
+ /**
218
+ * The expression as SQL on one engine. `column` writes a path the way the
219
+ * view writes every other (qualified against its joins); `kindOf` is the
220
+ * same reading of the catalog that typed it, which says where a yes-or-no
221
+ * column is an integer (SQLite, a PostgreSQL 0/1 flag).
222
+ */
223
+ export function compileComputed(computed, style, column, kindOf) {
224
+ const dialect = dialectOf(style);
225
+ const literal = (text) => `'${text.replace(/'/g, "''")}'`;
226
+ const truthy = (n) => {
227
+ if (n.k === 'bool')
228
+ return dialect === 'postgres' ? (n.value ? 'TRUE' : 'FALSE') : n.value ? '(1 = 1)' : '(1 = 0)';
229
+ if (n.k === 'path') {
230
+ const found = kindOf(n.path);
231
+ /* A native boolean reads as itself; a 0/1 integer as whether it is not 0. */
232
+ return dialect === 'postgres' && found?.native ? column(n.path) : `(${column(n.path)} <> 0)`;
233
+ }
234
+ return sql(n);
235
+ };
236
+ const days = (n) => n.k === 'span' ? (n.unit === 'week' ? `(${sql(n.of)}) * 7` : `(${sql(n.of)})`) : `(${sql(n)})`;
237
+ const unitOf = (n) => (n.k === 'span' ? (n.unit === 'week' ? 'day' : n.unit) : 'day');
238
+ /* An instant moved by the clock (`now - 30 minutes`), kept an instant rather than cast to its day. */
239
+ const clocked = (date, amount, sign) => {
240
+ const n = sign === 1 ? `(${sql(amount.of)})` : `(-(${sql(amount.of)}))`;
241
+ if (dialect === 'postgres')
242
+ return `(${date} + ${n} * INTERVAL '1 ${amount.unit}')`;
243
+ return `datetime(${date}, printf('%+d ${amount.unit}s', CAST(${n} AS INTEGER)))`;
244
+ };
245
+ const shifted = (date, amount, sign) => {
246
+ if (amount.k === 'span' && (amount.unit === 'hour' || amount.unit === 'minute'))
247
+ return clocked(date, amount, sign);
248
+ const unit = unitOf(amount);
249
+ const n = sign === 1 ? days(amount) : `(-${days(amount)})`;
250
+ if (dialect === 'postgres')
251
+ return unit === 'day'
252
+ ? `(CAST(${date} AS DATE) + CAST(${n} AS INTEGER))`
253
+ : `CAST(CAST(${date} AS DATE) + ${n} * INTERVAL '1 ${unit}' AS DATE)`;
254
+ return `date(${date}, printf('%+d ${unit}s', CAST(${n} AS INTEGER)))`;
255
+ };
256
+ const sql = (n) => {
257
+ switch (n.k) {
258
+ case 'path':
259
+ return column(n.path);
260
+ case 'number':
261
+ return String(n.value);
262
+ case 'text':
263
+ return literal(n.value);
264
+ case 'nobody':
265
+ return 'NULL';
266
+ case 'bool':
267
+ return truthy(n);
268
+ case 'now': {
269
+ const at = statementInstant();
270
+ if (at === undefined)
271
+ throw new StatementInstantMissing('"now" is read when the catalog is served, or by its request, before a statement is written.');
272
+ noteRead(2);
273
+ return sql({ k: 'instant', value: at });
274
+ }
275
+ case 'today':
276
+ case 'me':
277
+ throw new Error(`"${n.k}" is read when the catalog is served, before a statement is written.`);
278
+ case 'date':
279
+ return dialect === 'sqlite' ? literal(n.value) : `DATE ${literal(n.value)}`;
280
+ case 'instant':
281
+ return dialect === 'sqlite'
282
+ ? literal(n.value.replace('T', ' ').replace(/\.\d+Z$|Z$/, ''))
283
+ : dialect === 'postgres'
284
+ ? `CAST(${literal(n.value)} AS TIMESTAMPTZ)`
285
+ : `TIMESTAMP ${literal(n.value.replace('T', ' ').replace(/\.\d+Z$|Z$/, ''))}`;
286
+ case 'not':
287
+ return `(NOT ${truthy(n.of)})`;
288
+ case 'neg':
289
+ return `(-(${sql(n.of)}))`;
290
+ case 'empty':
291
+ return `(${sql(n.of)} IS ${n.negate ? 'NOT ' : ''}NULL)`;
292
+ case 'span':
293
+ return days(n);
294
+ case 'call': {
295
+ const args = n.args.map(sql);
296
+ if (n.fn === 'abs')
297
+ return `ABS(${args[0]})`;
298
+ if (n.fn === 'coalesce')
299
+ return `COALESCE(${args.join(', ')})`;
300
+ if (n.fn === 'round') {
301
+ const places = args[1] ?? '0';
302
+ /* A half rounds away from zero, of the figure as written: 1.005 is 1.01. PostgreSQL rounds a numeric so (a
303
+ double cast to one keeps 15 digits); SQLite rounds the double, which is 1.00499…, so the figure is moved
304
+ by its places and said to 15 digits first, as computedValue.ts works it out. */
305
+ if (dialect === 'postgres')
306
+ return `ROUND(CAST(${args[0]} AS NUMERIC), ${places})`;
307
+ const scale = places === '0' ? '' : ` * 1e${places}`;
308
+ const back = places === '0' ? '' : ` / 1e${places}`;
309
+ return `(CASE WHEN (${args[0]}) IS NULL THEN NULL ELSE ROUND(CAST(printf('%.15g', (${args[0]})${scale}) AS REAL))${back} END)`;
310
+ }
311
+ /* SQLite's min and max of several give nothing where one is nothing;
312
+ PostgreSQL's LEAST and GREATEST skip a null, so it is said there. */
313
+ if (dialect === 'sqlite')
314
+ return `${n.fn.toUpperCase()}(${args.join(', ')})`;
315
+ const pick = `${n.fn === 'min' ? 'LEAST' : 'GREATEST'}(${args.join(', ')})`;
316
+ return `(CASE WHEN ${args.map((arg) => `(${arg}) IS NULL`).join(' OR ')} THEN NULL ELSE ${pick} END)`;
317
+ }
318
+ case 'op': {
319
+ if (n.op === 'and' || n.op === 'or')
320
+ return `(${truthy(n.left)} ${n.op.toUpperCase()} ${truthy(n.right)})`;
321
+ const lk = kindAt(n.left), rk = kindAt(n.right);
322
+ if (['=', '!=', '<', '<=', '>', '>='].includes(n.op)) {
323
+ const op = n.op === '!=' ? '<>' : n.op;
324
+ if (lk === 'boolean')
325
+ return `(${truthy(n.left)} ${op} ${truthy(n.right)})`;
326
+ return `(${sql(n.left)} ${op} ${sql(n.right)})`;
327
+ }
328
+ if (n.op === '-' && lk === 'date' && rk === 'date') {
329
+ if (dialect === 'postgres')
330
+ return `(CAST(${sql(n.left)} AS DATE) - CAST(${sql(n.right)} AS DATE))`;
331
+ return `CAST(julianday(date(${sql(n.left)})) - julianday(date(${sql(n.right)})) AS INTEGER)`;
332
+ }
333
+ if ((n.op === '+' || n.op === '-') && lk === 'date')
334
+ return shifted(sql(n.left), n.right, n.op === '+' ? 1 : -1);
335
+ if (n.op === '+' && rk === 'date')
336
+ return shifted(sql(n.right), n.left, 1);
337
+ /* Division never truncates and never fails: a number over zero has no value. */
338
+ if (n.op === '/')
339
+ return `((${sql(n.left)}) * 1.0 / NULLIF(${sql(n.right)}, 0))`;
340
+ return `(${sql(n.left)} ${n.op} ${sql(n.right)})`;
341
+ }
342
+ }
343
+ };
344
+ const kindAt = (n) => computedKind(n, (path) => kindOf(path)?.kind);
345
+ /* A yes-or-no column is yes or no, never unknown: a task with no due date is not overdue. */
346
+ if (computed.type === 'boolean') {
347
+ return dialect === 'postgres'
348
+ ? `(CASE WHEN ${truthy(computed.expr)} THEN TRUE ELSE FALSE END)`
349
+ : `(CASE WHEN ${truthy(computed.expr)} THEN 1 ELSE 0 END)`;
350
+ }
351
+ return sql(computed.expr);
352
+ }
353
+ /** Whether an expression says the instant (`now`), so it comes to a moment rather than a day. */
354
+ export function readsNow(node) {
355
+ if (node.k === 'now' || node.k === 'instant')
356
+ return true;
357
+ if (node.k === 'op')
358
+ return readsNow(node.left) || readsNow(node.right);
359
+ if (node.k === 'call')
360
+ return node.args.some(readsNow);
361
+ if (node.k === 'not' || node.k === 'neg' || node.k === 'empty' || node.k === 'span')
362
+ return readsNow(node.of);
363
+ return false;
364
+ }
365
+ /** Whether an expression says the reader (`me`), so it comes to a different value for each. */
366
+ export function readsMe(node) {
367
+ if (node.k === 'me')
368
+ return true;
369
+ if (node.k === 'op')
370
+ return readsMe(node.left) || readsMe(node.right);
371
+ if (node.k === 'call')
372
+ return node.args.some(readsMe);
373
+ if (node.k === 'not' || node.k === 'neg' || node.k === 'empty' || node.k === 'span')
374
+ return readsMe(node.of);
375
+ return false;
376
+ }
377
+ /* Working an expression out in JavaScript is computedValue.ts: its own module,
378
+ so a page that only reads an expression's shape never fetches the evaluator. */
@@ -0,0 +1,13 @@
1
+ /**
2
+ * An expression's words read into its tree (computed.ts): the tokenizer and the parser computed columns, a form's
3
+ * live lines and the App's checks read with. A module of its own because nothing in computed.ts calls it, and a
4
+ * browser's first page reaches computed.ts (a computed column's meta): what a part loaded on demand uses of a module
5
+ * the first page reaches is drawn into the first page's chunk, so the parser lived there for a form's live lines.
6
+ */
7
+ import { type ComputedNode } from './computed.js';
8
+ /**
9
+ * An expression's tree, or why it is not one. `isColumn` says which bare
10
+ * words are names: a word on the right of `=` or `!=` that is not one is a
11
+ * value, as it is in a query (`status = open`).
12
+ */
13
+ export declare function parseComputed(text: string, isColumn: (path: string) => boolean): ComputedNode;
@@ -0,0 +1,278 @@
1
+ /**
2
+ * An expression's words read into its tree (computed.ts): the tokenizer and the parser computed columns, a form's
3
+ * live lines and the App's checks read with. A module of its own because nothing in computed.ts calls it, and a
4
+ * browser's first page reaches computed.ts (a computed column's meta): what a part loaded on demand uses of a module
5
+ * the first page reaches is drawn into the first page's chunk, so the parser lived there for a form's live lines.
6
+ */
7
+ import { ComputedError } from './computed.js';
8
+ /** The functions an expression may call: each written alike on every engine and worked out alike in JavaScript. */
9
+ const COMPUTED_FUNCTIONS = ['coalesce', 'round', 'min', 'max', 'abs'];
10
+ const isFunction = (word) => COMPUTED_FUNCTIONS.includes(word);
11
+ /* The greatest number of places `round` keeps: past it a figure is no longer one an engine says exactly. */
12
+ const ROUND_PLACES = 10;
13
+ const CONSTANTS = new Set(['today', 'now', 'me', 'true', 'false']);
14
+ const UNITS = {
15
+ minute: 'minute',
16
+ minutes: 'minute',
17
+ hour: 'hour',
18
+ hours: 'hour',
19
+ day: 'day',
20
+ days: 'day',
21
+ week: 'week',
22
+ weeks: 'week',
23
+ month: 'month',
24
+ months: 'month',
25
+ year: 'year',
26
+ years: 'year',
27
+ };
28
+ const WORD = /[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*/y;
29
+ function tokens(text) {
30
+ const out = [];
31
+ let i = 0;
32
+ while (i < text.length) {
33
+ const c = text[i];
34
+ if (/\s/.test(c)) {
35
+ i++;
36
+ continue;
37
+ }
38
+ if (/\d/.test(c)) {
39
+ const m = /\d+(?:\.\d+)?/y;
40
+ m.lastIndex = i;
41
+ const n = m.exec(text)[0];
42
+ out.push({ t: 'number', v: n, at: i });
43
+ i += n.length;
44
+ continue;
45
+ }
46
+ if (c === "'") {
47
+ let j = i + 1, value = '';
48
+ for (;;) {
49
+ if (j >= text.length)
50
+ throw new ComputedError('a quoted text is not closed.', i);
51
+ if (text[j] === "'") {
52
+ if (text[j + 1] === "'") {
53
+ value += "'";
54
+ j += 2;
55
+ continue;
56
+ }
57
+ break;
58
+ }
59
+ value += text[j++];
60
+ }
61
+ /* Written into the statement between quotes, so held to what every engine reads alike there (recordLabel.ts). */
62
+ if ([...value].some((ch) => ch === '\\' || ch.charCodeAt(0) < 0x20 || ch.charCodeAt(0) === 0x7f)) {
63
+ throw new ComputedError('a quoted text holds a backslash or a control character, which engines read differently.', i);
64
+ }
65
+ out.push({ t: 'text', v: value, at: i });
66
+ i = j + 1;
67
+ continue;
68
+ }
69
+ const two = text.slice(i, i + 2);
70
+ if (['!=', '<>', '<=', '>='].includes(two)) {
71
+ out.push({ t: 'op', v: two === '<>' ? '!=' : two, at: i });
72
+ i += 2;
73
+ continue;
74
+ }
75
+ if ('=<>+-*/(),'.includes(c)) {
76
+ out.push({ t: 'op', v: c, at: i });
77
+ i++;
78
+ continue;
79
+ }
80
+ WORD.lastIndex = i;
81
+ const w = WORD.exec(text);
82
+ if (w) {
83
+ out.push({ t: 'word', v: w[0], at: i });
84
+ i += w[0].length;
85
+ continue;
86
+ }
87
+ throw new ComputedError(`"${c}" is not part of an expression.`, i);
88
+ }
89
+ out.push({ t: 'end', v: '', at: text.length });
90
+ return out;
91
+ }
92
+ /**
93
+ * An expression's tree, or why it is not one. `isColumn` says which bare
94
+ * words are names: a word on the right of `=` or `!=` that is not one is a
95
+ * value, as it is in a query (`status = open`).
96
+ */
97
+ export function parseComputed(text, isColumn) {
98
+ const list = tokens(text);
99
+ let p = 0;
100
+ const peek = () => list[p];
101
+ const word = (v) => peek().t === 'word' && peek().v.toLowerCase() === v;
102
+ const take = () => list[p++];
103
+ const expect = (v) => {
104
+ if (peek().t !== 'op' || peek().v !== v)
105
+ throw new ComputedError(`expected "${v}"${peek().t === 'end' ? ' before the end' : ` at "${peek().v}"`}.`, peek().at);
106
+ take();
107
+ };
108
+ const or = () => {
109
+ let left = and();
110
+ while (word('or')) {
111
+ take();
112
+ left = { k: 'op', op: 'or', left, right: and() };
113
+ }
114
+ return left;
115
+ };
116
+ const and = () => {
117
+ let left = not();
118
+ while (word('and')) {
119
+ take();
120
+ left = { k: 'op', op: 'and', left, right: not() };
121
+ }
122
+ return left;
123
+ };
124
+ const not = () => {
125
+ if (word('not')) {
126
+ take();
127
+ return { k: 'not', of: not() };
128
+ }
129
+ return compare();
130
+ };
131
+ const compare = () => {
132
+ const left = additive();
133
+ if (word('is')) {
134
+ take();
135
+ const negate = word('not');
136
+ if (negate)
137
+ take();
138
+ if (!word('empty'))
139
+ throw new ComputedError('say "is empty" or "is not empty".', peek().at);
140
+ take();
141
+ return { k: 'empty', of: left, negate };
142
+ }
143
+ /* `status in (open, waiting)`, `status not in (done)`: the query language's list, said as the equalities it
144
+ means, joined by "or", so it types, compiles on every engine and works out in the browser as `=` does. */
145
+ const negated = word('not') && list[p + 1].t === 'word' && list[p + 1].v.toLowerCase() === 'in';
146
+ if (negated || word('in')) {
147
+ if (negated)
148
+ take();
149
+ take();
150
+ expect('(');
151
+ const items = [];
152
+ for (;;) {
153
+ const valueAt = peek();
154
+ const next = list[p + 1];
155
+ items.push(left.k === 'path' &&
156
+ valueAt.t === 'word' &&
157
+ !CONSTANTS.has(valueAt.v.toLowerCase()) &&
158
+ !valueAt.v.includes('.') &&
159
+ !isColumn(valueAt.v) &&
160
+ next.t === 'op' &&
161
+ (next.v === ',' || next.v === ')')
162
+ ? (take(), { k: 'text', value: valueAt.v })
163
+ : additive());
164
+ if (peek().t === 'op' && peek().v === ',') {
165
+ take();
166
+ continue;
167
+ }
168
+ expect(')');
169
+ break;
170
+ }
171
+ const any = items
172
+ .map((right) => ({ k: 'op', op: '=', left, right }))
173
+ .reduce((either, each) => ({ k: 'op', op: 'or', left: either, right: each }));
174
+ return negated ? { k: 'not', of: any } : any;
175
+ }
176
+ const op = peek();
177
+ if (op.t === 'op' && ['=', '!=', '<', '<=', '>', '>='].includes(op.v)) {
178
+ take();
179
+ const valueAt = peek();
180
+ /* `status = open`: a bare word that names no column is the value, as in a query. */
181
+ const right = (op.v === '=' || op.v === '!=') &&
182
+ left.k === 'path' &&
183
+ valueAt.t === 'word' &&
184
+ !CONSTANTS.has(valueAt.v.toLowerCase()) &&
185
+ !valueAt.v.includes('.') &&
186
+ !isColumn(valueAt.v) &&
187
+ (list[p + 1].t === 'end' || list[p + 1].t === 'word' || (list[p + 1].t === 'op' && list[p + 1].v === ')'))
188
+ ? (take(), { k: 'text', value: valueAt.v })
189
+ : additive();
190
+ if (op.v === '=' && right.k === 'path' && /^null$/i.test(right.path))
191
+ throw new ComputedError('"= null" is never true; say "is empty".', valueAt.at);
192
+ return { k: 'op', op: op.v, left, right };
193
+ }
194
+ return left;
195
+ };
196
+ const additive = () => {
197
+ let left = multiplicative();
198
+ while (peek().t === 'op' && (peek().v === '+' || peek().v === '-')) {
199
+ const op = take().v;
200
+ left = { k: 'op', op, left, right: multiplicative() };
201
+ }
202
+ return left;
203
+ };
204
+ const multiplicative = () => {
205
+ let left = unary();
206
+ while (peek().t === 'op' && (peek().v === '*' || peek().v === '/')) {
207
+ const op = take().v;
208
+ left = { k: 'op', op, left, right: unary() };
209
+ }
210
+ return left;
211
+ };
212
+ const unary = () => {
213
+ if (peek().t === 'op' && peek().v === '-') {
214
+ take();
215
+ return { k: 'neg', of: unary() };
216
+ }
217
+ const value = primary();
218
+ /* `3 days`, `term months`: a span a date moves by. */
219
+ if (peek().t === 'word' && Object.hasOwn(UNITS, peek().v.toLowerCase()))
220
+ return { k: 'span', of: value, unit: UNITS[take().v.toLowerCase()] };
221
+ return value;
222
+ };
223
+ const primary = () => {
224
+ const token = take();
225
+ if (token.t === 'number')
226
+ return { k: 'number', value: Number(token.v) };
227
+ if (token.t === 'text')
228
+ return { k: 'text', value: token.v };
229
+ if (token.t === 'op' && token.v === '(') {
230
+ const inner = or();
231
+ expect(')');
232
+ return inner;
233
+ }
234
+ if (token.t === 'word') {
235
+ const lower = token.v.toLowerCase();
236
+ /* `round(total, 2)`: a function's name is a word followed by "(", which no column or value ever is. */
237
+ if (peek().t === 'op' && peek().v === '(') {
238
+ if (!isFunction(lower))
239
+ throw new ComputedError(`"${token.v}" is not a function; an expression calls ${COMPUTED_FUNCTIONS.join(', ')}.`, token.at);
240
+ take();
241
+ const args = [];
242
+ if (!(peek().t === 'op' && peek().v === ')'))
243
+ for (;;) {
244
+ args.push(or());
245
+ if (peek().t === 'op' && peek().v === ',') {
246
+ take();
247
+ continue;
248
+ }
249
+ break;
250
+ }
251
+ expect(')');
252
+ const fn = lower;
253
+ const many = fn === 'coalesce' || fn === 'min' || fn === 'max';
254
+ if (many ? args.length < 2 : fn === 'round' ? args.length < 1 || args.length > 2 : args.length !== 1)
255
+ throw new ComputedError(many
256
+ ? `${fn}(…) takes two values or more: ${fn}(a, b).`
257
+ : fn === 'round'
258
+ ? 'round(…) takes a number and, if you like, how many places: round(total) or round(total, 2).'
259
+ : `${fn}(…) takes one number.`, token.at);
260
+ if (fn === 'round' && args[1] && !(args[1].k === 'number' && Number.isInteger(args[1].value) && args[1].value <= ROUND_PLACES))
261
+ throw new ComputedError(`round(…)'s places are a whole number from 0 to ${ROUND_PLACES}, written out: round(total, 2).`, token.at);
262
+ return { k: 'call', fn, args };
263
+ }
264
+ if (lower === 'true' || lower === 'false')
265
+ return { k: 'bool', value: lower === 'true' };
266
+ if (lower === 'today' || lower === 'now' || lower === 'me')
267
+ return { k: lower };
268
+ if (['and', 'or', 'not', 'is', 'empty', 'in'].includes(lower) || Object.hasOwn(UNITS, lower))
269
+ throw new ComputedError(`"${token.v}" stands where a value goes.`, token.at);
270
+ return { k: 'path', path: token.v };
271
+ }
272
+ throw new ComputedError(token.t === 'end' ? 'the expression ends where a value goes.' : `"${token.v}" stands where a value goes.`, token.at);
273
+ };
274
+ const tree = or();
275
+ if (peek().t !== 'end')
276
+ throw new ComputedError(`"${peek().v}" follows a complete expression; join two with "and" or "or".`, peek().at);
277
+ return tree;
278
+ }