@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,64 @@
1
+ /**
2
+ * Who an @ names, as a rich text column or input declares it:
3
+ * `mentions: { from, by, labelColumn }`. `by` is what is stored (the span's
4
+ * `data-id`, which a `notify` rule finds); `labelColumn` is what the list and the
5
+ * mention say — one column, or a record label template of the people's own
6
+ * columns, `'{first_name} {last_name}'` (recordLabel.ts's grammar), so two
7
+ * Morgans read as "Morgan Hughes" and "Morgan Tran".
8
+ *
9
+ * One reading for the browser, which asks, and the server, which checks the
10
+ * declaration: the query an @ sends, and the name a row is said by.
11
+ */
12
+ import { columnKind } from './schema.js';
13
+ import { quoteValue } from './query.js';
14
+ import { isLabelTemplate, parseLabelTemplate } from './recordLabel.js';
15
+ import { mentionLabelColumns } from './mentionLabel.js';
16
+ import { MENTION_QUERY_WORDS } from './richText.js';
17
+ /** A person's name as the label says it, from their row: the column, or the template filled and its spaces tidied. */
18
+ export function mentionLabelText(source, row) {
19
+ const label = source.labelColumn ?? source.by;
20
+ const said = (value) => (value === null || value === undefined ? '' : String(value));
21
+ if (!isLabelTemplate(label))
22
+ return said(row[label]);
23
+ const parsed = parseLabelTemplate(label);
24
+ if ('problem' in parsed)
25
+ return '';
26
+ return parsed.parts
27
+ .map((part) => ('text' in part ? part.text : said(row[part.path])))
28
+ .join('')
29
+ .replace(/\s+/g, ' ')
30
+ .trim();
31
+ }
32
+ /* A column a word can be looked for in: text the engine compares as text. A UUID is not one — Postgres has no
33
+ ILIKE for it, and nobody types a key's first letters — nor is JSON. */
34
+ const searchable = (column) => !column?.type || (columnKind(column.type) === 'text' && !/uuid|json/i.test(column.type));
35
+ /** The most words of what was typed that are each looked for; the rest narrow nothing. */
36
+ const MOST_WORDS = MENTION_QUERY_WORDS;
37
+ /**
38
+ * The query an @ sends for what was typed after it: the people whose label's
39
+ * words — any of them, by its start, in any case — or whose `by` value start
40
+ * with each typed word, shown by the label's columns and sorted by them.
41
+ * `columns` are the resource's, where the catalog has them, so a key or a
42
+ * number is not searched as text.
43
+ */
44
+ export function mentionQuery(source, typed, columns,
45
+ /** Read beside the label, never looked in: a team's key its link rows name. */
46
+ also = []) {
47
+ const read = mentionLabelColumns(source.labelColumn ?? source.by);
48
+ const shown = 'problem' in read ? [source.by] : read.columns;
49
+ const column = (name) => columns?.find((c) => c.name === name);
50
+ const looked = [...new Set([...shown, source.by])].filter((name) => searchable(column(name)));
51
+ /* A word's start: the value's, or after a space in it ("Mary Ann"). The language spreads the ands over the ors,
52
+ which it caps, so the words looked for are few. */
53
+ const words = typed
54
+ .trim()
55
+ .split(/\s+/)
56
+ .filter(Boolean)
57
+ .slice(0, looked.length > 4 ? 1 : MOST_WORDS);
58
+ const filter = looked.length
59
+ ? words.map((word) => `(${looked.flatMap((name) => [`${name} startswith ${quoteValue(word)}`, `${name} contains ${quoteValue(` ${word}`)}`]).join(' or ')})`)
60
+ : [];
61
+ return [source.from, filter.join(' and '), `show ${[...new Set([source.by, ...shown, ...also])].join(', ')}`, `sort ${shown.join(', ')}`]
62
+ .filter(Boolean)
63
+ .join(' ');
64
+ }
@@ -0,0 +1,16 @@
1
+ export interface CountedMachine {
2
+ column: string;
3
+ states: readonly {
4
+ value: string;
5
+ final?: true;
6
+ }[];
7
+ groups?: Readonly<Record<string, readonly string[]>>;
8
+ }
9
+ /**
10
+ * Whether a menu row counts its list, and whether that count is late. `count` is the list's own say
11
+ * (`count: true` or `false`), which wins. `segments` are the list's resource's, by name, to their conditions.
12
+ */
13
+ export declare function menuCount(written: string, machine: CountedMachine | undefined, count?: boolean, segments?: Readonly<Record<string, string>>): {
14
+ counted: boolean;
15
+ late: boolean;
16
+ };
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Which menu rows carry a count (ui.shell.counts), on both sides: the client's menu (sidebarModel.ts) and the
3
+ * server's first paint, which asks for the same counts before the menu draws (firstPaintRooms.ts).
4
+ *
5
+ * A count beside a list says work is waiting. A number beside every list made the menu a column of figures —
6
+ * Products 218, Customers 40, Stock 900 — in which the one that mattered did not stand out, and a catalog's size
7
+ * is not news. So a list is counted where its standing condition says it is work:
8
+ *
9
+ * - (a) its machine's states that are not final: `status = to_pick`, `status != shipped` where shipped is the one
10
+ * final state, `status in (draft, sent)`, `status is open`, or a group of open states (`status is onBench`);
11
+ * - (b) a date at or before today: `ship_by <= today`, `due before today`;
12
+ * - (c) the reader: `owner = me`.
13
+ *
14
+ * A plain filter (`status = active`) is not work. An author says otherwise for one list with its `count`.
15
+ * A count of (b), work past its date, is said in the danger's ink; no other count is an alarm.
16
+ *
17
+ * A list's query may name its resource's segments (appSegments.ts): `query: 'open'` is read as the conditions
18
+ * the segment names, so it is counted exactly as the same conditions written inline are.
19
+ */
20
+ import { expandSegments } from './query.js';
21
+ const PAST = /(?:<=?|\bbefore)\s*(?:today|now)\b/i;
22
+ const ME = /(?:^|[\s(,=])me(?=$|[\s),])/;
23
+ const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
24
+ const words = (list) => list
25
+ .split(',')
26
+ .map((word) => word.trim().replace(/^["']|["']$/g, ''))
27
+ .filter(Boolean);
28
+ /** Whether a condition is of work past its date. */
29
+ function pastDue(condition) {
30
+ return PAST.test(condition);
31
+ }
32
+ /** Whether the condition picks out only states its machine has not finished with. */
33
+ function openStates(condition, machine) {
34
+ if (!machine)
35
+ return false;
36
+ const final = new Set(machine.states.filter((state) => state.final).map((state) => state.value));
37
+ const open = (value) => machine.states.some((state) => state.value === value) && !final.has(value);
38
+ // The machine's own column, never a path through a reference to another table's column of that name.
39
+ const column = `(?<![\\w.])${escape(machine.column)}`;
40
+ const value = `["']?([\\w-]+)["']?`;
41
+ /* `status is open` is the machine's own name for its unfinished states (query.ts). */
42
+ if (new RegExp(`${column}\\s+is\\s+open\\b`, 'i').test(condition) && machine.states.some((state) => !final.has(state.value)))
43
+ return true;
44
+ /* A group the machine names (`status is onBench`) is work when every state it holds is. */
45
+ for (const [, group] of condition.matchAll(new RegExp(`${column}\\s+is\\s+(\\w+)\\b`, 'gi'))) {
46
+ const held = machine.groups && Object.hasOwn(machine.groups, group) ? machine.groups[group] : undefined;
47
+ if (held?.length && held.every(open))
48
+ return true;
49
+ }
50
+ for (const [, state] of condition.matchAll(new RegExp(`${column}\\s*=\\s*${value}`, 'g')))
51
+ if (open(state))
52
+ return true;
53
+ for (const [, list] of condition.matchAll(new RegExp(`${column}\\s+in\\s*\\(([^)]*)\\)`, 'gi')))
54
+ if (words(list).length && words(list).every(open))
55
+ return true;
56
+ const left = new Set();
57
+ for (const [, state] of condition.matchAll(new RegExp(`${column}\\s*!=\\s*${value}`, 'g')))
58
+ left.add(state);
59
+ for (const [, list] of condition.matchAll(new RegExp(`${column}\\s+not\\s+in\\s*\\(([^)]*)\\)`, 'gi')))
60
+ words(list).forEach((w) => left.add(w));
61
+ return final.size > 0 && left.size > 0 && [...final].every((state) => left.has(state));
62
+ }
63
+ /**
64
+ * Whether a menu row counts its list, and whether that count is late. `count` is the list's own say
65
+ * (`count: true` or `false`), which wins. `segments` are the list's resource's, by name, to their conditions.
66
+ */
67
+ export function menuCount(written, machine, count, segments) {
68
+ const condition = expandSegments(written, segments).text;
69
+ const late = pastDue(condition);
70
+ if (count !== undefined)
71
+ return { counted: count, late: count && late };
72
+ const counted = late || ME.test(condition) || openStates(condition, machine);
73
+ return { counted, late: counted && late };
74
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The end of a switch over a closed union: a compile error where a new
3
+ * member has no case, and a throw where one arrives at run time anyway.
4
+ * A `default` that quietly answered "nothing" is how a new section kind
5
+ * once skipped a role check.
6
+ */
7
+ export declare function assertNever(value: never, what?: string): never;
8
+ /**
9
+ * Refuse a key the location does not have, naming the ones it does.
10
+ *
11
+ * An unknown key used to vanish: `lable`, `qeury`, `navigation` all parsed
12
+ * to an emptier app with no word said, which for a manifest written by an
13
+ * agent — no editor squiggle, no schema check — is the worst failure mode a
14
+ * config surface has. The header promises nothing is silently skipped; this
15
+ * is what keeps the promise at every level. Keys beginning with `$` or `_`
16
+ * are annotations (`$schema`, `_comment`) and pass: JSON has no comments and
17
+ * a manifest is allowed to explain itself.
18
+ *
19
+ * A key the location declares ahead of its feature is in `refused`, and is
20
+ * refused with the reason instead of the list. Any other is offered the key
21
+ * it is a near miss of, or the place it belongs (unknownKey).
22
+ */
23
+ export declare function allowKeys(obj: Record<string, unknown>, allowed: readonly string[], at: string, refused?: Readonly<Record<string, string>>): void;
24
+ export declare const setKeyHomes: (homes: (key: string) => readonly string[]) => void;
25
+ export declare const keyHomesOf: (key: string) => readonly string[];
26
+ export declare const isRecord: (value: unknown) => value is Record<string, unknown>;
27
+ /**
28
+ * A plain data object, or a refusal: own enumerable data properties only, on
29
+ * no borrowed prototype. The places a getter could run code during a parse,
30
+ * or an inherited value could stand in for an authored one — the root, the
31
+ * resource blocks and their ceilings — are read only after this.
32
+ */
33
+ export declare function plainRecord(raw: unknown, at: string, what: string): Record<string, unknown>;
34
+ /** A trimmed non-empty string, or undefined when absent; anything else is refused. */
35
+ export declare function optionalText(o: Record<string, unknown>, key: string, at: string): string | undefined;
36
+ export declare const RESERVED_NAMES: Set<string>;
37
+ /** A view key: its address — `{id}:` before a list's question, `@dash-{id}`, `@form-{id}`, `/form/{id}`. */
38
+ export declare const VIEW_KEY: RegExp;
39
+ /** A page key: the page id (`@{id}` when its name does not say it unambiguously). */
40
+ export declare const PAGE_KEY: RegExp;
41
+ /**
42
+ * A table or column name as a person would say it: `work_order` → "Work
43
+ * order", `shippedOn` → "Shipped on". The nav used to serve the raw name
44
+ * when the author wrote no label, so the sidebar read `work_order` beside
45
+ * a breadcrumb that had already humanised it. Mirror of `humanName` in the
46
+ * client (core.js), for the one place the server labels something.
47
+ */
48
+ export declare function humanName(name: string): string;
49
+ /** What one of a resource's records is called, and more than one, as they read mid-sentence: `noun` on its block.
50
+ appNoun.ts says it where each place needs it. */
51
+ export interface AppNoun {
52
+ one: string;
53
+ many: string;
54
+ }
55
+ /** What a stored value is called wherever the platform words it: a tone chip, a picker, a filter, a board's lane and row heads. */
56
+ export declare function vocabularyWord(text: string): string;
57
+ /**
58
+ * The word a display rule says a stored value as: the author's own
59
+ * (`values`), the value made words where the rule says `humanize`
60
+ * (`IN_REVIEW` → "In review"), or undefined where the rule says neither.
61
+ * Own keys only, as everywhere a stored value names a key. One rule for a
62
+ * cell (the client's valueModel) and a record's computed name
63
+ * (appRecordLabels.ts).
64
+ */
65
+ export declare function displayWord(rule: {
66
+ values?: Record<string, string>;
67
+ humanize?: boolean;
68
+ } | null | undefined, text: string): string | undefined;
69
+ export type DisplayTone = 'good' | 'warn' | 'bad' | 'info' | 'neutral';
70
+ export declare const DISPLAY_TONES: readonly ['good', 'warn', 'bad', 'info', 'neutral'];
71
+ /** What a masked value is drawn as (`masked: true`): short, and the same for every value, so its length says nothing either. */
72
+ export declare const MASK = "\u2022\u2022\u2022\u2022\u2022\u2022";
73
+ export declare const CHART_SHAPES: readonly ['line', 'bar', 'donut', 'stacked'];
74
+ /** How a measured section says its figures where its measure has no column rule to say them: `duration` reads
75
+ the figure as seconds ("10h 2m"), as a `duration` column rule does. */
76
+ export declare const FIGURE_FORMATS: readonly ['percent', 'number', 'money', 'duration'];
77
+ export type FigureFormat = (typeof FIGURE_FORMATS)[number];
78
+ /** The refusal's list of them, to finish its own sentence. */
79
+ export declare const FIGURE_FORMAT_WORDS = "\"percent\" (a figure 0\u2013100), \"number\", \"money\" or \"duration\" (a figure in seconds)";
@@ -0,0 +1,153 @@
1
+ /**
2
+ * The helpers every model parser and rule reads, whichever product it
3
+ * belongs to: what a closed union's last case says, a key refused by name,
4
+ * a plain object, a name said the way a person says it.
5
+ */
6
+ import { unknownKey } from './suggest.js';
7
+ /**
8
+ * The end of a switch over a closed union: a compile error where a new
9
+ * member has no case, and a throw where one arrives at run time anyway.
10
+ * A `default` that quietly answered "nothing" is how a new section kind
11
+ * once skipped a role check.
12
+ */
13
+ export function assertNever(value, what = 'case') {
14
+ throw new Error(`Unknown ${what}: ${JSON.stringify(value?.kind ?? value)}.`);
15
+ }
16
+ /**
17
+ * Refuse a key the location does not have, naming the ones it does.
18
+ *
19
+ * An unknown key used to vanish: `lable`, `qeury`, `navigation` all parsed
20
+ * to an emptier app with no word said, which for a manifest written by an
21
+ * agent — no editor squiggle, no schema check — is the worst failure mode a
22
+ * config surface has. The header promises nothing is silently skipped; this
23
+ * is what keeps the promise at every level. Keys beginning with `$` or `_`
24
+ * are annotations (`$schema`, `_comment`) and pass: JSON has no comments and
25
+ * a manifest is allowed to explain itself.
26
+ *
27
+ * A key the location declares ahead of its feature is in `refused`, and is
28
+ * refused with the reason instead of the list. Any other is offered the key
29
+ * it is a near miss of, or the place it belongs (unknownKey).
30
+ */
31
+ export function allowKeys(obj, allowed, at, refused = {}) {
32
+ for (const key of Object.keys(obj)) {
33
+ if (allowed.includes(key) || /^[$_]/.test(key))
34
+ continue;
35
+ if (Object.hasOwn(refused, key))
36
+ throw new Error(`${at} has "${key}", which ${refused[key]}.`);
37
+ throw new Error(`${at} ${unknownKey(key, allowed, keyHomes(key))}.`);
38
+ }
39
+ }
40
+ /* Where else a key is taken, for a refusal to name. app.ts sets it to the
41
+ App parsers' own key lists, read on the first refusal (appKeyHomes.ts): a
42
+ hook, because every parser imports this module and the lists cannot be
43
+ imported back into it. Absent, a refusal names no home. */
44
+ let keyHomes = () => [];
45
+ export const setKeyHomes = (homes) => {
46
+ keyHomes = homes;
47
+ };
48
+ export const keyHomesOf = (key) => keyHomes(key);
49
+ export const isRecord = (value) => Boolean(value) && typeof value === 'object' && !Array.isArray(value);
50
+ /**
51
+ * A plain data object, or a refusal: own enumerable data properties only, on
52
+ * no borrowed prototype. The places a getter could run code during a parse,
53
+ * or an inherited value could stand in for an authored one — the root, the
54
+ * resource blocks and their ceilings — are read only after this.
55
+ */
56
+ export function plainRecord(raw, at, what) {
57
+ if (!isRecord(raw) || ![Object.prototype, null].includes(Object.getPrototypeOf(raw)))
58
+ throw new Error(`${at} is not ${what}.`);
59
+ for (const key of Reflect.ownKeys(raw)) {
60
+ const descriptor = Object.getOwnPropertyDescriptor(raw, key);
61
+ if (typeof key !== 'string' || !('value' in descriptor) || !descriptor.enumerable) {
62
+ throw new Error(`${at} must be plain data: "${String(key)}" is not a data property.`);
63
+ }
64
+ }
65
+ return raw;
66
+ }
67
+ /** A trimmed non-empty string, or undefined when absent; anything else is refused. */
68
+ export function optionalText(o, key, at) {
69
+ const value = o[key];
70
+ if (value === undefined)
71
+ return undefined;
72
+ if (typeof value !== 'string' || !value.trim())
73
+ throw new Error(`${at} has a "${key}" that is not a non-empty string.`);
74
+ return value.trim();
75
+ }
76
+ export const RESERVED_NAMES = new Set([...Object.getOwnPropertyNames(Object.prototype), 'prototype']);
77
+ /** A view key: its address — `{id}:` before a list's question, `@dash-{id}`, `@form-{id}`, `/form/{id}`. */
78
+ export const VIEW_KEY = /^[a-z0-9][a-z0-9-]{0,63}$/;
79
+ /** A page key: the page id (`@{id}` when its name does not say it unambiguously). */
80
+ export const PAGE_KEY = /^[a-z0-9][a-z0-9_-]{0,63}$/;
81
+ /**
82
+ * A table or column name as a person would say it: `work_order` → "Work
83
+ * order", `shippedOn` → "Shipped on". The nav used to serve the raw name
84
+ * when the author wrote no label, so the sidebar read `work_order` beside
85
+ * a breadcrumb that had already humanised it. Mirror of `humanName` in the
86
+ * client (core.js), for the one place the server labels something.
87
+ */
88
+ export function humanName(name) {
89
+ if (!name || /\s/.test(name))
90
+ return name;
91
+ /* A table is named by its schema too (`billing.order_line`), and a reader of the page it heads was never told which
92
+ schema it came from: the name after the last dot is the one that is said. */
93
+ const bare = name.includes('.') ? name.slice(name.lastIndexOf('.') + 1) : name;
94
+ if (!bare)
95
+ return name;
96
+ const words = bare
97
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
98
+ .split(/_+/)
99
+ .filter(Boolean);
100
+ if (!words.length)
101
+ return name;
102
+ return words
103
+ .map((word, i) => {
104
+ const lower = word.toLowerCase();
105
+ if (HUMAN_CAPS.has(lower))
106
+ return lower.toUpperCase();
107
+ return i === 0 ? lower.charAt(0).toUpperCase() + lower.slice(1) : lower;
108
+ })
109
+ .join(' ');
110
+ }
111
+ /* The same set as the client's CAPS, kept identical by test/mirrors.test.ts. */
112
+ const HUMAN_CAPS = new Set(['id', 'url', 'uuid', 'sku', 'api', 'ip', 'iso', 'sla']);
113
+ /* A stored vocabulary word (`in_progress`, `in progress`, `no-show`) is said
114
+ the way its picker and a workflow strip say it ("In progress", "No-show"),
115
+ whichever joiner the schema spelled it with: underscores alone left a column
116
+ reading "Done" above "in progress". A code (`RNO`), a mixed-case name or
117
+ anything with punctuation stays as stored. */
118
+ const VOCABULARY_WORD = /^[a-z][a-z0-9]*(?:(?:_+| |-)[a-z0-9]+)*$/;
119
+ /** What a stored value is called wherever the platform words it: a tone chip, a picker, a filter, a board's lane and row heads. */
120
+ export function vocabularyWord(text) {
121
+ return VOCABULARY_WORD.test(text) ? humanName(text.replaceAll(' ', '_')) : text;
122
+ }
123
+ /**
124
+ * The word a display rule says a stored value as: the author's own
125
+ * (`values`), the value made words where the rule says `humanize`
126
+ * (`IN_REVIEW` → "In review"), or undefined where the rule says neither.
127
+ * Own keys only, as everywhere a stored value names a key. One rule for a
128
+ * cell (the client's valueModel) and a record's computed name
129
+ * (appRecordLabels.ts).
130
+ */
131
+ export function displayWord(rule, text) {
132
+ if (rule?.values && Object.hasOwn(rule.values, text))
133
+ return rule.values[text];
134
+ if (rule?.humanize && text.trim()) {
135
+ const plain = /^[A-Z0-9_]+$/.test(text) ? text.toLowerCase() : text;
136
+ const word = vocabularyWord(plain);
137
+ return word !== plain ? word : humanName(plain);
138
+ }
139
+ return undefined;
140
+ }
141
+ /* `neutral` exists for the "*" rule: a vocabulary is all pills or no pills,
142
+ and the values the author has nothing to say about wear a pill that says
143
+ nothing in particular rather than falling back to bare text beside the
144
+ coloured ones. */
145
+ export const DISPLAY_TONES = ['good', 'warn', 'bad', 'info', 'neutral'];
146
+ /** What a masked value is drawn as (`masked: true`): short, and the same for every value, so its length says nothing either. */
147
+ export const MASK = '••••••';
148
+ export const CHART_SHAPES = ['line', 'bar', 'donut', 'stacked'];
149
+ /** How a measured section says its figures where its measure has no column rule to say them: `duration` reads
150
+ the figure as seconds ("10h 2m"), as a `duration` column rule does. */
151
+ export const FIGURE_FORMATS = ['percent', 'number', 'money', 'duration'];
152
+ /** The refusal's list of them, to finish its own sentence. */
153
+ export const FIGURE_FORMAT_WORDS = '"percent" (a figure 0–100), "number", "money" or "duration" (a figure in seconds)';
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Money kept as a whole number of minor units — cents, paise, fils, yen — the
3
+ * way a payment provider and most commerce schemas keep it, declared on the
4
+ * column's display rule: `total: { format: 'money', minor: true }`.
5
+ *
6
+ * The figure's decimals are the currency's own, as Intl knows them: two for
7
+ * USD and INR, none for JPY and KRW, three for KWD and BHD. So 1999 is $19.99,
8
+ * ¥1,999 and 1.999 KWD, and nothing about a currency is spelled twice. The
9
+ * conversions are text to text, never through a float: an amount past 2^53
10
+ * comes back from an adapter as a string and stays exact.
11
+ *
12
+ * Browser-safe, and drawn with every list, so it holds only what saying an
13
+ * amount needs; reading a typed one back (a money box, a CSV import) is
14
+ * moneyEntry.ts, loaded with what takes one.
15
+ */
16
+ /** The decimals a currency is written with (ISO 4217's minor unit, as Intl has it); 2 for a code Intl does not know. */
17
+ export declare function currencyDigits(currency: string): number;
18
+ /**
19
+ * A stored amount of minor units as the major figure's exact decimal text —
20
+ * 1999 → "19.99" in USD, "1999" in JPY, "1.999" in KWD — or undefined when
21
+ * the value is not a whole number of them (an average, say), which the caller
22
+ * then divides as a number.
23
+ */
24
+ export declare function minorToMajor(value: unknown, currency: string): string | undefined;
25
+ /**
26
+ * A minor-unit value as the figure a money format draws: the exact major text
27
+ * where it is a whole number of minor units, else the number divided (a
28
+ * total's average). Undefined for no number at all.
29
+ */
30
+ export declare function minorFigure(value: unknown, currency: string): string | number | undefined;
31
+ /**
32
+ * The path a shown money column's currency is read from, where its rule says
33
+ * `currency: { column }`: a column of the table the value was read from, so
34
+ * `order_id.total` shown on a line reads `order_id.currency_code`, as a
35
+ * second line does (subtitlePath.ts).
36
+ */
37
+ export declare function currencyPath(rule: {
38
+ currencyColumn?: string;
39
+ } | null | undefined, shown: string): string | undefined;
40
+ /** A rule's currency for one row: the row's own column where the rule names one and the row holds a code, else the rule's or the App's. */
41
+ export declare function rowCurrency(rule: {
42
+ currency?: string;
43
+ currencyColumn?: string;
44
+ } | null | undefined, row: Readonly<Record<string, unknown>> | undefined, fallback: string, shown?: string): string;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Money kept as a whole number of minor units — cents, paise, fils, yen — the
3
+ * way a payment provider and most commerce schemas keep it, declared on the
4
+ * column's display rule: `total: { format: 'money', minor: true }`.
5
+ *
6
+ * The figure's decimals are the currency's own, as Intl knows them: two for
7
+ * USD and INR, none for JPY and KRW, three for KWD and BHD. So 1999 is $19.99,
8
+ * ¥1,999 and 1.999 KWD, and nothing about a currency is spelled twice. The
9
+ * conversions are text to text, never through a float: an amount past 2^53
10
+ * comes back from an adapter as a string and stays exact.
11
+ *
12
+ * Browser-safe, and drawn with every list, so it holds only what saying an
13
+ * amount needs; reading a typed one back (a money box, a CSV import) is
14
+ * moneyEntry.ts, loaded with what takes one.
15
+ */
16
+ const digitsByCurrency = new Map();
17
+ /** The decimals a currency is written with (ISO 4217's minor unit, as Intl has it); 2 for a code Intl does not know. */
18
+ export function currencyDigits(currency) {
19
+ const code = currency.toUpperCase();
20
+ let digits = digitsByCurrency.get(code);
21
+ if (digits === undefined) {
22
+ try {
23
+ digits = new Intl.NumberFormat('en', { style: 'currency', currency: code }).resolvedOptions().maximumFractionDigits ?? 2;
24
+ }
25
+ catch {
26
+ digits = 2;
27
+ }
28
+ digitsByCurrency.set(code, digits);
29
+ }
30
+ return digits;
31
+ }
32
+ /**
33
+ * A stored amount of minor units as the major figure's exact decimal text —
34
+ * 1999 → "19.99" in USD, "1999" in JPY, "1.999" in KWD — or undefined when
35
+ * the value is not a whole number of them (an average, say), which the caller
36
+ * then divides as a number.
37
+ */
38
+ export function minorToMajor(value, currency) {
39
+ const m = /^(-?)0*(\d+)$/.exec(typeof value === 'number'
40
+ ? Number.isSafeInteger(value)
41
+ ? String(value)
42
+ : ''
43
+ : typeof value === 'string' || typeof value === 'bigint'
44
+ ? String(value).trim()
45
+ : '');
46
+ if (!m)
47
+ return undefined;
48
+ const digits = currencyDigits(currency);
49
+ const whole = m[2].padStart(digits + 1, '0');
50
+ return (/[1-9]/.test(whole) ? m[1] : '') + (digits ? `${whole.slice(0, -digits)}.${whole.slice(-digits)}` : whole);
51
+ }
52
+ /**
53
+ * A minor-unit value as the figure a money format draws: the exact major text
54
+ * where it is a whole number of minor units, else the number divided (a
55
+ * total's average). Undefined for no number at all.
56
+ */
57
+ export function minorFigure(value, currency) {
58
+ const exact = minorToMajor(value, currency);
59
+ if (exact !== undefined)
60
+ return exact;
61
+ const n = typeof value === 'number' ? value : typeof value === 'string' && value.trim() ? Number(value) : NaN;
62
+ return Number.isFinite(n) ? n / 10 ** currencyDigits(currency) : undefined;
63
+ }
64
+ /**
65
+ * The path a shown money column's currency is read from, where its rule says
66
+ * `currency: { column }`: a column of the table the value was read from, so
67
+ * `order_id.total` shown on a line reads `order_id.currency_code`, as a
68
+ * second line does (subtitlePath.ts).
69
+ */
70
+ export function currencyPath(rule, shown) {
71
+ if (!rule?.currencyColumn)
72
+ return undefined;
73
+ const hop = shown.lastIndexOf('.');
74
+ return hop < 0 ? rule.currencyColumn : `${shown.slice(0, hop + 1)}${rule.currencyColumn}`;
75
+ }
76
+ /** A rule's currency for one row: the row's own column where the rule names one and the row holds a code, else the rule's or the App's. */
77
+ export function rowCurrency(rule, row, fallback, shown = '') {
78
+ const path = currencyPath(rule, shown);
79
+ const own = path && row ? row[path] : undefined;
80
+ return typeof own === 'string' && /^[A-Za-z]{3}$/.test(own.trim()) ? own.trim().toUpperCase() : (rule?.currency ?? fallback);
81
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A major amount — a number, or decimal text with a point ("19.99", "-5",
3
+ * ".5") — as the whole number of minor units it is, or undefined when it is
4
+ * no amount or says more decimals than the currency has: 19.999 dollars is a
5
+ * typo, not a value to round.
6
+ */
7
+ export declare function majorToMinor(major: number | string, currency: string): number | undefined;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * An amount a person types, or a CSV cell holds, read back as the whole number
3
+ * of minor units a `minor: true` money column stores (money.ts says why). A
4
+ * module of its own so it loads with what takes a typed amount — a money box,
5
+ * an import — and not with every list that only says one.
6
+ */
7
+ import { currencyDigits } from './money.js';
8
+ /**
9
+ * A major amount — a number, or decimal text with a point ("19.99", "-5",
10
+ * ".5") — as the whole number of minor units it is, or undefined when it is
11
+ * no amount or says more decimals than the currency has: 19.999 dollars is a
12
+ * typo, not a value to round.
13
+ */
14
+ export function majorToMinor(major, currency) {
15
+ const text = typeof major === 'number' ? (Number.isFinite(major) ? String(major) : '') : major.trim();
16
+ const m = /^([-+]?)(\d*)(?:\.(\d*))?$/.exec(text);
17
+ if (!m || (!m[2] && !m[3]))
18
+ return undefined;
19
+ const digits = currencyDigits(currency);
20
+ const fraction = (m[3] ?? '').replace(/0+$/, '');
21
+ if (fraction.length > digits)
22
+ return undefined;
23
+ const n = Number(`${m[2] || '0'}${fraction.padEnd(digits, '0')}`);
24
+ if (!Number.isSafeInteger(n))
25
+ return undefined;
26
+ return m[1] === '-' && n !== 0 ? -n : n;
27
+ }