@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.
- package/LICENSE +21 -0
- package/README.md +17 -2
- package/dist/adapters/adapter.d.ts +693 -0
- package/dist/adapters/adapter.js +444 -0
- package/dist/adapters/cache/cacheStore.d.ts +75 -0
- package/dist/adapters/cache/cacheStore.js +160 -0
- package/dist/adapters/cache/resp.d.ts +52 -0
- package/dist/adapters/cache/resp.js +237 -0
- package/dist/adapters/commands/canonicalJson.d.ts +19 -0
- package/dist/adapters/commands/canonicalJson.js +154 -0
- package/dist/adapters/connect.d.ts +29 -0
- package/dist/adapters/connect.js +40 -0
- package/dist/adapters/connectionBudget.d.ts +101 -0
- package/dist/adapters/connectionBudget.js +128 -0
- package/dist/adapters/dbLatency.d.ts +35 -0
- package/dist/adapters/dbLatency.js +79 -0
- package/dist/adapters/epochCache.d.ts +50 -0
- package/dist/adapters/epochCache.js +85 -0
- package/dist/adapters/http/egress.d.ts +48 -0
- package/dist/adapters/http/egress.js +175 -0
- package/dist/adapters/http/httpAdapter.d.ts +71 -0
- package/dist/adapters/http/httpAdapter.js +512 -0
- package/dist/adapters/http/httpDescription.d.ts +32 -0
- package/dist/adapters/http/httpDescription.js +246 -0
- package/dist/adapters/http/openapi.d.ts +98 -0
- package/dist/adapters/http/openapi.js +487 -0
- package/dist/adapters/layoutRefusal.d.ts +24 -0
- package/dist/adapters/layoutRefusal.js +35 -0
- package/dist/adapters/net/networkPolicy.d.ts +44 -0
- package/dist/adapters/net/networkPolicy.js +123 -0
- package/dist/adapters/net/untrustedDatabase.d.ts +18 -0
- package/dist/adapters/net/untrustedDatabase.js +120 -0
- package/dist/adapters/poolAdmission.d.ts +43 -0
- package/dist/adapters/poolAdmission.js +184 -0
- package/dist/adapters/poolMetrics.d.ts +121 -0
- package/dist/adapters/poolMetrics.js +185 -0
- package/dist/adapters/postgres.d.ts +436 -0
- package/dist/adapters/postgres.js +1890 -0
- package/dist/adapters/postgresCatalog.d.ts +96 -0
- package/dist/adapters/postgresCatalog.js +387 -0
- package/dist/adapters/postgresCatalogDigest.d.ts +30 -0
- package/dist/adapters/postgresCatalogDigest.js +87 -0
- package/dist/adapters/postgresCatalogRows.d.ts +62 -0
- package/dist/adapters/postgresCatalogRows.js +37 -0
- package/dist/adapters/postgresDates.d.ts +1 -0
- package/dist/adapters/postgresDates.js +39 -0
- package/dist/adapters/postgresMaintenance.d.ts +33 -0
- package/dist/adapters/postgresMaintenance.js +179 -0
- package/dist/adapters/postgresPool.d.ts +255 -0
- package/dist/adapters/postgresPool.js +838 -0
- package/dist/adapters/postgresPooler.d.ts +28 -0
- package/dist/adapters/postgresPooler.js +267 -0
- package/dist/adapters/postgresReadCatalog.d.ts +31 -0
- package/dist/adapters/postgresReadCatalog.js +226 -0
- package/dist/adapters/postgresReadSnapshot.d.ts +46 -0
- package/dist/adapters/postgresReadSnapshot.js +133 -0
- package/dist/adapters/postgresSchemaEpoch.d.ts +24 -0
- package/dist/adapters/postgresSchemaEpoch.js +149 -0
- package/dist/adapters/postgresTransactionHandle.d.ts +173 -0
- package/dist/adapters/postgresTransactionHandle.js +524 -0
- package/dist/adapters/postgresValues.d.ts +30 -0
- package/dist/adapters/postgresValues.js +75 -0
- package/dist/adapters/replicas.d.ts +70 -0
- package/dist/adapters/replicas.js +208 -0
- package/dist/adapters/reservedSql.d.ts +38 -0
- package/dist/adapters/reservedSql.js +264 -0
- package/dist/adapters/rolePrivileges.d.ts +17 -0
- package/dist/adapters/rolePrivileges.js +22 -0
- package/dist/adapters/scoped/keyRows.d.ts +65 -0
- package/dist/adapters/scoped/keyRows.js +173 -0
- package/dist/adapters/scoped/postgresScopeCatalog.d.ts +16 -0
- package/dist/adapters/scoped/postgresScopeCatalog.js +117 -0
- package/dist/adapters/scoped/scopedCommandOperations.d.ts +5 -0
- package/dist/adapters/scoped/scopedCommandOperations.js +48 -0
- package/dist/adapters/scoped/scopedReads.d.ts +20 -0
- package/dist/adapters/scoped/scopedReads.js +174 -0
- package/dist/adapters/scoped/scopedTransaction.d.ts +89 -0
- package/dist/adapters/scoped/scopedTransaction.js +303 -0
- package/dist/adapters/scoped/sqliteScopeCatalog.d.ts +16 -0
- package/dist/adapters/scoped/sqliteScopeCatalog.js +241 -0
- package/dist/adapters/scoped/updateGuard.d.ts +3 -0
- package/dist/adapters/scoped/updateGuard.js +40 -0
- package/dist/adapters/serverSettings.d.ts +45 -0
- package/dist/adapters/serverSettings.js +46 -0
- package/dist/adapters/sqlite.d.ts +262 -0
- package/dist/adapters/sqlite.js +1434 -0
- package/dist/adapters/sqliteCostlyReads.d.ts +33 -0
- package/dist/adapters/sqliteCostlyReads.js +49 -0
- package/dist/adapters/sqliteDecimals.d.ts +22 -0
- package/dist/adapters/sqliteDecimals.js +57 -0
- package/dist/adapters/sqliteHandles.d.ts +43 -0
- package/dist/adapters/sqliteHandles.js +143 -0
- package/dist/adapters/sqliteStatementProcess.d.ts +29 -0
- package/dist/adapters/sqliteStatementProcess.js +131 -0
- package/dist/adapters/statementControl.d.ts +34 -0
- package/dist/adapters/statementControl.js +90 -0
- package/dist/adapters/storeHost.d.ts +130 -0
- package/dist/adapters/storeHost.js +13 -0
- package/dist/adapters/telemetry/drivers.d.ts +21 -0
- package/dist/adapters/telemetry/drivers.js +321 -0
- package/dist/adapters/telemetry/metrics.d.ts +63 -0
- package/dist/adapters/telemetry/metrics.js +122 -0
- package/dist/adapters/telemetry/otlp.d.ts +12 -0
- package/dist/adapters/telemetry/otlp.js +320 -0
- package/dist/adapters/telemetry/otlpEncode.d.ts +48 -0
- package/dist/adapters/telemetry/otlpEncode.js +366 -0
- package/dist/adapters/telemetry/otlpEnv.d.ts +1 -0
- package/dist/adapters/telemetry/otlpEnv.js +12 -0
- package/dist/adapters/telemetry/serverTiming.d.ts +83 -0
- package/dist/adapters/telemetry/serverTiming.js +503 -0
- package/dist/adapters/telemetry/start.d.ts +10 -0
- package/dist/adapters/telemetry/start.js +25 -0
- package/dist/adapters/telemetry/statement.d.ts +16 -0
- package/dist/adapters/telemetry/statement.js +134 -0
- package/dist/adapters/telemetry/trace.d.ts +127 -0
- package/dist/adapters/telemetry/trace.js +295 -0
- package/dist/adapters/writeAhead.d.ts +27 -0
- package/dist/adapters/writeAhead.js +46 -0
- package/dist/adapters/writeAttribution.d.ts +18 -0
- package/dist/adapters/writeAttribution.js +23 -0
- package/dist/adapters/writeCapture.d.ts +73 -0
- package/dist/adapters/writeCapture.js +20 -0
- package/dist/adapters/writeLanes.d.ts +94 -0
- package/dist/adapters/writeLanes.js +232 -0
- package/dist/engine.d.ts +15 -0
- package/dist/engine.js +13 -0
- package/dist/server/auth/credentials.d.ts +61 -0
- package/dist/server/auth/credentials.js +260 -0
- package/dist/server/cacheService.d.ts +50 -0
- package/dist/server/cacheService.js +110 -0
- package/dist/server/cli/args.d.ts +176 -0
- package/dist/server/cli/args.js +342 -0
- package/dist/server/cli/bin.d.ts +5 -0
- package/dist/server/cli/bin.js +66 -0
- package/dist/server/cli/browser.d.ts +15 -0
- package/dist/server/cli/browser.js +37 -0
- package/dist/server/cli/config.d.ts +50 -0
- package/dist/server/cli/config.js +206 -0
- package/dist/server/cli/startup.d.ts +36 -0
- package/dist/server/cli/startup.js +128 -0
- package/dist/server/cli/startupOptions.d.ts +63 -0
- package/dist/server/cli/startupOptions.js +143 -0
- package/dist/server/cli/subcommand.d.ts +28 -0
- package/dist/server/cli/subcommand.js +32 -0
- package/dist/server/cli/usage.d.ts +13 -0
- package/dist/server/cli/usage.js +31 -0
- package/dist/server/clientHttp.d.ts +184 -0
- package/dist/server/clientHttp.js +700 -0
- package/dist/server/clientSurface.d.ts +128 -0
- package/dist/server/clientSurface.js +182 -0
- package/dist/server/columnGrants.d.ts +103 -0
- package/dist/server/columnGrants.js +730 -0
- package/dist/server/compileCache.d.ts +1 -0
- package/dist/server/compileCache.js +30 -0
- package/dist/server/config/locations.d.ts +1 -0
- package/dist/server/config/locations.js +15 -0
- package/dist/server/configPaths.d.ts +7 -0
- package/dist/server/configPaths.js +34 -0
- package/dist/server/configSections.d.ts +64 -0
- package/dist/server/configSections.js +72 -0
- package/dist/server/connectionRedaction.d.ts +30 -0
- package/dist/server/connectionRedaction.js +77 -0
- package/dist/server/connections.d.ts +353 -0
- package/dist/server/connections.js +978 -0
- package/dist/server/constraints.d.ts +82 -0
- package/dist/server/constraints.js +169 -0
- package/dist/server/demo.d.ts +9 -0
- package/dist/server/demo.js +554 -0
- package/dist/server/devclient.d.ts +108 -0
- package/dist/server/devclient.js +361 -0
- package/dist/server/evidence.d.ts +55 -0
- package/dist/server/evidence.js +323 -0
- package/dist/server/hiddenColumns.d.ts +32 -0
- package/dist/server/hiddenColumns.js +238 -0
- package/dist/server/http/baselineHeaders.d.ts +24 -0
- package/dist/server/http/baselineHeaders.js +12 -0
- package/dist/server/http/captured.d.ts +35 -0
- package/dist/server/http/captured.js +73 -0
- package/dist/server/http/clock.d.ts +1 -0
- package/dist/server/http/clock.js +14 -0
- package/dist/server/http/connectionSource.d.ts +4 -0
- package/dist/server/http/connectionSource.js +48 -0
- package/dist/server/http/context.d.ts +189 -0
- package/dist/server/http/context.js +11 -0
- package/dist/server/http/crawlerText.d.ts +15 -0
- package/dist/server/http/crawlerText.js +32 -0
- package/dist/server/http/dataRoutes.d.ts +88 -0
- package/dist/server/http/dataRoutes.js +137 -0
- package/dist/server/http/door.d.ts +57 -0
- package/dist/server/http/door.js +39 -0
- package/dist/server/http/exportRoute.d.ts +15 -0
- package/dist/server/http/exportRoute.js +320 -0
- package/dist/server/http/firstPaint.d.ts +108 -0
- package/dist/server/http/firstPaint.js +262 -0
- package/dist/server/http/httpOperationRoutes.d.ts +11 -0
- package/dist/server/http/httpOperationRoutes.js +50 -0
- package/dist/server/http/pageReads.d.ts +20 -0
- package/dist/server/http/pageReads.js +205 -0
- package/dist/server/http/pageRoutes.d.ts +39 -0
- package/dist/server/http/pageRoutes.js +291 -0
- package/dist/server/http/probes.d.ts +22 -0
- package/dist/server/http/probes.js +27 -0
- package/dist/server/http/rateLimit.d.ts +131 -0
- package/dist/server/http/rateLimit.js +351 -0
- package/dist/server/http/readRoutes.d.ts +9 -0
- package/dist/server/http/readRoutes.js +131 -0
- package/dist/server/http/readRouting.d.ts +20 -0
- package/dist/server/http/readRouting.js +80 -0
- package/dist/server/http/recordCompose.d.ts +67 -0
- package/dist/server/http/recordCompose.js +167 -0
- package/dist/server/http/recordWrites.d.ts +89 -0
- package/dist/server/http/recordWrites.js +298 -0
- package/dist/server/http/refusalReport.d.ts +38 -0
- package/dist/server/http/refusalReport.js +63 -0
- package/dist/server/http/reply.d.ts +130 -0
- package/dist/server/http/reply.js +394 -0
- package/dist/server/http/requestOrigin.d.ts +11 -0
- package/dist/server/http/requestOrigin.js +8 -0
- package/dist/server/http/router.d.ts +45 -0
- package/dist/server/http/router.js +22 -0
- package/dist/server/http/serverCore.d.ts +68 -0
- package/dist/server/http/serverCore.js +177 -0
- package/dist/server/http/traceRequest.d.ts +30 -0
- package/dist/server/http/traceRequest.js +224 -0
- package/dist/server/http/trust.d.ts +261 -0
- package/dist/server/http/trust.js +472 -0
- package/dist/server/http/writeRefusal.d.ts +33 -0
- package/dist/server/http/writeRefusal.js +24 -0
- package/dist/server/httpConnection.d.ts +49 -0
- package/dist/server/httpConnection.js +170 -0
- package/dist/server/impact.d.ts +55 -0
- package/dist/server/impact.js +47 -0
- package/dist/server/journal.d.ts +134 -0
- package/dist/server/journal.js +398 -0
- package/dist/server/keysetReadHttp.d.ts +52 -0
- package/dist/server/keysetReadHttp.js +85 -0
- package/dist/server/layouts.d.ts +49 -0
- package/dist/server/layouts.js +192 -0
- package/dist/server/migrate/cli.d.ts +55 -0
- package/dist/server/migrate/cli.js +517 -0
- package/dist/server/migrate/database.d.ts +37 -0
- package/dist/server/migrate/database.js +247 -0
- package/dist/server/migrate/desired.d.ts +76 -0
- package/dist/server/migrate/desired.js +292 -0
- package/dist/server/migrate/files.d.ts +34 -0
- package/dist/server/migrate/files.js +141 -0
- package/dist/server/migrate/flyway.d.ts +7 -0
- package/dist/server/migrate/flyway.js +69 -0
- package/dist/server/migrate/history.d.ts +70 -0
- package/dist/server/migrate/history.js +211 -0
- package/dist/server/migrate/runner.d.ts +100 -0
- package/dist/server/migrate/runner.js +409 -0
- package/dist/server/migrate/snapshot.d.ts +30 -0
- package/dist/server/migrate/snapshot.js +239 -0
- package/dist/server/migrate/target.d.ts +33 -0
- package/dist/server/migrate/target.js +82 -0
- package/dist/server/openapiDraft.d.ts +25 -0
- package/dist/server/openapiDraft.js +171 -0
- package/dist/server/operations/diagnostics.d.ts +101 -0
- package/dist/server/operations/diagnostics.js +284 -0
- package/dist/server/operations/requestMetrics.d.ts +33 -0
- package/dist/server/operations/requestMetrics.js +94 -0
- package/dist/server/packageVersion.d.ts +1 -0
- package/dist/server/packageVersion.js +11 -0
- package/dist/server/poolConfig.d.ts +34 -0
- package/dist/server/poolConfig.js +114 -0
- package/dist/server/product.d.ts +20 -0
- package/dist/server/product.js +12 -0
- package/dist/server/recordHistoryOperations.d.ts +39 -0
- package/dist/server/recordHistoryOperations.js +43 -0
- package/dist/server/recordWriteOperations.d.ts +111 -0
- package/dist/server/recordWriteOperations.js +329 -0
- package/dist/server/resourceReadHttp.d.ts +81 -0
- package/dist/server/resourceReadHttp.js +606 -0
- package/dist/server/resourceReadOperations.d.ts +147 -0
- package/dist/server/resourceReadOperations.js +452 -0
- package/dist/server/scaffoldMachine.d.ts +54 -0
- package/dist/server/scaffoldMachine.js +184 -0
- package/dist/server/seed/cli.d.ts +20 -0
- package/dist/server/seed/cli.js +164 -0
- package/dist/server/seed/lexicon.d.ts +26 -0
- package/dist/server/seed/lexicon.js +585 -0
- package/dist/server/seed/seed.d.ts +70 -0
- package/dist/server/seed/seed.js +779 -0
- package/dist/server/seed/words.d.ts +21 -0
- package/dist/server/seed/words.js +164 -0
- package/dist/server/serverRequests.d.ts +6 -0
- package/dist/server/serverRequests.js +33 -0
- package/dist/server/serverTimeouts.d.ts +33 -0
- package/dist/server/serverTimeouts.js +32 -0
- package/dist/server/shapeonly.d.ts +32 -0
- package/dist/server/shapeonly.js +110 -0
- package/dist/server/startupWarnings.d.ts +32 -0
- package/dist/server/startupWarnings.js +92 -0
- package/dist/shared/addressParams.d.ts +28 -0
- package/dist/shared/addressParams.js +47 -0
- package/dist/shared/appCards.d.ts +123 -0
- package/dist/shared/appCards.js +385 -0
- package/dist/shared/appComponents.d.ts +177 -0
- package/dist/shared/appComponents.js +422 -0
- package/dist/shared/appDocuments.d.ts +43 -0
- package/dist/shared/appDocuments.js +131 -0
- package/dist/shared/appEmbeds.d.ts +21 -0
- package/dist/shared/appEmbeds.js +24 -0
- package/dist/shared/appIcons.d.ts +28 -0
- package/dist/shared/appIcons.js +223 -0
- package/dist/shared/appLinks.d.ts +17 -0
- package/dist/shared/appLinks.js +124 -0
- package/dist/shared/appListColumns.d.ts +3 -0
- package/dist/shared/appListColumns.js +66 -0
- package/dist/shared/appLocale.d.ts +36 -0
- package/dist/shared/appLocale.js +86 -0
- package/dist/shared/appMessages.d.ts +44 -0
- package/dist/shared/appMessages.js +78 -0
- package/dist/shared/appNoun.d.ts +21 -0
- package/dist/shared/appNoun.js +32 -0
- package/dist/shared/autoBucket.d.ts +98 -0
- package/dist/shared/autoBucket.js +305 -0
- package/dist/shared/autoValues.d.ts +25 -0
- package/dist/shared/autoValues.js +25 -0
- package/dist/shared/breakdown.d.ts +228 -0
- package/dist/shared/breakdown.js +557 -0
- package/dist/shared/breakdowntext.d.ts +41 -0
- package/dist/shared/breakdowntext.js +400 -0
- package/dist/shared/builtInThemes.d.ts +2 -0
- package/dist/shared/builtInThemes.js +771 -0
- package/dist/shared/chartSeparation.d.ts +11 -0
- package/dist/shared/chartSeparation.js +58 -0
- package/dist/shared/clauses.d.ts +22 -0
- package/dist/shared/clauses.js +97 -0
- package/dist/shared/columnCaption.d.ts +16 -0
- package/dist/shared/columnCaption.js +90 -0
- package/dist/shared/commandFieldPath.d.ts +2 -0
- package/dist/shared/commandFieldPath.js +7 -0
- package/dist/shared/commandWire.d.ts +26 -0
- package/dist/shared/commandWire.js +41 -0
- package/dist/shared/computed.d.ts +161 -0
- package/dist/shared/computed.js +378 -0
- package/dist/shared/computedParse.d.ts +13 -0
- package/dist/shared/computedParse.js +278 -0
- package/dist/shared/computedValue.d.ts +47 -0
- package/dist/shared/computedValue.js +191 -0
- package/dist/shared/connection.d.ts +30 -0
- package/dist/shared/connection.js +1 -0
- package/dist/shared/csv.d.ts +20 -0
- package/dist/shared/csv.js +63 -0
- package/dist/shared/dashLayout.d.ts +30 -0
- package/dist/shared/dashLayout.js +132 -0
- package/dist/shared/dashboardAsks.d.ts +93 -0
- package/dist/shared/dashboardAsks.js +129 -0
- package/dist/shared/dashboardTrend.d.ts +20 -0
- package/dist/shared/dashboardTrend.js +50 -0
- package/dist/shared/declaredReferences.d.ts +50 -0
- package/dist/shared/declaredReferences.js +202 -0
- package/dist/shared/definedFields.d.ts +63 -0
- package/dist/shared/definedFields.js +103 -0
- package/dist/shared/definedValues.d.ts +63 -0
- package/dist/shared/definedValues.js +184 -0
- package/dist/shared/displayDefaults.d.ts +135 -0
- package/dist/shared/displayDefaults.js +529 -0
- package/dist/shared/dueDate.d.ts +6 -0
- package/dist/shared/dueDate.js +6 -0
- package/dist/shared/duration.d.ts +4 -0
- package/dist/shared/duration.js +23 -0
- package/dist/shared/fileBounds.d.ts +9 -0
- package/dist/shared/fileBounds.js +9 -0
- package/dist/shared/filter.d.ts +217 -0
- package/dist/shared/filter.js +305 -0
- package/dist/shared/firstPaint.d.ts +24 -0
- package/dist/shared/firstPaint.js +33 -0
- package/dist/shared/form.d.ts +21 -0
- package/dist/shared/form.js +25 -0
- package/dist/shared/formValues.d.ts +104 -0
- package/dist/shared/formValues.js +352 -0
- package/dist/shared/funnel.d.ts +45 -0
- package/dist/shared/funnel.js +108 -0
- package/dist/shared/httpOperations.d.ts +48 -0
- package/dist/shared/httpOperations.js +9 -0
- package/dist/shared/iconGlyphs.d.ts +4 -0
- package/dist/shared/iconGlyphs.js +151 -0
- package/dist/shared/iconWeights.d.ts +3 -0
- package/dist/shared/iconWeights.js +162 -0
- package/dist/shared/imageWidths.d.ts +32 -0
- package/dist/shared/imageWidths.js +38 -0
- package/dist/shared/keysetPage.d.ts +64 -0
- package/dist/shared/keysetPage.js +161 -0
- package/dist/shared/like.d.ts +20 -0
- package/dist/shared/like.js +29 -0
- package/dist/shared/listEmpty.d.ts +12 -0
- package/dist/shared/listEmpty.js +36 -0
- package/dist/shared/listFilters.d.ts +28 -0
- package/dist/shared/listFilters.js +84 -0
- package/dist/shared/listPresentations.d.ts +199 -0
- package/dist/shared/listPresentations.js +7 -0
- package/dist/shared/listQuestion.d.ts +52 -0
- package/dist/shared/listQuestion.js +137 -0
- package/dist/shared/lookPalettes.d.ts +62 -0
- package/dist/shared/lookPalettes.js +306 -0
- package/dist/shared/maskQuoted.d.ts +24 -0
- package/dist/shared/maskQuoted.js +48 -0
- package/dist/shared/mentionLabel.d.ts +19 -0
- package/dist/shared/mentionLabel.js +38 -0
- package/dist/shared/mentionLookup.d.ts +17 -0
- package/dist/shared/mentionLookup.js +64 -0
- package/dist/shared/menuCounts.d.ts +16 -0
- package/dist/shared/menuCounts.js +74 -0
- package/dist/shared/model.d.ts +79 -0
- package/dist/shared/model.js +153 -0
- package/dist/shared/money.d.ts +44 -0
- package/dist/shared/money.js +81 -0
- package/dist/shared/moneyEntry.d.ts +7 -0
- package/dist/shared/moneyEntry.js +27 -0
- package/dist/shared/mount.d.ts +118 -0
- package/dist/shared/mount.js +248 -0
- package/dist/shared/niceTicks.d.ts +26 -0
- package/dist/shared/niceTicks.js +50 -0
- package/dist/shared/order.d.ts +59 -0
- package/dist/shared/order.js +133 -0
- package/dist/shared/page.d.ts +135 -0
- package/dist/shared/page.js +1187 -0
- package/dist/shared/pageAnatomy.d.ts +99 -0
- package/dist/shared/pageAnatomy.js +370 -0
- package/dist/shared/pageConfig.d.ts +25 -0
- package/dist/shared/pageConfig.js +1308 -0
- package/dist/shared/pageEmptyActions.d.ts +12 -0
- package/dist/shared/pageEmptyActions.js +20 -0
- package/dist/shared/pageLayouts.d.ts +72 -0
- package/dist/shared/pageLayouts.js +205 -0
- package/dist/shared/pageModel.d.ts +785 -0
- package/dist/shared/pageModel.js +121 -0
- package/dist/shared/pagePaths.d.ts +180 -0
- package/dist/shared/pagePaths.js +869 -0
- package/dist/shared/pagePlans.d.ts +52 -0
- package/dist/shared/pagePlans.js +108 -0
- package/dist/shared/pageRoutes.d.ts +9 -0
- package/dist/shared/pageRoutes.js +9 -0
- package/dist/shared/query.d.ts +166 -0
- package/dist/shared/query.js +1302 -0
- package/dist/shared/queryDates.d.ts +12 -0
- package/dist/shared/queryDates.js +101 -0
- package/dist/shared/queryOperands.d.ts +99 -0
- package/dist/shared/queryOperands.js +131 -0
- package/dist/shared/reads.d.ts +103 -0
- package/dist/shared/reads.js +154 -0
- package/dist/shared/recordLabel.d.ts +51 -0
- package/dist/shared/recordLabel.js +123 -0
- package/dist/shared/recordReadKeys.d.ts +30 -0
- package/dist/shared/recordReadKeys.js +51 -0
- package/dist/shared/recordReads.d.ts +268 -0
- package/dist/shared/recordReads.js +368 -0
- package/dist/shared/recordview.d.ts +198 -0
- package/dist/shared/recordview.js +356 -0
- package/dist/shared/referenceModel.d.ts +58 -0
- package/dist/shared/referenceModel.js +194 -0
- package/dist/shared/refusal.d.ts +64 -0
- package/dist/shared/refusal.js +144 -0
- package/dist/shared/relatedCreate.d.ts +30 -0
- package/dist/shared/relatedCreate.js +162 -0
- package/dist/shared/resourceHttp.d.ts +464 -0
- package/dist/shared/resourceHttp.js +1 -0
- package/dist/shared/richText.d.ts +85 -0
- package/dist/shared/richText.js +305 -0
- package/dist/shared/rollups.d.ts +143 -0
- package/dist/shared/rollups.js +64 -0
- package/dist/shared/rowScope.d.ts +72 -0
- package/dist/shared/rowScope.js +376 -0
- package/dist/shared/runtimeTables.d.ts +44 -0
- package/dist/shared/runtimeTables.js +79 -0
- package/dist/shared/schema.d.ts +523 -0
- package/dist/shared/schema.js +627 -0
- package/dist/shared/schematext.d.ts +38 -0
- package/dist/shared/schematext.js +101 -0
- package/dist/shared/scopeCatalog.d.ts +29 -0
- package/dist/shared/scopeCatalog.js +468 -0
- package/dist/shared/servedApp.d.ts +681 -0
- package/dist/shared/servedApp.js +45 -0
- package/dist/shared/sessionLease.d.ts +34 -0
- package/dist/shared/sessionLease.js +3 -0
- package/dist/shared/shape.d.ts +55 -0
- package/dist/shared/shape.js +168 -0
- package/dist/shared/slug.d.ts +1 -0
- package/dist/shared/slug.js +12 -0
- package/dist/shared/sortText.d.ts +14 -0
- package/dist/shared/sortText.js +26 -0
- package/dist/shared/sqlRelation.d.ts +4 -0
- package/dist/shared/sqlRelation.js +8 -0
- package/dist/shared/sqlsaved.d.ts +44 -0
- package/dist/shared/sqlsaved.js +63 -0
- package/dist/shared/stitchedPaths.d.ts +27 -0
- package/dist/shared/stitchedPaths.js +38 -0
- package/dist/shared/structuredFilter.d.ts +22 -0
- package/dist/shared/structuredFilter.js +1 -0
- package/dist/shared/subtitlePath.d.ts +20 -0
- package/dist/shared/subtitlePath.js +24 -0
- package/dist/shared/suggest.d.ts +18 -0
- package/dist/shared/suggest.js +59 -0
- package/dist/shared/tableSizing.d.ts +4 -0
- package/dist/shared/tableSizing.js +9 -0
- package/dist/shared/tagLists.d.ts +57 -0
- package/dist/shared/tagLists.js +34 -0
- package/dist/shared/textRules.d.ts +54 -0
- package/dist/shared/textRules.js +133 -0
- package/dist/shared/theme.d.ts +94 -0
- package/dist/shared/theme.js +800 -0
- package/dist/shared/themeColor.d.ts +34 -0
- package/dist/shared/themeColor.js +109 -0
- package/dist/shared/themeFaces.d.ts +30 -0
- package/dist/shared/themeFaces.js +42 -0
- package/dist/shared/themeInk.d.ts +20 -0
- package/dist/shared/themeInk.js +52 -0
- package/dist/shared/themeLooks.d.ts +9 -0
- package/dist/shared/themeLooks.js +572 -0
- package/dist/shared/themeParts.d.ts +26 -0
- package/dist/shared/themeParts.js +71 -0
- package/dist/shared/themePartsCheck.d.ts +21 -0
- package/dist/shared/themePartsCheck.js +91 -0
- package/dist/shared/themePresets.d.ts +85 -0
- package/dist/shared/themePresets.js +139 -0
- package/dist/shared/themeRecipeWords.d.ts +156 -0
- package/dist/shared/themeRecipeWords.js +156 -0
- package/dist/shared/themeRecipes.d.ts +213 -0
- package/dist/shared/themeRecipes.js +234 -0
- package/dist/shared/themeResolve.d.ts +55 -0
- package/dist/shared/themeResolve.js +52 -0
- package/dist/shared/themeTokens.d.ts +107 -0
- package/dist/shared/themeTokens.js +116 -0
- package/dist/shared/themeType.d.ts +38 -0
- package/dist/shared/themeType.js +205 -0
- package/dist/shared/unitWord.d.ts +4 -0
- package/dist/shared/unitWord.js +37 -0
- package/dist/shared/view.d.ts +195 -0
- package/dist/shared/view.js +987 -0
- package/dist/shared/viewLabels.d.ts +47 -0
- package/dist/shared/viewLabels.js +459 -0
- package/dist/shared/viewPaths.d.ts +248 -0
- package/dist/shared/viewPaths.js +294 -0
- package/dist/shared/viewtext.d.ts +57 -0
- package/dist/shared/viewtext.js +282 -0
- package/dist/shared/vocabulary.d.ts +71 -0
- package/dist/shared/vocabulary.js +249 -0
- package/dist/shared/weekStart.d.ts +7 -0
- package/dist/shared/weekStart.js +36 -0
- package/mark.svg +1 -0
- package/package.json +261 -4
- package/schema/model.d.ts +298 -0
- package/schema/theme.d.ts +587 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cards presentation: a list's rows as a grid of cards, each a picture,
|
|
3
|
+
* a title, one prominent figure, a few facts and a badge, the whole card
|
|
4
|
+
* opening its record. What a shop window, a listing site or a catalogue
|
|
5
|
+
* shows, drawn from ordinary records.
|
|
6
|
+
*
|
|
7
|
+
* The picture comes from one of two places, and the DSL says which by its
|
|
8
|
+
* shape: a column of the row holding an image address (`image: 'photo_url'`),
|
|
9
|
+
* or the first file of a related file resource (`image: { from, whose, sort }`,
|
|
10
|
+
* the related list's own words). The figure and the badge wear the column's
|
|
11
|
+
* display rule, so a price reads as money and a status in its tone.
|
|
12
|
+
*
|
|
13
|
+
* A card may also be the record a reference names, one hop away: a saved car
|
|
14
|
+
* drawn as the car. Its title, figure, lines, facts and picture may each read
|
|
15
|
+
* through one reference — `primary: 'vehicle_id.title'`, `value:
|
|
16
|
+
* 'vehicle_id.price'`, `image: 'vehicle_id.photo_url'`, or the referenced
|
|
17
|
+
* record's first file, `image: { about: 'vehicle_id', from: 'vehicle_photo',
|
|
18
|
+
* whose: 'vehicle_id' }`. Each is read through the referenced table's grants:
|
|
19
|
+
* a part the reader may not read is left off the card (cardsReadable).
|
|
20
|
+
*/
|
|
21
|
+
import { type DatabaseSchema, type TableMeta } from './schema.js';
|
|
22
|
+
/** The first file of a related file resource: its rows `whose` column names the card's record, first by `sort`. */
|
|
23
|
+
export interface AppCardsImageFrom {
|
|
24
|
+
/** A reference column of the card's row: the files are the referenced record's, not the row's own. */
|
|
25
|
+
about?: string;
|
|
26
|
+
/** A resource whose rows are files (`file` on the resource). */
|
|
27
|
+
from: string;
|
|
28
|
+
/** The column of `from` that names the card's record. */
|
|
29
|
+
whose: string;
|
|
30
|
+
/** Which file leads, written like the query bar: "position", "added_at desc". */
|
|
31
|
+
sort?: string;
|
|
32
|
+
}
|
|
33
|
+
/** A responsive grid of cards; the whole card opens its record. */
|
|
34
|
+
export interface AppCardsList {
|
|
35
|
+
kind: 'cards';
|
|
36
|
+
/** The card's title: a text column, or as authored without one `$label`, the record's name, which resolving
|
|
37
|
+
the list against a catalog makes the path that name is read from (cardsTitled). */
|
|
38
|
+
primary: string;
|
|
39
|
+
/** A text column said under the title at the card's full width, without a caption, clamped to three lines. */
|
|
40
|
+
description?: string;
|
|
41
|
+
/** One prominent figure — a price, a total — dressed by the column's display rule. A one-hop path
|
|
42
|
+
("vehicle_id.price") reads it from the record a reference names. */
|
|
43
|
+
value?: string;
|
|
44
|
+
/** A short word in the corner, dressed by the column's tones. */
|
|
45
|
+
badge?: string;
|
|
46
|
+
/** A column whose display rule maps its values to icons: the card wears its value's icon beside the
|
|
47
|
+
title — a ticket's channel, a part's kind — or, with `media: 'icon'`, as a tile leading the card. Only a
|
|
48
|
+
mapped value draws one. */
|
|
49
|
+
icon?: string;
|
|
50
|
+
/** Up to four facts under the title, each under its caption. A one-hop label path ("dealer_id.name") is taken. */
|
|
51
|
+
lines?: string[];
|
|
52
|
+
/** Up to six values said in one line under the figure, each after a dot — "2019 · 85,780 mi · Hybrid" —
|
|
53
|
+
their captions kept for assistive technology: a fields section's `facts` line, on a card. Local
|
|
54
|
+
columns or one-hop label paths. */
|
|
55
|
+
facts?: string[];
|
|
56
|
+
/** Served from a fact written `{ column, after }`: the word said after its value — "1 owner", "3 owners" —
|
|
57
|
+
or `{ column, before }`, before it ("Born Apr 24, 2017"), in place of the caption only assistive
|
|
58
|
+
technology hears. By fact path. */
|
|
59
|
+
factLabels?: Record<string, FactLabel>;
|
|
60
|
+
/** Up to four values along the card's foot, under a hairline, written as `facts` are: what an item costs and how
|
|
61
|
+
long it takes. Its labels are kept in `factLabels` beside the facts'. */
|
|
62
|
+
footer?: string[];
|
|
63
|
+
/** A column holding an image address — the row's, or one hop away ("vehicle_id.photo_url") — or the first file
|
|
64
|
+
of a related file resource, the row's own or (`about`) the referenced record's. */
|
|
65
|
+
image?: string | AppCardsImageFrom;
|
|
66
|
+
/** How an image is framed. Omit or use "cover" for the card's existing picture; "avatar" makes it a portrait and falls back to the title's initials;
|
|
67
|
+
"icon" leads the card with its `icon` column's mark as a tile, a catalog's laptop or headset, with no picture. */
|
|
68
|
+
media?: 'cover' | 'avatar' | 'icon';
|
|
69
|
+
}
|
|
70
|
+
/** How many facts a card carries under its title. */
|
|
71
|
+
export declare const CARDS_MAX_LINES = 4;
|
|
72
|
+
/** One sort key and its direction: "position", "added_at desc". */
|
|
73
|
+
export declare function cardsImageSort(sort: string): {
|
|
74
|
+
column: string;
|
|
75
|
+
direction: 'asc' | 'desc';
|
|
76
|
+
};
|
|
77
|
+
/** A fact's own word: after its value ("3 beds", plural by the value), or before it ("Born Apr 24, 2017"). */
|
|
78
|
+
/** A fact's word. `many` is the author's plural; absent, a word after a bare count agrees with it by rule
|
|
79
|
+
("3 beds") and any other figure — money, a percent, a figure with a unit — keeps the word as written. */
|
|
80
|
+
export interface FactLabel {
|
|
81
|
+
one: string;
|
|
82
|
+
many?: string;
|
|
83
|
+
position?: 'before';
|
|
84
|
+
}
|
|
85
|
+
export declare function parseFacts(raw: unknown, at: string, key?: 'facts' | 'footer', max?: number): Pick<AppCardsList, 'facts' | 'factLabels'>;
|
|
86
|
+
/**
|
|
87
|
+
* The word a fact's label says beside this value, or undefined where the value already says it. A word before a
|
|
88
|
+
* value is a caption ("Floor 3"). After one, the author's `{ one, many }` agrees with any figure; a word written
|
|
89
|
+
* once agrees only with a bare count ("3 beds"), since a figure the display rule dresses — money, a percent, a
|
|
90
|
+
* duration, a unit — is not a count of the word ("$18,400 left to pay"). A word that repeats the rule's unit is
|
|
91
|
+
* left out: the figure said it ("48,341 mi", never "48,341 mi mis").
|
|
92
|
+
*/
|
|
93
|
+
export declare function factWord(label: FactLabel, value: unknown, rule?: {
|
|
94
|
+
format?: string;
|
|
95
|
+
unit?: string;
|
|
96
|
+
bar?: boolean;
|
|
97
|
+
} | null): string | undefined;
|
|
98
|
+
/** The cards presentation as written: the shape only, judged against a catalog by cardsProblem. */
|
|
99
|
+
export declare function parseCards(raw: Record<string, unknown>, at: string, primary: string, lines: string[]): AppCardsList;
|
|
100
|
+
/**
|
|
101
|
+
* A card titled by its record's name, as this catalog names it: the
|
|
102
|
+
* resource's recordLabel — a template computed as `$label`, a column, a path
|
|
103
|
+
* through a reference — or the name the catalog finds without one
|
|
104
|
+
* (schema.ts labelPath), else the key. A card with a title of its own, or a
|
|
105
|
+
* `$label` this catalog serves, is as it was.
|
|
106
|
+
*/
|
|
107
|
+
export declare function cardsTitled(list: AppCardsList, table: TableMeta, schema: DatabaseSchema, recordLabel?: string | false): AppCardsList;
|
|
108
|
+
/** The row's own columns a card reads, so the list's query fetches them beside the keys. */
|
|
109
|
+
export declare function cardsColumns(list: AppCardsList): string[];
|
|
110
|
+
/**
|
|
111
|
+
* The cards as one reader's catalog can draw them: a figure, a picture, a
|
|
112
|
+
* line or a fact read through a reference that this reader may not read —
|
|
113
|
+
* the referenced table, or that column of it — is left off the card, and
|
|
114
|
+
* the card stands without it, as a calendar's span does. The title is the
|
|
115
|
+
* card: a title the reader cannot read is the cardsProblem it always was.
|
|
116
|
+
*/
|
|
117
|
+
export declare function cardsReadable(list: AppCardsList, table: TableMeta, schema: DatabaseSchema, files?: ReadonlySet<string>): AppCardsList;
|
|
118
|
+
/**
|
|
119
|
+
* The cards against the readable catalog. `files` is the tables whose rows
|
|
120
|
+
* are files (the App's resolved `file` rules), for an image drawn from one;
|
|
121
|
+
* absent, only the row's own columns are judged.
|
|
122
|
+
*/
|
|
123
|
+
export declare function cardsProblem(list: AppCardsList, table: TableMeta, schema?: DatabaseSchema, files?: ReadonlySet<string>, icons?: (column: string) => boolean): string | undefined;
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cards presentation: a list's rows as a grid of cards, each a picture,
|
|
3
|
+
* a title, one prominent figure, a few facts and a badge, the whole card
|
|
4
|
+
* opening its record. What a shop window, a listing site or a catalogue
|
|
5
|
+
* shows, drawn from ordinary records.
|
|
6
|
+
*
|
|
7
|
+
* The picture comes from one of two places, and the DSL says which by its
|
|
8
|
+
* shape: a column of the row holding an image address (`image: 'photo_url'`),
|
|
9
|
+
* or the first file of a related file resource (`image: { from, whose, sort }`,
|
|
10
|
+
* the related list's own words). The figure and the badge wear the column's
|
|
11
|
+
* display rule, so a price reads as money and a status in its tone.
|
|
12
|
+
*
|
|
13
|
+
* A card may also be the record a reference names, one hop away: a saved car
|
|
14
|
+
* drawn as the car. Its title, figure, lines, facts and picture may each read
|
|
15
|
+
* through one reference — `primary: 'vehicle_id.title'`, `value:
|
|
16
|
+
* 'vehicle_id.price'`, `image: 'vehicle_id.photo_url'`, or the referenced
|
|
17
|
+
* record's first file, `image: { about: 'vehicle_id', from: 'vehicle_photo',
|
|
18
|
+
* whose: 'vehicle_id' }`. Each is read through the referenced table's grants:
|
|
19
|
+
* a part the reader may not read is left off the card (cardsReadable).
|
|
20
|
+
*/
|
|
21
|
+
import { columnKind, labelPath, primaryKey, tableNamed } from './schema.js';
|
|
22
|
+
import { LABEL_SEGMENT } from './recordLabel.js';
|
|
23
|
+
import { allowKeys, isRecord } from './model.js';
|
|
24
|
+
import { pluralOf } from './appNoun.js';
|
|
25
|
+
import { singularOf } from './unitWord.js';
|
|
26
|
+
/** How many facts a card carries under its title. */
|
|
27
|
+
export const CARDS_MAX_LINES = 4;
|
|
28
|
+
/** How many values a card's facts line says. */
|
|
29
|
+
const CARDS_MAX_FACTS = 6;
|
|
30
|
+
/** How many values stand along a card's foot. */
|
|
31
|
+
const CARDS_MAX_FOOTER = 4;
|
|
32
|
+
const CARDS_IMAGE_KEYS = ['about', 'from', 'whose', 'sort'];
|
|
33
|
+
/** A local column: bare, non-empty, never a path. The same rule every card presentation reads. */
|
|
34
|
+
function local(value, key, at) {
|
|
35
|
+
if (typeof value !== 'string' || !value.trim() || value.includes('.'))
|
|
36
|
+
throw new Error(`${at}: "${key}" must name a local column, not a path.`);
|
|
37
|
+
return value.trim();
|
|
38
|
+
}
|
|
39
|
+
/** One sort key and its direction: "position", "added_at desc". */
|
|
40
|
+
export function cardsImageSort(sort) {
|
|
41
|
+
const [column, direction = 'asc'] = sort.trim().split(/\s+/);
|
|
42
|
+
return { column, direction: direction.toLowerCase() === 'desc' ? 'desc' : 'asc' };
|
|
43
|
+
}
|
|
44
|
+
/** A value the card reads off its row, or one hop away through a reference: "price", "vehicle_id.price". */
|
|
45
|
+
function said(value, key, at) {
|
|
46
|
+
if (typeof value !== 'string' || !LABEL_PATH.test(value.trim()))
|
|
47
|
+
throw new Error(`${at}: "${key}" must name a column, or a column one reference away like "vehicle_id.price".`);
|
|
48
|
+
return value.trim();
|
|
49
|
+
}
|
|
50
|
+
function parseImage(raw, at) {
|
|
51
|
+
if (typeof raw === 'string')
|
|
52
|
+
return said(raw, 'image', at);
|
|
53
|
+
if (!isRecord(raw))
|
|
54
|
+
throw new Error(`${at}: "image" must be a column holding an image address, or { from, whose, sort? } naming a file resource (with about, the referenced record's).`);
|
|
55
|
+
allowKeys(raw, CARDS_IMAGE_KEYS, `${at}, image`);
|
|
56
|
+
const about = raw.about === undefined ? undefined : local(raw.about, 'about', `${at}, image`);
|
|
57
|
+
if (typeof raw.from !== 'string' || !raw.from.trim())
|
|
58
|
+
throw new Error(`${at}, image: "from" must name a resource whose rows are files.`);
|
|
59
|
+
const whose = local(raw.whose, 'whose', `${at}, image`);
|
|
60
|
+
let sort;
|
|
61
|
+
if (raw.sort !== undefined) {
|
|
62
|
+
if (typeof raw.sort !== 'string' || !/^\s*[A-Za-z_][A-Za-z0-9_]*(\s+(asc|desc))?\s*$/i.test(raw.sort)) {
|
|
63
|
+
throw new Error(`${at}, image: "sort" is one column and an optional direction, like "position" or "added_at desc".`);
|
|
64
|
+
}
|
|
65
|
+
sort = raw.sort.trim().replace(/\s+/g, ' ');
|
|
66
|
+
}
|
|
67
|
+
return { ...(about ? { about } : {}), from: raw.from.trim(), whose, ...(sort ? { sort } : {}) };
|
|
68
|
+
}
|
|
69
|
+
/* A said value — the title, the figure, a line, a fact or the picture — may also be a one-hop label path:
|
|
70
|
+
"dealer_id.name" says who sells the car, and the list's query already reads such a path. The badge, the
|
|
71
|
+
icon and the description stay the row's own. */
|
|
72
|
+
const LABEL_PATH = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/;
|
|
73
|
+
export function parseFacts(raw, at, key = 'facts', max = CARDS_MAX_FACTS) {
|
|
74
|
+
const shape = `${at}: "${key}" must be one to ${max} columns or one-hop label paths, said in one line — ` +
|
|
75
|
+
"each a path, or { column, after } to say a word after its value, like { column: 'owners', after: 'owner' }, " +
|
|
76
|
+
"or { column, before } to say it before, like { column: 'born_on', before: 'Born' }.";
|
|
77
|
+
if (!Array.isArray(raw) || !raw.length || raw.length > max)
|
|
78
|
+
throw new Error(shape);
|
|
79
|
+
const facts = [];
|
|
80
|
+
const factLabels = {};
|
|
81
|
+
for (const entry of raw) {
|
|
82
|
+
if (typeof entry === 'string' && LABEL_PATH.test(entry.trim())) {
|
|
83
|
+
facts.push(entry.trim());
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (!isRecord(entry) || typeof entry.column !== 'string' || !LABEL_PATH.test(entry.column.trim()))
|
|
87
|
+
throw new Error(shape);
|
|
88
|
+
allowKeys(entry, ['column', 'before', 'after'], `${at}, ${key}`, {
|
|
89
|
+
label: 'is now "after" (a word after the value) or "before" (a word before it)',
|
|
90
|
+
position: 'is gone: "before" is a word before the value, "after" a word after it',
|
|
91
|
+
});
|
|
92
|
+
const path = entry.column.trim();
|
|
93
|
+
const word = (value, which) => {
|
|
94
|
+
if (typeof value !== 'string' || !value.trim() || value.trim().length > 40) {
|
|
95
|
+
throw new Error(`${at}: the fact "${path}" has a "${which}" that is not a word of at most 40 characters.`);
|
|
96
|
+
}
|
|
97
|
+
return value.trim();
|
|
98
|
+
};
|
|
99
|
+
if (entry.before !== undefined && entry.after !== undefined)
|
|
100
|
+
throw new Error(`${at}: the fact "${path}" has both "before" and "after"; a fact says its word on one side of the value.`);
|
|
101
|
+
if (entry.before === undefined && entry.after === undefined)
|
|
102
|
+
throw new Error(`${at}: the fact "${path}" says no word; write the path alone, or give it a "before" or an "after".`);
|
|
103
|
+
let label;
|
|
104
|
+
if (entry.before !== undefined)
|
|
105
|
+
label = { one: word(entry.before, 'before'), position: 'before' };
|
|
106
|
+
else if (isRecord(entry.after)) {
|
|
107
|
+
allowKeys(entry.after, ['one', 'many'], `${at}, facts "${path}" after`);
|
|
108
|
+
label = { one: word(entry.after.one, 'after'), many: word(entry.after.many, 'after') };
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
/* A word after a count agrees with it ("3 beds"), which factWord says as the
|
|
112
|
+
value is drawn: only a count does. "$18,400 left to pay" is not "left to pays". */
|
|
113
|
+
label = { one: word(entry.after, 'after') };
|
|
114
|
+
}
|
|
115
|
+
facts.push(path);
|
|
116
|
+
Object.defineProperty(factLabels, path, { value: label, enumerable: true, configurable: true, writable: true });
|
|
117
|
+
}
|
|
118
|
+
if (new Set(facts).size !== facts.length)
|
|
119
|
+
throw new Error(`${at}: "${key}" names a column twice.`);
|
|
120
|
+
return { facts, ...(Object.keys(factLabels).length ? { factLabels } : {}) };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The word a fact's label says beside this value, or undefined where the value already says it. A word before a
|
|
124
|
+
* value is a caption ("Floor 3"). After one, the author's `{ one, many }` agrees with any figure; a word written
|
|
125
|
+
* once agrees only with a bare count ("3 beds"), since a figure the display rule dresses — money, a percent, a
|
|
126
|
+
* duration, a unit — is not a count of the word ("$18,400 left to pay"). A word that repeats the rule's unit is
|
|
127
|
+
* left out: the figure said it ("48,341 mi", never "48,341 mi mis").
|
|
128
|
+
*/
|
|
129
|
+
export function factWord(label, value, rule) {
|
|
130
|
+
if (label.position === 'before' && label.many === undefined)
|
|
131
|
+
return label.one;
|
|
132
|
+
const unit = rule?.unit?.replace(/^\//, '').trim().toLowerCase();
|
|
133
|
+
if (unit && (label.one.toLowerCase() === unit || label.many?.toLowerCase() === unit))
|
|
134
|
+
return undefined;
|
|
135
|
+
const n = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : NaN;
|
|
136
|
+
const many = Number.isFinite(n) && n !== 1;
|
|
137
|
+
if (label.many !== undefined)
|
|
138
|
+
return many ? label.many : label.one;
|
|
139
|
+
const counted = !rule?.unit && !rule?.bar && (rule?.format === undefined || rule.format === 'number');
|
|
140
|
+
return counted && Number.isFinite(n) ? countWord(label.one, many) : label.one;
|
|
141
|
+
}
|
|
142
|
+
/* A word written once, agreed with a count by the shared rule (unitWord.ts): a phrase agrees by the word written
|
|
143
|
+
in the plural ("tickets logged" → "1 ticket logged"), a single word written singular is made plural ("bed" →
|
|
144
|
+
"3 beds"), and a phrase with no plural in it is said as written ("left to pay"), since no rule knows which of
|
|
145
|
+
its words counts. Never an "s" on the last word: "0 tickets loggeds" was. */
|
|
146
|
+
function countWord(phrase, many) {
|
|
147
|
+
const words = phrase.split(/\s+/);
|
|
148
|
+
const at = words.findIndex((word) => singularOf(word) !== undefined);
|
|
149
|
+
if (at >= 0)
|
|
150
|
+
return many ? phrase : words.map((word, i) => (i === at ? singularOf(word) : word)).join(' ');
|
|
151
|
+
return many && words.length === 1 ? pluralOf(phrase) : phrase;
|
|
152
|
+
}
|
|
153
|
+
/** The cards presentation as written: the shape only, judged against a catalog by cardsProblem. */
|
|
154
|
+
export function parseCards(raw, at, primary, lines) {
|
|
155
|
+
const value = raw.value === undefined ? undefined : said(raw.value, 'value', at);
|
|
156
|
+
const description = raw.description === undefined ? undefined : local(raw.description, 'description', at);
|
|
157
|
+
const badge = raw.badge === undefined ? undefined : local(raw.badge, 'badge', at);
|
|
158
|
+
const icon = raw.icon === undefined ? undefined : local(raw.icon, 'icon', at);
|
|
159
|
+
const image = raw.image === undefined ? undefined : parseImage(raw.image, at);
|
|
160
|
+
const media = raw.media;
|
|
161
|
+
if (media !== undefined && media !== 'cover' && media !== 'avatar' && media !== 'icon') {
|
|
162
|
+
throw new Error(`${at}: "media" must be "cover", "avatar" or "icon".`);
|
|
163
|
+
}
|
|
164
|
+
/* An icon tile is the card's lead in place of a picture: the mark its icon column's rule gives each value. */
|
|
165
|
+
if (media === 'icon' && icon === undefined)
|
|
166
|
+
throw new Error(`${at}: "media: 'icon'" leads the card with its "icon" column's mark; name the column, like icon: 'kind'.`);
|
|
167
|
+
if (media === 'icon' && image !== undefined)
|
|
168
|
+
throw new Error(`${at}: "media: 'icon'" leads the card with an icon tile, and "image" with a picture; a card has one lead.`);
|
|
169
|
+
const facts = raw.facts === undefined ? undefined : parseFacts(raw.facts, at);
|
|
170
|
+
/* The foot's values, written as facts are; their words kept with the facts', so a value is said in one place. */
|
|
171
|
+
const foot = raw.footer === undefined ? undefined : parseFacts(raw.footer, at, 'footer', CARDS_MAX_FOOTER);
|
|
172
|
+
const twice = foot?.facts?.find((path) => facts?.facts?.includes(path));
|
|
173
|
+
if (twice)
|
|
174
|
+
throw new Error(`${at}: "${twice}" is in "facts" and in "footer"; a card says a value once.`);
|
|
175
|
+
const factLabels = facts?.factLabels || foot?.factLabels ? { ...facts?.factLabels, ...foot?.factLabels } : undefined;
|
|
176
|
+
return {
|
|
177
|
+
kind: 'cards',
|
|
178
|
+
primary,
|
|
179
|
+
...(description ? { description } : {}),
|
|
180
|
+
...(value ? { value } : {}),
|
|
181
|
+
...(badge ? { badge } : {}),
|
|
182
|
+
...(icon ? { icon } : {}),
|
|
183
|
+
...(lines.length ? { lines } : {}),
|
|
184
|
+
...(facts?.facts ? { facts: facts.facts } : {}),
|
|
185
|
+
...(foot?.facts ? { footer: foot.facts } : {}),
|
|
186
|
+
...(factLabels ? { factLabels } : {}),
|
|
187
|
+
...(image === undefined ? {} : { image }),
|
|
188
|
+
...(media === 'cover' || media === 'avatar' || media === 'icon' ? { media } : {}),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* A card titled by its record's name, as this catalog names it: the
|
|
193
|
+
* resource's recordLabel — a template computed as `$label`, a column, a path
|
|
194
|
+
* through a reference — or the name the catalog finds without one
|
|
195
|
+
* (schema.ts labelPath), else the key. A card with a title of its own, or a
|
|
196
|
+
* `$label` this catalog serves, is as it was.
|
|
197
|
+
*/
|
|
198
|
+
export function cardsTitled(list, table, schema, recordLabel) {
|
|
199
|
+
if (list.primary !== LABEL_SEGMENT || table.labelTemplate)
|
|
200
|
+
return list;
|
|
201
|
+
const named = labelPath(schema, table, recordLabel);
|
|
202
|
+
return { ...list, primary: named && named !== LABEL_SEGMENT ? named : (primaryKey(table)[0] ?? list.primary) };
|
|
203
|
+
}
|
|
204
|
+
/** The row's own columns a card reads, so the list's query fetches them beside the keys. */
|
|
205
|
+
export function cardsColumns(list) {
|
|
206
|
+
return [
|
|
207
|
+
...new Set([
|
|
208
|
+
list.primary,
|
|
209
|
+
...(list.description ? [list.description] : []),
|
|
210
|
+
...(list.value ? [list.value] : []),
|
|
211
|
+
...(list.badge ? [list.badge] : []),
|
|
212
|
+
...(list.icon ? [list.icon] : []),
|
|
213
|
+
...(list.lines ?? []),
|
|
214
|
+
...(list.facts ?? []),
|
|
215
|
+
...(list.footer ?? []),
|
|
216
|
+
...(typeof list.image === 'string' ? [list.image] : []),
|
|
217
|
+
// The reference whose record's first file is the picture: its value names the record the files are asked by.
|
|
218
|
+
...(typeof list.image === 'object' && list.image.about ? [list.image.about] : []),
|
|
219
|
+
]),
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
/** A rollup of the row's own table, read like a column (rollups.ts). */
|
|
223
|
+
const ownRollup = (table, name) => Boolean(table.rollups && Object.hasOwn(table.rollups, name)) || Boolean(table.computed && Object.hasOwn(table.computed, name));
|
|
224
|
+
/** The table a one-column reference of `table` names, and the reference, in this catalog. */
|
|
225
|
+
function referenced(schema, table, column) {
|
|
226
|
+
const fk = schema.foreignKeys.find((candidate) => candidate.from.table === table.id && candidate.from.columns.length === 1 && candidate.from.columns[0] === column);
|
|
227
|
+
return fk ? { fk, target: schema.tables.find((candidate) => candidate.id === fk.to.table) } : undefined;
|
|
228
|
+
}
|
|
229
|
+
/** A said value against the catalog: the row's own column or rollup, or a reference and a column or rollup of its target. */
|
|
230
|
+
function saidProblem(name, key, table, schema, text = false) {
|
|
231
|
+
const [head, tail] = name.split('.');
|
|
232
|
+
if (!tail)
|
|
233
|
+
return table.columns.some((column) => column.name === head) || ownRollup(table, head)
|
|
234
|
+
? undefined
|
|
235
|
+
: `Cards ${key}: "${name}" must be a readable column.`;
|
|
236
|
+
if (!schema)
|
|
237
|
+
return undefined;
|
|
238
|
+
const hop = referenced(schema, table, head);
|
|
239
|
+
if (!hop)
|
|
240
|
+
return `Cards ${key}: "${head}" in "${name}" is not a reference of "${table.name}".`;
|
|
241
|
+
const { fk, target } = hop;
|
|
242
|
+
const column = target?.columns.find((candidate) => candidate.name === tail);
|
|
243
|
+
if (!target || (!column && !ownRollup(target, tail)))
|
|
244
|
+
return `Cards ${key}: "${target?.name ?? fk.to.table}" has no column "${tail}".`;
|
|
245
|
+
if (text && (!column || columnKind(column.type) !== 'text'))
|
|
246
|
+
return `Cards ${key} must be a text column; "${name}" is not.`;
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
/** The parts of the card that read through a reference, by where they are said: what cardsReadable may leave off. */
|
|
250
|
+
function throughReference(list) {
|
|
251
|
+
return [
|
|
252
|
+
...(list.value?.includes('.') ? [['value', list.value]] : []),
|
|
253
|
+
...(typeof list.image === 'string' && list.image.includes('.') ? [['image', list.image]] : []),
|
|
254
|
+
...(list.lines ?? []).flatMap((line, i) => (line.includes('.') ? [[`properties[${i}]`, line]] : [])),
|
|
255
|
+
...(list.facts ?? []).flatMap((fact, i) => (fact.includes('.') ? [[`facts[${i}]`, fact]] : [])),
|
|
256
|
+
...(list.footer ?? []).flatMap((fact, i) => (fact.includes('.') ? [[`footer[${i}]`, fact]] : [])),
|
|
257
|
+
];
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* The cards as one reader's catalog can draw them: a figure, a picture, a
|
|
261
|
+
* line or a fact read through a reference that this reader may not read —
|
|
262
|
+
* the referenced table, or that column of it — is left off the card, and
|
|
263
|
+
* the card stands without it, as a calendar's span does. The title is the
|
|
264
|
+
* card: a title the reader cannot read is the cardsProblem it always was.
|
|
265
|
+
*/
|
|
266
|
+
export function cardsReadable(list, table, schema, files) {
|
|
267
|
+
const unread = new Set(throughReference(list)
|
|
268
|
+
.filter(([key, name]) => saidProblem(name, key, table, schema, key === 'image'))
|
|
269
|
+
.map(([, name]) => name));
|
|
270
|
+
const image = list.image;
|
|
271
|
+
const fileGone = typeof image === 'object' && image.about !== undefined && Boolean(imageProblem(image, table, schema, files));
|
|
272
|
+
if (!unread.size && !fileGone)
|
|
273
|
+
return list;
|
|
274
|
+
const { value, image: _image, lines, facts, footer, factLabels, ...rest } = list;
|
|
275
|
+
const keptFacts = facts?.filter((fact) => !unread.has(fact));
|
|
276
|
+
const keptFooter = footer?.filter((fact) => !unread.has(fact));
|
|
277
|
+
const keptLines = lines?.filter((line) => !unread.has(line));
|
|
278
|
+
const labels = factLabels && Object.fromEntries(Object.entries(factLabels).filter(([fact]) => !unread.has(fact)));
|
|
279
|
+
return {
|
|
280
|
+
...rest,
|
|
281
|
+
...(value !== undefined && !unread.has(value) ? { value } : {}),
|
|
282
|
+
...(image !== undefined && !fileGone && !(typeof image === 'string' && unread.has(image)) ? { image } : {}),
|
|
283
|
+
...(keptLines?.length ? { lines: keptLines } : {}),
|
|
284
|
+
...(keptFacts?.length ? { facts: keptFacts } : {}),
|
|
285
|
+
...(keptFooter?.length ? { footer: keptFooter } : {}),
|
|
286
|
+
...(labels && Object.keys(labels).length ? { factLabels: labels } : {}),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/** A picture from a file resource against the catalog: the row's own files, or (`about`) the referenced record's. */
|
|
290
|
+
function imageProblem(image, table, schema, files) {
|
|
291
|
+
let owner = table;
|
|
292
|
+
if (image.about !== undefined) {
|
|
293
|
+
const hop = referenced(schema, table, image.about);
|
|
294
|
+
if (!hop)
|
|
295
|
+
return `Cards image: "about" names "${image.about}", which is not a reference of "${table.name}".`;
|
|
296
|
+
if (!hop.target)
|
|
297
|
+
return `Cards image: "${image.about}" names "${hop.fk.to.table}", which is not readable here.`;
|
|
298
|
+
owner = hop.target;
|
|
299
|
+
}
|
|
300
|
+
const from = tableNamed(schema, image.from);
|
|
301
|
+
if (!from)
|
|
302
|
+
return `Cards image: this connection has no table "${image.from}".`;
|
|
303
|
+
if (files && !files.has(from.id))
|
|
304
|
+
return `Cards image: "${image.from}" is not a resource whose rows are files; declare "file" on it.`;
|
|
305
|
+
const whose = from.columns.find((column) => column.name === image.whose);
|
|
306
|
+
if (!whose)
|
|
307
|
+
return `Cards image: "${from.name}" has no column "${image.whose}".`;
|
|
308
|
+
const fk = schema.foreignKeys.find((candidate) => candidate.from.table === from.id &&
|
|
309
|
+
candidate.to.table === owner.id &&
|
|
310
|
+
candidate.from.columns.length === 1 &&
|
|
311
|
+
candidate.from.columns[0] === whose.name);
|
|
312
|
+
if (!fk)
|
|
313
|
+
return `Cards image: "${from.name}.${whose.name}" does not reference "${owner.name}".`;
|
|
314
|
+
/* The row's reference and the files' must name the same key of that record, or the files asked by its value are another's. */
|
|
315
|
+
if (image.about !== undefined && referenced(schema, table, image.about).fk.to.columns[0] !== fk.to.columns[0])
|
|
316
|
+
return `Cards image: "${table.name}.${image.about}" and "${from.name}.${whose.name}" name different keys of "${owner.name}".`;
|
|
317
|
+
if (image.sort) {
|
|
318
|
+
const { column } = cardsImageSort(image.sort);
|
|
319
|
+
if (!from.columns.some((candidate) => candidate.name === column))
|
|
320
|
+
return `Cards image: "${from.name}" has no column "${column}" to sort by.`;
|
|
321
|
+
}
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* The cards against the readable catalog. `files` is the tables whose rows
|
|
326
|
+
* are files (the App's resolved `file` rules), for an image drawn from one;
|
|
327
|
+
* absent, only the row's own columns are judged.
|
|
328
|
+
*/
|
|
329
|
+
export function cardsProblem(list, table, schema, files, icons) {
|
|
330
|
+
if (!table.columns.some((column) => column.primaryKey))
|
|
331
|
+
return 'Cards require a complete readable primary key.';
|
|
332
|
+
if (list.icon !== undefined) {
|
|
333
|
+
if (!table.columns.some((column) => column.name === list.icon))
|
|
334
|
+
return `Cards icon: "${list.icon}" must be a local readable column.`;
|
|
335
|
+
/* The icon is the value's mark as the display rule draws it everywhere else; a card has no vocabulary of its own. */
|
|
336
|
+
if (icons && !icons(list.icon))
|
|
337
|
+
return `Cards icon: "${list.icon}" has no icons to draw; map its values in the resource's display rule (display.${list.icon}.icons).`;
|
|
338
|
+
}
|
|
339
|
+
const said = [
|
|
340
|
+
...(list.lines ?? []).map((line, i) => [`properties[${i}]`, line]),
|
|
341
|
+
...(list.facts ?? []).map((name, i) => [`facts[${i}]`, name]),
|
|
342
|
+
...(list.footer ?? []).map((name, i) => [`footer[${i}]`, name]),
|
|
343
|
+
...(list.value?.includes('.') ? [['value', list.value]] : []),
|
|
344
|
+
];
|
|
345
|
+
for (const [key, name] of said) {
|
|
346
|
+
const problem = saidProblem(name, key, table, schema);
|
|
347
|
+
if (problem)
|
|
348
|
+
return problem;
|
|
349
|
+
}
|
|
350
|
+
if (typeof list.image === 'string' && list.image.includes('.')) {
|
|
351
|
+
const problem = saidProblem(list.image, 'image', table, schema, true);
|
|
352
|
+
if (problem)
|
|
353
|
+
return problem;
|
|
354
|
+
}
|
|
355
|
+
/* A title read from the record's name is the catalog's own path: a computed `$label` or a reference's name. */
|
|
356
|
+
const titled = list.primary === LABEL_SEGMENT || list.primary.includes('.');
|
|
357
|
+
if (titled && list.primary !== LABEL_SEGMENT) {
|
|
358
|
+
const problem = saidProblem(list.primary, 'primary', table, schema);
|
|
359
|
+
if (problem)
|
|
360
|
+
return problem;
|
|
361
|
+
}
|
|
362
|
+
const named = [
|
|
363
|
+
...(titled ? [] : [['primary', list.primary]]),
|
|
364
|
+
...(list.value && !list.value.includes('.') ? [['value', list.value]] : []),
|
|
365
|
+
...(list.badge ? [['badge', list.badge]] : []),
|
|
366
|
+
...(list.description ? [['description', list.description]] : []),
|
|
367
|
+
...(typeof list.image === 'string' && !list.image.includes('.') ? [['image', list.image]] : []),
|
|
368
|
+
];
|
|
369
|
+
for (const [key, name] of named) {
|
|
370
|
+
const column = table.columns.find((candidate) => candidate.name === name);
|
|
371
|
+
// The figure and the badge may be a rollup: a SKU's stock, a board's threads.
|
|
372
|
+
if (!column && (key === 'value' || key === 'badge') && ownRollup(table, name))
|
|
373
|
+
continue;
|
|
374
|
+
if (!column)
|
|
375
|
+
return `Cards ${key}: "${name}" must be a local readable column.`;
|
|
376
|
+
if ((key === 'primary' || key === 'image' || key === 'description') && columnKind(column.type) !== 'text')
|
|
377
|
+
return `Cards ${key} must be a text column.`;
|
|
378
|
+
}
|
|
379
|
+
const image = list.image;
|
|
380
|
+
if (typeof image === 'object' && image.about !== undefined && !table.columns.some((column) => column.name === image.about))
|
|
381
|
+
return `Cards image: "about" names "${image.about}", which is not a readable column of "${table.name}".`;
|
|
382
|
+
if (typeof image !== 'object' || !schema)
|
|
383
|
+
return undefined;
|
|
384
|
+
return imageProblem(image, table, schema, files);
|
|
385
|
+
}
|