@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,529 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The conventions an App applies without being told: how a column is drawn
|
|
3
|
+
* when its name, type or vocabulary says what it holds. A `price` is money, a
|
|
4
|
+
* `due_on` is said from today, an `email` is a link, a CHECK vocabulary of
|
|
5
|
+
* plain words wears tones by what the words mean, a machine's states wear
|
|
6
|
+
* tones by where they stand, a person's name has an initials disc. The
|
|
7
|
+
* scaffold used to write each of these out; now the platform infers them at
|
|
8
|
+
* runtime, `mistri check --defaults` prints every one per resource, and a
|
|
9
|
+
* rule the App writes that only restates one is a `restated` warning.
|
|
10
|
+
*
|
|
11
|
+
* What the App writes wins, concern by concern: a declared `format` (or a
|
|
12
|
+
* unit, a bar) replaces the inferred figure, a declared `tone` or `colors` the
|
|
13
|
+
* inferred tones, declared `values` the inferred words, a declared avatar or
|
|
14
|
+
* mark the inferred disc. An empty rule (`display: { value: {} }`) keeps the
|
|
15
|
+
* column exactly as stored.
|
|
16
|
+
*
|
|
17
|
+
* Pure over one table's catalog entry, so the server's payload, `check` and
|
|
18
|
+
* the scaffold read one rule.
|
|
19
|
+
*/
|
|
20
|
+
import { columnKind, isFlagColumn, labelColumn, stateStampColumn, tableNamed, } from './schema.js';
|
|
21
|
+
import { displayWord } from './model.js';
|
|
22
|
+
import { inferredFormDefaults } from './formValues.js';
|
|
23
|
+
import { columnCaption } from './columnCaption.js';
|
|
24
|
+
import { DUE } from './dueDate.js';
|
|
25
|
+
/* Money by name, the words a ledger uses (a rent, a charge, what was billed and paid, an hourly rate), on a
|
|
26
|
+
column the catalog says holds a number; a Postgres `money` column is money whatever it is called. */
|
|
27
|
+
export const MONEY = /(^|_)(amount|total|subtotal|price|cost|costs|revenue|budget|quota|fee|fees|salary|balance|value|pay|paid|wage|wages|rent|charge|charges|billed|deposit|refund|payout|premium|(hourly|daily|nightly|day)_rate)$/i;
|
|
28
|
+
const MONEY_TYPE = /^money$/i;
|
|
29
|
+
/* Named like a yes-or-no. `auto_` is a switch (auto_renew, auto_pay) unless a plural follows it: a lender's
|
|
30
|
+
`auto_tradelines` counts car loans, 0 to 3. */
|
|
31
|
+
const FLAG_NAME = /^(is|has)_|able$|^auto_(?!.*[^s]s$)/i;
|
|
32
|
+
const PERCENT = /(probability|percent|pct|progress|(^|_)rate)$/i;
|
|
33
|
+
/* valueModel.ts YEAR_NAME: the browser already says such a column as a year. */
|
|
34
|
+
const YEAR = /(^|_)(year|yr)(_|$)/i;
|
|
35
|
+
/* A figure's unit, read off its name: "30 min", "1,494 sq ft", "3 bd". */
|
|
36
|
+
export const UNITS = [
|
|
37
|
+
[/(^|_)minutes$/i, 'min'],
|
|
38
|
+
[/(^|_)hours$/i, 'h'],
|
|
39
|
+
[/(^|_)days$/i, 'days'],
|
|
40
|
+
[/(^|_)(square_feet|sq_ft|sqft)$/i, 'sq ft'],
|
|
41
|
+
[/^bedrooms$/i, 'bd'],
|
|
42
|
+
[/^bathrooms$/i, 'ba'],
|
|
43
|
+
[/(^|_)(miles|mileage)$/i, 'mi'],
|
|
44
|
+
[/(^|_)kg$/i, 'kg'],
|
|
45
|
+
[/(^|_)(lb|lbs)$/i, 'lb'],
|
|
46
|
+
];
|
|
47
|
+
/* A column named like a way to reach someone (valueModel.ts links the same names in the browser). */
|
|
48
|
+
const LINKS = [
|
|
49
|
+
[/(^|_)e_?mail(_address)?$/i, 'email'],
|
|
50
|
+
[/(^|_)(phone|mobile|cell|telephone|tel)(_number|_no)?$/i, 'phone'],
|
|
51
|
+
[/(^|_)(url|website|web_site|homepage|home_page)$/i, 'url'],
|
|
52
|
+
];
|
|
53
|
+
/* A table whose rows are people, by its head noun (`customer`, `field_technician`): their name wears an initials
|
|
54
|
+
disc. The scaffold's people icons (users, user) read the same nouns. */
|
|
55
|
+
const PEOPLE = /^(customer|client|person|people|member|user|patient|student|guest|owner|employee|staff|agent|rep|worker|author|driver|technician|mechanic|provider|doctor|physician|nurse|clinician|instructor|teacher)s?$/i;
|
|
56
|
+
const CODE_NAME = /^(label|code|number|num|no|unit|slot|position)$/i;
|
|
57
|
+
const LONG_TEXT = /(description|body|notes?|summary|content|details|comments?|bio|message|text|address|html|markdown)$/i;
|
|
58
|
+
/* A stored vocabulary word's tone, by what the word says. Unrecognised words
|
|
59
|
+
stay neutral: a chip only earns a colour when the word earns it. Arriving
|
|
60
|
+
is an outcome (`received` is good); calling something off is not a failure
|
|
61
|
+
(`cancelled`, `void`, `archived` stay neutral) — red is for what went wrong. */
|
|
62
|
+
const GOOD = /^(done|complete|completed|paid|won|closed_won|active|approved|resolved|shipped|delivered|received|arrived|converted|qualified|success|succeeded|published|accepted|fulfilled|confirmed|live|healthy|passed|hot|good|in_stock|on_track|occupied)$/i;
|
|
63
|
+
const BAD = /^(failed|failure|lost|closed_lost|rejected|denied|overdue|error|expired|churned|declined|blocked|critical|urgent|bounced|cold|suspended|dead|bad|out_of_stock|off_track|no_show)$/i;
|
|
64
|
+
const WARN = /^(hold|on_hold|pending|awaiting|awaiting_\w+|waiting|waiting_\w+|draft|paused|review|in_review|at_risk|warm|high|delayed|late|stale|warn|warning|due|expiring|vacant|partially_paid|partial)$/i;
|
|
65
|
+
const INFO = /^(open|new|in_progress|working|ready|planned|planning|scheduled|submitted|sent|started|processing|info|negotiation|proposal|upcoming|make_ready)$/i;
|
|
66
|
+
/* A stored word is judged as said: "in progress", "no-show" and IN_REVIEW are the same words as in_progress. */
|
|
67
|
+
function wordTone(stored) {
|
|
68
|
+
const value = stored
|
|
69
|
+
.trim()
|
|
70
|
+
.toLowerCase()
|
|
71
|
+
.replace(/[\s-]+/g, '_');
|
|
72
|
+
return GOOD.test(value) ? 'good' : BAD.test(value) ? 'bad' : WARN.test(value) ? 'warn' : INFO.test(value) ? 'info' : 'neutral';
|
|
73
|
+
}
|
|
74
|
+
/** Tones for a short vocabulary, or nothing: a map that colours nothing says nothing. */
|
|
75
|
+
export function vocabularyTones(allowed) {
|
|
76
|
+
if (allowed.length > 12)
|
|
77
|
+
return undefined;
|
|
78
|
+
const map = Object.fromEntries(allowed.map((value) => [value, wordTone(value)]));
|
|
79
|
+
return Object.values(map).some((tone) => tone !== 'neutral' && tone !== 'info') ? map : undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A machine's tones, where the App gives none: a final state is neutral (it is
|
|
83
|
+
* over, however it ended); the open state furthest along that hands the record
|
|
84
|
+
* to a final one (`ready` before `collected`) is good, the work done; a state
|
|
85
|
+
* whose word says it waits (`waiting_parts`, `on_hold`) warns, one whose word
|
|
86
|
+
* says it went wrong is bad, and the rest are neutral or, by their word, info.
|
|
87
|
+
*/
|
|
88
|
+
export function machineTones(machine) {
|
|
89
|
+
const final = new Set(machine.states.filter((state) => state.final).map((state) => state.name));
|
|
90
|
+
/* How far each state is from the first, along any verb. */
|
|
91
|
+
const depth = new Map([[machine.states[0]?.name, 0]]);
|
|
92
|
+
for (let frontier = [machine.states[0]?.name]; frontier.length;) {
|
|
93
|
+
const next = [];
|
|
94
|
+
for (const from of frontier)
|
|
95
|
+
for (const edge of machine.edges)
|
|
96
|
+
if (edge.from === from)
|
|
97
|
+
for (const to of edge.to)
|
|
98
|
+
if (!depth.has(to)) {
|
|
99
|
+
depth.set(to, depth.get(from) + 1);
|
|
100
|
+
next.push(to);
|
|
101
|
+
}
|
|
102
|
+
frontier = next;
|
|
103
|
+
}
|
|
104
|
+
let done;
|
|
105
|
+
for (const state of machine.states) {
|
|
106
|
+
const name = state.name;
|
|
107
|
+
if (state.final || !machine.edges.some((edge) => edge.from === name && edge.to.some((to) => final.has(to))))
|
|
108
|
+
continue;
|
|
109
|
+
if (wordTone(name) === 'warn' || wordTone(name) === 'bad' || (depth.get(name) ?? 0) === 0)
|
|
110
|
+
continue;
|
|
111
|
+
if (done === undefined || (depth.get(name) ?? 0) >= (depth.get(done) ?? 0))
|
|
112
|
+
done = name;
|
|
113
|
+
}
|
|
114
|
+
return Object.fromEntries(machine.states.map((state) => {
|
|
115
|
+
if (state.final)
|
|
116
|
+
return [state.name, 'neutral'];
|
|
117
|
+
if (state.name === done)
|
|
118
|
+
return [state.name, 'good'];
|
|
119
|
+
const word = wordTone(state.name);
|
|
120
|
+
return [state.name, word === 'good' ? 'info' : word];
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
/* The words a vocabulary is said in without a rule: lowercase words joined by `_`, a space or `-` (vocabularyWord).
|
|
124
|
+
A code in capitals (IN_REVIEW) or run together (InReview) needs a `values` map to read as words. */
|
|
125
|
+
const SAID_AS_WORDS = /^[a-z][a-z0-9]*(?:(?:_+| |-)[a-z0-9]+)*$/;
|
|
126
|
+
/** A figure that is money: named like money on a number column, or typed as money. */
|
|
127
|
+
export function isMoneyColumn(column) {
|
|
128
|
+
return (!column.flag &&
|
|
129
|
+
!column.primaryKey &&
|
|
130
|
+
(MONEY_TYPE.test(column.type ?? '') || (columnKind(column.type ?? '') === 'number' && MONEY.test(column.name))));
|
|
131
|
+
}
|
|
132
|
+
/** The App's declared display rules looked up by table, as `InferOptions.declared` reads them. */
|
|
133
|
+
export function declaredDisplayOf(app, schema) {
|
|
134
|
+
const byId = new Map();
|
|
135
|
+
for (const [resource, def] of Object.entries(app.resources ?? {})) {
|
|
136
|
+
const table = def.display && tableNamed(schema, resource);
|
|
137
|
+
if (table && !byId.has(table.id))
|
|
138
|
+
byId.set(table.id, def.display);
|
|
139
|
+
}
|
|
140
|
+
return (table) => byId.get(table.id);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Every rule the conventions give one table's columns, keyed by column. A
|
|
144
|
+
* reference, a key and a column whose type says nothing are left alone.
|
|
145
|
+
*/
|
|
146
|
+
export function inferredDisplay(table, opts = {}) {
|
|
147
|
+
const inferred = {};
|
|
148
|
+
const named = labelColumn(table);
|
|
149
|
+
for (const column of table.columns) {
|
|
150
|
+
if (column.primaryKey || column.references)
|
|
151
|
+
continue;
|
|
152
|
+
const kind = columnKind(column.type ?? '');
|
|
153
|
+
const link = LINKS.find(([pattern]) => pattern.test(column.name));
|
|
154
|
+
const unit = kind === 'number' && !column.flag ? UNITS.find(([pattern]) => pattern.test(column.name)) : undefined;
|
|
155
|
+
let made;
|
|
156
|
+
if (opts.machine?.column === column.name) {
|
|
157
|
+
made = { rule: { tone: machineTones(opts.machine) }, why: "the machine's states: final neutral, the last forward state good" };
|
|
158
|
+
}
|
|
159
|
+
else if (FLAG_NAME.test(column.name) && /int/i.test(column.type ?? '') && !column.flag && !column.allowed?.length) {
|
|
160
|
+
made = { rule: { values: { 0: 'No', 1: 'Yes' } }, why: 'a 0/1 integer named like a yes-or-no' };
|
|
161
|
+
}
|
|
162
|
+
else if (isMoneyColumn(column)) {
|
|
163
|
+
made = { rule: { format: 'money' }, why: MONEY_TYPE.test(column.type ?? '') ? 'a money column' : 'a number named like money' };
|
|
164
|
+
}
|
|
165
|
+
else if (kind === 'number' && PERCENT.test(column.name) && !column.flag) {
|
|
166
|
+
made = { rule: { format: 'percent', bar: true }, why: 'a number named like a percentage' };
|
|
167
|
+
}
|
|
168
|
+
else if (kind === 'number' && YEAR.test(column.name) && !column.flag) {
|
|
169
|
+
made = { rule: { format: 'year' }, why: 'a number named like a year', served: false };
|
|
170
|
+
}
|
|
171
|
+
else if (kind === 'date' && DUE.test(column.name)) {
|
|
172
|
+
made = { rule: { format: 'relative' }, why: 'a date named like a due date, said from today' };
|
|
173
|
+
}
|
|
174
|
+
else if (unit) {
|
|
175
|
+
made = { rule: { unit: unit[1] }, why: `a number whose name says its unit` };
|
|
176
|
+
}
|
|
177
|
+
else if (link && kind === 'text') {
|
|
178
|
+
made = {
|
|
179
|
+
rule: { format: link[1] },
|
|
180
|
+
why: `a text column named like ${link[1] === 'url' ? 'a web address' : link[1] === 'email' ? 'an email' : 'a phone number'}`,
|
|
181
|
+
served: false,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
else if (column.allowed?.length && !column.flag) {
|
|
185
|
+
const tones = vocabularyTones(column.allowed);
|
|
186
|
+
if (tones)
|
|
187
|
+
made = { rule: { tone: tones }, why: 'a vocabulary whose words say a tone' };
|
|
188
|
+
else if (column.allowed.some((value) => !SAID_AS_WORDS.test(value)))
|
|
189
|
+
made = {
|
|
190
|
+
rule: { values: Object.fromEntries(column.allowed.map((value) => [value, displayWord({ humanize: true }, value) ?? value])) },
|
|
191
|
+
why: 'a vocabulary of codes, said as words',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
if (!made && column.name === named && isPeople(table) && strongName(column)) {
|
|
195
|
+
const email = table.columns.find((candidate) => /(^|_)email$/i.test(candidate.name));
|
|
196
|
+
made = {
|
|
197
|
+
rule: { avatar: true, ...(email ? { subtitle: email.name } : {}) },
|
|
198
|
+
why: `a person's name${email ? ', their email under it' : ''}`,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
if (made)
|
|
202
|
+
inferred[column.name] = made;
|
|
203
|
+
}
|
|
204
|
+
/* A figure computed from money is money: `labor + parts`, a sum of charges, the most a line cost. */
|
|
205
|
+
const declaredOn = (of, name) => (of ? opts.declared?.(of)?.[name] : undefined);
|
|
206
|
+
const moneyOn = (of, name) => {
|
|
207
|
+
if (declaredOn(of, name)?.format === 'money')
|
|
208
|
+
return true;
|
|
209
|
+
const stored = of?.columns.find((column) => column.name === name);
|
|
210
|
+
if (stored)
|
|
211
|
+
return isMoneyColumn(stored);
|
|
212
|
+
const computed = of?.computed?.[name];
|
|
213
|
+
if (computed)
|
|
214
|
+
return computed.type === 'number' && moneyExpression(of, computed.reads);
|
|
215
|
+
const rollup = of?.rollups?.[name];
|
|
216
|
+
return Boolean(rollup && rollup.fn !== 'count' && rollup.fn !== 'latest' && rollupMoney(rollup));
|
|
217
|
+
};
|
|
218
|
+
/* A rollup's child, and the child's columns it reads: a sum of money is money. A child's figures never read a
|
|
219
|
+
rollup (appRollupRules), so the walk ends there. */
|
|
220
|
+
const rollupChild = (rollup) => (opts.schema ? tableNamed(opts.schema, rollup.via.slice(0, rollup.via.indexOf('.'))) : undefined);
|
|
221
|
+
const rollupReads = (rollup) => (rollup.expression ? rollup.expression.reads : rollup.column ? [rollup.column] : []);
|
|
222
|
+
const rollupMoney = (rollup) => {
|
|
223
|
+
const child = rollupChild(rollup);
|
|
224
|
+
return Boolean(rollup.column &&
|
|
225
|
+
(rollup.expression
|
|
226
|
+
? rollup.expression.type === 'number' && child && moneyExpression(child, rollup.expression.reads)
|
|
227
|
+
: moneyOn(child, rollup.column)));
|
|
228
|
+
};
|
|
229
|
+
const moneyExpression = (of, reads) => reads.length > 0 && reads.every((path) => !path.includes('.') && moneyOn({ ...of, computed: undefined }, path));
|
|
230
|
+
/* The money a figure is made of says how it is counted: cents in, cents out. A price kept in minor units times a
|
|
231
|
+
quantity is minor units too, and drawn as dollars it would read a hundred times too large. A currency every
|
|
232
|
+
input shares carries the same way; inputs that disagree carry neither. */
|
|
233
|
+
const countedAs = (of, reads, seen = new Set()) => {
|
|
234
|
+
const rules = [];
|
|
235
|
+
for (const path of reads) {
|
|
236
|
+
if (!of || path.includes('.') || !moneyOn(of, path))
|
|
237
|
+
continue;
|
|
238
|
+
const own = declaredOn(of, path);
|
|
239
|
+
const computed = of.computed?.[path];
|
|
240
|
+
const rollup = of.rollups?.[path];
|
|
241
|
+
const key = `${of.id}.${path}`;
|
|
242
|
+
if (own?.format === 'money' || (!computed && !rollup) || seen.has(key))
|
|
243
|
+
rules.push(own ?? {});
|
|
244
|
+
else if (computed)
|
|
245
|
+
rules.push(countedAs(of, computed.reads, new Set([...seen, key])));
|
|
246
|
+
else
|
|
247
|
+
rules.push(countedAs(rollupChild(rollup), rollupReads(rollup), new Set([...seen, key])));
|
|
248
|
+
}
|
|
249
|
+
if (!rules.length)
|
|
250
|
+
return {};
|
|
251
|
+
const minor = rules.every((rule) => rule.minor === true);
|
|
252
|
+
const currency = rules[0].currency;
|
|
253
|
+
return {
|
|
254
|
+
...(minor ? { minor: true } : {}),
|
|
255
|
+
...(currency && rules.every((rule) => rule.currency === currency) ? { currency } : {}),
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
for (const [name, computed] of Object.entries(table.computed ?? {})) {
|
|
259
|
+
if (inferred[name] || computed.type !== 'number')
|
|
260
|
+
continue;
|
|
261
|
+
if (MONEY.test(name) || moneyExpression(table, computed.reads))
|
|
262
|
+
inferred[name] = {
|
|
263
|
+
rule: { format: 'money', ...countedAs(table, computed.reads) },
|
|
264
|
+
why: MONEY.test(name) ? 'a figure named like money' : 'a figure made of money columns',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
for (const [name, rollup] of Object.entries(table.rollups ?? {})) {
|
|
268
|
+
if (inferred[name] || rollup.fn === 'count' || rollup.fn === 'latest' || columnKind(rollup.type) !== 'number')
|
|
269
|
+
continue;
|
|
270
|
+
const fromMoney = rollupMoney(rollup);
|
|
271
|
+
if (fromMoney || MONEY.test(name))
|
|
272
|
+
inferred[name] = {
|
|
273
|
+
rule: { format: 'money', ...countedAs(rollupChild(rollup), rollupReads(rollup)) },
|
|
274
|
+
why: fromMoney ? `a ${rollup.fn} of money` : 'a figure named like money',
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
return inferred;
|
|
278
|
+
}
|
|
279
|
+
/* A name a person is known by: one every row has, not a key, a code or a note. */
|
|
280
|
+
const strongName = (column) => !column.primaryKey &&
|
|
281
|
+
!column.nullable &&
|
|
282
|
+
!LONG_TEXT.test(column.name) &&
|
|
283
|
+
!CODE_NAME.test(column.name) &&
|
|
284
|
+
!isFlagColumn(column) &&
|
|
285
|
+
columnKind(column.type) === 'text';
|
|
286
|
+
/** Rows that are people, by the table's head noun. */
|
|
287
|
+
export function isPeople(table) {
|
|
288
|
+
const local = table.name.slice(table.name.lastIndexOf('.') + 1).toLowerCase();
|
|
289
|
+
return PEOPLE.test(local) || PEOPLE.test(local.slice(local.lastIndexOf('_') + 1));
|
|
290
|
+
}
|
|
291
|
+
/* Each concern of a rule, by the keys that say it: a declared key of a concern replaces the inferred concern whole. */
|
|
292
|
+
const CONCERNS = [
|
|
293
|
+
{
|
|
294
|
+
name: 'figure',
|
|
295
|
+
owns: ['format', 'bar', 'unit', 'minor', 'currency'],
|
|
296
|
+
displaces: ['format', 'bar', 'unit', 'ring', 'slider', 'outOf', 'max', 'minor', 'currency', 'currencyColumn', 'values', 'avatar'],
|
|
297
|
+
},
|
|
298
|
+
{ name: 'words', owns: ['values'], displaces: ['values', 'format'] },
|
|
299
|
+
{ name: 'tone', owns: ['tone'], displaces: ['tone', 'colors'] },
|
|
300
|
+
{ name: 'disc', owns: ['avatar', 'subtitle'], displaces: ['avatar', 'icon', 'format', 'subtitle'] },
|
|
301
|
+
];
|
|
302
|
+
const WHOLE = ['component', 'masked'];
|
|
303
|
+
/** The inferred concerns a declared rule leaves standing: what the App did not say about that part of the column. */
|
|
304
|
+
function standingInferred(inferred, declared) {
|
|
305
|
+
if (!declared)
|
|
306
|
+
return inferred;
|
|
307
|
+
const said = Object.keys(declared);
|
|
308
|
+
// An empty rule keeps the column as stored; a component or a mask draws it whole.
|
|
309
|
+
if (!said.length || said.some((key) => WHOLE.includes(key)))
|
|
310
|
+
return {};
|
|
311
|
+
const kept = {};
|
|
312
|
+
for (const concern of CONCERNS) {
|
|
313
|
+
if (concern.displaces.some((key) => said.includes(key)))
|
|
314
|
+
continue;
|
|
315
|
+
for (const key of concern.owns)
|
|
316
|
+
if (inferred[key] !== undefined)
|
|
317
|
+
kept[key] = inferred[key];
|
|
318
|
+
}
|
|
319
|
+
return kept;
|
|
320
|
+
}
|
|
321
|
+
/** The rule a column is drawn by: the inferred concerns the App left standing, under what the App wrote. */
|
|
322
|
+
function withInferred(inferred, declared) {
|
|
323
|
+
if (!inferred)
|
|
324
|
+
return declared;
|
|
325
|
+
const standing = standingInferred(inferred, declared);
|
|
326
|
+
if (!Object.keys(standing).length)
|
|
327
|
+
return declared;
|
|
328
|
+
return { ...standing, ...declared };
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* The concerns of a declared rule that say exactly what the conventions
|
|
332
|
+
* would: each is a deletion. A tone map is the same when it gives every value
|
|
333
|
+
* the inferred tone; a figure when its format, bar and unit are the inferred ones.
|
|
334
|
+
*/
|
|
335
|
+
function restatedConcerns(inferred, declared) {
|
|
336
|
+
const found = [];
|
|
337
|
+
if (Object.keys(declared).some((key) => WHOLE.includes(key)))
|
|
338
|
+
return found;
|
|
339
|
+
const same = (a, b) => JSON.stringify(sorted(a)) === JSON.stringify(sorted(b));
|
|
340
|
+
for (const concern of CONCERNS) {
|
|
341
|
+
const own = concern.owns.filter((key) => inferred[key] !== undefined);
|
|
342
|
+
if (!own.length)
|
|
343
|
+
continue;
|
|
344
|
+
const declaredKeys = Object.keys(declared).filter((key) => concern.displaces.includes(key));
|
|
345
|
+
if (!declaredKeys.length || declaredKeys.some((key) => !own.includes(key)))
|
|
346
|
+
continue;
|
|
347
|
+
if (own.every((key) => same(inferred[key], declared[key])))
|
|
348
|
+
found.push({ keys: own, said: own.map((key) => `${key}: ${JSON.stringify(declared[key])}`).join(', ') });
|
|
349
|
+
}
|
|
350
|
+
return found;
|
|
351
|
+
}
|
|
352
|
+
function sorted(value) {
|
|
353
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
354
|
+
return value;
|
|
355
|
+
return Object.fromEntries(Object.entries(value)
|
|
356
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
357
|
+
.map(([k, v]) => [k, sorted(v)]));
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* A resource's display rules as they are drawn: each column's declared rule
|
|
361
|
+
* over the conventions it leaves standing, and a rule for every column the
|
|
362
|
+
* conventions dress that the App did not mention. `served` keeps only what the
|
|
363
|
+
* server sends (the browser reads a year and a link off the name itself).
|
|
364
|
+
*/
|
|
365
|
+
export function effectiveDisplay(declared, table, opts = {}) {
|
|
366
|
+
const out = { ...declared };
|
|
367
|
+
for (const [column, inferred] of Object.entries(inferredDisplay(table, opts))) {
|
|
368
|
+
if (opts.served && inferred.served === false)
|
|
369
|
+
continue;
|
|
370
|
+
const merged = withInferred(inferred.rule, declared?.[column]);
|
|
371
|
+
if (merged)
|
|
372
|
+
out[column] = merged;
|
|
373
|
+
}
|
|
374
|
+
return out;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Every declared value the platform derives, so deleting it changes nothing:
|
|
378
|
+
* a display rule or concern of one the conventions give, a caption the screens
|
|
379
|
+
* say anyway, a record label that is the label column, a `number` format beside
|
|
380
|
+
* a unit, the App's own currency, a word a vocabulary says by itself, a form
|
|
381
|
+
* default that is the schema's DEFAULT, a verb's stamp its state writes on
|
|
382
|
+
* entry. `check` warns on each (`restated`) and `check --design --fix` deletes
|
|
383
|
+
* exactly these, so the two never disagree.
|
|
384
|
+
*/
|
|
385
|
+
export function restatedDefaults(app, schema) {
|
|
386
|
+
const found = [];
|
|
387
|
+
const resources = app.resources ?? {};
|
|
388
|
+
const own = app.ui?.currency ?? 'USD';
|
|
389
|
+
for (const [resource, def] of Object.entries(resources)) {
|
|
390
|
+
const table = tableNamed(schema, resource);
|
|
391
|
+
const where = `resources "${resource}" [restated]`;
|
|
392
|
+
if (table) {
|
|
393
|
+
for (const [path, said] of Object.entries(def.labels ?? {})) {
|
|
394
|
+
const { [path]: _stated, ...rest } = def.labels;
|
|
395
|
+
const derived = columnCaption({ ...resources, [resource]: { ...def, labels: rest } }, schema, table.id, path);
|
|
396
|
+
if (derived === said)
|
|
397
|
+
found.push({
|
|
398
|
+
resource,
|
|
399
|
+
at: ['labels'],
|
|
400
|
+
keys: [path],
|
|
401
|
+
held: def.labels,
|
|
402
|
+
whole: Object.keys(def.labels).length === 1,
|
|
403
|
+
warning: `${where}: labels "${path}" says "${said}", which the screens say without it. Delete it.`,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
if (def.recordLabel !== undefined && def.recordLabel === labelColumn(table))
|
|
407
|
+
found.push({
|
|
408
|
+
resource,
|
|
409
|
+
at: [],
|
|
410
|
+
keys: ['recordLabel'],
|
|
411
|
+
whole: false,
|
|
412
|
+
warning: `${where}: recordLabel "${def.recordLabel}" is the table's label column already. Delete it.`,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
const inferred = table ? inferredDisplay(table, { machine: def.machine, schema }) : {};
|
|
416
|
+
for (const [column, rule] of Object.entries(def.display ?? {})) {
|
|
417
|
+
if (!rule)
|
|
418
|
+
continue;
|
|
419
|
+
const held = rule;
|
|
420
|
+
const convention = inferred[column];
|
|
421
|
+
const concerns = convention && Object.keys(rule).length ? restatedConcerns(convention.rule, rule) : [];
|
|
422
|
+
if (concerns.length) {
|
|
423
|
+
const keys = concerns.flatMap((concern) => concern.keys);
|
|
424
|
+
const whole = Object.keys(rule).every((key) => keys.includes(key));
|
|
425
|
+
found.push({
|
|
426
|
+
resource,
|
|
427
|
+
at: ['display', column],
|
|
428
|
+
keys,
|
|
429
|
+
held,
|
|
430
|
+
whole,
|
|
431
|
+
warning: `${where}: display "${column}" says ${concerns.map((concern) => concern.said).join(', ')}, which the platform infers ` +
|
|
432
|
+
`(${convention.why}). Delete ${whole ? 'the rule' : keys.length > 1 ? 'those keys' : 'it'}.`,
|
|
433
|
+
});
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
if (rule.format === 'number' && rule.unit !== undefined)
|
|
437
|
+
found.push({
|
|
438
|
+
resource,
|
|
439
|
+
at: ['display', column],
|
|
440
|
+
keys: ['format'],
|
|
441
|
+
held,
|
|
442
|
+
whole: false,
|
|
443
|
+
warning: `${where}: display "${column}" says format: 'number' beside a unit, which already means a number. Delete the format.`,
|
|
444
|
+
});
|
|
445
|
+
/* A declared vocabulary (a check constraint, an enum) or a toned column says its values as words already, so an
|
|
446
|
+
entry whose word is what that gives says nothing. A free-text column keeps its stored words. */
|
|
447
|
+
const stored = table?.columns.find((candidate) => candidate.name === column);
|
|
448
|
+
const allowed = stored?.allowed;
|
|
449
|
+
/* Without a declared vocabulary, the keys of `values` are the order a `steps` breakdown, a chart and a donut
|
|
450
|
+
read the column in (client groupOrder.ts declaredOrder), so deleting one reorders them: only a column the
|
|
451
|
+
order does not read them from (a reference, or a vocabulary that has its own) has them restated. */
|
|
452
|
+
const orders = !allowed?.length && !stored?.references;
|
|
453
|
+
for (const [value, said] of Object.entries(rule.values ?? {}))
|
|
454
|
+
if ((allowed?.includes(value) || (rule.tone !== undefined && !orders)) && displayWord({ humanize: true }, value) === said)
|
|
455
|
+
found.push({
|
|
456
|
+
resource,
|
|
457
|
+
at: ['display', column, 'values'],
|
|
458
|
+
keys: [value],
|
|
459
|
+
held: rule.values,
|
|
460
|
+
whole: false,
|
|
461
|
+
warning: `${where}: display "${column}" values "${value}" says "${said}", which the screens say without it. Delete it.`,
|
|
462
|
+
});
|
|
463
|
+
if (rule.format === 'money' && rule.currency !== undefined && rule.currency.toUpperCase() === own)
|
|
464
|
+
found.push({
|
|
465
|
+
resource,
|
|
466
|
+
at: ['display', column],
|
|
467
|
+
keys: ['currency'],
|
|
468
|
+
held,
|
|
469
|
+
whole: false,
|
|
470
|
+
warning: `${where}: display "${column}" says currency: '${rule.currency}', which is the App's currency (ui.currency, else USD). Delete it.`,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
if (!table)
|
|
474
|
+
continue;
|
|
475
|
+
/* A verb that stamps the state it enters, by hand: the machine stamps `ready_at` on entry to `ready` already. */
|
|
476
|
+
for (const edge of def.machine?.edges ?? []) {
|
|
477
|
+
const set = edge.fixed?.set ?? {};
|
|
478
|
+
for (const to of edge.to.length === 1 ? edge.to : []) {
|
|
479
|
+
const stamp = stateStampColumn(to, table.columns, def.machine);
|
|
480
|
+
const said = stamp ? stampWord(set[stamp.name]) : undefined;
|
|
481
|
+
if (stamp && (said === 'now' || said === 'today'))
|
|
482
|
+
found.push({
|
|
483
|
+
resource,
|
|
484
|
+
at: ['set'],
|
|
485
|
+
keys: [stamp.name],
|
|
486
|
+
held: set,
|
|
487
|
+
whole: Object.keys(set).length === 1,
|
|
488
|
+
warning: `${where}: machine verb "${edge.verb}" says set: { ${stamp.name}: ${said} }, which the platform infers ` +
|
|
489
|
+
`("${stamp.name}" is stamped as the record enters "${to}"). Delete it.`,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
const schemaDefaults = inferredFormDefaults(table);
|
|
494
|
+
const declared = (def.form?.defaults ?? {});
|
|
495
|
+
for (const column of Object.keys(declared).filter((name) => schemaDefaults[name] !== undefined && declared[name] === schemaDefaults[name]))
|
|
496
|
+
found.push({
|
|
497
|
+
resource,
|
|
498
|
+
at: ['defaults'],
|
|
499
|
+
keys: [column],
|
|
500
|
+
held: declared,
|
|
501
|
+
whole: false,
|
|
502
|
+
warning: `${where}: form defaults "${column}" says ${JSON.stringify(declared[column])}, which the platform infers ` +
|
|
503
|
+
"(the column's schema DEFAULT). Delete it.",
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
return found;
|
|
507
|
+
}
|
|
508
|
+
/* A stamp word as written: the DSL's constant (`now`, an `{ auto: 'now' }`) or the word itself. */
|
|
509
|
+
const stampWord = (value) => value && typeof value === 'object' && 'auto' in value
|
|
510
|
+
? String(value.auto)
|
|
511
|
+
: typeof value === 'string'
|
|
512
|
+
? value
|
|
513
|
+
: undefined;
|
|
514
|
+
/** What `check --defaults` prints: each declared resource's inferred rules, and whether the App's own rule wins. */
|
|
515
|
+
export function inferredReport(app, schema) {
|
|
516
|
+
const rows = [];
|
|
517
|
+
const declaredOf = declaredDisplayOf(app, schema);
|
|
518
|
+
for (const [resource, def] of Object.entries(app.resources ?? {})) {
|
|
519
|
+
const table = tableNamed(schema, resource);
|
|
520
|
+
if (!table)
|
|
521
|
+
continue;
|
|
522
|
+
for (const [column, inferred] of Object.entries(inferredDisplay(table, { machine: def.machine, schema, declared: declaredOf }))) {
|
|
523
|
+
const declared = def.display?.[column];
|
|
524
|
+
const standing = standingInferred(inferred.rule, declared);
|
|
525
|
+
rows.push({ resource, column, rule: inferred.rule, why: inferred.why, overridden: !Object.keys(standing).length });
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
return rows;
|
|
529
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A date named like a due date (`due_on`, `deadline`): the convention says it from today
|
|
3
|
+
* (displayDefaults.ts), and the client draws one that has passed on a row still open in the
|
|
4
|
+
* warning tone (client/components/dueOpen.ts). One name list, so the two cannot disagree.
|
|
5
|
+
*/
|
|
6
|
+
export declare const DUE: RegExp;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A date named like a due date (`due_on`, `deadline`): the convention says it from today
|
|
3
|
+
* (displayDefaults.ts), and the client draws one that has passed on a row still open in the
|
|
4
|
+
* warning tone (client/components/dueOpen.ts). One name list, so the two cannot disagree.
|
|
5
|
+
*/
|
|
6
|
+
export const DUE = /^(due|due_on|due_at|due_date|deadline)$/i;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** What a refusal says a duration is, to finish its own sentence. */
|
|
2
|
+
export declare const DURATION_WORDS = "a whole number and seconds, minutes, hours, days or weeks, like '30 seconds' or '3 days'";
|
|
3
|
+
/** A duration in milliseconds, or undefined for anything that is not `'<n> <unit>'`. Zero reads as zero; a caller that needs more refuses it. */
|
|
4
|
+
export declare function parseDuration(value: unknown): number | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one spelling of "how long" in the App DSL: a whole number and a unit,
|
|
3
|
+
* `'30 seconds'`, `'5 minutes'`, `'12 hours'`, `'3 days'`, `'2 weeks'`. A
|
|
4
|
+
* machine's timer, a workflow's sleep, retry and timeout, an HMAC's timestamp
|
|
5
|
+
* window, a saved form's resume and an experiment's conversion window
|
|
6
|
+
* all read it here, so a duration an author learns once
|
|
7
|
+
* works everywhere; each caller says only how long is too long (or too short)
|
|
8
|
+
* for it.
|
|
9
|
+
*/
|
|
10
|
+
const UNITS = Object.freeze({
|
|
11
|
+
second: 1_000,
|
|
12
|
+
minute: 60_000,
|
|
13
|
+
hour: 3_600_000,
|
|
14
|
+
day: 86_400_000,
|
|
15
|
+
week: 604_800_000,
|
|
16
|
+
});
|
|
17
|
+
/** What a refusal says a duration is, to finish its own sentence. */
|
|
18
|
+
export const DURATION_WORDS = "a whole number and seconds, minutes, hours, days or weeks, like '30 seconds' or '3 days'";
|
|
19
|
+
/** A duration in milliseconds, or undefined for anything that is not `'<n> <unit>'`. Zero reads as zero; a caller that needs more refuses it. */
|
|
20
|
+
export function parseDuration(value) {
|
|
21
|
+
const match = typeof value === 'string' ? /^\s*(\d{1,9})\s+(second|minute|hour|day|week)s?\s*$/.exec(value) : null;
|
|
22
|
+
return match ? Number(match[1]) * UNITS[match[2]] : undefined;
|
|
23
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The most bytes one uploaded file may be, whatever a resource says: an App's
|
|
3
|
+
* `file` block may ask for less, never more (appModel.ts), and the server
|
|
4
|
+
* sizes the one request body allowed past its usual bound from it (server
|
|
5
|
+
* http/reply.ts FILE_UPLOAD_BODY). Uploads cross as base64 inside JSON.
|
|
6
|
+
*/
|
|
7
|
+
export declare const FILE_MAX_BYTES_CEILING: number;
|
|
8
|
+
/** An upload's cap when the resource does not say. */
|
|
9
|
+
export declare const FILE_MAX_BYTES_DEFAULT: number;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The most bytes one uploaded file may be, whatever a resource says: an App's
|
|
3
|
+
* `file` block may ask for less, never more (appModel.ts), and the server
|
|
4
|
+
* sizes the one request body allowed past its usual bound from it (server
|
|
5
|
+
* http/reply.ts FILE_UPLOAD_BODY). Uploads cross as base64 inside JSON.
|
|
6
|
+
*/
|
|
7
|
+
export const FILE_MAX_BYTES_CEILING = 25 * 1024 * 1024;
|
|
8
|
+
/** An upload's cap when the resource does not say. */
|
|
9
|
+
export const FILE_MAX_BYTES_DEFAULT = 10 * 1024 * 1024;
|