@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,45 @@
|
|
|
1
|
+
export const PLACEMENTS = ['side', 'top'];
|
|
2
|
+
/**
|
|
3
|
+
* The entries this reader may use, in the App's order. Its words are the
|
|
4
|
+
* entry's own, else a list's noun ("Ticket", its resource's singular) or the
|
|
5
|
+
* form's heading.
|
|
6
|
+
*/
|
|
7
|
+
export function newMenuEntries(served, views, reader, noun) {
|
|
8
|
+
return (served ?? []).flatMap((entry) => {
|
|
9
|
+
const view = views[entry.view];
|
|
10
|
+
if (!view || view.error)
|
|
11
|
+
return [];
|
|
12
|
+
/* Its mark and its group's heading, where it has them. */
|
|
13
|
+
const dress = {
|
|
14
|
+
...(entry.icon === undefined ? {} : { icon: entry.icon }),
|
|
15
|
+
...(entry.group === undefined ? {} : { group: entry.group }),
|
|
16
|
+
};
|
|
17
|
+
if (isServedForm(view)) {
|
|
18
|
+
if (!reader.grantedCommands?.includes(view.command.id))
|
|
19
|
+
return [];
|
|
20
|
+
return [{ view: entry.view, label: entry.label ?? view.label, ...dress }];
|
|
21
|
+
}
|
|
22
|
+
if (typeof view.table !== 'string' || !reader.canAdd(view.table))
|
|
23
|
+
return [];
|
|
24
|
+
return [{ view: entry.view, label: entry.label ?? noun(entry.view, view.table), table: view.table, ...dress }];
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Whether a view is a command form: the one kind of view that runs a command. */
|
|
28
|
+
export const isServedForm = (view) => Object.hasOwn(view, 'command');
|
|
29
|
+
/** The view keys nav references, depth first: the menu's order. */
|
|
30
|
+
export function navViewKeys(nav) {
|
|
31
|
+
return nav.flatMap((node) => ('group' in node ? navViewKeys(node.children) : 'view' in node ? [node.view] : []));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Every view key in the order rooms are listed: the menu's, then the views
|
|
35
|
+
* nav does not reference (a home nav does not list, and a list view only a
|
|
36
|
+
* dashboard embeds). Never the keys'
|
|
37
|
+
* own order — an object puts a key like "2024" before every other.
|
|
38
|
+
*/
|
|
39
|
+
export function viewOrder(app) {
|
|
40
|
+
const keys = navViewKeys(app.nav).filter((key) => Object.hasOwn(app.views, key));
|
|
41
|
+
return [...keys, ...Object.keys(app.views).filter((key) => !keys.includes(key))];
|
|
42
|
+
}
|
|
43
|
+
/** The assistant's own room, where its App gives it a page (`placement: 'page'`, appAssistant.ts): its word in
|
|
44
|
+
* nav, and its address, `/{app}/assistant` and `/{app}/assistant/{conversation}` for one conversation. */
|
|
45
|
+
export const ASSISTANT_ROOM = 'assistant';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The lease a session's requests carry once a tenant is chosen, as the
|
|
3
|
+
* client's session identity holds it (client sessionIdentity.ts): who it is
|
|
4
|
+
* for, and the platform realm's reserved id that its shape is checked
|
|
5
|
+
* against when it is adopted. Below the kit because the kit's session
|
|
6
|
+
* identity checks it; the tenancy that issues one, and the headers a
|
|
7
|
+
* request asserts it by, are the App framework's (tenantContext.ts, which
|
|
8
|
+
* says these again for its own readers).
|
|
9
|
+
*/
|
|
10
|
+
export interface TenantContextOwner {
|
|
11
|
+
readonly tabId: string;
|
|
12
|
+
readonly context: string;
|
|
13
|
+
readonly appId: string;
|
|
14
|
+
readonly accountId: string;
|
|
15
|
+
/** The selected tenant. In the platform realm it is the reserved
|
|
16
|
+
`@platform`, which no `?tenant=` selector can name. */
|
|
17
|
+
readonly tenantId: string;
|
|
18
|
+
/** Present only for a lease in the platform realm, which reads across
|
|
19
|
+
tenants, or for a support session's lease inside one dealer (its
|
|
20
|
+
`tenantId`), which may read that dealer's rows — every read ledgered —
|
|
21
|
+
and writes nothing; a tenant's lease carries no realm. */
|
|
22
|
+
readonly realm?: 'platform' | 'support';
|
|
23
|
+
/** The support session this lease is inside. Present only under
|
|
24
|
+
`realm: 'support'`, and only the id the caller opened the session with:
|
|
25
|
+
it names the row each ledgered read is recorded against. */
|
|
26
|
+
readonly supportId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface TenantContextReply extends TenantContextOwner {
|
|
29
|
+
readonly revision: number;
|
|
30
|
+
readonly expiresAt: number;
|
|
31
|
+
}
|
|
32
|
+
/** The platform realm's reserved context id. It fails every tenant selector,
|
|
33
|
+
* so only `?realm=platform` reaches it. */
|
|
34
|
+
export declare const PLATFORM_TENANT_ID = "@platform";
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What is in this database, answered from the catalog alone.
|
|
3
|
+
*
|
|
4
|
+
* The first minute with an unfamiliar schema is spent on questions the
|
|
5
|
+
* structure already answers: where does this thing centre, what are the tables
|
|
6
|
+
* I will actually query, how deep does it go, and what is that lump over there
|
|
7
|
+
* connected to nothing. The diagram shows all of it at once, which is a
|
|
8
|
+
* different thing from saying it — a picture of sixty-six tables answers "what
|
|
9
|
+
* is in here" only for someone who already knows.
|
|
10
|
+
*
|
|
11
|
+
* This is the non-model version of the feature the backlog files under LLM
|
|
12
|
+
* assistance, and it is the honest first version: everything below is derived
|
|
13
|
+
* from foreign keys that were introspected on connect, so it costs no network,
|
|
14
|
+
* no key, and cannot be wrong about a table it hallucinated.
|
|
15
|
+
*
|
|
16
|
+
* Pure on purpose — no DOM, no state, no imports. It takes a schema and returns
|
|
17
|
+
* a description, which is what makes it testable without a browser.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Describe a schema's shape.
|
|
21
|
+
*
|
|
22
|
+
* @param {{tables: Array, foreignKeys: Array}} schema
|
|
23
|
+
* @returns {{
|
|
24
|
+
* counts: {tables: number, views: number, keys: number},
|
|
25
|
+
* hubs: Array<{table: object, incoming: number, from: string[]}>,
|
|
26
|
+
* leaves: object[],
|
|
27
|
+
* joins: Array<{table: object, connects: string[]}>,
|
|
28
|
+
* chain: object[],
|
|
29
|
+
* islands: object[],
|
|
30
|
+
* start: object | null,
|
|
31
|
+
* }}
|
|
32
|
+
*/
|
|
33
|
+
export declare function describeSchema(schema: {
|
|
34
|
+
tables: any[];
|
|
35
|
+
foreignKeys: any[];
|
|
36
|
+
}): {
|
|
37
|
+
counts: {
|
|
38
|
+
tables: number;
|
|
39
|
+
views: number;
|
|
40
|
+
keys: number;
|
|
41
|
+
};
|
|
42
|
+
hubs: Array<{
|
|
43
|
+
table: object;
|
|
44
|
+
incoming: number;
|
|
45
|
+
from: string[];
|
|
46
|
+
}>;
|
|
47
|
+
leaves: object[];
|
|
48
|
+
joins: Array<{
|
|
49
|
+
table: object;
|
|
50
|
+
connects: string[];
|
|
51
|
+
}>;
|
|
52
|
+
chain: object[];
|
|
53
|
+
islands: object[];
|
|
54
|
+
start: object | null;
|
|
55
|
+
};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What is in this database, answered from the catalog alone.
|
|
3
|
+
*
|
|
4
|
+
* The first minute with an unfamiliar schema is spent on questions the
|
|
5
|
+
* structure already answers: where does this thing centre, what are the tables
|
|
6
|
+
* I will actually query, how deep does it go, and what is that lump over there
|
|
7
|
+
* connected to nothing. The diagram shows all of it at once, which is a
|
|
8
|
+
* different thing from saying it — a picture of sixty-six tables answers "what
|
|
9
|
+
* is in here" only for someone who already knows.
|
|
10
|
+
*
|
|
11
|
+
* This is the non-model version of the feature the backlog files under LLM
|
|
12
|
+
* assistance, and it is the honest first version: everything below is derived
|
|
13
|
+
* from foreign keys that were introspected on connect, so it costs no network,
|
|
14
|
+
* no key, and cannot be wrong about a table it hallucinated.
|
|
15
|
+
*
|
|
16
|
+
* Pure on purpose — no DOM, no state, no imports. It takes a schema and returns
|
|
17
|
+
* a description, which is what makes it testable without a browser.
|
|
18
|
+
*/
|
|
19
|
+
/** A table has to be pointed at by this many others before it is a hub. */
|
|
20
|
+
const HUB_MINIMUM = 2;
|
|
21
|
+
/** How much of a table has to be foreign keys before it is a join table. */
|
|
22
|
+
const JOIN_RATIO = 0.6;
|
|
23
|
+
/**
|
|
24
|
+
* Describe a schema's shape.
|
|
25
|
+
*
|
|
26
|
+
* @param {{tables: Array, foreignKeys: Array}} schema
|
|
27
|
+
* @returns {{
|
|
28
|
+
* counts: {tables: number, views: number, keys: number},
|
|
29
|
+
* hubs: Array<{table: object, incoming: number, from: string[]}>,
|
|
30
|
+
* leaves: object[],
|
|
31
|
+
* joins: Array<{table: object, connects: string[]}>,
|
|
32
|
+
* chain: object[],
|
|
33
|
+
* islands: object[],
|
|
34
|
+
* start: object | null,
|
|
35
|
+
* }}
|
|
36
|
+
*/
|
|
37
|
+
export function describeSchema(schema) {
|
|
38
|
+
const tables = schema?.tables ?? [];
|
|
39
|
+
const keys = (schema?.foreignKeys ?? []).filter((fk) => fk.from.table !== fk.to.table);
|
|
40
|
+
const byId = new Map(tables.map((t) => [t.id, t]));
|
|
41
|
+
/* Counted as *distinct tables*, not constraints. `work_order` pointing at
|
|
42
|
+
`employee` three times — raised_by, assigned_to, approved_by — says one
|
|
43
|
+
thing about the shape, not three, and counting constraints would rank a
|
|
44
|
+
table by how many roles one neighbour plays in it. */
|
|
45
|
+
const incoming = new Map(tables.map((t) => [t.id, new Set()]));
|
|
46
|
+
const outgoing = new Map(tables.map((t) => [t.id, new Set()]));
|
|
47
|
+
for (const fk of keys) {
|
|
48
|
+
incoming.get(fk.to.table)?.add(fk.from.table);
|
|
49
|
+
outgoing.get(fk.from.table)?.add(fk.to.table);
|
|
50
|
+
}
|
|
51
|
+
const inCount = (t) => incoming.get(t.id)?.size ?? 0;
|
|
52
|
+
const outCount = (t) => outgoing.get(t.id)?.size ?? 0;
|
|
53
|
+
const real = tables.filter((t) => !t.isView);
|
|
54
|
+
const hubs = real
|
|
55
|
+
.filter((t) => inCount(t) >= HUB_MINIMUM)
|
|
56
|
+
.sort((a, b) => inCount(b) - inCount(a) || a.name.localeCompare(b.name))
|
|
57
|
+
.slice(0, 4)
|
|
58
|
+
.map((table) => ({
|
|
59
|
+
table,
|
|
60
|
+
incoming: inCount(table),
|
|
61
|
+
from: [...(incoming.get(table.id) ?? [])].map((id) => byId.get(id)?.name ?? id).sort(),
|
|
62
|
+
}));
|
|
63
|
+
/* Leaves point outwards and are pointed at by nothing, which is what a
|
|
64
|
+
transaction or an event table looks like: the thing that happened, hanging
|
|
65
|
+
off the things it happened to. They are usually what someone actually
|
|
66
|
+
wants to query, and they are the least visible in a diagram because they
|
|
67
|
+
sit at the edges. */
|
|
68
|
+
const leaves = real
|
|
69
|
+
.filter((t) => outCount(t) > 0 && inCount(t) === 0)
|
|
70
|
+
.sort((a, b) => outCount(b) - outCount(a) || a.name.localeCompare(b.name));
|
|
71
|
+
/* A join table is mostly foreign keys, points at two or more things, and —
|
|
72
|
+
the part that separates it from a lookup table — is pointed at by almost
|
|
73
|
+
nothing itself. A join table *connects* things; things do not connect to
|
|
74
|
+
it.
|
|
75
|
+
|
|
76
|
+
Without that last clause `country` qualifies: three of its five columns are
|
|
77
|
+
references, to currency, language and region. But half the schema points at
|
|
78
|
+
`country`, which makes it a dimension everyone shares rather than a bridge
|
|
79
|
+
between two tables, and calling it a join table would mislead about the
|
|
80
|
+
one thing this list exists to say. */
|
|
81
|
+
const joins = real
|
|
82
|
+
.filter((t) => {
|
|
83
|
+
const fkColumns = t.columns.filter((c) => c.references).length;
|
|
84
|
+
return outCount(t) >= 2 && inCount(t) <= 1 && t.columns.length > 0 && fkColumns / t.columns.length >= JOIN_RATIO;
|
|
85
|
+
})
|
|
86
|
+
.map((table) => ({
|
|
87
|
+
table,
|
|
88
|
+
connects: [...(outgoing.get(table.id) ?? [])].map((id) => byId.get(id)?.name ?? id).sort(),
|
|
89
|
+
}));
|
|
90
|
+
return {
|
|
91
|
+
counts: {
|
|
92
|
+
tables: real.length,
|
|
93
|
+
views: tables.length - real.length,
|
|
94
|
+
keys: schema?.foreignKeys?.length ?? 0,
|
|
95
|
+
},
|
|
96
|
+
hubs,
|
|
97
|
+
leaves,
|
|
98
|
+
joins,
|
|
99
|
+
chain: longestChain(tables, outgoing)
|
|
100
|
+
.map((id) => byId.get(id))
|
|
101
|
+
.filter(Boolean),
|
|
102
|
+
islands: real.filter((t) => inCount(t) === 0 && outCount(t) === 0),
|
|
103
|
+
start: suggestStart(real, inCount, outCount),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The longest path of references, as the tables along it.
|
|
108
|
+
*
|
|
109
|
+
* The diagram computes the same *depth* to lay itself out, but a number is not
|
|
110
|
+
* the interesting part — "five levels deep" says less than "region → country →
|
|
111
|
+
* address → site → building → room", which is the shape of the domain written
|
|
112
|
+
* out. Recomputed here rather than shared because the diagram throws the path
|
|
113
|
+
* away and keeps only the count.
|
|
114
|
+
*
|
|
115
|
+
* A cycle is broken at the first table already on the path. A circular schema
|
|
116
|
+
* has no longest chain, and the alternative to stopping is not stopping.
|
|
117
|
+
*/
|
|
118
|
+
function longestChain(tables, outgoing) {
|
|
119
|
+
const best = new Map();
|
|
120
|
+
const walk = (id, seen) => {
|
|
121
|
+
if (seen.has(id))
|
|
122
|
+
return [];
|
|
123
|
+
if (best.has(id))
|
|
124
|
+
return best.get(id);
|
|
125
|
+
seen.add(id);
|
|
126
|
+
let longest = [];
|
|
127
|
+
for (const next of outgoing.get(id) ?? []) {
|
|
128
|
+
const path = walk(next, seen);
|
|
129
|
+
if (path.length > longest.length)
|
|
130
|
+
longest = path;
|
|
131
|
+
}
|
|
132
|
+
seen.delete(id);
|
|
133
|
+
const result = [id, ...longest];
|
|
134
|
+
/* Only memoised when the walk was not truncated by the cycle guard — a
|
|
135
|
+
path cut short by `seen` is an answer about this route, not about this
|
|
136
|
+
table, and caching it would poison every later route through it. */
|
|
137
|
+
if (!longest.some((t) => seen.has(t)))
|
|
138
|
+
best.set(id, result);
|
|
139
|
+
return result;
|
|
140
|
+
};
|
|
141
|
+
let chain = [];
|
|
142
|
+
for (const t of tables) {
|
|
143
|
+
const path = walk(t.id, new Set());
|
|
144
|
+
if (path.length > chain.length)
|
|
145
|
+
chain = path;
|
|
146
|
+
}
|
|
147
|
+
return chain.length > 1 ? chain : [];
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Where to start reading.
|
|
151
|
+
*
|
|
152
|
+
* The table that connects to the most, with a readable name to recognise rows
|
|
153
|
+
* by. Both halves matter: a join table is highly connected and tells you
|
|
154
|
+
* nothing on its own, and a lookup table is readable and leads nowhere.
|
|
155
|
+
*/
|
|
156
|
+
function suggestStart(tables, inCount, outCount) {
|
|
157
|
+
const scored = tables
|
|
158
|
+
.filter((t) => t.columns.some((c) => !c.primaryKey && !c.references))
|
|
159
|
+
.map((t) => ({
|
|
160
|
+
table: t,
|
|
161
|
+
// Outgoing weighted higher: a table you can walk *from* opens more of the
|
|
162
|
+
// schema than one that is merely popular.
|
|
163
|
+
score: outCount(t) * 2 + inCount(t),
|
|
164
|
+
}))
|
|
165
|
+
.filter((s) => s.score > 0)
|
|
166
|
+
.sort((a, b) => b.score - a.score || a.table.name.localeCompare(b.table.name));
|
|
167
|
+
return scored[0]?.table ?? null;
|
|
168
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function slug(name: string, fallback: string): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The one rule for turning a display name into an id: lower case, each run of
|
|
3
|
+
* anything but letters and digits becomes one hyphen, and no hyphen at either
|
|
4
|
+
* end. Apps, pages, views and connections all derive a default id this way,
|
|
5
|
+
* each with its own word for a name that leaves nothing behind.
|
|
6
|
+
*/
|
|
7
|
+
export function slug(name, fallback) {
|
|
8
|
+
return (name
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
11
|
+
.replace(/^-+|-+$/g, '') || fallback);
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A sort written the way the query bar writes it — "due_on desc, name" —
|
|
3
|
+
* parsed to the structure a planner runs. One spelling for one question: a
|
|
4
|
+
* structured orderBy lived beside textual sort in tab queries, and remembering
|
|
5
|
+
* which surface wanted which was a tax on every author.
|
|
6
|
+
*
|
|
7
|
+
* A page section's `sort` (pageConfig.ts) and a record view's list section
|
|
8
|
+
* (recordview.ts) both read it here, so the two cannot drift into accepting
|
|
9
|
+
* different text. `example` is the surface's own sample, quoted in the error.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseSortText(raw: unknown, at: string, example: string): Array<{
|
|
12
|
+
column: string;
|
|
13
|
+
direction: 'asc' | 'desc';
|
|
14
|
+
}> | undefined;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A sort written the way the query bar writes it — "due_on desc, name" —
|
|
3
|
+
* parsed to the structure a planner runs. One spelling for one question: a
|
|
4
|
+
* structured orderBy lived beside textual sort in tab queries, and remembering
|
|
5
|
+
* which surface wanted which was a tax on every author.
|
|
6
|
+
*
|
|
7
|
+
* A page section's `sort` (pageConfig.ts) and a record view's list section
|
|
8
|
+
* (recordview.ts) both read it here, so the two cannot drift into accepting
|
|
9
|
+
* different text. `example` is the surface's own sample, quoted in the error.
|
|
10
|
+
*/
|
|
11
|
+
export function parseSortText(raw, at, example) {
|
|
12
|
+
if (raw === undefined)
|
|
13
|
+
return undefined;
|
|
14
|
+
if (typeof raw !== 'string' || !raw.trim()) {
|
|
15
|
+
throw new Error(`${at} has a "sort" that is not query-bar text like "${example}".`);
|
|
16
|
+
}
|
|
17
|
+
return raw.split(',').map((part) => {
|
|
18
|
+
const words = part.trim().split(/\s+/);
|
|
19
|
+
const column = words[0] ?? '';
|
|
20
|
+
const direction = (words[1] ?? 'asc').toLowerCase();
|
|
21
|
+
if (!column || words.length > 2 || (direction !== 'asc' && direction !== 'desc')) {
|
|
22
|
+
throw new Error(`${at} has a "sort" it cannot read at "${part.trim()}". Write it like the query bar: "${example}".`);
|
|
23
|
+
}
|
|
24
|
+
return { column, direction: direction };
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SqlStyle } from './filter.js';
|
|
2
|
+
import { type DatabaseSchema } from './schema.js';
|
|
3
|
+
/** Physical relation rendering, kept separate from scoped relation lookup. */
|
|
4
|
+
export declare function qualifiedTable(schema: DatabaseSchema, tableId: string, style: SqlStyle): string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { findTable } from './schema.js';
|
|
2
|
+
/** Physical relation rendering, kept separate from scoped relation lookup. */
|
|
3
|
+
export function qualifiedTable(schema, tableId, style) {
|
|
4
|
+
const table = findTable(schema, tableId);
|
|
5
|
+
if (!table)
|
|
6
|
+
return style.quote(tableId);
|
|
7
|
+
return table.schema ? `${style.quote(table.schema)}.${style.quote(table.name)}` : style.quote(table.name);
|
|
8
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Saved SQL statements, as a config file section.
|
|
3
|
+
*
|
|
4
|
+
* The same idea as the `views` section beside it, for the same reason: a
|
|
5
|
+
* statement you retype every morning is a statement that should have a name,
|
|
6
|
+
* and a *team's* statements belong in a file they can commit rather than in
|
|
7
|
+
* one person's browser. `tablewalk.json` is already the place a repository says
|
|
8
|
+
* "these are the databases this project talks to"; this lets it also say "and
|
|
9
|
+
* these are the questions people ask of them".
|
|
10
|
+
*
|
|
11
|
+
* The stored form is the text, never anything compiled. It stays readable in
|
|
12
|
+
* the editor, it survives the schema changing underneath it — at worst as a
|
|
13
|
+
* visible error you can fix rather than a silently wrong answer — and it can be
|
|
14
|
+
* reviewed in a pull request by someone who knows SQL and nothing about
|
|
15
|
+
* tablewalk.
|
|
16
|
+
*/
|
|
17
|
+
export interface SavedQuery {
|
|
18
|
+
name: string;
|
|
19
|
+
sql: string;
|
|
20
|
+
/** Optional prose, for a statement whose purpose is not obvious from it. */
|
|
21
|
+
description?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Connection id or name this belongs to. Absent means every connection —
|
|
24
|
+
* which is right for a statement about a schema several databases share, and
|
|
25
|
+
* wrong for one about a table only production has, so it is worth setting.
|
|
26
|
+
*/
|
|
27
|
+
connection?: string;
|
|
28
|
+
/** Where it came from, so the interface can say what it can be edited. */
|
|
29
|
+
source?: 'config' | 'saved';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read the `queries` section of a config file.
|
|
33
|
+
*
|
|
34
|
+
* Errors name the file, the position *and* the statement's name where there is
|
|
35
|
+
* one, because a config file is something a person wrote by hand and "queries
|
|
36
|
+
* is not an array" sends them to search a file they may not have written.
|
|
37
|
+
*
|
|
38
|
+
* A duplicate name is refused rather than resolved. Two statements called
|
|
39
|
+
* "Daily totals" that do different things is a worse outcome than a startup
|
|
40
|
+
* error, and silently keeping the last one is the worst of the three.
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseQueriesConfig(raw: unknown, where: string): SavedQuery[];
|
|
43
|
+
/** The saved statements that apply to one connection, by id or by name. */
|
|
44
|
+
export declare function queriesFor(all: SavedQuery[], connectionId: string, connectionName?: string): SavedQuery[];
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Saved SQL statements, as a config file section.
|
|
3
|
+
*
|
|
4
|
+
* The same idea as the `views` section beside it, for the same reason: a
|
|
5
|
+
* statement you retype every morning is a statement that should have a name,
|
|
6
|
+
* and a *team's* statements belong in a file they can commit rather than in
|
|
7
|
+
* one person's browser. `tablewalk.json` is already the place a repository says
|
|
8
|
+
* "these are the databases this project talks to"; this lets it also say "and
|
|
9
|
+
* these are the questions people ask of them".
|
|
10
|
+
*
|
|
11
|
+
* The stored form is the text, never anything compiled. It stays readable in
|
|
12
|
+
* the editor, it survives the schema changing underneath it — at worst as a
|
|
13
|
+
* visible error you can fix rather than a silently wrong answer — and it can be
|
|
14
|
+
* reviewed in a pull request by someone who knows SQL and nothing about
|
|
15
|
+
* tablewalk.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Read the `queries` section of a config file.
|
|
19
|
+
*
|
|
20
|
+
* Errors name the file, the position *and* the statement's name where there is
|
|
21
|
+
* one, because a config file is something a person wrote by hand and "queries
|
|
22
|
+
* is not an array" sends them to search a file they may not have written.
|
|
23
|
+
*
|
|
24
|
+
* A duplicate name is refused rather than resolved. Two statements called
|
|
25
|
+
* "Daily totals" that do different things is a worse outcome than a startup
|
|
26
|
+
* error, and silently keeping the last one is the worst of the three.
|
|
27
|
+
*/
|
|
28
|
+
export function parseQueriesConfig(raw, where) {
|
|
29
|
+
const queries = raw?.queries;
|
|
30
|
+
if (queries === undefined)
|
|
31
|
+
return [];
|
|
32
|
+
if (!Array.isArray(queries))
|
|
33
|
+
throw new Error(`${where}: "queries" must be an array.`);
|
|
34
|
+
const seen = new Set();
|
|
35
|
+
return queries.map((entry, i) => {
|
|
36
|
+
const at = `${where}: query ${i + 1}`;
|
|
37
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {
|
|
38
|
+
throw new Error(`${at} is not an object.`);
|
|
39
|
+
}
|
|
40
|
+
const q = entry;
|
|
41
|
+
if (typeof q.name !== 'string' || !q.name.trim())
|
|
42
|
+
throw new Error(`${at} has no "name".`);
|
|
43
|
+
const name = q.name.trim();
|
|
44
|
+
if (seen.has(name)) {
|
|
45
|
+
throw new Error(`${where}: two queries are called "${name}". Names have to be distinct.`);
|
|
46
|
+
}
|
|
47
|
+
seen.add(name);
|
|
48
|
+
if (typeof q.sql !== 'string' || !q.sql.trim()) {
|
|
49
|
+
throw new Error(`${at} ("${name}") has no "sql".`);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
name,
|
|
53
|
+
sql: q.sql.trim(),
|
|
54
|
+
description: typeof q.description === 'string' && q.description.trim() ? q.description.trim() : undefined,
|
|
55
|
+
connection: typeof q.connection === 'string' && q.connection.trim() ? q.connection.trim() : undefined,
|
|
56
|
+
source: 'config',
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** The saved statements that apply to one connection, by id or by name. */
|
|
61
|
+
export function queriesFor(all, connectionId, connectionName) {
|
|
62
|
+
return all.filter((q) => !q.connection || q.connection === connectionId || q.connection === connectionName);
|
|
63
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a path crosses a stitched reference: a declared reference to a table
|
|
3
|
+
* in another source, on another connection (ForeignKey.stitched), which is
|
|
4
|
+
* read in a second step and never joined. Shared by the reader that stitches
|
|
5
|
+
* (appStitchedReads.ts) and the load-time check of an App's own lists, so an
|
|
6
|
+
* authored filter or sort through one is refused when the App starts, in the
|
|
7
|
+
* words a request through one is refused with.
|
|
8
|
+
*/
|
|
9
|
+
import type { DatabaseSchema, ForeignKey } from './schema.js';
|
|
10
|
+
import { type ViewCondition, type ViewOrder } from './viewPaths.js';
|
|
11
|
+
/** A stitched hop a path takes: the prefix as the path wrote it, the edge, and whether it is past the first step. */
|
|
12
|
+
export interface StitchedHop {
|
|
13
|
+
prefix: string;
|
|
14
|
+
edge: ForeignKey;
|
|
15
|
+
deep: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** The first stitched hop a path takes from `base`, or none. */
|
|
18
|
+
export declare function stitchedHop(schema: DatabaseSchema, base: string, path: string): StitchedHop | undefined;
|
|
19
|
+
/** Why a list cannot filter or sort by a path on the far side of a stitched reference. */
|
|
20
|
+
export declare function stitchedFarProblem(hop: StitchedHop, path: string, what: string): string;
|
|
21
|
+
/** The first condition or sort of a list that is across a stitched reference, said as a problem. */
|
|
22
|
+
export declare function stitchedListProblem(schema: DatabaseSchema, base: string, parsed: {
|
|
23
|
+
filter?: {
|
|
24
|
+
groups: ViewCondition[][];
|
|
25
|
+
};
|
|
26
|
+
orderBy?: ViewOrder[];
|
|
27
|
+
}): string | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { hopsFrom } from './viewPaths.js';
|
|
2
|
+
/** The first stitched hop a path takes from `base`, or none. */
|
|
3
|
+
export function stitchedHop(schema, base, path) {
|
|
4
|
+
const segments = path.split('.').map((segment) => segment.trim());
|
|
5
|
+
let table = base;
|
|
6
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
7
|
+
const matches = hopsFrom(schema, table).filter((hop) => hop.name === segments[i] || hop.fk.name === segments[i]);
|
|
8
|
+
if (matches.length !== 1)
|
|
9
|
+
return undefined;
|
|
10
|
+
const { fk } = matches[0];
|
|
11
|
+
if (fk.stitched)
|
|
12
|
+
return { prefix: segments.slice(0, i + 1).join('.'), edge: fk, deep: i > 0 };
|
|
13
|
+
table = fk.to.table;
|
|
14
|
+
}
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
/** Why a list cannot filter or sort by a path on the far side of a stitched reference. */
|
|
18
|
+
export function stitchedFarProblem(hop, path, what) {
|
|
19
|
+
const target = hop.edge.to.table;
|
|
20
|
+
return (`"${path}" is on ${target}, in another source on another connection, so a list of ${hop.edge.from.table} cannot ${what} by it: ` +
|
|
21
|
+
`each database filters and sorts what it holds. Show it, or ${what} on ${target}'s own list.`);
|
|
22
|
+
}
|
|
23
|
+
/** The first condition or sort of a list that is across a stitched reference, said as a problem. */
|
|
24
|
+
export function stitchedListProblem(schema, base, parsed) {
|
|
25
|
+
for (const condition of parsed.filter?.groups.flat() ?? []) {
|
|
26
|
+
for (const path of [condition.path, ...(condition.other ? [condition.other] : [])]) {
|
|
27
|
+
const hop = stitchedHop(schema, base, path);
|
|
28
|
+
if (hop)
|
|
29
|
+
return stitchedFarProblem(hop, path, 'filter');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (const order of parsed.orderBy ?? []) {
|
|
33
|
+
const hop = order.alias ? undefined : stitchedHop(schema, base, order.path);
|
|
34
|
+
if (hop)
|
|
35
|
+
return stitchedFarProblem(hop, order.path, 'sort');
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Op } from './filter.js';
|
|
2
|
+
export type StructuredScalar = string | number | boolean | null;
|
|
3
|
+
/** A validated condition, shared by execution and transport. Parsing may build
|
|
4
|
+
* broader draft types; execution must validate them before claiming this shape. */
|
|
5
|
+
type StructuredCondition<Field extends 'column' | 'path'> = Record<Field, string> & ({
|
|
6
|
+
op: 'isNull' | 'isNotNull';
|
|
7
|
+
value?: StructuredScalar;
|
|
8
|
+
} | {
|
|
9
|
+
op: 'in';
|
|
10
|
+
value: StructuredScalar[];
|
|
11
|
+
} | {
|
|
12
|
+
op: Exclude<Op, 'isNull' | 'isNotNull' | 'in'>;
|
|
13
|
+
value: StructuredScalar;
|
|
14
|
+
} | (Field extends 'path' ? {
|
|
15
|
+
op: '=' | '!=' | '>' | '>=' | '<' | '<=';
|
|
16
|
+
other: string;
|
|
17
|
+
value?: undefined;
|
|
18
|
+
} : never));
|
|
19
|
+
export interface StructuredFilter<Field extends 'column' | 'path' = 'column'> {
|
|
20
|
+
groups: Array<Array<StructuredCondition<Field>>>;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The path a shown column's second line reads, or undefined for none. A
|
|
3
|
+
* rule's `subtitle` names a column of the table the value was read from, so
|
|
4
|
+
* `employee_id.name` shown on a timesheet reads `employee_id.title` — the
|
|
5
|
+
* employee's title, never the timesheet's own column of that name. Its own
|
|
6
|
+
* module: the cell draws it (client valueModel.ts) and a list's question
|
|
7
|
+
* fetches it (listQuestion.ts), and a public page's cells carry nothing else.
|
|
8
|
+
*/
|
|
9
|
+
export declare function subtitlePath(rule: {
|
|
10
|
+
subtitle?: string;
|
|
11
|
+
} | null | undefined, column: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* The path a shown column's lead icon reads its tone from, or undefined for
|
|
14
|
+
* none: like a second line, a column of the table the value was read from.
|
|
15
|
+
*/
|
|
16
|
+
export declare function leadTonePath(rule: {
|
|
17
|
+
icon?: {
|
|
18
|
+
toneOf?: string;
|
|
19
|
+
};
|
|
20
|
+
} | null | undefined, column: string): string | undefined;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The path a shown column's second line reads, or undefined for none. A
|
|
3
|
+
* rule's `subtitle` names a column of the table the value was read from, so
|
|
4
|
+
* `employee_id.name` shown on a timesheet reads `employee_id.title` — the
|
|
5
|
+
* employee's title, never the timesheet's own column of that name. Its own
|
|
6
|
+
* module: the cell draws it (client valueModel.ts) and a list's question
|
|
7
|
+
* fetches it (listQuestion.ts), and a public page's cells carry nothing else.
|
|
8
|
+
*/
|
|
9
|
+
export function subtitlePath(rule, column) {
|
|
10
|
+
if (!rule?.subtitle)
|
|
11
|
+
return undefined;
|
|
12
|
+
const hop = column.lastIndexOf('.');
|
|
13
|
+
return hop < 0 ? rule.subtitle : `${column.slice(0, hop + 1)}${rule.subtitle}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The path a shown column's lead icon reads its tone from, or undefined for
|
|
17
|
+
* none: like a second line, a column of the table the value was read from.
|
|
18
|
+
*/
|
|
19
|
+
export function leadTonePath(rule, column) {
|
|
20
|
+
if (!rule?.icon?.toneOf)
|
|
21
|
+
return undefined;
|
|
22
|
+
const hop = column.lastIndexOf('.');
|
|
23
|
+
return hop < 0 ? rule.icon.toneOf : `${column.slice(0, hop + 1)}${rule.icon.toneOf}`;
|
|
24
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Levenshtein distance, capped: names more than three characters apart in
|
|
3
|
+
* length score 99 without the table being built. Only ever used to suggest
|
|
4
|
+
* a near miss, where anything that far off is no suggestion at all.
|
|
5
|
+
*/
|
|
6
|
+
export declare function distance(a: string, b: string): number;
|
|
7
|
+
/** The candidate closest to `name` ignoring case, if one is within three edits. */
|
|
8
|
+
export declare function nearest(name: string, candidates: readonly string[]): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* The refusal of a key its place does not take, after the place:
|
|
11
|
+
* `has no "lable". Did you mean "label"? It takes: …`, the caller ending the
|
|
12
|
+
* sentence. A key some other place takes (`homes`) is told where it belongs
|
|
13
|
+
* instead: it is spelled right and put in the wrong place. A key here one
|
|
14
|
+
* slip away still wins, since a typo is the likelier mistake.
|
|
15
|
+
*/
|
|
16
|
+
export declare function unknownKey(key: string, takes: readonly string[], homes?: readonly string[]): string;
|
|
17
|
+
/** A short list for an error message; long lists help nobody. */
|
|
18
|
+
export declare function shortList(items: readonly string[]): string;
|