@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,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The migration runner: status, up, validate, baseline and repair over one
|
|
3
|
+
* database, with no opinion about how they are printed (migrate/cli.ts says
|
|
4
|
+
* them; `@mistriwork/mistri/maintenance` hands `migrateUp` to a seed).
|
|
5
|
+
*
|
|
6
|
+
* Forward only. Each file runs once, in version order, in its own
|
|
7
|
+
* transaction on SQLite and PostgreSQL, then its history row is written in
|
|
8
|
+
* that same transaction, so a file is either applied and recorded or neither.
|
|
9
|
+
* A file that must run outside a transaction (CREATE INDEX CONCURRENTLY) has
|
|
10
|
+
* a failure recorded as failed that stops the run, as Flyway does, because
|
|
11
|
+
* what ran before the failing statement is in the database and only a person
|
|
12
|
+
* can say whether to finish it or undo it.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { openMigrationDb, quoteIdent, splitPostgres } from './database.js';
|
|
17
|
+
import { readMigrations } from './files.js';
|
|
18
|
+
import { BASELINE_DESCRIPTION, historyDdl, historyExists, insertHistory, plan, qualified, readHistory, readRows, } from './history.js';
|
|
19
|
+
import { carryForward, drift, readSchema, readSnapshot, sorted, writeSnapshot, } from './snapshot.js';
|
|
20
|
+
import { product } from '../product.js';
|
|
21
|
+
/** The baseline's snapshot file, beside the migrations. Never run: no V or R, and not .sql. */
|
|
22
|
+
const BASELINE_FILE = 'baseline.schema.json';
|
|
23
|
+
/** How long a run waits for another to finish before it gives up, as Flyway's default retries do. */
|
|
24
|
+
const LOCK_WAIT_MS = 60_000;
|
|
25
|
+
async function withDb(target, create, run) {
|
|
26
|
+
const db = await openMigrationDb(target.url, target.schemas, create);
|
|
27
|
+
try {
|
|
28
|
+
return await run(db);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await db.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const refuseNonTransactional = (db, directory) => {
|
|
35
|
+
const file = directory.files.find((each) => !each.transactional);
|
|
36
|
+
if (file && db.dialect === 'sqlite') {
|
|
37
|
+
throw new Error(`${file.script}.conf says executeInTransaction=false, and SQLite runs every migration in a transaction: its write lock is what keeps two runs apart. Remove the .conf.`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
async function readStatus(db, target) {
|
|
41
|
+
const directory = readMigrations(target.dir);
|
|
42
|
+
const started = await historyExists(db, target.table);
|
|
43
|
+
const history = readRows(await readHistory(db, target.table));
|
|
44
|
+
const snapshot = started ? await readSnapshot(db, target.table) : undefined;
|
|
45
|
+
const live = snapshot ? await readSchema(db, target.schemas, target.table) : undefined;
|
|
46
|
+
const behind = snapshot
|
|
47
|
+
? history.rows.filter((row) => row.installed_rank > snapshot.rank && row.success && row.type !== 'DELETE').length
|
|
48
|
+
: 0;
|
|
49
|
+
const holds = started
|
|
50
|
+
? 0
|
|
51
|
+
: Object.keys(await readSchema(db, target.schemas, target.table)).filter((key) => /^(table|view|materialized view) /.test(key)).length;
|
|
52
|
+
return {
|
|
53
|
+
dialect: db.dialect,
|
|
54
|
+
home: db.home,
|
|
55
|
+
directory,
|
|
56
|
+
plan: plan(directory.files, history),
|
|
57
|
+
started,
|
|
58
|
+
...(snapshot && live ? { drift: drift(snapshot.objects, live), snapshot } : {}),
|
|
59
|
+
behind,
|
|
60
|
+
holds,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function migrationStatus(target) {
|
|
64
|
+
return withDb(target, false, (db) => readStatus(db, target));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Apply every pending migration. Under the run's lock the plan is read again
|
|
68
|
+
* before each file, so a second deploy that waited finds the first's work
|
|
69
|
+
* done and applies nothing twice.
|
|
70
|
+
*/
|
|
71
|
+
export function migrateUp(target, options = {}) {
|
|
72
|
+
return withDb(target, !options.dryRun, async (db) => {
|
|
73
|
+
const directory = readMigrations(target.dir);
|
|
74
|
+
refuseNonTransactional(db, directory);
|
|
75
|
+
await db.lock(target.table, LOCK_WAIT_MS, options.waiting ?? (() => { }));
|
|
76
|
+
const initial = await readStatus(db, target);
|
|
77
|
+
/* R7, and Flyway's rule: a database with tables and no history is
|
|
78
|
+
recorded as it is before anything runs on it. */
|
|
79
|
+
if (initial.holds) {
|
|
80
|
+
return {
|
|
81
|
+
status: initial,
|
|
82
|
+
applied: [],
|
|
83
|
+
refused: `the database already holds ${initial.holds} table${initial.holds === 1 ? '' : 's'} or view${initial.holds === 1 ? '' : 's'} and no migration history. Record it as it is first: ${product()} migrate baseline`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (initial.plan.problems.length)
|
|
87
|
+
return { status: initial, applied: [] };
|
|
88
|
+
if (options.dryRun)
|
|
89
|
+
return { status: initial, applied: [], wouldRun: initial.plan.pending };
|
|
90
|
+
const expected = initial.snapshot?.objects;
|
|
91
|
+
const before = await readSchema(db, target.schemas, target.table);
|
|
92
|
+
if (!initial.started) {
|
|
93
|
+
if (db.dialect === 'postgres' && target.schemas.length)
|
|
94
|
+
await db.run(`CREATE SCHEMA IF NOT EXISTS ${quoteIdent('postgres', db.home)}`);
|
|
95
|
+
await ensureHistory(db, target.table);
|
|
96
|
+
}
|
|
97
|
+
const applied = [];
|
|
98
|
+
let failure;
|
|
99
|
+
for (;;) {
|
|
100
|
+
if (db.dialect === 'sqlite')
|
|
101
|
+
await db.run('BEGIN IMMEDIATE');
|
|
102
|
+
const now = plan(directory.files, readRows(await readHistory(db, target.table)));
|
|
103
|
+
const next = now.pending[0];
|
|
104
|
+
if (now.problems.length || !next) {
|
|
105
|
+
if (db.dialect === 'sqlite')
|
|
106
|
+
await db.run('COMMIT');
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
const result = await apply(db, target.table, next);
|
|
110
|
+
if ('message' in result) {
|
|
111
|
+
failure = { file: next, ...result };
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
applied.push({ file: next, ms: result.ms });
|
|
115
|
+
}
|
|
116
|
+
/* Recorded after a failure too: what did apply is migrations' work, and
|
|
117
|
+
what had drifted before the run stays drift. */
|
|
118
|
+
if (applied.length || !initial.snapshot) {
|
|
119
|
+
const after = await readSchema(db, target.schemas, target.table);
|
|
120
|
+
const lastRank = readRows(await readHistory(db, target.table)).lastRank;
|
|
121
|
+
await writeSnapshot(db, target.table, lastRank, expected
|
|
122
|
+
? carryForward(expected, before, after, applied.map(({ file }) => file.sql))
|
|
123
|
+
: after);
|
|
124
|
+
}
|
|
125
|
+
return { status: await readStatus(db, target), applied, ...(failure ? { failure } : {}) };
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/* Created under the write lock and looked for again inside it: on SQLite two
|
|
129
|
+
first runs can both have seen no table before either took the lock. */
|
|
130
|
+
function ensureHistory(db, table) {
|
|
131
|
+
return transaction(db, async () => {
|
|
132
|
+
if (!(await historyExists(db, table)))
|
|
133
|
+
for (const ddl of historyDdl(db, table))
|
|
134
|
+
await db.run(ddl);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async function transaction(db, run) {
|
|
138
|
+
await db.run(db.dialect === 'sqlite' ? 'BEGIN IMMEDIATE' : 'BEGIN');
|
|
139
|
+
try {
|
|
140
|
+
await run();
|
|
141
|
+
await db.run('COMMIT');
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
await db.run('ROLLBACK').catch(() => { });
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const sayError = (error) => (error instanceof Error ? error.message : String(error)).split('\n')[0];
|
|
149
|
+
/* A transactional PostgreSQL file whose statement waited out its lock
|
|
150
|
+
(database.ts MIGRATION_LOCK_TIMEOUT_MS) rolled back whole, so it is tried
|
|
151
|
+
again after a pause that grows: a long transaction on the table may end.
|
|
152
|
+
Five tries, about half a minute in all, and then it says so. */
|
|
153
|
+
const LOCK_ATTEMPTS = 5;
|
|
154
|
+
const lockWaited = (error) => error?.code === '55P03';
|
|
155
|
+
const pause = (ms) => new Promise((done) => setTimeout(done, ms));
|
|
156
|
+
/** One file and its history row. On SQLite the caller's BEGIN IMMEDIATE is already open. */
|
|
157
|
+
async function apply(db, table, file) {
|
|
158
|
+
const started = performance.now();
|
|
159
|
+
const row = (success) => ({
|
|
160
|
+
version: file.version ?? null,
|
|
161
|
+
description: file.description,
|
|
162
|
+
type: 'SQL',
|
|
163
|
+
script: file.script,
|
|
164
|
+
checksum: file.checksum,
|
|
165
|
+
executionTime: Math.round(performance.now() - started),
|
|
166
|
+
success,
|
|
167
|
+
});
|
|
168
|
+
if (file.transactional && db.dialect === 'postgres') {
|
|
169
|
+
for (let attempt = 1;; attempt++) {
|
|
170
|
+
const tried = await applyInTransaction(db, table, file, row);
|
|
171
|
+
if (!('locked' in tried))
|
|
172
|
+
return tried;
|
|
173
|
+
if (attempt === LOCK_ATTEMPTS) {
|
|
174
|
+
return {
|
|
175
|
+
message: `${tried.locked}. It waited for another transaction's lock ${LOCK_ATTEMPTS} times; nothing of it was applied. ` +
|
|
176
|
+
'Run it again when the transaction holding the table has finished.',
|
|
177
|
+
recorded: false,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
await pause(attempt * 1_000);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (file.transactional) {
|
|
184
|
+
try {
|
|
185
|
+
await db.script(file.sql);
|
|
186
|
+
if (db.dialect === 'sqlite') {
|
|
187
|
+
/* Foreign keys are off while a migration runs, so a table can be
|
|
188
|
+
rebuilt the way SQLite's manual says; they are checked here, before
|
|
189
|
+
the commit, so none is left pointing nowhere. */
|
|
190
|
+
const broken = await db.all('PRAGMA foreign_key_check');
|
|
191
|
+
if (broken.length) {
|
|
192
|
+
const first = broken[0];
|
|
193
|
+
throw new Error(`it leaves ${broken.length} row${broken.length === 1 ? '' : 's'} of ${first.table} pointing at no row of ${first.parent}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
await insertHistory(db, table, row(true));
|
|
197
|
+
await db.run('COMMIT');
|
|
198
|
+
return { ms: row(true).executionTime };
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
await db.run('ROLLBACK').catch(() => { });
|
|
202
|
+
return { message: `${sayError(error)}. Nothing of it was applied.`, recorded: false };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
if (db.dialect === 'postgres')
|
|
207
|
+
for (const statement of splitPostgres(file.sql))
|
|
208
|
+
await db.script(statement);
|
|
209
|
+
else
|
|
210
|
+
await db.script(file.sql);
|
|
211
|
+
await insertHistory(db, table, row(true));
|
|
212
|
+
return { ms: row(true).executionTime };
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
await insertHistory(db, table, row(false)).catch(() => { });
|
|
216
|
+
return {
|
|
217
|
+
message: `${sayError(error)}. It ran outside a transaction, so the statements before the failing one are applied: finish or undo them by hand, then ${product()} migrate repair.`,
|
|
218
|
+
recorded: true,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** One PostgreSQL file in its own transaction: applied, refused, or rolled back after a lock wait ran out. */
|
|
223
|
+
async function applyInTransaction(db, table, file, row) {
|
|
224
|
+
await db.run('BEGIN');
|
|
225
|
+
try {
|
|
226
|
+
await db.script(file.sql);
|
|
227
|
+
await insertHistory(db, table, row(true));
|
|
228
|
+
await db.run('COMMIT');
|
|
229
|
+
return { ms: row(true).executionTime };
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
await db.run('ROLLBACK').catch(() => { });
|
|
233
|
+
if (lockWaited(error))
|
|
234
|
+
return { locked: sayError(error) };
|
|
235
|
+
return { message: `${sayError(error)}. Nothing of it was applied.`, recorded: false };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Flyway's validate — every applied file unchanged and present, nothing
|
|
240
|
+
* pending, nothing failed — and one thing Flyway cannot see: the database
|
|
241
|
+
* is still what its migrations made it.
|
|
242
|
+
*/
|
|
243
|
+
export async function migrateValidate(target) {
|
|
244
|
+
const status = await migrationStatus(target);
|
|
245
|
+
const valid = status.started && !status.plan.problems.length && !status.plan.pending.length && !status.drift?.length;
|
|
246
|
+
return { status, valid };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Record the database as it is as version 0: nothing that exists is touched,
|
|
250
|
+
* and history starts here. The schema as read is written beside the
|
|
251
|
+
* migrations, read-only, and kept as the one migrations start from.
|
|
252
|
+
*/
|
|
253
|
+
export function migrateBaseline(target, options = {}) {
|
|
254
|
+
return withDb(target, false, async (db) => {
|
|
255
|
+
await db.lock(target.table, LOCK_WAIT_MS, () => { });
|
|
256
|
+
const history = readRows(await readHistory(db, target.table));
|
|
257
|
+
const file = join(target.dir, BASELINE_FILE);
|
|
258
|
+
const objects = await readSchema(db, target.schemas, target.table);
|
|
259
|
+
if (history.baseline)
|
|
260
|
+
return {
|
|
261
|
+
already: `baselined as version ${history.baseline.version} on ${history.baseline.installed_on}`,
|
|
262
|
+
objects,
|
|
263
|
+
file,
|
|
264
|
+
wrote: false,
|
|
265
|
+
};
|
|
266
|
+
const applied = history.rows.filter((row) => row.type !== 'DELETE').length;
|
|
267
|
+
if (applied)
|
|
268
|
+
return {
|
|
269
|
+
refused: `${target.table} already records ${applied} migration${applied === 1 ? '' : 's'}; a baseline starts a history, it does not join one`,
|
|
270
|
+
objects,
|
|
271
|
+
file,
|
|
272
|
+
wrote: false,
|
|
273
|
+
};
|
|
274
|
+
if (options.dryRun)
|
|
275
|
+
return { objects, file, wrote: false };
|
|
276
|
+
await ensureHistory(db, target.table);
|
|
277
|
+
await transaction(db, async () => {
|
|
278
|
+
await insertHistory(db, target.table, {
|
|
279
|
+
version: '0',
|
|
280
|
+
description: BASELINE_DESCRIPTION,
|
|
281
|
+
type: 'BASELINE',
|
|
282
|
+
script: BASELINE_DESCRIPTION,
|
|
283
|
+
checksum: null,
|
|
284
|
+
executionTime: 0,
|
|
285
|
+
success: true,
|
|
286
|
+
});
|
|
287
|
+
await writeSnapshot(db, target.table, readRows(await readHistory(db, target.table)).lastRank, objects);
|
|
288
|
+
});
|
|
289
|
+
let wrote = false;
|
|
290
|
+
if (!existsSync(file)) {
|
|
291
|
+
mkdirSync(target.dir, { recursive: true });
|
|
292
|
+
writeFileSync(file, `${JSON.stringify({
|
|
293
|
+
about: 'The schema as it was when ' +
|
|
294
|
+
product() +
|
|
295
|
+
' migrate baseline recorded it as version 0: a record, never run. Migrations after it start from here.',
|
|
296
|
+
dialect: db.dialect,
|
|
297
|
+
schemas: target.schemas.length ? target.schemas : db.home ? [db.home] : [],
|
|
298
|
+
taken: new Date().toISOString().slice(0, 19).replace('T', ' '),
|
|
299
|
+
objects: sorted(objects),
|
|
300
|
+
}, null, 2)}\n`, { mode: 0o444, flag: 'wx' });
|
|
301
|
+
wrote = true;
|
|
302
|
+
}
|
|
303
|
+
return { objects, file, wrote };
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Make the history agree with the files again, as Flyway's repair does:
|
|
308
|
+
* failed entries removed, an applied file's checksum and description taken
|
|
309
|
+
* from the file as it is now, a file that is gone marked deleted. And the
|
|
310
|
+
* recorded schema retaken when another runner applied migrations after it,
|
|
311
|
+
* since their changes cannot be told from drift; drift itself is never
|
|
312
|
+
* repaired away.
|
|
313
|
+
*/
|
|
314
|
+
export function migrateRepair(target, options = {}) {
|
|
315
|
+
return withDb(target, false, async (db) => {
|
|
316
|
+
await db.lock(target.table, LOCK_WAIT_MS, () => { });
|
|
317
|
+
const status = await readStatus(db, target);
|
|
318
|
+
const { history } = status.plan;
|
|
319
|
+
const name = qualified(db, target.table);
|
|
320
|
+
const actions = [];
|
|
321
|
+
const work = [];
|
|
322
|
+
const flag = (value) => (db.dialect === 'postgres' ? value : value ? 1 : 0);
|
|
323
|
+
if (history.failed.length) {
|
|
324
|
+
actions.push(...history.failed.map((row) => `removed the failed entry for ${row.script}`));
|
|
325
|
+
work.push(() => db.run(`DELETE FROM ${name} WHERE success = ?`, [flag(false)]));
|
|
326
|
+
}
|
|
327
|
+
const files = status.directory.files;
|
|
328
|
+
for (const [version, row] of history.versioned) {
|
|
329
|
+
const file = files.find((each) => each.version === version);
|
|
330
|
+
if (file) {
|
|
331
|
+
if (file.checksum !== row.checksum || file.description !== row.description) {
|
|
332
|
+
actions.push(`${file.script}: history now says checksum ${file.checksum}, "${file.description}"`);
|
|
333
|
+
work.push(() => db.run(`UPDATE ${name} SET checksum = ?, description = ? WHERE installed_rank = ?`, [
|
|
334
|
+
file.checksum,
|
|
335
|
+
file.description,
|
|
336
|
+
row.installed_rank,
|
|
337
|
+
]));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else if (!status.plan.notes.some((note) => note.startsWith(`version ${version} `))) {
|
|
341
|
+
actions.push(`marked ${row.script} deleted`);
|
|
342
|
+
work.push(() => insertHistory(db, target.table, {
|
|
343
|
+
version: row.version,
|
|
344
|
+
description: row.description,
|
|
345
|
+
type: 'DELETE',
|
|
346
|
+
script: row.script,
|
|
347
|
+
checksum: row.checksum,
|
|
348
|
+
executionTime: 0,
|
|
349
|
+
success: true,
|
|
350
|
+
}));
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
for (const [description, row] of history.repeatable) {
|
|
354
|
+
if (files.some((file) => file.kind === 'repeatable' && file.description === description))
|
|
355
|
+
continue;
|
|
356
|
+
actions.push(`marked ${row.script} deleted`);
|
|
357
|
+
work.push(() => insertHistory(db, target.table, {
|
|
358
|
+
version: null,
|
|
359
|
+
description,
|
|
360
|
+
type: 'DELETE',
|
|
361
|
+
script: row.script,
|
|
362
|
+
checksum: row.checksum,
|
|
363
|
+
executionTime: 0,
|
|
364
|
+
success: true,
|
|
365
|
+
}));
|
|
366
|
+
}
|
|
367
|
+
if (status.started && (!status.snapshot || status.behind)) {
|
|
368
|
+
actions.push(status.snapshot
|
|
369
|
+
? `recorded the schema again: ${status.behind} migration${status.behind === 1 ? ' was' : 's were'} applied after it by another runner, so what they changed is now what migrations made`
|
|
370
|
+
: 'recorded the schema as it is now: drift is measured from here');
|
|
371
|
+
work.push(async () => writeSnapshot(db, target.table, readRows(await readHistory(db, target.table)).lastRank, await readSchema(db, target.schemas, target.table)));
|
|
372
|
+
}
|
|
373
|
+
if (!options.dryRun && work.length)
|
|
374
|
+
await transaction(db, async () => {
|
|
375
|
+
for (const step of work)
|
|
376
|
+
await step();
|
|
377
|
+
});
|
|
378
|
+
return { actions };
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Around a run another tool makes (`--tool flyway`): the schema read before
|
|
383
|
+
* it, and recorded after it as tablewalk's own runs record it, so drift stays
|
|
384
|
+
* measured whichever tool applied the files.
|
|
385
|
+
*/
|
|
386
|
+
export async function recordAround(target, run) {
|
|
387
|
+
const before = await withDb(target, false, async (db) => ({
|
|
388
|
+
expected: (await readSnapshot(db, target.table))?.objects,
|
|
389
|
+
objects: await readSchema(db, target.schemas, target.table),
|
|
390
|
+
rank: readRows(await readHistory(db, target.table)).lastRank,
|
|
391
|
+
})).catch(() => undefined);
|
|
392
|
+
const code = await run();
|
|
393
|
+
await withDb(target, false, async (db) => {
|
|
394
|
+
if (!(await historyExists(db, target.table)))
|
|
395
|
+
return;
|
|
396
|
+
const lastRank = readRows(await readHistory(db, target.table)).lastRank;
|
|
397
|
+
if (before && lastRank === before.rank && before.expected)
|
|
398
|
+
return;
|
|
399
|
+
const after = await readSchema(db, target.schemas, target.table);
|
|
400
|
+
// What the other tool applied, read back from the files its history rows name.
|
|
401
|
+
const { files } = readMigrations(target.dir);
|
|
402
|
+
const scripts = new Set(readRows(await readHistory(db, target.table))
|
|
403
|
+
.rows.filter((row) => row.installed_rank > (before?.rank ?? 0))
|
|
404
|
+
.map((row) => row.script));
|
|
405
|
+
const applied = files.filter((file) => scripts.has(file.script)).map((file) => file.sql);
|
|
406
|
+
await writeSnapshot(db, target.table, lastRank, before?.expected ? carryForward(before.expected, before.objects, after, applied) : after);
|
|
407
|
+
}).catch(() => { });
|
|
408
|
+
return code;
|
|
409
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { MigrationDb } from './database.js';
|
|
2
|
+
export type Objects = Record<string, string>;
|
|
3
|
+
export declare function readSchema(db: MigrationDb, scope: readonly string[], history: string): Promise<Objects>;
|
|
4
|
+
export interface Change {
|
|
5
|
+
readonly key: string;
|
|
6
|
+
readonly was?: string;
|
|
7
|
+
readonly now?: string;
|
|
8
|
+
}
|
|
9
|
+
/** What differs between the schema migrations left and the one there now. A new or dropped table is one line, not one per column. */
|
|
10
|
+
export declare function drift(expected: Objects, live: Objects): Change[];
|
|
11
|
+
export declare function sayChange(change: Change): string;
|
|
12
|
+
/**
|
|
13
|
+
* The schema to record after a run: what the database is now, except where
|
|
14
|
+
* it had drifted before the run and the run left that alone — that stays
|
|
15
|
+
* drift, so a run never quietly blesses a column someone added by hand. A
|
|
16
|
+
* migration that changed the drifted object (putting it back, or altering
|
|
17
|
+
* it) settles it, and so does one that names it: adopting a hand-made column
|
|
18
|
+
* is `ADD COLUMN IF NOT EXISTS note`, which changes nothing here and makes
|
|
19
|
+
* the column everywhere else. `applied` is the text of the files the run
|
|
20
|
+
* applied.
|
|
21
|
+
*/
|
|
22
|
+
export declare function carryForward(expected: Objects, before: Objects, after: Objects, applied?: readonly string[]): Objects;
|
|
23
|
+
export interface StoredSnapshot {
|
|
24
|
+
readonly rank: number;
|
|
25
|
+
readonly takenOn: string;
|
|
26
|
+
readonly objects: Objects;
|
|
27
|
+
}
|
|
28
|
+
export declare function readSnapshot(db: MigrationDb, history: string): Promise<StoredSnapshot | undefined>;
|
|
29
|
+
export declare function writeSnapshot(db: MigrationDb, history: string, rank: number, objects: Objects): Promise<void>;
|
|
30
|
+
export declare const sorted: (objects: Objects) => Objects;
|