@mistriwork/engine 0.0.0-stage → 1.0.0-rc.9

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 +62 -0
  386. package/dist/shared/keysetPage.js +159 -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,131 @@
1
+ /**
2
+ * Documents: a record put on paper — an invoice, a packing slip, a payslip, a
3
+ * quote.
4
+ *
5
+ * A document is an App page that says `document: { label, number, size,
6
+ * description }`. Its sections are the page sections a reader already knows
7
+ * (fields, related lists, notes), so its reads are a record page's: planned
8
+ * by the same route, asked through the same reads, under the same grants,
9
+ * row scope and tenant as the record's own page. Nothing is read for paper
10
+ * that the record's page could not read, and nothing new is served to make
11
+ * it: the browser's print engine is the renderer, and "Save as PDF" is the
12
+ * browser's.
13
+ *
14
+ * It is addressed under the record it is of, its key the last segment —
15
+ * `/atelier/orders/12/invoice` — the place a record's tab is said, so the
16
+ * address grammar (appAddress.ts) reads it unchanged. A document is never the
17
+ * page a record opens through, never a route of its own, and never in a menu:
18
+ * it is reached from its record, as a verb.
19
+ *
20
+ * Pure, and shared: the parser and the check here, the client's sheet and the
21
+ * server's address book read the same rules.
22
+ */
23
+ import { allowKeys, isRecord } from './model.js';
24
+ /** What a page's `document` takes. `label` names it (the verb on its record, its heading on paper); `description` is
25
+ the sender's lines under the letterhead's name. */
26
+ export const DOCUMENT_KEYS = ['label', 'number', 'size', 'description'];
27
+ /** Sheet sizes: ISO A4, or US Letter. */
28
+ const DOCUMENT_SIZES = ['a4', 'letter'];
29
+ /** What paper draws: the record's own fields, the rows that point at it, and the author's words. */
30
+ const DOCUMENT_SECTION_KINDS = ['fields', 'list', 'note'];
31
+ /** Every line is on paper, up to the most a related list reads at once; a page that would be longer says so. */
32
+ const DOCUMENT_LINES = 500;
33
+ /** A page's document, as one page body states it. */
34
+ export function parseDocument(raw, at) {
35
+ const where = `${at}, "document"`;
36
+ if (!isRecord(raw))
37
+ throw new Error(`${where} is an object: { label: 'Invoice', number: 'invoice_no' }.`);
38
+ allowKeys(raw, DOCUMENT_KEYS, where);
39
+ if (typeof raw.label !== 'string' || !raw.label.trim())
40
+ throw new Error(`${where} has no "label": a document is named by what it is, "Invoice" or "Packing slip".`);
41
+ if (raw.number !== undefined &&
42
+ (typeof raw.number !== 'string' || !/^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(raw.number)))
43
+ throw new Error(`${where}: "number" is a field of the record, "invoice_no" or "pay_run_id.reference".`);
44
+ if (raw.size !== undefined && !DOCUMENT_SIZES.includes(raw.size))
45
+ throw new Error(`${where}: "size" is ${DOCUMENT_SIZES.map((size) => `"${size}"`).join(' or ')}.`);
46
+ if (raw.description !== undefined && (typeof raw.description !== 'string' || !raw.description.trim()))
47
+ throw new Error(`${where}: "description" is text, the sender's lines under the name.`);
48
+ return {
49
+ label: raw.label.trim(),
50
+ ...(raw.number === undefined ? {} : { number: raw.number }),
51
+ ...(raw.size === undefined ? {} : { size: raw.size }),
52
+ ...(raw.description === undefined ? {} : { description: raw.description.trim() }),
53
+ };
54
+ }
55
+ /**
56
+ * What a document's sections may be, refused section by section: paper has no
57
+ * aside, no tabs and nothing to operate, and a list on it is every line — a
58
+ * table whose header repeats on each sheet — never a gallery, a card or a
59
+ * page of rows. Its lists read every line, up to DOCUMENT_LINES, unless the
60
+ * author says fewer.
61
+ */
62
+ export function documentSections(sections, at) {
63
+ return sections.map((section, i) => {
64
+ const where = `${at}, section ${i + 1}`;
65
+ if (!DOCUMENT_SECTION_KINDS.includes(section.kind))
66
+ throw new Error(`${where} is a "${section.kind}" section; a document draws fields, related lists and notes on paper.`);
67
+ if (section.kind === 'fields' && (section.presentation === 'card' || section.presentation === 'header'))
68
+ throw new Error(`${where} is a "${section.presentation}"; on paper fields are a summary, properties, facts, a table or a headline.`);
69
+ if (section.region === 'aside')
70
+ throw new Error(`${where} is in the aside; a document is one sheet wide, so place sections side by side with "width".`);
71
+ if (section.tab !== undefined)
72
+ throw new Error(`${where} has a "tab"; paper has no tabs, so every section of a document is drawn.`);
73
+ if (section.kind === 'fields' && section.actions?.length)
74
+ throw new Error(`${where} has "actions"; paper has nothing to press.`);
75
+ if (section.kind !== 'list')
76
+ return section;
77
+ if (section.presentation !== undefined || section.create || section.rowActions)
78
+ throw new Error(`${where} is a list of the record's lines on paper: no presentation, create or row actions.`);
79
+ return section.limit === undefined ? { ...section, limit: DOCUMENT_LINES } : section;
80
+ });
81
+ }
82
+ /* Where Letter is the paper in the drawer: ISO 216 everywhere else. */
83
+ const LETTER_REGIONS = new Set(['US', 'CA', 'MX', 'PH', 'PR', 'CL', 'CO', 'VE', 'GT', 'CR', 'PA', 'DO', 'SV', 'NI', 'HN', 'BZ']);
84
+ /** The sheet a document is printed on: its own `size`, else the paper the App's (or tenant's) locale buys. */
85
+ export function paperSize(document, locale) {
86
+ if (document.size)
87
+ return document.size;
88
+ let region;
89
+ try {
90
+ region = locale ? new Intl.Locale(locale).maximize().region : undefined;
91
+ }
92
+ catch {
93
+ region = undefined;
94
+ }
95
+ return region && LETTER_REGIONS.has(region) ? 'letter' : 'a4';
96
+ }
97
+ /** Whether a page is a document rather than a screen. */
98
+ export const isDocument = (page) => page.document !== undefined;
99
+ /**
100
+ * A document's key is the last segment of its record's address, where a record
101
+ * page's tab is said: `/orders/12/invoice`. A tab of the same word on a page
102
+ * over the same table would be two things at one address, and a record's page
103
+ * never opens through a document.
104
+ */
105
+ export function documentProblems(pages, pageOf, tabWord, where) {
106
+ const problems = [];
107
+ const documents = pages.filter(isDocument);
108
+ for (const document of documents) {
109
+ for (const page of pages) {
110
+ if (isDocument(page) || page.base !== document.base)
111
+ continue;
112
+ const words = new Set();
113
+ for (const section of page.sections) {
114
+ if (section.tab)
115
+ words.add(tabWord(`tab:${section.tab}`));
116
+ if (section.kind === 'list' && section.title)
117
+ words.add(tabWord(`tab:${section.title}`));
118
+ }
119
+ if (words.has(document.id))
120
+ problems.push(`${where}: pages "${document.id}" is a document at /<record>/${document.id}, which the page "${page.id}" already answers to as a tab. Give the document another key.`);
121
+ }
122
+ }
123
+ for (const [resource, id] of Object.entries(pageOf)) {
124
+ const named = id === undefined ? undefined : documents.find((page) => page.id === id);
125
+ if (named)
126
+ problems.push(`${where}: resources "${resource}", "page" names "${named.id}", which is a document: a record opens on a page, and its documents are verbs on it.`);
127
+ }
128
+ return problems;
129
+ }
130
+ /** The share of a 12-column sheet a section's width takes, as the page's grid says it. */
131
+ export const SHEET_SPAN = { full: 12, half: 6, third: 4, 'two-thirds': 8 };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Which views a dashboard embeds, and which of those only a dashboard opens.
3
+ * The client asks this to lay out its rooms on first paint; it is apart from
4
+ * appPayload.ts because that module builds the payload from the parsed App,
5
+ * and importing it took the manifest parser into the first script. It reads
6
+ * the views by their shape, so the shared client asks it without the App's
7
+ * model.
8
+ */
9
+ import { type ServedNavNode } from './servedApp.js';
10
+ /** The list views a dashboard section embeds, by key. */
11
+ export declare function embedTargets(views: Readonly<Record<string, object>>): Set<string>;
12
+ /**
13
+ * The views only a dashboard opens: embedded by one, and neither in nav
14
+ * nor among `homes`. Each has a room, where the embed's "open →" goes, and
15
+ * no menu lists it. The server passes every view a home rule names; the
16
+ * client, which knows only its own, the home it was served.
17
+ */
18
+ export declare function embeddedOnlyViews(app: {
19
+ views: Readonly<Record<string, object>>;
20
+ nav: readonly ServedNavNode[];
21
+ }, homes: Iterable<string>): Set<string>;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Which views a dashboard embeds, and which of those only a dashboard opens.
3
+ * The client asks this to lay out its rooms on first paint; it is apart from
4
+ * appPayload.ts because that module builds the payload from the parsed App,
5
+ * and importing it took the manifest parser into the first script. It reads
6
+ * the views by their shape, so the shared client asks it without the App's
7
+ * model.
8
+ */
9
+ import { navViewKeys } from './servedApp.js';
10
+ const embeds = (view) => Object.hasOwn(view, 'sections');
11
+ /** The list views a dashboard section embeds, by key. */
12
+ export function embedTargets(views) {
13
+ return new Set(Object.values(views).flatMap((view) => embeds(view) ? [...view.sections, ...(view.aside ?? [])].flatMap((section) => (section.view ? [section.view] : [])) : []));
14
+ }
15
+ /**
16
+ * The views only a dashboard opens: embedded by one, and neither in nav
17
+ * nor among `homes`. Each has a room, where the embed's "open →" goes, and
18
+ * no menu lists it. The server passes every view a home rule names; the
19
+ * client, which knows only its own, the home it was served.
20
+ */
21
+ export function embeddedOnlyViews(app, homes) {
22
+ const listed = new Set([...navViewKeys(app.nav), ...homes]);
23
+ return new Set([...embedTargets(app.views)].filter((key) => !listed.has(key)));
24
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The icons an App may name, and the check that an authored name is one.
3
+ *
4
+ * A menu entry's icon is a word in the manifest (`icon: 'kanban'`), never a
5
+ * path or a component: a manifest is data, served to the browser and checked
6
+ * by the server, and a word is what both sides can agree on. The words are
7
+ * Phosphor's own names (https://phosphoricons.com, MIT, Phosphor Icons), so
8
+ * an author can look one up there and see exactly what they will get; the
9
+ * glyphs are drawn by `@phosphor-icons/react`, which the client already
10
+ * depends on (packages/kit/src/client/components/Icon.tsx imports each one by itself).
11
+ *
12
+ * The set is curated rather than the whole pack of ~1,500: the icons business
13
+ * Apps put in a menu — places, people, things, money, documents, time, state,
14
+ * and a clinic's, a school's, a workshop's — and the marks a value or a change
15
+ * wears (a display rule's `icons`, an activity feed's resources), and not the
16
+ * glyphs neither has a use for. A glyph costs an App nothing it does not use:
17
+ * the server sends the drawings of the icons an App names with its payload
18
+ * (packages/mistri/src/server/app/iconPayload.ts), and the client bundles none of the set. So
19
+ * the set grows by a word here and `node scripts/generate-icons.mjs`; the
20
+ * tests keep this list, the JSON schema's `appIcon` enum, packages/mistri/schema/app.d.ts's
21
+ * `AppIconName` and the generated glyphs the same.
22
+ */
23
+ export declare const APP_ICONS: readonly ['house', 'tray', 'list', 'list-checks', 'kanban', 'table', 'calendar', 'calendar-check', 'clock', 'chart-bar', 'chart-line', 'chart-pie', 'gauge', 'target', 'flag', 'user', 'users', 'user-circle', 'address-book', 'handshake', 'buildings', 'storefront', 'briefcase', 'package', 'truck', 'car', 'shopping-cart', 'receipt', 'currency-dollar', 'credit-card', 'wallet', 'bank', 'file', 'file-text', 'folder', 'clipboard-text', 'note', 'archive', 'tag', 'ticket', 'star', 'bookmark-simple', 'bell', 'envelope', 'chat-circle', 'phone', 'headset', 'megaphone', 'globe', 'map-pin', 'magnifying-glass', 'gear', 'sliders', 'wrench', 'bug', 'shield-check', 'lock', 'key', 'database', 'stack', 'lightning', 'check-circle', 'warning', 'info', 'cell-signal-low', 'cell-signal-medium', 'cell-signal-high', 'cell-signal-full', 'fire', 'hourglass', 'circle-dashed', 'x-circle', 'plus-circle', 'pencil-simple', 'paper-plane-tilt', 'arrows-left-right', 'arrow-circle-down', 'arrow-circle-up', 'laptop', 'monitor', 'device-mobile', 'printer', 'stethoscope', 'heartbeat', 'heart', 'pill', 'syringe', 'first-aid-kit', 'thermometer', 'flask', 'test-tube', 'microscope', 'bed', 'hospital', 'ambulance', 'tooth', 'eyeglasses', 'wheelchair', 'baby', 'dna', 'brain', 'bandaids', 'hand-heart', 'graduation-cap', 'book-open', 'student', 'chalkboard-teacher', 'factory', 'warehouse', 'house-line', 'plant', 'leaf', 'sun', 'cloud', 'drop', 'airplane', 'bicycle', 'bus', 'train', 'boat', 'hammer', 'toolbox', 'plug', 'lightbulb', 'cube', 'camera', 'image', 'trophy', 'gift', 'coffee', 'fork-knife', 'shopping-bag', 'basket', 'barcode', 'qr-code', 'scales', 'gavel', 'certificate', 'identification-card', 'fingerprint', 'eye', 'link', 'paperclip', 'scissors', 'palette', 'code', 'terminal', 'users-three', 'user-plus'];
24
+ export type AppIconName = (typeof APP_ICONS)[number];
25
+ export declare const isAppIcon: (value: unknown) => value is AppIconName;
26
+ /** An authored `icon`: one of APP_ICONS, or refused with the closest names and where the rest are listed.
27
+ * `key` is the key the author wrote it under — `ui.logo` takes an icon too, and a refusal naming "icon" sent people looking for a key they never wrote. */
28
+ export declare function parseIcon(value: unknown, at: string, key?: string): AppIconName;
@@ -0,0 +1,223 @@
1
+ /**
2
+ * The icons an App may name, and the check that an authored name is one.
3
+ *
4
+ * A menu entry's icon is a word in the manifest (`icon: 'kanban'`), never a
5
+ * path or a component: a manifest is data, served to the browser and checked
6
+ * by the server, and a word is what both sides can agree on. The words are
7
+ * Phosphor's own names (https://phosphoricons.com, MIT, Phosphor Icons), so
8
+ * an author can look one up there and see exactly what they will get; the
9
+ * glyphs are drawn by `@phosphor-icons/react`, which the client already
10
+ * depends on (packages/kit/src/client/components/Icon.tsx imports each one by itself).
11
+ *
12
+ * The set is curated rather than the whole pack of ~1,500: the icons business
13
+ * Apps put in a menu — places, people, things, money, documents, time, state,
14
+ * and a clinic's, a school's, a workshop's — and the marks a value or a change
15
+ * wears (a display rule's `icons`, an activity feed's resources), and not the
16
+ * glyphs neither has a use for. A glyph costs an App nothing it does not use:
17
+ * the server sends the drawings of the icons an App names with its payload
18
+ * (packages/mistri/src/server/app/iconPayload.ts), and the client bundles none of the set. So
19
+ * the set grows by a word here and `node scripts/generate-icons.mjs`; the
20
+ * tests keep this list, the JSON schema's `appIcon` enum, packages/mistri/schema/app.d.ts's
21
+ * `AppIconName` and the generated glyphs the same.
22
+ */
23
+ export const APP_ICONS = [
24
+ // Places and structure
25
+ 'house',
26
+ 'tray',
27
+ 'list',
28
+ 'list-checks',
29
+ 'kanban',
30
+ 'table',
31
+ 'calendar',
32
+ 'calendar-check',
33
+ 'clock',
34
+ 'chart-bar',
35
+ 'chart-line',
36
+ 'chart-pie',
37
+ 'gauge',
38
+ 'target',
39
+ 'flag',
40
+ // People and organizations
41
+ 'user',
42
+ 'users',
43
+ 'user-circle',
44
+ 'address-book',
45
+ 'handshake',
46
+ 'buildings',
47
+ 'storefront',
48
+ 'briefcase',
49
+ // Things and logistics
50
+ 'package',
51
+ 'truck',
52
+ 'car',
53
+ 'shopping-cart',
54
+ // Money
55
+ 'receipt',
56
+ 'currency-dollar',
57
+ 'credit-card',
58
+ 'wallet',
59
+ 'bank',
60
+ // Documents
61
+ 'file',
62
+ 'file-text',
63
+ 'folder',
64
+ 'clipboard-text',
65
+ 'note',
66
+ 'archive',
67
+ 'tag',
68
+ 'ticket',
69
+ 'star',
70
+ 'bookmark-simple',
71
+ // Communication
72
+ 'bell',
73
+ 'envelope',
74
+ 'chat-circle',
75
+ 'phone',
76
+ 'headset',
77
+ 'megaphone',
78
+ 'globe',
79
+ 'map-pin',
80
+ // Tools and state
81
+ 'magnifying-glass',
82
+ 'gear',
83
+ 'sliders',
84
+ 'wrench',
85
+ 'bug',
86
+ 'shield-check',
87
+ 'lock',
88
+ 'key',
89
+ 'database',
90
+ 'stack',
91
+ 'lightning',
92
+ 'check-circle',
93
+ 'warning',
94
+ 'info',
95
+ // Values: a priority's signal bars, a status's mark, what a change did
96
+ 'cell-signal-low',
97
+ 'cell-signal-medium',
98
+ 'cell-signal-high',
99
+ 'cell-signal-full',
100
+ 'fire',
101
+ 'hourglass',
102
+ 'circle-dashed',
103
+ 'x-circle',
104
+ 'plus-circle',
105
+ 'pencil-simple',
106
+ 'paper-plane-tilt',
107
+ 'arrows-left-right',
108
+ 'arrow-circle-down',
109
+ 'arrow-circle-up',
110
+ // Devices: what a service catalog orders and an asset list holds
111
+ 'laptop',
112
+ 'monitor',
113
+ 'device-mobile',
114
+ 'printer',
115
+ // Health and care: a clinic, a pharmacy, a lab
116
+ 'stethoscope',
117
+ 'heartbeat',
118
+ 'heart',
119
+ 'pill',
120
+ 'syringe',
121
+ 'first-aid-kit',
122
+ 'thermometer',
123
+ 'flask',
124
+ 'test-tube',
125
+ 'microscope',
126
+ 'bed',
127
+ 'hospital',
128
+ 'ambulance',
129
+ 'tooth',
130
+ 'eyeglasses',
131
+ 'wheelchair',
132
+ 'baby',
133
+ 'dna',
134
+ 'brain',
135
+ 'bandaids',
136
+ 'hand-heart',
137
+ // Learning, land and buildings
138
+ 'graduation-cap',
139
+ 'book-open',
140
+ 'student',
141
+ 'chalkboard-teacher',
142
+ 'factory',
143
+ 'warehouse',
144
+ 'house-line',
145
+ 'plant',
146
+ 'leaf',
147
+ 'sun',
148
+ 'cloud',
149
+ 'drop',
150
+ // Travel
151
+ 'airplane',
152
+ 'bicycle',
153
+ 'bus',
154
+ 'train',
155
+ 'boat',
156
+ // Things, tools and records
157
+ 'hammer',
158
+ 'toolbox',
159
+ 'plug',
160
+ 'lightbulb',
161
+ 'cube',
162
+ 'camera',
163
+ 'image',
164
+ 'trophy',
165
+ 'gift',
166
+ 'coffee',
167
+ 'fork-knife',
168
+ 'shopping-bag',
169
+ 'basket',
170
+ 'barcode',
171
+ 'qr-code',
172
+ 'scales',
173
+ 'gavel',
174
+ 'certificate',
175
+ 'identification-card',
176
+ 'fingerprint',
177
+ 'eye',
178
+ 'link',
179
+ 'paperclip',
180
+ 'scissors',
181
+ 'palette',
182
+ 'code',
183
+ 'terminal',
184
+ 'users-three',
185
+ 'user-plus',
186
+ ];
187
+ const KNOWN = new Set(APP_ICONS);
188
+ export const isAppIcon = (value) => typeof value === 'string' && KNOWN.has(value);
189
+ /* Edit distance, for "did you mean": a typo is a letter or two away, and a
190
+ near synonym usually shares its first word ("chart" → chart-bar). */
191
+ function distance(a, b) {
192
+ const row = Array.from({ length: b.length + 1 }, (_, i) => i);
193
+ for (let i = 1; i <= a.length; i++) {
194
+ let previous = row[0];
195
+ row[0] = i;
196
+ for (let j = 1; j <= b.length; j++) {
197
+ const kept = row[j];
198
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, previous + (a[i - 1] === b[j - 1] ? 0 : 1));
199
+ previous = kept;
200
+ }
201
+ }
202
+ return row[b.length];
203
+ }
204
+ function nearest(name) {
205
+ const lower = name.toLowerCase();
206
+ const stem = lower.split('-')[0];
207
+ return APP_ICONS.map((icon) => ({ icon, d: icon.startsWith(stem) || icon.split('-').includes(stem) ? 0 : distance(lower, icon) }))
208
+ .filter((each) => each.d <= 3)
209
+ .sort((a, b) => a.d - b.d || a.icon.localeCompare(b.icon))
210
+ .slice(0, 3)
211
+ .map((each) => each.icon);
212
+ }
213
+ /** An authored `icon`: one of APP_ICONS, or refused with the closest names and where the rest are listed.
214
+ * `key` is the key the author wrote it under — `ui.logo` takes an icon too, and a refusal naming "icon" sent people looking for a key they never wrote. */
215
+ export function parseIcon(value, at, key = 'icon') {
216
+ if (isAppIcon(value))
217
+ return value;
218
+ if (typeof value !== 'string' || !value.trim())
219
+ throw new Error(`${at} has ${/^[aeiou]/.test(key) ? 'an' : 'a'} "${key}" that is not an icon's name.`);
220
+ const near = nearest(value.trim());
221
+ throw new Error(`${at} has "${key}": "${value}", which is not one of the App icons.` +
222
+ `${near.length ? ` Did you mean ${near.map((each) => `"${each}"`).join(', ')}?` : ''} The icons: ${APP_ICONS.join(', ')}.`);
223
+ }
@@ -0,0 +1,17 @@
1
+ /** Checked cross-App destinations are navigation intent, never authority. */
2
+ import type { AppTarget } from '../../schema/model.js';
3
+ export type { AppTarget, AppLinkValue, AppTenantIntent } from '../../schema/model.js';
4
+ export type BoundAppTarget = AppTarget<string | number>;
5
+ export type AppLinkAction = {
6
+ label: string;
7
+ to: AppTarget;
8
+ } | {
9
+ label: string;
10
+ view: string;
11
+ };
12
+ /** Parse closed authoring data. Record bindings are opt-in at the source surface. */
13
+ export declare function parseAppTarget(raw: unknown, at?: string, record?: boolean): AppTarget;
14
+ export declare function parseAppLinkAction(raw: unknown, at: string, record?: boolean): AppLinkAction;
15
+ export declare function appTargetFields(target: AppTarget): string[];
16
+ /** Only bind values already served to this reader. Missing/hidden values refuse. */
17
+ export declare function bindAppTarget(target: AppTarget, row: Readonly<Record<string, unknown>>, visibleFields: readonly string[]): BoundAppTarget;
@@ -0,0 +1,124 @@
1
+ function object(value, keys, at) {
2
+ if (!value || typeof value !== 'object' || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
3
+ throw new Error(`${at} must be a plain object.`);
4
+ const raw = value;
5
+ for (const key of Reflect.ownKeys(raw)) {
6
+ if (typeof key !== 'string' ||
7
+ !keys.includes(key) ||
8
+ !Object.getOwnPropertyDescriptor(raw, key)?.enumerable ||
9
+ !Object.hasOwn(Object.getOwnPropertyDescriptor(raw, key), 'value'))
10
+ throw new Error(`${at}: unsupported field "${String(key)}".`);
11
+ }
12
+ return raw;
13
+ }
14
+ function text(value, at) {
15
+ if (typeof value !== 'string' || !value.length || value.length > 1024 || /[\p{Cc}\p{Cs}]/u.test(value))
16
+ throw new Error(`${at} needs non-empty text.`);
17
+ return value;
18
+ }
19
+ function value(raw, at, record) {
20
+ if (typeof raw === 'number') {
21
+ if (!Number.isSafeInteger(raw))
22
+ throw new Error(`${at} needs a safe integer; use text for opaque or large keys.`);
23
+ return raw;
24
+ }
25
+ if (typeof raw === 'string')
26
+ return text(raw, at);
27
+ if (raw && typeof raw === 'object' && Object.hasOwn(raw, 'from'))
28
+ throw new Error(`${at} has "from", which is now "column": the field of this record the value is read from.`);
29
+ const bound = object(raw, ['column'], at);
30
+ if (!record)
31
+ throw new Error(`${at}: "column" bindings require a record surface.`);
32
+ const field = text(bound.column, `${at}.column`);
33
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(field))
34
+ throw new Error(`${at}.column must name one visible field of this record.`);
35
+ return { column: field };
36
+ }
37
+ /** Parse closed authoring data. Record bindings are opt-in at the source surface. */
38
+ export function parseAppTarget(raw, at = 'App link', record = false) {
39
+ const o = object(raw, ['app', 'kind', 'view', 'resource', 'key', 'tenant'], at);
40
+ const app = text(o.app, `${at}.app`);
41
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(app))
42
+ throw new Error(`${at}.app is not an App id.`);
43
+ const kind = o.kind;
44
+ if (kind !== 'home' && kind !== 'view' && kind !== 'record')
45
+ throw new Error(`${at}.kind must be home, view or record.`);
46
+ object(raw, ['app', 'kind', 'tenant', ...(kind === 'view' ? ['view'] : kind === 'record' ? ['resource', 'key'] : [])], at);
47
+ let tenant;
48
+ if (Object.hasOwn(o, 'tenant')) {
49
+ const t = object(o.tenant, ['kind', 'id'], `${at}.tenant`);
50
+ if (t.kind === 'choose' || t.kind === 'platform') {
51
+ object(t, ['kind'], `${at}.tenant`);
52
+ tenant = { kind: t.kind };
53
+ }
54
+ else if (t.kind === 'tenant') {
55
+ const id = value(t.id, `${at}.tenant.id`, record);
56
+ if (typeof id !== 'object' && (String(id).trim() !== String(id) || id === '@platform'))
57
+ throw new Error(`${at}.tenant.id is not a tenant selector.`);
58
+ tenant = { kind: 'tenant', id };
59
+ }
60
+ else
61
+ throw new Error(`${at}.tenant.kind must be choose, tenant or platform.`);
62
+ }
63
+ const base = { app, ...(tenant ? { tenant } : {}) };
64
+ if (kind === 'home')
65
+ return { ...base, kind };
66
+ if (kind === 'view') {
67
+ const view = text(o.view, `${at}.view`);
68
+ if (!/^[a-z0-9][a-z0-9-]{0,63}$/.test(view))
69
+ throw new Error(`${at}.view is not a view key.`);
70
+ return { ...base, kind, view };
71
+ }
72
+ const resource = text(o.resource, `${at}.resource`);
73
+ if (!/^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(resource))
74
+ throw new Error(`${at}.resource is not a resource name.`);
75
+ const keys = o.key && typeof o.key === 'object' ? Object.keys(o.key) : [];
76
+ const key = object(o.key, keys, `${at}.key`);
77
+ if (!keys.length || keys.some((column) => !/^[A-Za-z_][A-Za-z0-9_]*$/.test(column)))
78
+ throw new Error(`${at}.key needs primary-key columns.`);
79
+ return {
80
+ ...base,
81
+ kind,
82
+ resource,
83
+ key: Object.fromEntries(keys.map((column) => [column, value(key[column], `${at}.key.${column}`, record)])),
84
+ };
85
+ }
86
+ /** `to` is a view's key, or an App link (`appLink({ … })`): one key says where a link goes. */
87
+ function parseLinkTo(to, at, record = false) {
88
+ if (typeof to === 'string') {
89
+ const view = to.trim();
90
+ if (!view || view.length > 1024 || /[\p{Cc}\p{Cs}]/u.test(view))
91
+ throw new Error(`${at} needs the key of a view, or an appLink().`);
92
+ return { view };
93
+ }
94
+ return { to: parseAppTarget(to, at, record) };
95
+ }
96
+ export function parseAppLinkAction(raw, at, record = false) {
97
+ const o = object(raw, ['label', 'to'], at);
98
+ if (typeof o.label !== 'string' || !o.label.trim())
99
+ throw new Error(`${at}.label needs non-empty text.`);
100
+ return { label: o.label.trim(), ...parseLinkTo(o.to, `${at}.to`, record) };
101
+ }
102
+ export function appTargetFields(target) {
103
+ const values = [
104
+ ...(target.kind === 'record' ? Object.values(target.key) : []),
105
+ ...(target.tenant?.kind === 'tenant' ? [target.tenant.id] : []),
106
+ ];
107
+ return [...new Set(values.flatMap((v) => (typeof v === 'object' ? [v.column] : [])))];
108
+ }
109
+ /** Only bind values already served to this reader. Missing/hidden values refuse. */
110
+ export function bindAppTarget(target, row, visibleFields) {
111
+ const parsed = parseAppTarget(target, 'App link', true);
112
+ const bind = (v) => {
113
+ if (typeof v !== 'object')
114
+ return v;
115
+ if (!visibleFields.includes(v.column) || !Object.hasOwn(row, v.column))
116
+ throw new Error(`App link: unavailable source field "${v.column}".`);
117
+ return value(row[v.column], `App link source "${v.column}"`, false);
118
+ };
119
+ return parseAppTarget({
120
+ ...parsed,
121
+ ...(parsed.kind === 'record' ? { key: Object.fromEntries(Object.entries(parsed.key).map(([k, v]) => [k, bind(v)])) } : {}),
122
+ ...(parsed.tenant?.kind === 'tenant' ? { tenant: { kind: 'tenant', id: bind(parsed.tenant.id) } } : {}),
123
+ });
124
+ }
@@ -0,0 +1,3 @@
1
+ import type { AppListPresentation } from './listPresentations.js';
2
+ /** A split reads through its own show, and the columns of its rows when it chooses them. */
3
+ export declare function listPresentationColumns(list: AppListPresentation): string[];
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The local columns a list presentation reads, so a list's query fetches
3
+ * them beside the keys. Its own module because the client needs it on first
4
+ * paint and app.ts is the manifest parser: a client that imported it from
5
+ * there took the whole parser — every key list, the page parser, the key
6
+ * homes it installs at load — into the first script it downloads.
7
+ */
8
+ import { cardsColumns } from './appCards.js';
9
+ /** A split reads through its own show, and the columns of its rows when it chooses them. */
10
+ export function listPresentationColumns(list) {
11
+ if (list.kind === 'split') {
12
+ const { row } = list;
13
+ return row
14
+ ? [
15
+ ...new Set([
16
+ row.primary,
17
+ ...(row.badge ? [row.badge] : []),
18
+ ...(row.avatar ? [row.avatar] : []),
19
+ ...(row.lines ?? []),
20
+ ...(row.facts ?? []),
21
+ ]),
22
+ ]
23
+ : [];
24
+ }
25
+ if (list.kind === 'custom')
26
+ return [...list.show];
27
+ if (list.kind === 'cards')
28
+ return cardsColumns(list);
29
+ if (list.kind === 'tree')
30
+ return [...new Set([list.parent, list.primary, ...(list.lines ?? [])])];
31
+ if (list.kind === 'gantt')
32
+ return [
33
+ ...new Set([
34
+ list.start,
35
+ list.end,
36
+ list.primary,
37
+ ...(list.by === undefined ? [] : [list.by]),
38
+ ...(list.progress === undefined ? [] : [list.progress]),
39
+ ]),
40
+ ];
41
+ const lines = list.lines ?? [];
42
+ return list.kind === 'checklist'
43
+ ? [list.primary, list.checked, ...lines]
44
+ : list.kind === 'queue'
45
+ ? [...new Set([list.primary, ...(list.badge === undefined ? [] : [list.badge]), ...lines, ...(list.facts ?? [])])]
46
+ : list.kind === 'calendar'
47
+ ? [
48
+ ...new Set([
49
+ list.date,
50
+ ...(list.end === undefined ? [] : [list.end]),
51
+ list.primary,
52
+ ...lines,
53
+ ...(list.badge === undefined ? [] : [list.badge]),
54
+ ]),
55
+ ]
56
+ : // The place and the row are read with the card, so a lane can be drawn in its order and a row found.
57
+ [
58
+ list.by,
59
+ list.primary,
60
+ ...lines,
61
+ ...(list.order === undefined ? [] : [list.order]),
62
+ ...(list.swimlanes === undefined ? [] : [list.swimlanes]),
63
+ ...(list.category === undefined ? [] : [list.category]),
64
+ ...(list.footer ?? []).map((fact) => fact.column),
65
+ ];
66
+ }