@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,248 @@
|
|
|
1
|
+
import { type AnyRows, type Op } from './filter.js';
|
|
2
|
+
import { type ColumnMeta, type DatabaseSchema, type ForeignKey, type TableMeta } from './schema.js';
|
|
3
|
+
import { type ComputedPath, type Rollup } from './rollups.js';
|
|
4
|
+
import { type ComputedColumn, type ComputedPath as ExpressionPath } from './computed.js';
|
|
5
|
+
import { type TagPath, type TagSet } from './tagLists.js';
|
|
6
|
+
/** One column of a view: a path, and optionally what to call it. */
|
|
7
|
+
export interface ViewColumn {
|
|
8
|
+
path: string;
|
|
9
|
+
/** Output name. Defaults to the path itself, which is already unique. */
|
|
10
|
+
alias?: string;
|
|
11
|
+
}
|
|
12
|
+
/** One condition. Identical to `Condition` except that it addresses a path. */
|
|
13
|
+
export interface ViewCondition {
|
|
14
|
+
path: string;
|
|
15
|
+
op: Op;
|
|
16
|
+
value?: string | number | boolean | Array<string | number>;
|
|
17
|
+
/** As on `Condition`: compare by bytes; only comparisons take it. */
|
|
18
|
+
collation?: 'binary';
|
|
19
|
+
/** As on `Condition`: compare with this path's value rather than `value`. */
|
|
20
|
+
other?: string;
|
|
21
|
+
/**
|
|
22
|
+
* As on `Condition`: the rows that point at this one, asked whether any
|
|
23
|
+
* matches. `path` is then the condition as it is written (`any opportunity
|
|
24
|
+
* where stage = won`), for a reader to say back; the compiler reads `any`.
|
|
25
|
+
*/
|
|
26
|
+
any?: AnyRows;
|
|
27
|
+
}
|
|
28
|
+
/** OR-of-ANDs over paths — the same shape as `Filter`, one level out. */
|
|
29
|
+
export interface ViewFilter {
|
|
30
|
+
groups: ViewCondition[][];
|
|
31
|
+
}
|
|
32
|
+
export interface ViewOrder {
|
|
33
|
+
path: string;
|
|
34
|
+
direction: 'asc' | 'desc';
|
|
35
|
+
/**
|
|
36
|
+
* When true, `path` names an aggregate's output alias rather than a
|
|
37
|
+
* column: `sort invoices desc` after `count invoice … as invoices`.
|
|
38
|
+
* Compiled as the quoted alias, which every dialect here accepts in an
|
|
39
|
+
* ORDER BY — the one clause that runs late enough to see it.
|
|
40
|
+
*/
|
|
41
|
+
alias?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Closest first: order by the distance of `path` from this number rather
|
|
44
|
+
* than by `path` itself — a similar list's nearest price. Written into the
|
|
45
|
+
* ORDER BY as a literal, so it must be a finite, safe number; anything
|
|
46
|
+
* else is refused, never quoted.
|
|
47
|
+
*/
|
|
48
|
+
near?: number;
|
|
49
|
+
/**
|
|
50
|
+
* Order text by its bytes, not by the column's collation, so that a keyset
|
|
51
|
+
* cursor's comparison (`collation` on a condition) agrees with the order it
|
|
52
|
+
* resumes. A column only: an alias or a distance is refused with it.
|
|
53
|
+
*/
|
|
54
|
+
collation?: 'binary';
|
|
55
|
+
/**
|
|
56
|
+
* Nulls after every value, in either direction, on every dialect: the order
|
|
57
|
+
* a keyset cursor over a nullable column resumes (apiReadBoundary).
|
|
58
|
+
*/
|
|
59
|
+
nulls?: 'last';
|
|
60
|
+
}
|
|
61
|
+
export type AggregateFn = 'count' | 'sum' | 'min' | 'max' | 'avg';
|
|
62
|
+
export interface ViewAggregate {
|
|
63
|
+
fn: AggregateFn;
|
|
64
|
+
/**
|
|
65
|
+
* The foreign key pointing back at the parent, by constraint name.
|
|
66
|
+
*
|
|
67
|
+
* A name rather than a table, because a table can point at the same parent
|
|
68
|
+
* more than once — `work_order.parent_id` and `work_order.supersedes_id`
|
|
69
|
+
* are two different questions and "count of work_orders" is neither.
|
|
70
|
+
*/
|
|
71
|
+
via: string;
|
|
72
|
+
/** Path prefix naming the parent the children point at. Empty is the base. */
|
|
73
|
+
on?: string;
|
|
74
|
+
/** Column on the child table. Required for everything except `count`. */
|
|
75
|
+
column?: string;
|
|
76
|
+
alias?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface ViewDef {
|
|
79
|
+
id: string;
|
|
80
|
+
name: string;
|
|
81
|
+
/** Base table id. Every path in the view starts here. */
|
|
82
|
+
base: string;
|
|
83
|
+
columns: ViewColumn[];
|
|
84
|
+
/** Scalar summaries of many-valued relationships. */
|
|
85
|
+
aggregates?: ViewAggregate[];
|
|
86
|
+
filter?: ViewFilter;
|
|
87
|
+
orderBy?: ViewOrder[];
|
|
88
|
+
limit?: number;
|
|
89
|
+
/**
|
|
90
|
+
* The view written down, in the same language.
|
|
91
|
+
*
|
|
92
|
+
* When present it is the definition and the structure above is derived from
|
|
93
|
+
* it — a config file holding `work_order show reference, customer_id.name
|
|
94
|
+
* as customer count work_order_part via work_order_id as parts` is a file
|
|
95
|
+
* someone can review in a pull request, which a nest of JSON objects with
|
|
96
|
+
* `op: "contains"` in it is not.
|
|
97
|
+
*/
|
|
98
|
+
text?: string;
|
|
99
|
+
/** Config-defined views may name the connection they belong to. */
|
|
100
|
+
connection?: string;
|
|
101
|
+
/** Where this came from. Absent means the client's own storage. */
|
|
102
|
+
source?: 'config' | 'saved';
|
|
103
|
+
/**
|
|
104
|
+
* The record-label templates its `$label` paths compile from, by the path
|
|
105
|
+
* prefix each hangs off ('' for the base's own). Filled by the server's
|
|
106
|
+
* read from the App's catalog (recordLabel.ts); a request never supplies it.
|
|
107
|
+
*/
|
|
108
|
+
labels?: Record<string, string>;
|
|
109
|
+
/**
|
|
110
|
+
* The rollups its paths name (rollups.ts), by path: what makes `line_total`
|
|
111
|
+
* or `customer_id.open_deals` a correlated subquery rather than a column.
|
|
112
|
+
* Filled by the server's read from the App's catalog, like `labels`, and
|
|
113
|
+
* carried with the view so a layer whose catalog is the database's own
|
|
114
|
+
* (an adapter, a source) compiles the same statement; a request never
|
|
115
|
+
* supplies it.
|
|
116
|
+
*/
|
|
117
|
+
computed?: Record<string, ComputedPath>;
|
|
118
|
+
/**
|
|
119
|
+
* The computed columns its paths name (computed.ts), by path, each with its
|
|
120
|
+
* expression and the prefix of the record it is on: filled from the App's
|
|
121
|
+
* catalog like `computed`, so an adapter writes the same expression; a
|
|
122
|
+
* request never supplies it.
|
|
123
|
+
*/
|
|
124
|
+
expressions?: Record<string, ExpressionPath>;
|
|
125
|
+
/**
|
|
126
|
+
* The record tags its paths name (tagLists.ts), by path: filled from the
|
|
127
|
+
* App's catalog like `computed`, so an adapter writes the same subquery; a
|
|
128
|
+
* request never supplies them.
|
|
129
|
+
*/
|
|
130
|
+
tagged?: Record<string, TagPath>;
|
|
131
|
+
/**
|
|
132
|
+
* The App's declared references (soft keys) the view may walk, as edges of
|
|
133
|
+
* the catalog it is compiled against (declaredReferences.ts). Attached by
|
|
134
|
+
* the App's resource layer, where a catalog that is the database's own
|
|
135
|
+
* does not have them; a request never supplies them.
|
|
136
|
+
*/
|
|
137
|
+
references?: ForeignKey[];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* How many foreign keys a path may follow.
|
|
141
|
+
*
|
|
142
|
+
* A cap is not a nicety: `work_order.parent_id` points at `work_order`, so the
|
|
143
|
+
* path space is infinite and any breadth-first enumeration of it runs forever.
|
|
144
|
+
* Four hops is past the point where anyone can still read the result, and the
|
|
145
|
+
* limit is stated in the error rather than left to be discovered.
|
|
146
|
+
*/
|
|
147
|
+
export declare const MAX_PATH_DEPTH = 4;
|
|
148
|
+
/** What a `$label` path ends on: text, and empty where the row is missing. */
|
|
149
|
+
export declare const labelColumnMeta: () => ColumnMeta;
|
|
150
|
+
/**
|
|
151
|
+
* A path that does not resolve, with the segment that failed.
|
|
152
|
+
*
|
|
153
|
+
* The segment matters more than the path: `customer_id.country_code.nmae` is
|
|
154
|
+
* four words of which one is wrong, and an error that repeats the whole path
|
|
155
|
+
* makes you find the wrong one yourself.
|
|
156
|
+
*/
|
|
157
|
+
export declare class PathError extends Error {
|
|
158
|
+
readonly path: string;
|
|
159
|
+
readonly segment: string;
|
|
160
|
+
/** Index of the failing segment within the path, 0-based. */
|
|
161
|
+
readonly index: number;
|
|
162
|
+
constructor(message: string, path: string, segment: string,
|
|
163
|
+
/** Index of the failing segment within the path, 0-based. */
|
|
164
|
+
index: number);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* What a hop is called in a path.
|
|
168
|
+
*
|
|
169
|
+
* A single-column foreign key is named by its column, which is what anyone
|
|
170
|
+
* would write and what the composer shows. A composite key has no single
|
|
171
|
+
* column to name it, so its columns are joined with `+` — deterministic,
|
|
172
|
+
* derivable from the model alone, and impossible to confuse with a column
|
|
173
|
+
* name because `+` is not legal in one.
|
|
174
|
+
*/
|
|
175
|
+
export declare function hopName(fk: ForeignKey): string;
|
|
176
|
+
export interface Hop {
|
|
177
|
+
/** What to write in a path. */
|
|
178
|
+
name: string;
|
|
179
|
+
fk: ForeignKey;
|
|
180
|
+
/** The table this hop lands on. */
|
|
181
|
+
target: string;
|
|
182
|
+
/** True when every column of the key is nullable — the row may not exist. */
|
|
183
|
+
optional: boolean;
|
|
184
|
+
}
|
|
185
|
+
/** Every forward hop available from a table, in a stable order. */
|
|
186
|
+
export declare function hopsFrom(schema: DatabaseSchema, tableId: string): Hop[];
|
|
187
|
+
export interface ResolvedPath {
|
|
188
|
+
path: string;
|
|
189
|
+
/** The foreign keys followed, in order. Empty for a plain column. */
|
|
190
|
+
hops: ForeignKey[];
|
|
191
|
+
hopNames: string[];
|
|
192
|
+
/** The table the final column lives on. */
|
|
193
|
+
table: TableMeta;
|
|
194
|
+
column: ColumnMeta;
|
|
195
|
+
/** Set when the path ends on a rollup of `table` rather than a column (rollups.ts). */
|
|
196
|
+
rollup?: Rollup;
|
|
197
|
+
/** With `rollup`: the prefix of the record the rollup is on, where that is not the path's own (a path read through the rollup, below). */
|
|
198
|
+
rollupAt?: string;
|
|
199
|
+
/** Set when the path ends on a computed column of `table` (computed.ts). */
|
|
200
|
+
computed?: ComputedColumn;
|
|
201
|
+
/** Set when the path ends on the record's tags (tagLists.ts). */
|
|
202
|
+
tags?: TagSet;
|
|
203
|
+
/** Set when the path reads one key of a JSON column (`specs.capacity`, definedFields.ts): the column and the key. */
|
|
204
|
+
jsonKey?: {
|
|
205
|
+
column: string;
|
|
206
|
+
key: string;
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Resolve a path against the schema, or explain precisely why it does not.
|
|
211
|
+
*
|
|
212
|
+
* Every hop is checked against the foreign key graph, so an unknown segment is
|
|
213
|
+
* an error here rather than a database exception later — or, far worse, a
|
|
214
|
+
* silently empty result that looks like a table with nothing in it.
|
|
215
|
+
*/
|
|
216
|
+
export declare function resolvePath(schema: DatabaseSchema, baseId: string, path: string): ResolvedPath;
|
|
217
|
+
interface Backref {
|
|
218
|
+
/** What to write in an aggregate's `via`. */
|
|
219
|
+
name: string;
|
|
220
|
+
fk: ForeignKey;
|
|
221
|
+
/** The table holding the key — the "many" end. */
|
|
222
|
+
child: string;
|
|
223
|
+
}
|
|
224
|
+
/** Every foreign key pointing at a table: the "what refers to me" direction. */
|
|
225
|
+
export declare function backrefsTo(schema: DatabaseSchema, tableId: string): Backref[];
|
|
226
|
+
interface ResolvedAggregate {
|
|
227
|
+
aggregate: ViewAggregate;
|
|
228
|
+
fk: ForeignKey;
|
|
229
|
+
/** The table the children live in. */
|
|
230
|
+
child: TableMeta;
|
|
231
|
+
/** The table the children point at. */
|
|
232
|
+
parent: TableMeta;
|
|
233
|
+
/** The path prefix of the parent, '' for the base table. */
|
|
234
|
+
on: string;
|
|
235
|
+
column?: ColumnMeta;
|
|
236
|
+
/** Default output name, e.g. `count(work_order_part)`. */
|
|
237
|
+
name: string;
|
|
238
|
+
}
|
|
239
|
+
export declare const AGGREGATE_FNS: AggregateFn[];
|
|
240
|
+
export declare function resolveAggregate(schema: DatabaseSchema, baseId: string, aggregate: ViewAggregate): ResolvedAggregate;
|
|
241
|
+
/** The table a chain of hop names lands on. Empty prefix is the base itself. */
|
|
242
|
+
export declare function tableAtPrefix(schema: DatabaseSchema, baseId: string, prefix: string): TableMeta | undefined;
|
|
243
|
+
/** Resolve without throwing — for callers collecting several errors at once. */
|
|
244
|
+
export declare function tryResolvePath(schema: DatabaseSchema, baseId: string, path: string): {
|
|
245
|
+
resolved?: ResolvedPath;
|
|
246
|
+
error?: PathError;
|
|
247
|
+
};
|
|
248
|
+
export {};
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The view model and its reference paths: what a view holds, and how a path
|
|
3
|
+
* or an aggregate resolves against the foreign-key graph to the tables and
|
|
4
|
+
* columns it names. view.ts compiles what resolves here into SQL.
|
|
5
|
+
*/
|
|
6
|
+
import {} from './filter.js';
|
|
7
|
+
import { findTable, isJsonType, referencesFrom } from './schema.js';
|
|
8
|
+
import { nearest, shortList } from './suggest.js';
|
|
9
|
+
import { LABEL_SEGMENT } from './recordLabel.js';
|
|
10
|
+
import { rollupColumnMeta } from './rollups.js';
|
|
11
|
+
import { computedColumnMeta } from './computed.js';
|
|
12
|
+
import { TAGS_COLUMN, tagsColumnMeta } from './tagLists.js';
|
|
13
|
+
import { DEFINED_KEY, definedColumnMeta } from './definedFields.js';
|
|
14
|
+
/**
|
|
15
|
+
* How many foreign keys a path may follow.
|
|
16
|
+
*
|
|
17
|
+
* A cap is not a nicety: `work_order.parent_id` points at `work_order`, so the
|
|
18
|
+
* path space is infinite and any breadth-first enumeration of it runs forever.
|
|
19
|
+
* Four hops is past the point where anyone can still read the result, and the
|
|
20
|
+
* limit is stated in the error rather than left to be discovered.
|
|
21
|
+
*/
|
|
22
|
+
export const MAX_PATH_DEPTH = 4;
|
|
23
|
+
/** What a `$label` path ends on: text, and empty where the row is missing. */
|
|
24
|
+
export const labelColumnMeta = () => ({ name: LABEL_SEGMENT, type: 'TEXT', nullable: true, primaryKey: false });
|
|
25
|
+
/* ---------- errors ---------- */
|
|
26
|
+
/**
|
|
27
|
+
* A path that does not resolve, with the segment that failed.
|
|
28
|
+
*
|
|
29
|
+
* The segment matters more than the path: `customer_id.country_code.nmae` is
|
|
30
|
+
* four words of which one is wrong, and an error that repeats the whole path
|
|
31
|
+
* makes you find the wrong one yourself.
|
|
32
|
+
*/
|
|
33
|
+
export class PathError extends Error {
|
|
34
|
+
path;
|
|
35
|
+
segment;
|
|
36
|
+
index;
|
|
37
|
+
constructor(message, path, segment,
|
|
38
|
+
/** Index of the failing segment within the path, 0-based. */
|
|
39
|
+
index) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.path = path;
|
|
42
|
+
this.segment = segment;
|
|
43
|
+
this.index = index;
|
|
44
|
+
this.name = 'PathError';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/* ---------- hops ---------- */
|
|
48
|
+
/**
|
|
49
|
+
* What a hop is called in a path.
|
|
50
|
+
*
|
|
51
|
+
* A single-column foreign key is named by its column, which is what anyone
|
|
52
|
+
* would write and what the composer shows. A composite key has no single
|
|
53
|
+
* column to name it, so its columns are joined with `+` — deterministic,
|
|
54
|
+
* derivable from the model alone, and impossible to confuse with a column
|
|
55
|
+
* name because `+` is not legal in one.
|
|
56
|
+
*/
|
|
57
|
+
export function hopName(fk) {
|
|
58
|
+
return fk.from.columns.length === 1 ? fk.from.columns[0] : fk.from.columns.join('+');
|
|
59
|
+
}
|
|
60
|
+
/** Every forward hop available from a table, in a stable order. */
|
|
61
|
+
export function hopsFrom(schema, tableId) {
|
|
62
|
+
const table = findTable(schema, tableId);
|
|
63
|
+
return referencesFrom(schema, tableId).map((fk) => ({
|
|
64
|
+
name: hopName(fk),
|
|
65
|
+
fk,
|
|
66
|
+
target: fk.to.table,
|
|
67
|
+
optional: fk.from.columns.some((c) => table?.columns.find((col) => col.name === c)?.nullable !== false),
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
/** A table's rollup of that name where it is a latest of a reference column: the record it names can be read through it. */
|
|
71
|
+
function latestReference(table, name) {
|
|
72
|
+
const rollup = table.rollups && Object.hasOwn(table.rollups, name) ? table.rollups[name] : undefined;
|
|
73
|
+
return rollup?.fn === 'latest' && rollup.references && !rollup.of ? rollup : undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolve a path against the schema, or explain precisely why it does not.
|
|
77
|
+
*
|
|
78
|
+
* Every hop is checked against the foreign key graph, so an unknown segment is
|
|
79
|
+
* an error here rather than a database exception later — or, far worse, a
|
|
80
|
+
* silently empty result that looks like a table with nothing in it.
|
|
81
|
+
*/
|
|
82
|
+
export function resolvePath(schema, baseId, path) {
|
|
83
|
+
/* A path means the same against the same catalog, and a list asks for each
|
|
84
|
+
of its columns' paths on every request, per row's worth of fields. Kept
|
|
85
|
+
per schema object, so a reloaded App or a new catalog starts empty; a
|
|
86
|
+
refused path is not kept (it throws, and is the rare one). The result is
|
|
87
|
+
frozen, shared by every caller. */
|
|
88
|
+
let kept = resolved.get(schema);
|
|
89
|
+
if (!kept)
|
|
90
|
+
resolved.set(schema, (kept = new Map()));
|
|
91
|
+
const key = `${baseId}\u0000${path}`;
|
|
92
|
+
const hit = kept.get(key);
|
|
93
|
+
if (hit)
|
|
94
|
+
return hit;
|
|
95
|
+
const made = resolvePathFresh(schema, baseId, path);
|
|
96
|
+
Object.freeze(made.hops);
|
|
97
|
+
Object.freeze(made.hopNames);
|
|
98
|
+
// A reader can type paths (a query's `a.b.c`), and a path may loop through
|
|
99
|
+
// the graph, so what is kept is bounded; the declared ones come straight back.
|
|
100
|
+
if (kept.size >= MAX_KEPT_PATHS)
|
|
101
|
+
kept.clear();
|
|
102
|
+
kept.set(key, Object.freeze(made));
|
|
103
|
+
return made;
|
|
104
|
+
}
|
|
105
|
+
const resolved = new WeakMap();
|
|
106
|
+
const MAX_KEPT_PATHS = 2048;
|
|
107
|
+
function resolvePathFresh(schema, baseId, path) {
|
|
108
|
+
const raw = String(path ?? '').trim();
|
|
109
|
+
if (!raw)
|
|
110
|
+
throw new PathError('A path cannot be empty.', raw, '', 0);
|
|
111
|
+
const segments = raw.split('.');
|
|
112
|
+
const blank = segments.findIndex((s) => s.trim() === '');
|
|
113
|
+
if (blank !== -1) {
|
|
114
|
+
throw new PathError(`"${raw}" has an empty segment — two dots in a row, or a trailing dot.`, raw, '', blank);
|
|
115
|
+
}
|
|
116
|
+
const hopCount = segments.length - 1;
|
|
117
|
+
if (hopCount > MAX_PATH_DEPTH) {
|
|
118
|
+
throw new PathError(`"${raw}" follows ${hopCount} references; at most ${MAX_PATH_DEPTH} are allowed. ` +
|
|
119
|
+
'Deeper walks are usually two views rather than one.', raw, segments[MAX_PATH_DEPTH], MAX_PATH_DEPTH);
|
|
120
|
+
}
|
|
121
|
+
let table = findTable(schema, baseId);
|
|
122
|
+
if (!table) {
|
|
123
|
+
throw new PathError(`No table called "${baseId}" in this database.`, raw, segments[0], 0);
|
|
124
|
+
}
|
|
125
|
+
const hops = [];
|
|
126
|
+
const hopNames = [];
|
|
127
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
128
|
+
const segment = segments[i];
|
|
129
|
+
const available = hopsFrom(schema, table.id);
|
|
130
|
+
const matches = available.filter((h) => h.name === segment || h.fk.name === segment);
|
|
131
|
+
/* The last step after a latest that reads a reference is a column of the record it names (`resident.name`): the
|
|
132
|
+
rollup's key, read through that table's own relation (viewLabels.ts), so a list draws the name beside the key. */
|
|
133
|
+
const through = !matches.length && i === segments.length - 2 ? latestReference(table, segment) : undefined;
|
|
134
|
+
if (through) {
|
|
135
|
+
const target = findTable(schema, through.references.table);
|
|
136
|
+
const wanted = segments[i + 1];
|
|
137
|
+
const read = target?.columns.find((c) => c.name === wanted);
|
|
138
|
+
if (!target || !read) {
|
|
139
|
+
throw new PathError(`"${wanted}" is not a column on ${target?.name ?? through.references.table}.`, raw, wanted, i + 1);
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
path: raw,
|
|
143
|
+
hops,
|
|
144
|
+
hopNames,
|
|
145
|
+
table,
|
|
146
|
+
column: read,
|
|
147
|
+
rollup: { ...through, through: { table: target.id, key: through.references.column, column: read.name } },
|
|
148
|
+
rollupAt: hopNames.join('.'),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/* The last step after a JSON column is one of its keys (`specs.capacity`):
|
|
152
|
+
a value the definition rows name (definedFields.ts), read, filtered and
|
|
153
|
+
sorted like a column. A reference of the same name wins. */
|
|
154
|
+
const json = !matches.length && i === segments.length - 2 ? table.columns.find((c) => c.name === segment && isJsonType(c.type)) : undefined;
|
|
155
|
+
if (json) {
|
|
156
|
+
const key = segments[i + 1];
|
|
157
|
+
if (!DEFINED_KEY.test(key))
|
|
158
|
+
throw new PathError(`"${key}" is not a key "${segment}" can hold; a key is a name of letters, digits and _.`, raw, key, i + 1);
|
|
159
|
+
return { path: raw, hops, hopNames, table, column: definedColumnMeta(key), jsonKey: { column: json.name, key } };
|
|
160
|
+
}
|
|
161
|
+
if (!matches.length) {
|
|
162
|
+
/* A real column that simply is not a reference is the commonest
|
|
163
|
+
mistake, and deserves its own sentence: "total is not a reference"
|
|
164
|
+
beats "total is not one of customer_id, sold_by". */
|
|
165
|
+
const isColumn = table.columns.some((c) => c.name === segment);
|
|
166
|
+
const names = available.map((h) => h.name);
|
|
167
|
+
const suggestion = nearest(segment, names);
|
|
168
|
+
const hint = suggestion
|
|
169
|
+
? ` Did you mean "${suggestion}"?`
|
|
170
|
+
: names.length
|
|
171
|
+
? ` ${table.name} references: ${shortList(names)}.`
|
|
172
|
+
: ` ${table.name} has no foreign keys.`;
|
|
173
|
+
throw new PathError(isColumn
|
|
174
|
+
? `"${segment}" is a column on ${table.name}, not a reference, so nothing can follow it.${hint}`
|
|
175
|
+
: `"${segment}" is not a reference on ${table.name}.${hint}`, raw, segment, i);
|
|
176
|
+
}
|
|
177
|
+
if (matches.length > 1) {
|
|
178
|
+
throw new PathError(`"${segment}" is ambiguous on ${table.name} — ${matches.length} foreign keys match. ` +
|
|
179
|
+
`Name the constraint instead: ${shortList(matches.map((m) => m.fk.name))}.`, raw, segment, i);
|
|
180
|
+
}
|
|
181
|
+
const next = findTable(schema, matches[0].target);
|
|
182
|
+
if (!next) {
|
|
183
|
+
throw new PathError(`"${segment}" points at "${matches[0].target}", which is not in this schema.`, raw, segment, i);
|
|
184
|
+
}
|
|
185
|
+
hops.push(matches[0].fk);
|
|
186
|
+
hopNames.push(matches[0].name);
|
|
187
|
+
table = next;
|
|
188
|
+
}
|
|
189
|
+
const last = segments[segments.length - 1];
|
|
190
|
+
if (last === LABEL_SEGMENT) {
|
|
191
|
+
if (!table.labelTemplate) {
|
|
192
|
+
throw new PathError(`${table.name} has no record label template, so "${LABEL_SEGMENT}" names nothing on it.`, raw, last, segments.length - 1);
|
|
193
|
+
}
|
|
194
|
+
return { path: raw, hops, hopNames, table, column: labelColumnMeta() };
|
|
195
|
+
}
|
|
196
|
+
const column = table.columns.find((c) => c.name === last) ?? table.columns.find((c) => c.name.toLowerCase() === last.toLowerCase());
|
|
197
|
+
/* A rollup is found by its exact name only, and after the columns: the
|
|
198
|
+
catalog never serves one that shares a column's name, so this order
|
|
199
|
+
only matters to a hand-made catalog, where the column wins. */
|
|
200
|
+
const rollup = column ? undefined : table.rollups && Object.hasOwn(table.rollups, last) ? table.rollups[last] : undefined;
|
|
201
|
+
if (rollup)
|
|
202
|
+
return { path: raw, hops, hopNames, table, column: rollupColumnMeta(last, rollup), rollup };
|
|
203
|
+
const computed = column ? undefined : table.computed && Object.hasOwn(table.computed, last) ? table.computed[last] : undefined;
|
|
204
|
+
if (computed)
|
|
205
|
+
return { path: raw, hops, hopNames, table, column: computedColumnMeta(last, computed), computed };
|
|
206
|
+
if (!column && last === TAGS_COLUMN && table.tags)
|
|
207
|
+
return { path: raw, hops, hopNames, table, column: tagsColumnMeta(), tags: table.tags };
|
|
208
|
+
if (!column) {
|
|
209
|
+
const suggestion = nearest(last, table.columns.map((c) => c.name));
|
|
210
|
+
throw new PathError(`"${last}" is not a column on ${table.name}.${suggestion ? ` Did you mean "${suggestion}"?` : ''}`, raw, last, segments.length - 1);
|
|
211
|
+
}
|
|
212
|
+
return { path: raw, hops, hopNames, table, column };
|
|
213
|
+
}
|
|
214
|
+
/** Every foreign key pointing at a table: the "what refers to me" direction. */
|
|
215
|
+
export function backrefsTo(schema, tableId) {
|
|
216
|
+
return schema.foreignKeys.filter((fk) => fk.to.table === tableId).map((fk) => ({ name: fk.name, fk, child: fk.from.table }));
|
|
217
|
+
}
|
|
218
|
+
export const AGGREGATE_FNS = ['count', 'sum', 'min', 'max', 'avg'];
|
|
219
|
+
export function resolveAggregate(schema, baseId, aggregate) {
|
|
220
|
+
const on = (aggregate.on ?? '').trim();
|
|
221
|
+
const fail = (message, segment) => {
|
|
222
|
+
throw new PathError(message, aggregate.via, segment, 0);
|
|
223
|
+
};
|
|
224
|
+
if (!AGGREGATE_FNS.includes(aggregate.fn)) {
|
|
225
|
+
fail(`"${String(aggregate.fn)}" is not a summary. Use one of: ${AGGREGATE_FNS.join(', ')}.`, String(aggregate.fn));
|
|
226
|
+
}
|
|
227
|
+
/* The parent is the base table, or whatever a path prefix reaches. Resolved
|
|
228
|
+
by resolving a path *through* it — the same code, so a prefix that is not
|
|
229
|
+
a real chain of keys fails here exactly as it would anywhere else. */
|
|
230
|
+
const parent = tableAtPrefix(schema, baseId, on);
|
|
231
|
+
if (!parent) {
|
|
232
|
+
fail(on ? `"${on}" is not a chain of references from ${baseId}.` : `No table called "${baseId}" in this database.`, on || baseId);
|
|
233
|
+
}
|
|
234
|
+
const candidates = backrefsTo(schema, parent.id);
|
|
235
|
+
// A qualified relationship spelling identifies endpoints, not a constraint.
|
|
236
|
+
// Prefer it when a physical constraint happens to have the same text; App
|
|
237
|
+
// logical-to-physical transfers use this form to preserve the selected edge.
|
|
238
|
+
const match = candidates.find((b) => `${b.child}.${b.fk.from.columns.join('+')}` === aggregate.via) ??
|
|
239
|
+
candidates.find((b) => b.name === aggregate.via);
|
|
240
|
+
if (!match) {
|
|
241
|
+
fail(`Nothing called "${aggregate.via}" points at ${parent.name}.` +
|
|
242
|
+
(candidates.length ? ` It is referred to by: ${shortList(candidates.map((c) => c.name))}.` : ' Nothing refers to it.'), aggregate.via);
|
|
243
|
+
}
|
|
244
|
+
const child = findTable(schema, match.child);
|
|
245
|
+
if (!child)
|
|
246
|
+
fail(`"${match.child}" is not in this schema.`, aggregate.via);
|
|
247
|
+
let column;
|
|
248
|
+
if (aggregate.fn !== 'count') {
|
|
249
|
+
if (!aggregate.column) {
|
|
250
|
+
fail(`${aggregate.fn} needs a column on ${child.name} to summarise.`, aggregate.via);
|
|
251
|
+
}
|
|
252
|
+
column = child.columns.find((c) => c.name === aggregate.column);
|
|
253
|
+
if (!column) {
|
|
254
|
+
const suggestion = nearest(aggregate.column, child.columns.map((c) => c.name));
|
|
255
|
+
fail(`"${aggregate.column}" is not a column on ${child.name}.${suggestion ? ` Did you mean "${suggestion}"?` : ''}`, aggregate.column);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const subject = `${on ? `${on}.` : ''}${child.name}${column ? `.${column.name}` : ''}`;
|
|
259
|
+
return {
|
|
260
|
+
aggregate,
|
|
261
|
+
fk: match.fk,
|
|
262
|
+
child: child,
|
|
263
|
+
parent: parent,
|
|
264
|
+
on,
|
|
265
|
+
column,
|
|
266
|
+
name: aggregate.alias?.trim() || `${aggregate.fn}(${subject})`,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/** The table a chain of hop names lands on. Empty prefix is the base itself. */
|
|
270
|
+
export function tableAtPrefix(schema, baseId, prefix) {
|
|
271
|
+
let table = findTable(schema, baseId);
|
|
272
|
+
if (!prefix)
|
|
273
|
+
return table;
|
|
274
|
+
for (const segment of prefix.split('.')) {
|
|
275
|
+
if (!table)
|
|
276
|
+
return undefined;
|
|
277
|
+
const hop = hopsFrom(schema, table.id).find((h) => h.name === segment || h.fk.name === segment);
|
|
278
|
+
if (!hop)
|
|
279
|
+
return undefined;
|
|
280
|
+
table = findTable(schema, hop.target);
|
|
281
|
+
}
|
|
282
|
+
return table;
|
|
283
|
+
}
|
|
284
|
+
/** Resolve without throwing — for callers collecting several errors at once. */
|
|
285
|
+
export function tryResolvePath(schema, baseId, path) {
|
|
286
|
+
try {
|
|
287
|
+
return { resolved: resolvePath(schema, baseId, path) };
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
if (err instanceof PathError)
|
|
291
|
+
return { error: err };
|
|
292
|
+
throw err;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A view, written down.
|
|
3
|
+
*
|
|
4
|
+
* The composer builds views by clicking, and a view built by clicking is UI
|
|
5
|
+
* state: it can be saved and loaded, and that is all. Everything else in
|
|
6
|
+
* tablewalk holds that the *query text* is the single source of truth — it is
|
|
7
|
+
* why filters compose into the bar, why sorting edits the query, why a link
|
|
8
|
+
* carries the whole walk. A view that cannot be written down cannot be
|
|
9
|
+
* hand-edited, diffed in a config file, pasted into a conversation, or
|
|
10
|
+
* explained to someone who does not have the UI open.
|
|
11
|
+
*
|
|
12
|
+
* So a view has a text form, and it is the same language:
|
|
13
|
+
*
|
|
14
|
+
* work_order
|
|
15
|
+
* show reference, total_cost, customer_id.name as customer
|
|
16
|
+
* count work_order_part via work_order_id as parts
|
|
17
|
+
* sum work_order_part.quantity via work_order_id as units
|
|
18
|
+
* where customer_id.country_code = AU and total_cost > 500
|
|
19
|
+
* sort total_cost desc
|
|
20
|
+
* limit 20
|
|
21
|
+
*
|
|
22
|
+
* Only two things here are new: the base table on the front, and the
|
|
23
|
+
* aggregate clauses. Paths, conditions, sort and limit are parsed by
|
|
24
|
+
* `parseViewQuery`, which the composer's filter box already uses — one
|
|
25
|
+
* grammar, not two that drift.
|
|
26
|
+
*
|
|
27
|
+
* Aggregates name the child table and the foreign key column rather than the
|
|
28
|
+
* constraint, because a constraint name is a database artefact nobody reads
|
|
29
|
+
* (`work_order_part_work_order_id_fkey`) and `work_order_part via
|
|
30
|
+
* work_order_id` says the same thing in words that appear in the schema. The
|
|
31
|
+
* pair is unambiguous: two foreign keys from one child to one parent must sit
|
|
32
|
+
* on different columns.
|
|
33
|
+
*/
|
|
34
|
+
import { type ViewDef } from './view.js';
|
|
35
|
+
import { type DatabaseSchema } from './schema.js';
|
|
36
|
+
import type { QueryError, QueryPerson } from './query.js';
|
|
37
|
+
interface ParsedViewText {
|
|
38
|
+
view?: ViewDef;
|
|
39
|
+
errors: QueryError[];
|
|
40
|
+
}
|
|
41
|
+
/** Render with a schema, so aggregates name real tables and columns. */
|
|
42
|
+
export declare function viewToTextWithSchema(schema: DatabaseSchema, view: ViewDef): string;
|
|
43
|
+
/**
|
|
44
|
+
* Parse a written view.
|
|
45
|
+
*
|
|
46
|
+
* The base table and the aggregates are handled here; everything else is
|
|
47
|
+
* handed to `parseViewQuery`, which the composer's filter box already uses.
|
|
48
|
+
* Two parsers for one language is how a language starts disagreeing with
|
|
49
|
+
* itself.
|
|
50
|
+
*/
|
|
51
|
+
export declare function textToView(schema: DatabaseSchema, text: string, options?: {
|
|
52
|
+
id?: string;
|
|
53
|
+
name?: string;
|
|
54
|
+
now?: Date;
|
|
55
|
+
me?: QueryPerson | null;
|
|
56
|
+
}): ParsedViewText;
|
|
57
|
+
export {};
|