@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,43 @@
|
|
|
1
|
+
import { TransactionOutcomeUnknown } from '../adapters/adapter.js';
|
|
2
|
+
import { snapshotScopedData } from '../adapters/scoped/scopedReads.js';
|
|
3
|
+
/** Owns completion/publication only. The supplied transaction and work retain
|
|
4
|
+
* their original authorization, record fences and image-capture contracts.
|
|
5
|
+
* No registry, fallback writer or way to upgrade a scoped capability exists. */
|
|
6
|
+
export async function runRecordedTransaction(options) {
|
|
7
|
+
if (options.mode === 'preview') {
|
|
8
|
+
const transaction = options.transaction.bind(options), work = options.work.bind(options);
|
|
9
|
+
return { result: await transaction(work) };
|
|
10
|
+
}
|
|
11
|
+
const transaction = options.transaction.bind(options), work = options.work.bind(options);
|
|
12
|
+
const history = options.history;
|
|
13
|
+
const publish = history.publish.bind(history), quarantine = history.quarantine.bind(history);
|
|
14
|
+
const isRejection = options.isRejection.bind(options);
|
|
15
|
+
// Validate without accessors/prototypes, then retain the journal's ordinary
|
|
16
|
+
// data-object shape while detaching every nested value.
|
|
17
|
+
const uncertainty = structuredClone(snapshotScopedData(options.uncertainty));
|
|
18
|
+
let committed = false;
|
|
19
|
+
try {
|
|
20
|
+
const stored = await transaction(async (tx) => {
|
|
21
|
+
const prepared = await work(tx);
|
|
22
|
+
// Malformed evidence must fail inside the transaction, not after COMMIT.
|
|
23
|
+
// Detach before the writer's completion wait so retained callback objects
|
|
24
|
+
// cannot rewrite the history that will be published after commit.
|
|
25
|
+
return { result: prepared.result, entry: structuredClone(snapshotScopedData(prepared.entry)) };
|
|
26
|
+
});
|
|
27
|
+
committed = true;
|
|
28
|
+
const entry = publish(stored.entry);
|
|
29
|
+
return { result: stored.result, ...(entry.revertible ? { undoId: entry.id } : {}) };
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (committed || error instanceof TransactionOutcomeUnknown || !isRejection(error)) {
|
|
33
|
+
try {
|
|
34
|
+
publish(uncertainty);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
quarantine();
|
|
38
|
+
}
|
|
39
|
+
throw error instanceof TransactionOutcomeUnknown ? error : new TransactionOutcomeUnknown(error);
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Refusal, type Adapter, type DeleteRequest, type DeleteResult, type InsertRequest, type InsertResult, type UpdateRequest, type UpdateResult, type WriteTransaction } from '../adapters/adapter.js';
|
|
2
|
+
import { recordWrite } from './journal.js';
|
|
3
|
+
import { type DatabaseSchema, type ForeignKey } from '../shared/schema.js';
|
|
4
|
+
interface RecordWriteOptions {
|
|
5
|
+
adapter: Adapter;
|
|
6
|
+
connection: string;
|
|
7
|
+
/** Owns logical/physical mapping and verified account attribution for every entry. */
|
|
8
|
+
record?: typeof recordWrite;
|
|
9
|
+
/** Verified history ownership, paired with the exact physical connection.
|
|
10
|
+
* Used to fail closed if publishing even an uncertainty barrier fails. */
|
|
11
|
+
historyOwner?: {
|
|
12
|
+
principal?: string;
|
|
13
|
+
app?: string;
|
|
14
|
+
};
|
|
15
|
+
completeInverse?: boolean;
|
|
16
|
+
by?: string;
|
|
17
|
+
/** False where an App writes: it has no Undo, so nothing is journaled (unrecorded). */
|
|
18
|
+
journal?: boolean;
|
|
19
|
+
}
|
|
20
|
+
type Recorded<Result> = {
|
|
21
|
+
result: Result;
|
|
22
|
+
undoId?: number;
|
|
23
|
+
};
|
|
24
|
+
/** What else a deletion may change: see recordedDelete. */
|
|
25
|
+
interface Dependents {
|
|
26
|
+
references?: readonly ForeignKey[];
|
|
27
|
+
unseen?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/** One row of a new record's lines as a save sends it: the values the reader set. */
|
|
30
|
+
export interface LineRow {
|
|
31
|
+
values: Record<string, string | number | boolean | null>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One collection of a record's lines, judged by the route (formLinesWrite.ts):
|
|
35
|
+
* the child table, the reference that joins a row to the record and the
|
|
36
|
+
* record's column it holds, the column the rows' places
|
|
37
|
+
* fill, and every row, in order.
|
|
38
|
+
*/
|
|
39
|
+
export interface LineCollection {
|
|
40
|
+
table: string;
|
|
41
|
+
whose: string;
|
|
42
|
+
refers: string;
|
|
43
|
+
order?: string;
|
|
44
|
+
rows: readonly LineRow[];
|
|
45
|
+
/** Filled as the lines are written: the key of every row inserted, for the search index to follow once the transaction commits. */
|
|
46
|
+
written?: Record<string, string | number>[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A record's lines, written in its transaction once the record is: each row
|
|
50
|
+
* the insert the reader could make of it alone, so the
|
|
51
|
+
* App's adapter judges every one (grants, validation, transitions) and a
|
|
52
|
+
* refusal of any rolls back the record with them. A refused row's fields
|
|
53
|
+
* cross as `table[i].field`, so the form marks the line, not the record.
|
|
54
|
+
*/
|
|
55
|
+
/**
|
|
56
|
+
* A refusal that names the fields it turned down — the App framework's
|
|
57
|
+
* validation (app/appValidationDenied.ts) — said again by a line with each
|
|
58
|
+
* field at the line's place, so the form marks the line, not the record.
|
|
59
|
+
*/
|
|
60
|
+
export interface FieldRefusal extends Refusal {
|
|
61
|
+
readonly fields: readonly string[];
|
|
62
|
+
renamed(rename: (field: string) => string): Refusal;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* What writes a record's lines: the transaction itself where its adapter
|
|
66
|
+
* judges every row, or, under a row policy or a tenant lease, that writer's
|
|
67
|
+
* own facade — its transitions, its stamps, its deletion policy — so a line
|
|
68
|
+
* is held to exactly what the same row would be held to alone.
|
|
69
|
+
*/
|
|
70
|
+
export type LineWriter = Pick<WriteTransaction, 'query' | 'insert' | 'lockRecord'> & {
|
|
71
|
+
update(request: UpdateRequest): Promise<unknown>;
|
|
72
|
+
remove(request: DeleteRequest): Promise<unknown>;
|
|
73
|
+
};
|
|
74
|
+
export declare function writeLines(tx: LineWriter, lines: readonly LineCollection[], record: Readonly<Record<string, unknown>> | undefined): Promise<void>;
|
|
75
|
+
export declare function recordedUpdate(options: RecordWriteOptions, input: UpdateRequest): Promise<Recorded<UpdateResult>>;
|
|
76
|
+
export declare function recordedInsert(options: RecordWriteOptions, input: InsertRequest,
|
|
77
|
+
/** Rows that go with the new one, in its transaction, made from it: a record's tag links (tagLists.ts). */
|
|
78
|
+
alongside?: (result: InsertResult) => readonly InsertRequest[],
|
|
79
|
+
/** The new record's lines (`form.lines`), inserted in its transaction and joined to it (formLinesWrite.ts). */
|
|
80
|
+
lines?: readonly LineCollection[]): Promise<Recorded<InsertResult>>;
|
|
81
|
+
/**
|
|
82
|
+
* Many new rows of one table in one transaction, recorded as one entry: an
|
|
83
|
+
* import. Undo removes every row it added or none, as a single insert's
|
|
84
|
+
* does, and only when each row's whole stored image could be captured; one
|
|
85
|
+
* that could not makes the entry a barrier that says why.
|
|
86
|
+
*/
|
|
87
|
+
export declare function recordedImport(options: RecordWriteOptions, inputs: readonly InsertRequest[], checkpoint?: () => void): Promise<Recorded<InsertResult[]>>;
|
|
88
|
+
/**
|
|
89
|
+
* Captures this row only. A database-owned cascade (or `set null`) is not a
|
|
90
|
+
* graph Undo: putting the parent back would leave its children gone or
|
|
91
|
+
* emptied, which is half an undo. So when one of `dependents.references` —
|
|
92
|
+
* the incoming references whose rule changes the rows behind them, named as
|
|
93
|
+
* this writer names them — has a row pointing at this one, read on the same
|
|
94
|
+
* writer before the delete, the entry is a barrier that says why, and the
|
|
95
|
+
* deletion is undone whole or not at all. `dependents.unseen` says such a
|
|
96
|
+
* reference exists from a table this writer cannot read (one an App does not
|
|
97
|
+
* declare): it cannot be counted here, so it is a barrier whatever it holds.
|
|
98
|
+
*/
|
|
99
|
+
export declare function recordedDelete(options: RecordWriteOptions, input: DeleteRequest, dependents?: Dependents): Promise<Recorded<DeleteResult>>;
|
|
100
|
+
/** The incoming references a deletion of `table` would change rows through:
|
|
101
|
+
* every rule but a refusal, an unreported one included. */
|
|
102
|
+
export declare function changingReferences(schema: DatabaseSchema, table: string): ForeignKey[];
|
|
103
|
+
/**
|
|
104
|
+
* A deletion's dependents read off the database's own catalog, never an
|
|
105
|
+
* App's reduced one: a cascade into a table the App does not declare still
|
|
106
|
+
* happens. `physical` is the connection's catalog and `table` its name there;
|
|
107
|
+
* `writerName` gives the name the writer reads a physical table by, or
|
|
108
|
+
* undefined when it cannot read it — which makes the reference unseen.
|
|
109
|
+
*/
|
|
110
|
+
export declare function deletionDependents(physical: DatabaseSchema, table: string, writerName: (physicalTable: string) => string | undefined): Dependents;
|
|
111
|
+
export {};
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { Refusal, WriteConflict, } from '../adapters/adapter.js';
|
|
2
|
+
import { snapshotScopedData } from '../adapters/scoped/scopedReads.js';
|
|
3
|
+
import { inRecordLane } from '../adapters/writeLanes.js';
|
|
4
|
+
import { withWriteAhead } from '../adapters/writeAhead.js';
|
|
5
|
+
import { isPoolBusy } from '../adapters/poolMetrics.js';
|
|
6
|
+
import { writeFailureOutcome } from './constraints.js';
|
|
7
|
+
import { journalFieldsMatch, journalImageMatches, quarantineHistory, recordWrite, summarise, } from './journal.js';
|
|
8
|
+
import { runRecordedTransaction } from './recordHistoryOperations.js';
|
|
9
|
+
import { referencesTo } from '../shared/schema.js';
|
|
10
|
+
import { carryServerRequest } from './serverRequests.js';
|
|
11
|
+
function barrier(kind, table, reason, unknown = false) {
|
|
12
|
+
const entry = {
|
|
13
|
+
kind,
|
|
14
|
+
summary: reason,
|
|
15
|
+
reason,
|
|
16
|
+
revertible: false,
|
|
17
|
+
...(unknown ? { undoState: 'unknown' } : { blocksUndo: true }),
|
|
18
|
+
// Keep the logical resource for source attribution, but no record values.
|
|
19
|
+
steps: [{ table }],
|
|
20
|
+
};
|
|
21
|
+
return entry;
|
|
22
|
+
}
|
|
23
|
+
async function recorded(options, kind, table, run) {
|
|
24
|
+
const { adapter: writer, record = recordWrite, connection, by } = options;
|
|
25
|
+
const historyOwner = options.historyOwner ? { ...options.historyOwner } : undefined;
|
|
26
|
+
if (!writer.transaction)
|
|
27
|
+
throw new Refusal('Recorded writes require a supported transaction writer.');
|
|
28
|
+
return runRecordedTransaction({
|
|
29
|
+
mode: 'write',
|
|
30
|
+
transaction: writer.transaction.bind(writer),
|
|
31
|
+
work: run,
|
|
32
|
+
history: {
|
|
33
|
+
publish: (entry) => record(connection, { ...entry, ...(by ? { by } : {}) }),
|
|
34
|
+
quarantine: () => quarantineHistory(connection, historyOwner),
|
|
35
|
+
},
|
|
36
|
+
uncertainty: {
|
|
37
|
+
...barrier(kind, table, 'Write outcome or history unconfirmed. Refresh and reconcile before further editing.', true),
|
|
38
|
+
revertible: false,
|
|
39
|
+
undoState: 'unknown',
|
|
40
|
+
},
|
|
41
|
+
// A refused checkout: no writer was leased, or the transaction rolled back (a failed rollback is an unknown outcome, which isPoolBusy does not claim).
|
|
42
|
+
isRejection: (error) => error instanceof Refusal || error instanceof WriteConflict || isPoolBusy(error) || writeFailureOutcome(error) === 'rejected',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* An App's write. An App has no Undo, so it keeps no journal entry and
|
|
47
|
+
* captures no images for one; what it keeps is the transaction and the row
|
|
48
|
+
* lock the journal's capture ran in. Inside them the App's adapter judges
|
|
49
|
+
* transitions on the locked row and validates the stored row after the
|
|
50
|
+
* write, and a refusal there rolls the write back — the reasons a single
|
|
51
|
+
* statement would not do. The lane (writeLanes.ts) keeps saves of one
|
|
52
|
+
* record in the order they arrived, now that saves of different records
|
|
53
|
+
* run side by side.
|
|
54
|
+
*/
|
|
55
|
+
async function unrecorded(options, request, run) {
|
|
56
|
+
const writer = options.adapter;
|
|
57
|
+
if (!writer.transaction)
|
|
58
|
+
throw new Refusal('Writes require a supported transaction writer.');
|
|
59
|
+
const work = () => writer.transaction(run);
|
|
60
|
+
return { result: await (request.key ? inRecordLane(request.table, request.key, work) : work()) };
|
|
61
|
+
}
|
|
62
|
+
async function original(tx, request, columns) {
|
|
63
|
+
// Merely using the writer handle is not enough under READ COMMITTED: another
|
|
64
|
+
// transaction could change the row between SELECT and mutation. The adapter
|
|
65
|
+
// owns the dialect-specific row lock (or SQLite's existing writer fence).
|
|
66
|
+
if (!tx.lockRecord)
|
|
67
|
+
throw new Refusal('Recorded writes require a transaction record-lock capability.');
|
|
68
|
+
await tx.lockRecord({ table: request.table, key: request.key });
|
|
69
|
+
return rowAt(tx, request, columns);
|
|
70
|
+
}
|
|
71
|
+
async function rowAt(tx, request, columns) {
|
|
72
|
+
const result = await tx.query({
|
|
73
|
+
table: request.table,
|
|
74
|
+
...(columns ? { columns } : {}),
|
|
75
|
+
filter: { groups: [Object.entries(request.key).map(([column, value]) => ({ column, op: '=', value }))] },
|
|
76
|
+
limit: 2,
|
|
77
|
+
offset: 0,
|
|
78
|
+
});
|
|
79
|
+
return result.rows.length === 1 ? { ...snapshotScopedData(result.rows[0]) } : undefined;
|
|
80
|
+
}
|
|
81
|
+
const isFieldRefusal = (error) => error instanceof Refusal && typeof error.renamed === 'function';
|
|
82
|
+
export async function writeLines(tx, lines, record) {
|
|
83
|
+
for (const line of lines) {
|
|
84
|
+
/* A transaction tried again writes them again: only the last attempt's keys stand. */
|
|
85
|
+
const written = (line.written = []);
|
|
86
|
+
const bound = record?.[line.refers];
|
|
87
|
+
if (typeof bound !== 'string' && typeof bound !== 'number')
|
|
88
|
+
throw new Refusal("The record's key was not read back, so its lines cannot be joined to it.");
|
|
89
|
+
const marked = async (i, work) => {
|
|
90
|
+
try {
|
|
91
|
+
return await work();
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (!isFieldRefusal(error))
|
|
95
|
+
throw error;
|
|
96
|
+
/* The table's own name, unqualified: a field crosses as one segment and a column (fieldErrors.ts). */
|
|
97
|
+
throw error.renamed((name) => `${line.table.slice(line.table.lastIndexOf('.') + 1)}[${i}].${name}`);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const placed = (row, i) => ({ ...row.values, ...(line.order ? { [line.order]: i + 1 } : {}) });
|
|
101
|
+
for (const [i, row] of line.rows.entries()) {
|
|
102
|
+
const made = await marked(i, () => tx.insert(snapshotScopedData({ table: line.table, values: { ...placed(row, i), [line.whose]: bound } })));
|
|
103
|
+
written.push(made.key);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function recordedUpdate(options, input) {
|
|
108
|
+
const request = snapshotScopedData(input);
|
|
109
|
+
if (!Object.keys(request.values).length)
|
|
110
|
+
throw new Refusal('Nothing to set.');
|
|
111
|
+
if (options.journal === false)
|
|
112
|
+
// The record it locks, reads and writes, told to the transaction so its lock and row go behind the BEGIN (writeAhead.ts).
|
|
113
|
+
return withWriteAhead({ targets: [{ table: request.table, key: request.key }], writes: true, locks: true }, () => unrecorded(options, request, async (tx) => {
|
|
114
|
+
// The row the App judges is the row the write replaces: a plain read would not hold it.
|
|
115
|
+
if (!tx.lockRecord)
|
|
116
|
+
throw new Refusal('Writes require a transaction record-lock capability.');
|
|
117
|
+
await tx.lockRecord({ table: request.table, key: request.key });
|
|
118
|
+
return tx.update(request);
|
|
119
|
+
}));
|
|
120
|
+
return recorded(options, 'update', request.table, async (tx) => {
|
|
121
|
+
// PK fields identify the predicate; they need not be readable projections.
|
|
122
|
+
const before = await original(tx, request, Object.keys(request.values));
|
|
123
|
+
const losslessBefore = Boolean(before && (await journalFieldsMatch(tx, request.table, request.key, before)));
|
|
124
|
+
const result = await tx.update(request);
|
|
125
|
+
const touched = Object.keys(result.applied);
|
|
126
|
+
// Store the database image, not its write-intent DTO (booleans, defaults
|
|
127
|
+
// and AFTER triggers can have a different stored representation).
|
|
128
|
+
const after = result.affected === 1 && touched.length ? await rowAt(tx, request, touched) : undefined;
|
|
129
|
+
if (!losslessBefore ||
|
|
130
|
+
!before ||
|
|
131
|
+
!after ||
|
|
132
|
+
!touched.length ||
|
|
133
|
+
touched.some((column) => !Object.hasOwn(before, column)) ||
|
|
134
|
+
!(await journalFieldsMatch(tx, request.table, request.key, after))) {
|
|
135
|
+
return { result, entry: barrier('update', request.table, 'The updated record has no complete original for Undo.') };
|
|
136
|
+
}
|
|
137
|
+
const steps = [
|
|
138
|
+
{
|
|
139
|
+
table: request.table,
|
|
140
|
+
key: { ...request.key },
|
|
141
|
+
before: Object.fromEntries(touched.map((column) => [column, before[column]])),
|
|
142
|
+
after,
|
|
143
|
+
exactFields: true,
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
return { result, entry: { kind: 'update', summary: summarise('update', steps), revertible: true, steps } };
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
export async function recordedInsert(options, input,
|
|
150
|
+
/** Rows that go with the new one, in its transaction, made from it: a record's tag links (tagLists.ts). */
|
|
151
|
+
alongside,
|
|
152
|
+
/** The new record's lines (`form.lines`), inserted in its transaction and joined to it (formLinesWrite.ts). */
|
|
153
|
+
lines) {
|
|
154
|
+
// An upload's file columns are the server's to write (serverRequests.ts): the copy keeps the mark.
|
|
155
|
+
const request = carryServerRequest(input, snapshotScopedData(input));
|
|
156
|
+
const completeInverse = options.completeInverse !== false;
|
|
157
|
+
if (lines?.length && options.journal !== false)
|
|
158
|
+
throw new Refusal("A record's lines are saved with it in an App.");
|
|
159
|
+
const withRows = async (tx, result) => {
|
|
160
|
+
for (const row of alongside?.(result) ?? [])
|
|
161
|
+
await tx.insert(snapshotScopedData(row));
|
|
162
|
+
if (lines?.length)
|
|
163
|
+
await writeLines(tx, lines, { ...result.row, ...result.key });
|
|
164
|
+
return result;
|
|
165
|
+
};
|
|
166
|
+
if (options.journal === false)
|
|
167
|
+
return unrecorded(options, request, async (tx) => withRows(tx, await tx.insert(request)));
|
|
168
|
+
return recorded(options, 'insert', request.table, async (tx) => {
|
|
169
|
+
const result = await withRows(tx, await tx.insert(request));
|
|
170
|
+
/* An Undo of the record alone would leave its tags' link rows pointing at nothing. */
|
|
171
|
+
if (alongside && alongside(result).length) {
|
|
172
|
+
return {
|
|
173
|
+
result,
|
|
174
|
+
entry: barrier('insert', request.table, 'This creation added rows beside the record, which one Undo does not take back.'),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (!tx.lockRecord ||
|
|
178
|
+
!completeInverse ||
|
|
179
|
+
!Object.keys(result.key ?? {}).length ||
|
|
180
|
+
!result.row ||
|
|
181
|
+
!Object.keys(result.row).length ||
|
|
182
|
+
!(await journalImageMatches(tx, request.table, result.row))) {
|
|
183
|
+
return {
|
|
184
|
+
result,
|
|
185
|
+
entry: barrier('insert', request.table, 'This creation has no complete identifiable inverse under the current permissions.'),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const steps = [
|
|
189
|
+
{ table: request.table, key: { ...result.key }, after: { ...snapshotScopedData(result.row) }, wholeRow: true },
|
|
190
|
+
];
|
|
191
|
+
return { result, entry: { kind: 'insert', summary: summarise('insert', steps), revertible: true, steps } };
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Many new rows of one table in one transaction, recorded as one entry: an
|
|
196
|
+
* import. Undo removes every row it added or none, as a single insert's
|
|
197
|
+
* does, and only when each row's whole stored image could be captured; one
|
|
198
|
+
* that could not makes the entry a barrier that says why.
|
|
199
|
+
*/
|
|
200
|
+
export async function recordedImport(options, inputs, checkpoint = () => { }) {
|
|
201
|
+
const requests = inputs.map((input) => snapshotScopedData(input));
|
|
202
|
+
const table = requests[0]?.table;
|
|
203
|
+
if (!table || requests.some((request) => request.table !== table))
|
|
204
|
+
throw new Refusal('An import writes rows of one table.');
|
|
205
|
+
if (options.journal === false)
|
|
206
|
+
return unrecorded(options, { table }, async (tx) => {
|
|
207
|
+
const results = [];
|
|
208
|
+
for (const request of requests) {
|
|
209
|
+
checkpoint();
|
|
210
|
+
results.push(await tx.insert(request));
|
|
211
|
+
}
|
|
212
|
+
checkpoint();
|
|
213
|
+
return results;
|
|
214
|
+
});
|
|
215
|
+
let complete = options.completeInverse !== false;
|
|
216
|
+
return recorded(options, 'insert', table, async (tx) => {
|
|
217
|
+
const results = [];
|
|
218
|
+
const steps = [];
|
|
219
|
+
for (const request of requests) {
|
|
220
|
+
checkpoint();
|
|
221
|
+
const result = await tx.insert(request);
|
|
222
|
+
results.push(result);
|
|
223
|
+
if (complete &&
|
|
224
|
+
(!tx.lockRecord ||
|
|
225
|
+
!Object.keys(result.key ?? {}).length ||
|
|
226
|
+
!result.row ||
|
|
227
|
+
!Object.keys(result.row).length ||
|
|
228
|
+
!(await journalImageMatches(tx, table, result.row))))
|
|
229
|
+
complete = false;
|
|
230
|
+
if (complete)
|
|
231
|
+
steps.push({ table, key: { ...result.key }, after: { ...snapshotScopedData(result.row) }, wholeRow: true });
|
|
232
|
+
}
|
|
233
|
+
checkpoint();
|
|
234
|
+
if (!complete)
|
|
235
|
+
return {
|
|
236
|
+
result: results,
|
|
237
|
+
entry: barrier('insert', table, 'This import has no complete identifiable inverse under the current permissions.'),
|
|
238
|
+
};
|
|
239
|
+
return { result: results, entry: { kind: 'insert', summary: summarise('insert', steps), revertible: true, steps } };
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Captures this row only. A database-owned cascade (or `set null`) is not a
|
|
244
|
+
* graph Undo: putting the parent back would leave its children gone or
|
|
245
|
+
* emptied, which is half an undo. So when one of `dependents.references` —
|
|
246
|
+
* the incoming references whose rule changes the rows behind them, named as
|
|
247
|
+
* this writer names them — has a row pointing at this one, read on the same
|
|
248
|
+
* writer before the delete, the entry is a barrier that says why, and the
|
|
249
|
+
* deletion is undone whole or not at all. `dependents.unseen` says such a
|
|
250
|
+
* reference exists from a table this writer cannot read (one an App does not
|
|
251
|
+
* declare): it cannot be counted here, so it is a barrier whatever it holds.
|
|
252
|
+
*/
|
|
253
|
+
export async function recordedDelete(options, input, dependents = {}) {
|
|
254
|
+
const request = snapshotScopedData(input);
|
|
255
|
+
const completeInverse = options.completeInverse !== false;
|
|
256
|
+
if (options.journal === false)
|
|
257
|
+
return unrecorded(options, request, (tx) => tx.remove(request));
|
|
258
|
+
return recorded(options, 'delete', request.table, async (tx) => {
|
|
259
|
+
const before = await original(tx, request);
|
|
260
|
+
const complete = completeInverse && Boolean(before && (await journalImageMatches(tx, request.table, before)));
|
|
261
|
+
const touches = complete && (dependents.unseen === true || (await touchesDependents(tx, request.key, dependents.references ?? [])));
|
|
262
|
+
const result = await tx.remove(request);
|
|
263
|
+
if (touches) {
|
|
264
|
+
return { result, entry: barrier('delete', request.table, 'Rows elsewhere depended on it, so this deletion cannot be undone.') };
|
|
265
|
+
}
|
|
266
|
+
if (!complete || result.affected !== 1 || !before || !Object.keys(before).length) {
|
|
267
|
+
return { result, entry: barrier('delete', request.table, 'The deleted record has no complete original for Undo.') };
|
|
268
|
+
}
|
|
269
|
+
/* The key as the row stored it, not as the request spelled it: an
|
|
270
|
+
address says `1` as text, and a restore is checked against the stored
|
|
271
|
+
row, whose integer 1 is not the string '1'. */
|
|
272
|
+
const key = Object.fromEntries(Object.entries(request.key).map(([column, value]) => [column, Object.hasOwn(before, column) ? before[column] : value]));
|
|
273
|
+
const steps = [{ table: request.table, key, before, wholeRow: true }];
|
|
274
|
+
return { result, entry: { kind: 'delete', summary: summarise('delete', steps), revertible: true, steps } };
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
/** Whether a row behind one of these references points at `key`. A count that
|
|
278
|
+
* cannot be taken is read as yes: an Undo that might be partial is not offered. */
|
|
279
|
+
async function touchesDependents(tx, key, dependents) {
|
|
280
|
+
for (const fk of dependents) {
|
|
281
|
+
const conditions = fk.to.columns.map((column, i) => ({
|
|
282
|
+
column: fk.from.columns[i] ?? fk.from.columns[0],
|
|
283
|
+
op: '=',
|
|
284
|
+
value: key[column],
|
|
285
|
+
}));
|
|
286
|
+
if (conditions.some((condition) => condition.value === undefined || condition.value === null))
|
|
287
|
+
return true;
|
|
288
|
+
try {
|
|
289
|
+
const found = await tx.query({
|
|
290
|
+
table: fk.from.table,
|
|
291
|
+
columns: fk.from.columns,
|
|
292
|
+
filter: { groups: [conditions] },
|
|
293
|
+
limit: 1,
|
|
294
|
+
offset: 0,
|
|
295
|
+
});
|
|
296
|
+
if (found.rows.length)
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
/** The incoming references a deletion of `table` would change rows through:
|
|
306
|
+
* every rule but a refusal, an unreported one included. */
|
|
307
|
+
export function changingReferences(schema, table) {
|
|
308
|
+
return referencesTo(schema, table).filter((fk) => !fk.declared && fk.onDelete !== 'restrict' && fk.onDelete !== 'no action');
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* A deletion's dependents read off the database's own catalog, never an
|
|
312
|
+
* App's reduced one: a cascade into a table the App does not declare still
|
|
313
|
+
* happens. `physical` is the connection's catalog and `table` its name there;
|
|
314
|
+
* `writerName` gives the name the writer reads a physical table by, or
|
|
315
|
+
* undefined when it cannot read it — which makes the reference unseen.
|
|
316
|
+
*/
|
|
317
|
+
export function deletionDependents(physical, table, writerName) {
|
|
318
|
+
const references = [];
|
|
319
|
+
// A table the catalog does not know cannot be shown to have no dependents.
|
|
320
|
+
let unseen = !physical.tables.some((item) => item.id === table);
|
|
321
|
+
for (const fk of changingReferences(physical, table)) {
|
|
322
|
+
const name = writerName(fk.from.table);
|
|
323
|
+
if (name === undefined)
|
|
324
|
+
unseen = true;
|
|
325
|
+
else
|
|
326
|
+
references.push({ ...fk, from: { ...fk.from, table: name } });
|
|
327
|
+
}
|
|
328
|
+
return { references, unseen };
|
|
329
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type Adapter, type SqlStyle } from '../adapters/adapter.js';
|
|
2
|
+
import { type DatabaseSchema } from '../shared/schema.js';
|
|
3
|
+
import { type QueryPerson } from '../shared/query.js';
|
|
4
|
+
import { type ViewDef } from '../shared/view.js';
|
|
5
|
+
/** A dashboard is at most a few dozen sections; a batch past this is not one. */
|
|
6
|
+
export declare const BREAKDOWN_BATCH = 48;
|
|
7
|
+
/** The furthest a list is paged by offset over HTTP: past it the rows skipped cost more than the page. */
|
|
8
|
+
export declare const MAX_PAGE_OFFSET = 10000;
|
|
9
|
+
/**
|
|
10
|
+
* What an App's reads are beside the database browser's, given by the App
|
|
11
|
+
* framework (app/appReads.ts) wherever an App is read: absent, a read is the
|
|
12
|
+
* browser's, which shows its SQL and its compiled columns and says a failure
|
|
13
|
+
* in the engine's own words.
|
|
14
|
+
*/
|
|
15
|
+
export interface AppReads {
|
|
16
|
+
/** The adapter with every read of a union answered by its branches (app/unionReads.ts). */
|
|
17
|
+
reader(adapter: Adapter, schema: DatabaseSchema): Adapter;
|
|
18
|
+
/** A reply as an App is told it: rendering and mutation state, never compiler output (app/appResponses.ts). */
|
|
19
|
+
reply(body: Record<string, unknown>): Record<string, unknown>;
|
|
20
|
+
/** A structured read's failure as an App says it (app/appErrors.ts): never a driver's message. */
|
|
21
|
+
error(err: unknown): unknown;
|
|
22
|
+
/**
|
|
23
|
+
* Who `me` is in `texts`, with the memberships they read, through this
|
|
24
|
+
* request's reader (app/appMe.ts), or nothing where no text compares with
|
|
25
|
+
* the person.
|
|
26
|
+
*/
|
|
27
|
+
person(me: () => Promise<QueryPerson | null>, texts: readonly unknown[], schema: DatabaseSchema, adapter: Adapter): Promise<{
|
|
28
|
+
me?: QueryPerson | null;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
interface ResourceReadHttpOptions {
|
|
32
|
+
/** An App's reads (AppReads), or none: the database browser's. */
|
|
33
|
+
app: AppReads | undefined;
|
|
34
|
+
now: () => Date;
|
|
35
|
+
/**
|
|
36
|
+
* Who `me` is in this request's text, read from the verified session and
|
|
37
|
+
* asked only when the text says `me` (appMe.ts). Absent — the database
|
|
38
|
+
* browser, a tenant App — `me` is the word it is.
|
|
39
|
+
*/
|
|
40
|
+
me?: () => Promise<QueryPerson | null>;
|
|
41
|
+
/**
|
|
42
|
+
* The ISO weekday an App's weeks start on (its `ui.locale`, weekStart.ts),
|
|
43
|
+
* set on every breakdown in place of whatever the request said. Absent —
|
|
44
|
+
* the database browser — a request may say its own, and Monday is the default.
|
|
45
|
+
*/
|
|
46
|
+
weekStart?: number;
|
|
47
|
+
/**
|
|
48
|
+
* The most rows `/api/run` answers for a table, where its reader may not
|
|
49
|
+
* export it (dataRoutes.ts, by the product's `exports.may`); undefined is no
|
|
50
|
+
* bound past the ceiling. A list's own read of 100,000 rows was an export
|
|
51
|
+
* by another name.
|
|
52
|
+
*/
|
|
53
|
+
rowsMost?: (table: string) => number | undefined;
|
|
54
|
+
}
|
|
55
|
+
interface ResourceReadHttpReply {
|
|
56
|
+
status: number;
|
|
57
|
+
body: unknown;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parse and shape the five resource-read routes using an already-authorized
|
|
61
|
+
* adapter. This owns no source acquisition, response stream or HTTP error class:
|
|
62
|
+
* escaping service validation errors retain their identity for the host to map.
|
|
63
|
+
*/
|
|
64
|
+
export declare function dispatchResourceReadHttp(path: string, body: Record<string, unknown>, adapter: Adapter, schema: DatabaseSchema, options: ResourceReadHttpOptions): Promise<ResourceReadHttpReply | undefined>;
|
|
65
|
+
/**
|
|
66
|
+
* Which dialect writes the SQL shown in the explain panel.
|
|
67
|
+
*
|
|
68
|
+
* The adapter picks its own style when it runs the statement; this is the
|
|
69
|
+
* copy the user reads, and it has to agree with what actually ran or the
|
|
70
|
+
* panel is teaching the wrong thing.
|
|
71
|
+
*/
|
|
72
|
+
export declare function styleFor(schema: DatabaseSchema): SqlStyle;
|
|
73
|
+
/**
|
|
74
|
+
* Coerce a JSON body into a `ViewDef`.
|
|
75
|
+
*
|
|
76
|
+
* Shape only. Whether the paths mean anything is `compileView`'s job, and it
|
|
77
|
+
* refuses what it cannot resolve — so this does not need to know the schema,
|
|
78
|
+
* and there is no second, weaker validator to disagree with the first.
|
|
79
|
+
*/
|
|
80
|
+
export declare function normaliseView(raw: unknown): ViewDef;
|
|
81
|
+
export {};
|