@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,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An `http` connection in the config file: checked when the file is read,
|
|
3
|
+
* opened when the connection is first used.
|
|
4
|
+
*
|
|
5
|
+
* { "name": "Desk", "kind": "http", "url": "https://desk.example/v1/",
|
|
6
|
+
* "description": "desk.http.json", "auth": { "bearer": "${DESK_TOKEN}" },
|
|
7
|
+
* "cache": { "ttl": 60 } }
|
|
8
|
+
*
|
|
9
|
+
* The description is the file `tablewalk --from-openapi` drafts, found
|
|
10
|
+
* relative to the config file so the two travel together — or the description
|
|
11
|
+
* itself, inline, which is what `--openapi` drafts in memory and what saving
|
|
12
|
+
* such a connection writes. The credential is written as a `${VAR}` reference
|
|
13
|
+
* and expanded only here, at open, into a header the adapter hands to egress;
|
|
14
|
+
* it is never stored expanded, never sent to the browser, and never attached
|
|
15
|
+
* to a URL a browser supplied. `cache` opts the connection's reads into the
|
|
16
|
+
* deployment's cache (the process's own, or the Valkey a `"kind": "cache"`
|
|
17
|
+
* connection names) for `ttl` seconds.
|
|
18
|
+
*/
|
|
19
|
+
import { readFile } from 'node:fs/promises';
|
|
20
|
+
import { dirname, resolve } from 'node:path';
|
|
21
|
+
import { DEFAULT_POLICY } from '../adapters/http/egress.js';
|
|
22
|
+
import { HttpAdapter } from '../adapters/http/httpAdapter.js';
|
|
23
|
+
import { readDescription } from '../adapters/http/httpDescription.js';
|
|
24
|
+
import { expandEnvReferences } from './auth/credentials.js';
|
|
25
|
+
import { product } from './product.js';
|
|
26
|
+
const HTTP_ONLY = ['description', 'auth', 'insecure', 'allowLinkLocal', 'cache'];
|
|
27
|
+
/* RFC 9110's token, minus the headers the request itself owns. */
|
|
28
|
+
const HEADER_NAME = /^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/;
|
|
29
|
+
const OWNED_HEADERS = new Set(['host', 'content-length', 'content-type', 'accept', 'connection', 'transfer-encoding', 'cookie']);
|
|
30
|
+
/* A day: an answer older than that is not a cached answer, it is a copy. */
|
|
31
|
+
const MAX_CACHE_TTL_SECONDS = 86_400;
|
|
32
|
+
/**
|
|
33
|
+
* An entry's HTTP fields, checked: the resolved block for an `http`
|
|
34
|
+
* connection, undefined for a database. Throws naming the field, because a
|
|
35
|
+
* config someone wrote is refused rather than half-read. Service kinds
|
|
36
|
+
* (`cache`, `webhook`, …) are read by serviceConnections.ts before this is asked.
|
|
37
|
+
*/
|
|
38
|
+
export function httpConnectionOf(entry, path) {
|
|
39
|
+
const where = `${path}: connection "${String(entry.name)}"`;
|
|
40
|
+
if (entry.kind === undefined) {
|
|
41
|
+
const stray = HTTP_ONLY.find((key) => entry[key] !== undefined);
|
|
42
|
+
if (stray)
|
|
43
|
+
throw new Error(`${where} has "${stray}", which only an HTTP connection takes. Add "kind": "http", or remove it.`);
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
/* Said by name rather than as an unknown kind: a config written for 0.9.5 or earlier had one, and the reader should learn where it went. */
|
|
47
|
+
if (entry.kind === 'search') {
|
|
48
|
+
throw new Error(`${where} has "kind": "search". Search providers are not part of ${product()}: they are packs (Typesense is @mistriwork/search-typesense, SQLite FTS5 is @mistriwork/search-sqlite, Postgres tsvector is @mistriwork/search-postgres), which ship after 1.0. Remove the entry, and a text filter runs on the database.`);
|
|
49
|
+
}
|
|
50
|
+
if (entry.kind !== 'http') {
|
|
51
|
+
throw new Error(`${where} has "kind": ${JSON.stringify(entry.kind)}. The kinds are "http", "cache" and "webhook"; a database needs none.`);
|
|
52
|
+
}
|
|
53
|
+
// Writes to an API arrive with their own slice; until then a flag saying otherwise would be a promise nothing keeps.
|
|
54
|
+
if (entry.writable === true)
|
|
55
|
+
throw new Error(`${where} is an HTTP connection, which is read-only; remove "writable".`);
|
|
56
|
+
if (entry.schemas !== undefined)
|
|
57
|
+
throw new Error(`${where} is an HTTP connection; "schemas" belongs to Postgres.`);
|
|
58
|
+
const written = entry.description;
|
|
59
|
+
let description;
|
|
60
|
+
if (typeof written === 'string' && written)
|
|
61
|
+
description = written;
|
|
62
|
+
else if (written && typeof written === 'object' && !Array.isArray(written))
|
|
63
|
+
description = readDescription(written, `${where}: "description"`);
|
|
64
|
+
else
|
|
65
|
+
throw new Error(`${where} needs a "description": the file ${product()} --from-openapi drafts from the API's spec, or the description itself.`);
|
|
66
|
+
for (const flag of ['insecure', 'allowLinkLocal']) {
|
|
67
|
+
if (entry[flag] !== undefined && typeof entry[flag] !== 'boolean') {
|
|
68
|
+
throw new Error(`${where} has "${flag}": ${JSON.stringify(entry[flag])}. It must be true or false, without quotes.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// A base URL that is still a reference is checked when it opens, once the environment has said what it is.
|
|
72
|
+
if (!String(entry.url).includes('${'))
|
|
73
|
+
baseUrl(String(entry.url), entry.insecure === true, where);
|
|
74
|
+
return {
|
|
75
|
+
description,
|
|
76
|
+
...(typeof description === 'string' ? { descriptionPath: resolve(dirname(path), description) } : {}),
|
|
77
|
+
...(entry.auth !== undefined ? { auth: authOf(entry.auth, where) } : {}),
|
|
78
|
+
...(entry.insecure === true ? { insecure: true } : {}),
|
|
79
|
+
...(entry.allowLinkLocal === true ? { allowLinkLocal: true } : {}),
|
|
80
|
+
...(entry.cache !== undefined ? { cache: cacheOf(entry.cache, where) } : {}),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function cacheOf(value, where) {
|
|
84
|
+
const cache = value;
|
|
85
|
+
const keys = cache && typeof cache === 'object' && !Array.isArray(cache) ? Object.keys(cache).join(',') : '';
|
|
86
|
+
if (keys === 'ttl' && Number.isSafeInteger(cache.ttl) && cache.ttl >= 1 && cache.ttl <= MAX_CACHE_TTL_SECONDS) {
|
|
87
|
+
return { ttl: cache.ttl };
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`${where} has a "cache" ${product()} cannot read. Write { "ttl": 60 }: whole seconds, from 1 to ${MAX_CACHE_TTL_SECONDS}.`);
|
|
90
|
+
}
|
|
91
|
+
function authOf(value, where) {
|
|
92
|
+
const auth = value;
|
|
93
|
+
const keys = auth && typeof auth === 'object' && !Array.isArray(auth) ? Object.keys(auth).sort().join(',') : '';
|
|
94
|
+
if (keys === 'bearer' && typeof auth.bearer === 'string' && auth.bearer)
|
|
95
|
+
return { bearer: auth.bearer };
|
|
96
|
+
if (keys === 'header,value' && typeof auth.header === 'string' && typeof auth.value === 'string' && auth.value) {
|
|
97
|
+
if (!HEADER_NAME.test(auth.header) || OWNED_HEADERS.has(auth.header.toLowerCase())) {
|
|
98
|
+
throw new Error(`${where} has "auth.header": ${JSON.stringify(auth.header)}, which is not a header a credential can travel in.`);
|
|
99
|
+
}
|
|
100
|
+
return { header: auth.header, value: auth.value };
|
|
101
|
+
}
|
|
102
|
+
throw new Error(`${where} has an "auth" ${product()} cannot read. Write { "bearer": "\${TOKEN}" } or { "header": "x-api-key", "value": "\${KEY}" }.`);
|
|
103
|
+
}
|
|
104
|
+
/* The base every description path resolves under: https unless the operator
|
|
105
|
+
said otherwise, no credential in it, and ending in "/" so a relative path
|
|
106
|
+
extends it rather than replacing its last segment. */
|
|
107
|
+
function baseUrl(text, insecure, where) {
|
|
108
|
+
let url;
|
|
109
|
+
try {
|
|
110
|
+
url = new URL(text);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
throw new Error(`${where} has a "url" that is not a URL.`);
|
|
114
|
+
}
|
|
115
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && insecure)) {
|
|
116
|
+
throw new Error(`${where} has a ${url.protocol}// "url". Use https, or set "insecure": true for an API on a trusted network.`);
|
|
117
|
+
}
|
|
118
|
+
if (url.username || url.password)
|
|
119
|
+
throw new Error(`${where} has a credential in its "url"; it belongs in "auth".`);
|
|
120
|
+
if (url.search || url.hash)
|
|
121
|
+
throw new Error(`${where} has a query or fragment in its "url"; the base is a path only.`);
|
|
122
|
+
if (!url.pathname.endsWith('/'))
|
|
123
|
+
url.pathname += '/';
|
|
124
|
+
return url;
|
|
125
|
+
}
|
|
126
|
+
/* A description file, read and checked. */
|
|
127
|
+
async function describedIn(file) {
|
|
128
|
+
let text;
|
|
129
|
+
try {
|
|
130
|
+
text = await readFile(file, 'utf8');
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
throw new Error(`the description file ${file} could not be read.`);
|
|
134
|
+
}
|
|
135
|
+
let raw;
|
|
136
|
+
try {
|
|
137
|
+
raw = JSON.parse(text);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
throw new Error(`${file} is not valid JSON.`);
|
|
141
|
+
}
|
|
142
|
+
return readDescription(raw, file);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Open an HTTP connection: read its description, resolve its credential and
|
|
146
|
+
* hand both to the adapter. `secrets: false` — a URL a browser supplied —
|
|
147
|
+
* opens without the credential rather than sending it to that URL, and
|
|
148
|
+
* without the cache: an answer fetched for one URL is not kept under a name
|
|
149
|
+
* another URL could be given.
|
|
150
|
+
*/
|
|
151
|
+
export async function openHttp(name, url, http, options) {
|
|
152
|
+
const where = `"${name}"`;
|
|
153
|
+
const base = baseUrl(options.secrets ? expandEnvReferences(url, options.environment) : url, http.insecure === true, where);
|
|
154
|
+
const description = typeof http.description === 'string' ? await describedIn(http.descriptionPath ?? http.description) : http.description;
|
|
155
|
+
let auth;
|
|
156
|
+
let secret = 'none';
|
|
157
|
+
let warning;
|
|
158
|
+
if (http.auth && options.secrets) {
|
|
159
|
+
const written = 'bearer' in http.auth ? http.auth.bearer : http.auth.value;
|
|
160
|
+
const value = expandEnvReferences(written, options.environment);
|
|
161
|
+
auth =
|
|
162
|
+
'bearer' in http.auth ? { header: 'authorization', value: `Bearer ${value}` } : { header: http.auth.header.toLowerCase(), value };
|
|
163
|
+
secret = value !== written ? 'environment' : 'inline';
|
|
164
|
+
if (secret === 'inline')
|
|
165
|
+
warning = 'This connection has its credential written into the config file. Prefer ${ENV_VAR}.';
|
|
166
|
+
}
|
|
167
|
+
const policy = { ...DEFAULT_POLICY, insecure: http.insecure === true, allowLinkLocal: http.allowLinkLocal === true };
|
|
168
|
+
const cache = http.cache && options.cache && options.secrets ? { store: options.cache, ttlMs: http.cache.ttl * 1000 } : undefined;
|
|
169
|
+
return { adapter: new HttpAdapter({ base, description, label: name, auth, policy, ...(cache ? { cache } : {}) }), secret, warning };
|
|
170
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What deleting a row would take with it — shared by the HTTP endpoint and
|
|
3
|
+
* the MCP server, which cannot import index.ts without also running it.
|
|
4
|
+
*
|
|
5
|
+
* One filtered count per incoming constraint, batched, with the constraint's
|
|
6
|
+
* `ON DELETE` rule beside each count: the same three rows are three
|
|
7
|
+
* deletions, three holes, or a refusal depending on it, and a count without
|
|
8
|
+
* the rule invites the reader to guess which.
|
|
9
|
+
*
|
|
10
|
+
* Only the first level. A `cascade` whose children themselves cascade would
|
|
11
|
+
* need the whole reachable graph, and walking it means a query per table per
|
|
12
|
+
* level on a schema that may be cyclic — expensive, and slow exactly when the
|
|
13
|
+
* answer matters most. Saying "three invoice rows, which cascade" is honest
|
|
14
|
+
* and useful; claiming a total that quietly stopped one level down would not
|
|
15
|
+
* be.
|
|
16
|
+
*/
|
|
17
|
+
import type { Adapter } from '../adapters/adapter.js';
|
|
18
|
+
import { type DatabaseSchema } from '../shared/schema.js';
|
|
19
|
+
/**
|
|
20
|
+
* Run `work` over `items`, at most `width` at a time, keeping input order.
|
|
21
|
+
*
|
|
22
|
+
* `Promise.all` over a map is the usual shape and is unbounded: it starts
|
|
23
|
+
* everything and hopes the pool underneath copes. For a handful of cheap
|
|
24
|
+
* queries that is right; for a dozen table scans it is a way to make one page
|
|
25
|
+
* load monopolise a connection.
|
|
26
|
+
*/
|
|
27
|
+
export declare function inBatches<T, R>(items: readonly T[], width: number, work: (item: T) => Promise<R>): Promise<R[]>;
|
|
28
|
+
export declare function deleteImpact(adapter: Adapter, schema: DatabaseSchema, tableId: string, key: Record<string, string | number>, errorMessage?: (error: unknown) => string): Promise<NonNullable<{
|
|
29
|
+
table: string;
|
|
30
|
+
columns: string[];
|
|
31
|
+
constraint: string;
|
|
32
|
+
onDelete: import("../shared/schema.js").DeleteRule | undefined;
|
|
33
|
+
filter: {
|
|
34
|
+
groups: {
|
|
35
|
+
column: string;
|
|
36
|
+
op: '=';
|
|
37
|
+
value: string | number;
|
|
38
|
+
}[][];
|
|
39
|
+
};
|
|
40
|
+
count: number;
|
|
41
|
+
} | {
|
|
42
|
+
table: string;
|
|
43
|
+
columns: string[];
|
|
44
|
+
constraint: string;
|
|
45
|
+
onDelete: import("../shared/schema.js").DeleteRule | undefined;
|
|
46
|
+
filter: {
|
|
47
|
+
groups: {
|
|
48
|
+
column: string;
|
|
49
|
+
op: '=';
|
|
50
|
+
value: string | number;
|
|
51
|
+
}[][];
|
|
52
|
+
};
|
|
53
|
+
count: number;
|
|
54
|
+
error: string;
|
|
55
|
+
} | null>[]>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { referencesTo } from '../shared/schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run `work` over `items`, at most `width` at a time, keeping input order.
|
|
4
|
+
*
|
|
5
|
+
* `Promise.all` over a map is the usual shape and is unbounded: it starts
|
|
6
|
+
* everything and hopes the pool underneath copes. For a handful of cheap
|
|
7
|
+
* queries that is right; for a dozen table scans it is a way to make one page
|
|
8
|
+
* load monopolise a connection.
|
|
9
|
+
*/
|
|
10
|
+
export async function inBatches(items, width, work) {
|
|
11
|
+
const out = [];
|
|
12
|
+
for (let i = 0; i < items.length; i += width) {
|
|
13
|
+
out.push(...(await Promise.all(items.slice(i, i + width).map(work))));
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
export async function deleteImpact(adapter, schema, tableId, key, errorMessage = (error) => error.message) {
|
|
18
|
+
// A declared reference is not the database's: deleting its target touches no row that names it.
|
|
19
|
+
const incoming = referencesTo(schema, tableId).filter((fk) => !fk.declared);
|
|
20
|
+
const found = await inBatches(incoming, 4, async (fk) => {
|
|
21
|
+
const conditions = fk.to.columns.map((toCol, i) => ({
|
|
22
|
+
column: fk.from.columns[i] ?? fk.from.columns[0],
|
|
23
|
+
op: '=',
|
|
24
|
+
value: key[toCol],
|
|
25
|
+
}));
|
|
26
|
+
if (conditions.some((c) => c.value === undefined || c.value === null))
|
|
27
|
+
return null;
|
|
28
|
+
const base = {
|
|
29
|
+
table: fk.from.table,
|
|
30
|
+
columns: fk.from.columns,
|
|
31
|
+
constraint: fk.name,
|
|
32
|
+
onDelete: fk.onDelete,
|
|
33
|
+
filter: { groups: [conditions] },
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
return { ...base, count: await adapter.count(fk.from.table, base.filter) };
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
// One unreadable table must not stop the report; a count nobody could
|
|
40
|
+
// take is more honest as an error than as a zero.
|
|
41
|
+
return { ...base, count: -1, error: errorMessage(err) };
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
/* Constraints with nothing behind them are dropped: "0 rows point at this"
|
|
45
|
+
is noise in a list whose only job is to say what would be affected. */
|
|
46
|
+
return found.filter((r) => r !== null).filter((r) => r.count !== 0);
|
|
47
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What was written, and how to put it back.
|
|
3
|
+
*
|
|
4
|
+
* Transactions protect a call from failing *halfway*. They do nothing at all
|
|
5
|
+
* about a call that succeeded and should not have — which is the failure mode
|
|
6
|
+
* that actually happens when an agent has write access: nothing errored,
|
|
7
|
+
* nothing rolled back, and the row is simply wrong now. Every destructive
|
|
8
|
+
* label in the tool surface warns about that and none of them helped after
|
|
9
|
+
* the fact.
|
|
10
|
+
*
|
|
11
|
+
* So every write that lands is recorded with what it would take to undo it,
|
|
12
|
+
* and `revert` undoes the last one. The browser has had an undo for its own
|
|
13
|
+
* edits since write mode shipped; this is the same idea one door out, covering
|
|
14
|
+
* the writes an agent makes as well, and covering inserts and deletes, which
|
|
15
|
+
* that one never did.
|
|
16
|
+
*
|
|
17
|
+
* Three things it deliberately does not do.
|
|
18
|
+
*
|
|
19
|
+
* It is **not persisted**. The browser's undo stack makes this argument and it
|
|
20
|
+
* is the right one: a stack that outlives the process invites undoing
|
|
21
|
+
* something from an hour ago, by which time the row has very likely moved on
|
|
22
|
+
* and the "undo" is an overwrite wearing a friendly name. In-session is the
|
|
23
|
+
* honest scope.
|
|
24
|
+
*
|
|
25
|
+
* It **checks before it writes**. Putting the old value back over a newer one
|
|
26
|
+
* is not an undo, it is a silent overwrite — so the row is re-read first and
|
|
27
|
+
* the revert refused if it no longer holds what this journal put there. An
|
|
28
|
+
* undo that can quietly destroy someone else's edit is worse than no undo.
|
|
29
|
+
*
|
|
30
|
+
* And it **does not pretend about SQL**. A `runSql` write is recorded so the
|
|
31
|
+
* history is complete, and marked unrevertible with the reason: arbitrary SQL
|
|
32
|
+
* has no general inverse, and guessing one is how a safety net becomes the
|
|
33
|
+
* thing that cut you.
|
|
34
|
+
*/
|
|
35
|
+
import { type Adapter, type WriteTransaction } from '../adapters/adapter.js';
|
|
36
|
+
type WriteKind = 'update' | 'insert' | 'delete' | 'insert_graph' | 'delete_graph' | 'sql';
|
|
37
|
+
/** One row's worth of change, and everything needed to reverse it. */
|
|
38
|
+
export interface WriteStep {
|
|
39
|
+
table: string;
|
|
40
|
+
/** The row's primary key. Absent only where the write never had one. */
|
|
41
|
+
key?: Record<string, unknown>;
|
|
42
|
+
/** What the row held before. The inverse of an update or a delete. */
|
|
43
|
+
before?: Record<string, unknown>;
|
|
44
|
+
/** What it holds after, which is what a revert checks is still true. */
|
|
45
|
+
after?: Record<string, unknown>;
|
|
46
|
+
/** Complete stored image for bounded single-row inverses. Requires a fenced
|
|
47
|
+
* transaction and lossless comparison; restore also requires non-replacing
|
|
48
|
+
* insertion. Unmarked graph/scoped entries retain their existing contracts. */
|
|
49
|
+
wholeRow?: boolean;
|
|
50
|
+
/** Bounded update inverse: fence and compare only the touched fields, then
|
|
51
|
+
* verify their restored stored values before committing. */
|
|
52
|
+
exactFields?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface JournalEntry {
|
|
55
|
+
id: number;
|
|
56
|
+
connection: string;
|
|
57
|
+
kind: WriteKind;
|
|
58
|
+
at: string;
|
|
59
|
+
/** One line, in the words someone would use about it afterwards. */
|
|
60
|
+
summary: string;
|
|
61
|
+
/** Who made it, when a proxy header said (see --auth-proxy-header). */
|
|
62
|
+
by?: string;
|
|
63
|
+
/** Verified account and authored app identity, never request-supplied labels. */
|
|
64
|
+
principal?: string;
|
|
65
|
+
app?: string;
|
|
66
|
+
revertible: boolean;
|
|
67
|
+
/** Present when it is not, saying why rather than leaving it to be guessed. */
|
|
68
|
+
reason?: string;
|
|
69
|
+
/** In-memory attempt state, not a durable operation receipt. */
|
|
70
|
+
undoState?: 'pending' | 'unknown';
|
|
71
|
+
/** A confirmed write without a safe inverse must not expose an older Undo. */
|
|
72
|
+
blocksUndo?: boolean;
|
|
73
|
+
steps: WriteStep[];
|
|
74
|
+
}
|
|
75
|
+
/** Record a write that landed. Returns the entry, mostly for tests. */
|
|
76
|
+
export declare function recordWrite(connection: string, entry: Omit<JournalEntry, 'id' | 'at' | 'connection'>): JournalEntry;
|
|
77
|
+
/** The most recent first, which is the order anyone asks about them in. */
|
|
78
|
+
export declare function history(connection: string, limit?: number): JournalEntry[];
|
|
79
|
+
/** The newest write that could still be undone, if there is one. */
|
|
80
|
+
export declare function lastRevertible(connection: string): JournalEntry | undefined;
|
|
81
|
+
/** Entries are newest first. Never silently step past an unresolved Undo. */
|
|
82
|
+
export declare function latestRevertible(entries: readonly JournalEntry[]): JournalEntry | undefined;
|
|
83
|
+
export declare function forget(connection: string, id: number): void;
|
|
84
|
+
/** Testing seam: a fresh process is the normal state, and tests want it too. */
|
|
85
|
+
export declare function clearJournal(connection?: string): void;
|
|
86
|
+
/** Fail closed without publishing another entry (or consulting a clock). The
|
|
87
|
+
* caller supplies already verified ownership; no record values are introduced. */
|
|
88
|
+
export declare function quarantineHistory(connection: string, owner?: {
|
|
89
|
+
principal?: string;
|
|
90
|
+
app?: string;
|
|
91
|
+
}): void;
|
|
92
|
+
type RevertResult = {
|
|
93
|
+
entry: JournalEntry;
|
|
94
|
+
/** What was put back, in the order it was put back. */
|
|
95
|
+
steps?: Array<{
|
|
96
|
+
table: string;
|
|
97
|
+
key?: Record<string, unknown>;
|
|
98
|
+
action: string;
|
|
99
|
+
}>;
|
|
100
|
+
} & ({
|
|
101
|
+
reverted: true;
|
|
102
|
+
outcome: 'applied';
|
|
103
|
+
errors?: never;
|
|
104
|
+
} | {
|
|
105
|
+
reverted: false;
|
|
106
|
+
outcome: 'not_applied' | 'unknown';
|
|
107
|
+
errors?: string[];
|
|
108
|
+
});
|
|
109
|
+
/**
|
|
110
|
+
* Undo one recorded write.
|
|
111
|
+
*
|
|
112
|
+
* Every step is checked against the database before anything is written, and
|
|
113
|
+
* the whole revert is refused if any of them has moved on. Half an undo is
|
|
114
|
+
* worse than none: it leaves the row in a state neither the write nor the
|
|
115
|
+
* revert intended, and nothing recorded that it happened.
|
|
116
|
+
*/
|
|
117
|
+
export declare function revert(adapter: Adapter, connection: string, entry: JournalEntry, errorMessage?: (error: unknown) => string): Promise<RevertResult>;
|
|
118
|
+
/** Call on the fenced writer BOTH when capturing an image and when undoing it.
|
|
119
|
+
* SQL equality detects lossy driver conversions (e.g. submillisecond dates);
|
|
120
|
+
* strict scalar comparison also rejects NULL/empty and collation-equivalent
|
|
121
|
+
* text changes. Capture-time validation is essential: a later rounded value
|
|
122
|
+
* could match an image whose original precision was already lost.
|
|
123
|
+
* Permission wrappers must expose complete raw fields before marking wholeRow.
|
|
124
|
+
* This proves one scalar row, not trigger/cascade side effects or DDL history. */
|
|
125
|
+
export declare function journalImageMatches(tx: Pick<WriteTransaction, 'query'>, table: string, image: Record<string, unknown> | undefined): Promise<boolean>;
|
|
126
|
+
/** The touched-field counterpart to journalImageMatches. Call under lockRecord
|
|
127
|
+
* before and after a shared update to establish lossless history, and around
|
|
128
|
+
* its inverse to detect races and restore coercion. Untouched fields need no
|
|
129
|
+
* projection or inverse permission. A successful capture is not a guarantee
|
|
130
|
+
* that generic type coercion will restore it; inverse readback must still pass. */
|
|
131
|
+
export declare function journalFieldsMatch(tx: Pick<WriteTransaction, 'query'>, table: string, key: Record<string, unknown> | undefined, values: Record<string, unknown> | undefined): Promise<boolean>;
|
|
132
|
+
/** A sentence for the history, in the words someone would use about it. */
|
|
133
|
+
export declare function summarise(kind: WriteKind, steps: WriteStep[], detail?: string): string;
|
|
134
|
+
export {};
|