@mistriwork/engine 0.0.0 → 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 +16 -1
- 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 +262 -3
- package/schema/model.d.ts +298 -0
- package/schema/theme.d.ts +587 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a server's Apps are mounted, and the path it is served under: the one
|
|
3
|
+
* rule every address passes through on its way in and out.
|
|
4
|
+
*
|
|
5
|
+
* Inside tablewalk an App's address is always `/{app}/…` — the walk, the
|
|
6
|
+
* address book (appAddress.ts), the route table and every link the client
|
|
7
|
+
* builds say it so. What the browser shows is decided here, once:
|
|
8
|
+
*
|
|
9
|
+
* - a server serving one App serves it at the root: `/leases/12`;
|
|
10
|
+
* - several Apps each keep `/{app}`, and one of them may be the main App at
|
|
11
|
+
* the root (`--mount main=/`), the others under their own segment;
|
|
12
|
+
* - an explicit mount (`--mount lintel=/lintel`, config `"mount"`)
|
|
13
|
+
* overrides either default;
|
|
14
|
+
* - and the whole server may sit under a prefix a reverse proxy serves it
|
|
15
|
+
* at (`--base-path /tools`): `https://host/tools/leases/12`.
|
|
16
|
+
*
|
|
17
|
+
* `outward` turns an inside address into the one the browser shows, and
|
|
18
|
+
* `inward` reads one back. The server reads every request through `inward`
|
|
19
|
+
* and writes every address it sends (a redirect, a canonical link, a mail's
|
|
20
|
+
* link, a cookie's path) through `outward`; the client does the same at the
|
|
21
|
+
* address bar, its links and its fetches (client addressMount.js). There are no
|
|
22
|
+
* aliases: whichever form applies is the only spelling, and an address in
|
|
23
|
+
* another form names nothing.
|
|
24
|
+
*
|
|
25
|
+
* The standalone database browser mounts nothing, so every address is its
|
|
26
|
+
* own — only a base path, when one is given, is added and taken off.
|
|
27
|
+
*
|
|
28
|
+
* Pure and dependency-free, so the server, the client and `mistri check`
|
|
29
|
+
* cannot disagree.
|
|
30
|
+
*/
|
|
31
|
+
export interface AddressMount {
|
|
32
|
+
/** The path the server is served under: '' or `/tools`, never a trailing slash. */
|
|
33
|
+
base: string;
|
|
34
|
+
/** Each served App's mount, by id: '' at the root, else its one segment. */
|
|
35
|
+
apps: Readonly<Record<string, string>>;
|
|
36
|
+
}
|
|
37
|
+
/** No Apps and no prefix: every address is its own. */
|
|
38
|
+
export declare const NO_MOUNT: AddressMount;
|
|
39
|
+
/**
|
|
40
|
+
* First segments the server answers at its root whatever it serves: the API,
|
|
41
|
+
* the built client's files, `_mistri` — the custom components' host
|
|
42
|
+
* modules and tablewalk's own tools, the dev observer among them — and an
|
|
43
|
+
* orchestrator's `healthz` and `readyz` probes, and a crawler's `robots.txt`
|
|
44
|
+
* and `sitemap.xml` (http/sitemap.ts). No App is mounted at one, and
|
|
45
|
+
* an App at the root cannot route to one.
|
|
46
|
+
*/
|
|
47
|
+
export declare const SERVER_SEGMENTS: readonly string[];
|
|
48
|
+
/**
|
|
49
|
+
* A base path as written — `/tools`, `/tools/`, `tools`, `/a/b` — made
|
|
50
|
+
* canonical (`/tools`), or a refusal that names the fix. '' and '/' are no
|
|
51
|
+
* base at all.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseBasePath(value: string, at?: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* One App's mount as written — `/` for the root, `/billing` (or `billing`)
|
|
56
|
+
* for a segment — into its stored form ('' or `billing`).
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseMountPath(value: string, at: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* The mounts of the Apps a server serves: one App at the root, several each
|
|
61
|
+
* under its id, and whatever `explicit` says over either. Throws, naming the
|
|
62
|
+
* App, on a mount that names no served App, two Apps at one place, or an
|
|
63
|
+
* App id the server's own paths already hold.
|
|
64
|
+
*/
|
|
65
|
+
export declare function appMounts(ids: readonly string[], explicit?: {
|
|
66
|
+
base?: string;
|
|
67
|
+
mounts?: Readonly<Record<string, string>>;
|
|
68
|
+
}): AddressMount;
|
|
69
|
+
/**
|
|
70
|
+
* The mounts as a deployment writes them — `--mount`/`--base-path` over the
|
|
71
|
+
* config's `"mount"`/`"basePath"` — for these Apps. The server, `check
|
|
72
|
+
* --routes` and `shot` all start here, so they read one deployment alike.
|
|
73
|
+
*/
|
|
74
|
+
export declare function settingsMount(ids: readonly string[], flags: {
|
|
75
|
+
mounts?: Readonly<Record<string, string>>;
|
|
76
|
+
basePath?: string;
|
|
77
|
+
}, config?: {
|
|
78
|
+
mount?: Readonly<Record<string, string>>;
|
|
79
|
+
basePath?: string;
|
|
80
|
+
}): AddressMount;
|
|
81
|
+
/** The App mounted at the root, if any. */
|
|
82
|
+
export declare function rootApp(mount: AddressMount): string | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* The words an App at the root cannot route to beyond its own reserved ones:
|
|
85
|
+
* every other App's segment, by its id, which the server reads first.
|
|
86
|
+
*/
|
|
87
|
+
export declare function segmentsTakenFrom(mount: AddressMount, app: string): Record<string, string>;
|
|
88
|
+
/** An App's home as the browser shows it: `/`, `/billing`, `/tools/`, `/tools/billing`. */
|
|
89
|
+
export declare function appHome(mount: AddressMount, app: string): string;
|
|
90
|
+
/**
|
|
91
|
+
* An inside address as the browser shows it. `/lintel/leases/12` is
|
|
92
|
+
* `/leases/12` with Lintel at the root, `/tools/leases/12` under a base; a
|
|
93
|
+
* server path (`/api/…`) only gains the base. Any `?search` and `#hash` ride
|
|
94
|
+
* along untouched.
|
|
95
|
+
*/
|
|
96
|
+
export declare function outward(mount: AddressMount, internal: string): string;
|
|
97
|
+
/**
|
|
98
|
+
* An address as the browser sent it, read back to the inside form; undefined
|
|
99
|
+
* for one outside the base path or naming an App the way it is not mounted —
|
|
100
|
+
* the spelling that applies is the only one.
|
|
101
|
+
*/
|
|
102
|
+
export declare function inward(mount: AddressMount, external: string): string | undefined;
|
|
103
|
+
/** A server path (`/api/…`, `/_mistri/…`) under the base. */
|
|
104
|
+
export declare const serverPath: (mount: AddressMount, path: string) => string;
|
|
105
|
+
/** A Set-Cookie value with its `Path=/…` said under the base, so the browser sends it back where the proxy serves the server. */
|
|
106
|
+
export declare const cookieUnder: (base: string, cookie: string) => string;
|
|
107
|
+
/** The mount as a page carries it to the client (client addressMount.js): compact, and nothing but these two. */
|
|
108
|
+
export declare function mountJson(mount: AddressMount): string;
|
|
109
|
+
/** A page's mount, read back; anything malformed is no mount, which is how a page with none behaves. */
|
|
110
|
+
export declare function readMountJson(text: string | null | undefined): AddressMount;
|
|
111
|
+
/**
|
|
112
|
+
* The public URL (MISTRI_PUBLIC_URL) as the root every outward address is
|
|
113
|
+
* appended to: no trailing slash, and without the base path where it was
|
|
114
|
+
* written with it. A link adds the base itself, so `https://host/desk` with
|
|
115
|
+
* `--base-path /desk` became `/desk/desk` — sign-in answered 404 and looped.
|
|
116
|
+
* Both spellings name the one place; a URL that is not one is left as given.
|
|
117
|
+
*/
|
|
118
|
+
export declare function publicRoot(url: string, base: string): string;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a server's Apps are mounted, and the path it is served under: the one
|
|
3
|
+
* rule every address passes through on its way in and out.
|
|
4
|
+
*
|
|
5
|
+
* Inside tablewalk an App's address is always `/{app}/…` — the walk, the
|
|
6
|
+
* address book (appAddress.ts), the route table and every link the client
|
|
7
|
+
* builds say it so. What the browser shows is decided here, once:
|
|
8
|
+
*
|
|
9
|
+
* - a server serving one App serves it at the root: `/leases/12`;
|
|
10
|
+
* - several Apps each keep `/{app}`, and one of them may be the main App at
|
|
11
|
+
* the root (`--mount main=/`), the others under their own segment;
|
|
12
|
+
* - an explicit mount (`--mount lintel=/lintel`, config `"mount"`)
|
|
13
|
+
* overrides either default;
|
|
14
|
+
* - and the whole server may sit under a prefix a reverse proxy serves it
|
|
15
|
+
* at (`--base-path /tools`): `https://host/tools/leases/12`.
|
|
16
|
+
*
|
|
17
|
+
* `outward` turns an inside address into the one the browser shows, and
|
|
18
|
+
* `inward` reads one back. The server reads every request through `inward`
|
|
19
|
+
* and writes every address it sends (a redirect, a canonical link, a mail's
|
|
20
|
+
* link, a cookie's path) through `outward`; the client does the same at the
|
|
21
|
+
* address bar, its links and its fetches (client addressMount.js). There are no
|
|
22
|
+
* aliases: whichever form applies is the only spelling, and an address in
|
|
23
|
+
* another form names nothing.
|
|
24
|
+
*
|
|
25
|
+
* The standalone database browser mounts nothing, so every address is its
|
|
26
|
+
* own — only a base path, when one is given, is added and taken off.
|
|
27
|
+
*
|
|
28
|
+
* Pure and dependency-free, so the server, the client and `mistri check`
|
|
29
|
+
* cannot disagree.
|
|
30
|
+
*/
|
|
31
|
+
/** No Apps and no prefix: every address is its own. */
|
|
32
|
+
export const NO_MOUNT = Object.freeze({ base: '', apps: Object.freeze({}) });
|
|
33
|
+
/**
|
|
34
|
+
* First segments the server answers at its root whatever it serves: the API,
|
|
35
|
+
* the built client's files, `_mistri` — the custom components' host
|
|
36
|
+
* modules and tablewalk's own tools, the dev observer among them — and an
|
|
37
|
+
* orchestrator's `healthz` and `readyz` probes, and a crawler's `robots.txt`
|
|
38
|
+
* and `sitemap.xml` (http/sitemap.ts). No App is mounted at one, and
|
|
39
|
+
* an App at the root cannot route to one.
|
|
40
|
+
*/
|
|
41
|
+
export const SERVER_SEGMENTS = ['api', 'assets', '_mistri', 'healthz', 'readyz', 'robots.txt', 'sitemap.xml'];
|
|
42
|
+
/** One mount segment: the letters an App id and a route path allow. */
|
|
43
|
+
const SEGMENT = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
|
|
44
|
+
/**
|
|
45
|
+
* A base path as written — `/tools`, `/tools/`, `tools`, `/a/b` — made
|
|
46
|
+
* canonical (`/tools`), or a refusal that names the fix. '' and '/' are no
|
|
47
|
+
* base at all.
|
|
48
|
+
*/
|
|
49
|
+
export function parseBasePath(value, at = 'the base path') {
|
|
50
|
+
const trimmed = value.trim();
|
|
51
|
+
if (trimmed === '' || trimmed === '/')
|
|
52
|
+
return '';
|
|
53
|
+
const segments = trimmed.replace(/^\/+/, '').replace(/\/+$/, '').split('/');
|
|
54
|
+
if (segments.some((segment) => !SEGMENT.test(segment))) {
|
|
55
|
+
throw new Error(`${at}: "${value}" must be a path like /tools — segments of letters, digits, hyphens and underscores.`);
|
|
56
|
+
}
|
|
57
|
+
return `/${segments.join('/')}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* One App's mount as written — `/` for the root, `/billing` (or `billing`)
|
|
61
|
+
* for a segment — into its stored form ('' or `billing`).
|
|
62
|
+
*/
|
|
63
|
+
export function parseMountPath(value, at) {
|
|
64
|
+
const trimmed = value.trim();
|
|
65
|
+
if (trimmed === '/')
|
|
66
|
+
return '';
|
|
67
|
+
const segment = trimmed.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
68
|
+
if (!SEGMENT.test(segment))
|
|
69
|
+
throw new Error(`${at}: "${value}" must be "/" (the root) or one segment, like "/billing".`);
|
|
70
|
+
if (SERVER_SEGMENTS.includes(segment))
|
|
71
|
+
throw new Error(`${at}: "${value}" is the server's own (${SERVER_SEGMENTS.join(', ')}); mount the App elsewhere.`);
|
|
72
|
+
return segment;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The mounts of the Apps a server serves: one App at the root, several each
|
|
76
|
+
* under its id, and whatever `explicit` says over either. Throws, naming the
|
|
77
|
+
* App, on a mount that names no served App, two Apps at one place, or an
|
|
78
|
+
* App id the server's own paths already hold.
|
|
79
|
+
*/
|
|
80
|
+
export function appMounts(ids, explicit = {}) {
|
|
81
|
+
const base = explicit.base ?? '';
|
|
82
|
+
const mounts = explicit.mounts ?? {};
|
|
83
|
+
for (const id of Object.keys(mounts)) {
|
|
84
|
+
if (!ids.includes(id))
|
|
85
|
+
throw new Error(`--mount names "${id}", which is not an App this server serves${ids.length ? ` (${ids.join(', ')})` : ''}.`);
|
|
86
|
+
}
|
|
87
|
+
const apps = {};
|
|
88
|
+
for (const id of ids) {
|
|
89
|
+
apps[id] = Object.hasOwn(mounts, id) ? mounts[id] : ids.length === 1 ? '' : id;
|
|
90
|
+
if (apps[id] !== '' && SERVER_SEGMENTS.includes(apps[id])) {
|
|
91
|
+
throw new Error(`The App "${id}" would be mounted at /${apps[id]}, which is the server's own; mount it elsewhere with --mount ${id}=/<segment>.`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const held = new Map();
|
|
95
|
+
for (const [id, at] of Object.entries(apps)) {
|
|
96
|
+
const other = held.get(at);
|
|
97
|
+
if (other !== undefined) {
|
|
98
|
+
throw new Error(at === ''
|
|
99
|
+
? `The Apps "${other}" and "${id}" are both mounted at the root; only one App can be the main App.`
|
|
100
|
+
: `The Apps "${other}" and "${id}" are both mounted at /${at}; give one of them another --mount.`);
|
|
101
|
+
}
|
|
102
|
+
held.set(at, id);
|
|
103
|
+
}
|
|
104
|
+
return { base, apps };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The mounts as a deployment writes them — `--mount`/`--base-path` over the
|
|
108
|
+
* config's `"mount"`/`"basePath"` — for these Apps. The server, `check
|
|
109
|
+
* --routes` and `shot` all start here, so they read one deployment alike.
|
|
110
|
+
*/
|
|
111
|
+
export function settingsMount(ids, flags, config = {}) {
|
|
112
|
+
const written = { ...config.mount, ...flags.mounts };
|
|
113
|
+
const mounts = Object.fromEntries(Object.entries(written).map(([id, at]) => [id, parseMountPath(at, `--mount ${id}`)]));
|
|
114
|
+
return appMounts(ids, { base: parseBasePath(flags.basePath ?? config.basePath ?? '', '--base-path'), mounts });
|
|
115
|
+
}
|
|
116
|
+
/** The App mounted at the root, if any. */
|
|
117
|
+
export function rootApp(mount) {
|
|
118
|
+
return Object.entries(mount.apps).find(([, at]) => at === '')?.[0];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The words an App at the root cannot route to beyond its own reserved ones:
|
|
122
|
+
* every other App's segment, by its id, which the server reads first.
|
|
123
|
+
*/
|
|
124
|
+
export function segmentsTakenFrom(mount, app) {
|
|
125
|
+
if (mount.apps[app] !== '')
|
|
126
|
+
return {};
|
|
127
|
+
return Object.fromEntries(Object.entries(mount.apps).filter(([id, at]) => id !== app && at !== ''));
|
|
128
|
+
}
|
|
129
|
+
const splitTail = (path) => {
|
|
130
|
+
const at = path.search(/[?#]/);
|
|
131
|
+
return at < 0 ? [path, ''] : [path.slice(0, at), path.slice(at)];
|
|
132
|
+
};
|
|
133
|
+
const decoded = (segment) => {
|
|
134
|
+
try {
|
|
135
|
+
return decodeURIComponent(segment);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
/** An App's home as the browser shows it: `/`, `/billing`, `/tools/`, `/tools/billing`. */
|
|
142
|
+
export function appHome(mount, app) {
|
|
143
|
+
return outward(mount, `/${encodeURIComponent(app)}`);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* An inside address as the browser shows it. `/lintel/leases/12` is
|
|
147
|
+
* `/leases/12` with Lintel at the root, `/tools/leases/12` under a base; a
|
|
148
|
+
* server path (`/api/…`) only gains the base. Any `?search` and `#hash` ride
|
|
149
|
+
* along untouched.
|
|
150
|
+
*/
|
|
151
|
+
export function outward(mount, internal) {
|
|
152
|
+
const [path, tail] = splitTail(internal);
|
|
153
|
+
const first = path.split('/')[1] ?? '';
|
|
154
|
+
const app = first ? decoded(first) : undefined;
|
|
155
|
+
if (app !== undefined && path.startsWith('/') && Object.hasOwn(mount.apps, app)) {
|
|
156
|
+
const rest = path.slice(1 + first.length);
|
|
157
|
+
const at = mount.apps[app];
|
|
158
|
+
const said = `${at ? `/${encodeURIComponent(at)}` : ''}${rest}`;
|
|
159
|
+
return `${mount.base}${said || '/'}${tail}`;
|
|
160
|
+
}
|
|
161
|
+
return `${mount.base}${path}${tail}`;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* An address as the browser sent it, read back to the inside form; undefined
|
|
165
|
+
* for one outside the base path or naming an App the way it is not mounted —
|
|
166
|
+
* the spelling that applies is the only one.
|
|
167
|
+
*/
|
|
168
|
+
export function inward(mount, external) {
|
|
169
|
+
const [whole, tail] = splitTail(external);
|
|
170
|
+
let path = whole;
|
|
171
|
+
if (mount.base) {
|
|
172
|
+
if (path !== mount.base && !path.startsWith(`${mount.base}/`))
|
|
173
|
+
return undefined;
|
|
174
|
+
path = path.slice(mount.base.length) || '/';
|
|
175
|
+
}
|
|
176
|
+
const ids = Object.keys(mount.apps);
|
|
177
|
+
if (!ids.length)
|
|
178
|
+
return path + tail;
|
|
179
|
+
const first = path.split('/')[1] ?? '';
|
|
180
|
+
const segment = first ? decoded(first) : undefined;
|
|
181
|
+
const rest = path.slice(1 + first.length);
|
|
182
|
+
if (segment !== undefined && SERVER_SEGMENTS.includes(segment))
|
|
183
|
+
return path + tail;
|
|
184
|
+
if (segment !== undefined && segment !== '') {
|
|
185
|
+
const mounted = ids.find((id) => mount.apps[id] === segment);
|
|
186
|
+
if (mounted !== undefined)
|
|
187
|
+
return `/${encodeURIComponent(mounted)}${rest}${tail}`;
|
|
188
|
+
}
|
|
189
|
+
const root = rootApp(mount);
|
|
190
|
+
if (root !== undefined)
|
|
191
|
+
return `/${encodeURIComponent(root)}${path === '/' ? '' : path}${tail}`;
|
|
192
|
+
// An App's id where it is mounted under another name is no address of it.
|
|
193
|
+
if (segment !== undefined && ids.includes(segment))
|
|
194
|
+
return undefined;
|
|
195
|
+
return path + tail;
|
|
196
|
+
}
|
|
197
|
+
/** A server path (`/api/…`, `/_mistri/…`) under the base. */
|
|
198
|
+
export const serverPath = (mount, path) => `${mount.base}${path}`;
|
|
199
|
+
/** A Set-Cookie value with its `Path=/…` said under the base, so the browser sends it back where the proxy serves the server. */
|
|
200
|
+
export const cookieUnder = (base, cookie) => (base ? cookie.replace(/(;\s*Path=)\//i, `$1${base}/`) : cookie);
|
|
201
|
+
/** The mount as a page carries it to the client (client addressMount.js): compact, and nothing but these two. */
|
|
202
|
+
export function mountJson(mount) {
|
|
203
|
+
return JSON.stringify({ base: mount.base, apps: mount.apps });
|
|
204
|
+
}
|
|
205
|
+
/** A page's mount, read back; anything malformed is no mount, which is how a page with none behaves. */
|
|
206
|
+
export function readMountJson(text) {
|
|
207
|
+
if (!text)
|
|
208
|
+
return NO_MOUNT;
|
|
209
|
+
try {
|
|
210
|
+
const value = JSON.parse(text);
|
|
211
|
+
// Internal hosts such as Console live under the reserved /_mistri
|
|
212
|
+
// segment, optionally below a suite base. Preserve their server-owned base.
|
|
213
|
+
const base = typeof value.base === 'string' && (value.base === '' || /^(\/(?:[A-Za-z0-9][A-Za-z0-9_-]*|_mistri))+$/.test(value.base))
|
|
214
|
+
? value.base
|
|
215
|
+
: '';
|
|
216
|
+
const apps = {};
|
|
217
|
+
if (value.apps && typeof value.apps === 'object') {
|
|
218
|
+
for (const [id, at] of Object.entries(value.apps))
|
|
219
|
+
if (typeof at === 'string')
|
|
220
|
+
apps[id] = at;
|
|
221
|
+
}
|
|
222
|
+
return { base, apps };
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return NO_MOUNT;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* The public URL (MISTRI_PUBLIC_URL) as the root every outward address is
|
|
230
|
+
* appended to: no trailing slash, and without the base path where it was
|
|
231
|
+
* written with it. A link adds the base itself, so `https://host/desk` with
|
|
232
|
+
* `--base-path /desk` became `/desk/desk` — sign-in answered 404 and looped.
|
|
233
|
+
* Both spellings name the one place; a URL that is not one is left as given.
|
|
234
|
+
*/
|
|
235
|
+
export function publicRoot(url, base) {
|
|
236
|
+
const trimmed = url.replace(/\/+$/, '');
|
|
237
|
+
if (!base)
|
|
238
|
+
return trimmed;
|
|
239
|
+
let parsed;
|
|
240
|
+
try {
|
|
241
|
+
parsed = new URL(trimmed);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return trimmed;
|
|
245
|
+
}
|
|
246
|
+
const path = parsed.pathname.replace(/\/+$/, '');
|
|
247
|
+
return path === base || path.endsWith(base) ? `${parsed.origin}${path.slice(0, -base.length)}` : trimmed;
|
|
248
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The levels an axis is ruled at: round numbers that cover the figures. An
|
|
3
|
+
* axis ruled at its own minimum, middle and maximum said "$0 / $2,039.50 /
|
|
4
|
+
* $4,079" — exact, and unreadable at a glance; a reader takes in "$0 / $2K /
|
|
5
|
+
* $4K" without reading it. The step is a one, two or five of a power of ten,
|
|
6
|
+
* chosen for about `intervals` steps across the range (the 1-2-5 rule, after
|
|
7
|
+
* d3's `ticks`), and the scale is widened to the step's multiples on either
|
|
8
|
+
* side, so the highest figure never stands over the top rule.
|
|
9
|
+
*/
|
|
10
|
+
interface NiceScale {
|
|
11
|
+
/** The scale's low end: a multiple of the step at or under the smallest figure. */
|
|
12
|
+
min: number;
|
|
13
|
+
/** The scale's high end: a multiple of the step at or over the largest figure. */
|
|
14
|
+
max: number;
|
|
15
|
+
step: number;
|
|
16
|
+
/** Every level from `min` to `max`, a step apart. */
|
|
17
|
+
levels: number[];
|
|
18
|
+
}
|
|
19
|
+
/** The round steps of a time taken, in seconds: a minute, five, a quarter hour, half, an hour, two, three, six,
|
|
20
|
+
twelve, a day, two, three, a week, two, thirty days. A duration axis is ruled at "2d / 4d / 6d", not at
|
|
21
|
+
the decimal 1-2-5 steps of its seconds ("2d 7h"). */
|
|
22
|
+
export declare const DURATION_STEPS: readonly number[];
|
|
23
|
+
/** Round levels over `[low, high]`; a flat range is given a step of room above it. `steps`, where given, are the
|
|
24
|
+
only steps an axis may take (DURATION_STEPS), the one covering the range most closely in two to four. */
|
|
25
|
+
export declare function niceScale(low: number, high: number, intervals?: number, steps?: readonly number[]): NiceScale;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function niceStep(span, intervals = 2) {
|
|
2
|
+
const raw = span / Math.max(1, intervals);
|
|
3
|
+
if (!(raw > 0) || !Number.isFinite(raw))
|
|
4
|
+
return 1;
|
|
5
|
+
const power = 10 ** Math.floor(Math.log10(raw));
|
|
6
|
+
const error = raw / power;
|
|
7
|
+
return power * (error >= Math.sqrt(50) ? 10 : error >= Math.sqrt(10) ? 5 : error >= Math.sqrt(2) ? 2 : 1);
|
|
8
|
+
}
|
|
9
|
+
/** The round steps of a time taken, in seconds: a minute, five, a quarter hour, half, an hour, two, three, six,
|
|
10
|
+
twelve, a day, two, three, a week, two, thirty days. A duration axis is ruled at "2d / 4d / 6d", not at
|
|
11
|
+
the decimal 1-2-5 steps of its seconds ("2d 7h"). */
|
|
12
|
+
export const DURATION_STEPS = [
|
|
13
|
+
60, 300, 900, 1800, 3600, 7200, 10800, 21600, 43200, 86400, 172800, 259200, 604800, 1209600, 2592000,
|
|
14
|
+
];
|
|
15
|
+
/** Round levels over `[low, high]`; a flat range is given a step of room above it. `steps`, where given, are the
|
|
16
|
+
only steps an axis may take (DURATION_STEPS), the one covering the range most closely in two to four. */
|
|
17
|
+
export function niceScale(low, high, intervals = 2, steps) {
|
|
18
|
+
if (steps?.length && Number.isFinite(low) && Number.isFinite(high) && high > low) {
|
|
19
|
+
let best;
|
|
20
|
+
for (const step of steps) {
|
|
21
|
+
const min = Math.floor(low / step) * step, max = Math.ceil(high / step) * step;
|
|
22
|
+
const count = Math.round((max - min) / step);
|
|
23
|
+
if (count < 2 || count > 4)
|
|
24
|
+
continue;
|
|
25
|
+
if (!best || max - min < best.max - best.min)
|
|
26
|
+
best = { min, max, step, levels: Array.from({ length: count + 1 }, (_, i) => min + i * step) };
|
|
27
|
+
}
|
|
28
|
+
if (best)
|
|
29
|
+
return best;
|
|
30
|
+
}
|
|
31
|
+
let min = Math.min(low, high), max = Math.max(low, high);
|
|
32
|
+
if (!Number.isFinite(min) || !Number.isFinite(max))
|
|
33
|
+
return { min: 0, max: 1, step: 1, levels: [0, 1] };
|
|
34
|
+
if (min === max) {
|
|
35
|
+
if (max === 0)
|
|
36
|
+
return { min: 0, max: 1, step: 1, levels: [0, 1] };
|
|
37
|
+
const step = niceStep(Math.abs(max), 1);
|
|
38
|
+
return niceScale(Math.min(0, min), Math.max(0, max) + (max > 0 ? 0 : step), intervals);
|
|
39
|
+
}
|
|
40
|
+
const step = niceStep(max - min, intervals);
|
|
41
|
+
/* A step's own decimals, so 0.1 + 0.2 is said 0.3 and not 0.30000000000000004. */
|
|
42
|
+
const places = Math.max(0, -Math.floor(Math.log10(step)) + 1);
|
|
43
|
+
const round = (v) => Number(v.toFixed(places));
|
|
44
|
+
min = round(Math.floor(min / step) * step);
|
|
45
|
+
max = round(Math.ceil(max / step) * step);
|
|
46
|
+
const levels = [];
|
|
47
|
+
for (let v = min, i = 0; v <= max + step / 2 && i < 50; v = round(min + step * ++i))
|
|
48
|
+
levels.push(v);
|
|
49
|
+
return { min, max, step, levels };
|
|
50
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What has to exist first, and what comes apart in which order.
|
|
3
|
+
*
|
|
4
|
+
* Every foreign key is a statement about time: a row cannot point at a row
|
|
5
|
+
* that is not there yet, and a row that is pointed at cannot leave before the
|
|
6
|
+
* rows pointing at it. Building test data means knowing that order, and
|
|
7
|
+
* deriving it by hand from a catalog is exactly the work this tool already
|
|
8
|
+
* did to draw the graph.
|
|
9
|
+
*
|
|
10
|
+
* A topological sort, with the two things a topological sort usually leaves
|
|
11
|
+
* out said out loud:
|
|
12
|
+
*
|
|
13
|
+
* - **Cycles.** Two tables that point at each other have no order. Rather
|
|
14
|
+
* than picking one and pretending, the cycle is named — and where one of
|
|
15
|
+
* its edges is nullable, the way through is named too: insert with the
|
|
16
|
+
* column null, then update it once the other row exists.
|
|
17
|
+
* - **Self-references.** `work_order.parent_id → work_order` is not a
|
|
18
|
+
* cycle between tables and does not affect the order at all, but it does
|
|
19
|
+
* mean the rows inside that table have an order of their own. Reported
|
|
20
|
+
* separately, because it is a different problem with a different answer.
|
|
21
|
+
*
|
|
22
|
+
* Ties break alphabetically. A stable answer is worth more than a marginally
|
|
23
|
+
* shorter one: an order that changes between runs makes a fixture that
|
|
24
|
+
* "sometimes works", which is the failure this exists to prevent.
|
|
25
|
+
*/
|
|
26
|
+
import { type DatabaseSchema } from './schema.js';
|
|
27
|
+
interface Requirement {
|
|
28
|
+
/** The table that must have the row already. */
|
|
29
|
+
table: string;
|
|
30
|
+
/** The columns pointing at it. */
|
|
31
|
+
via: string[];
|
|
32
|
+
/**
|
|
33
|
+
* Whether every one of those columns may be null.
|
|
34
|
+
*
|
|
35
|
+
* A nullable reference is a requirement you can postpone: insert the row
|
|
36
|
+
* without it, then update. That is the only way out of a cycle, so it is
|
|
37
|
+
* worth saying even where the order came out fine.
|
|
38
|
+
*/
|
|
39
|
+
optional: boolean;
|
|
40
|
+
}
|
|
41
|
+
interface OrderPlan {
|
|
42
|
+
/** Parents first: insert in this order and no reference dangles. */
|
|
43
|
+
insert: string[];
|
|
44
|
+
/** Children first: the reverse, which is what teardown needs. */
|
|
45
|
+
remove: string[];
|
|
46
|
+
/** Per table, what must exist before it. */
|
|
47
|
+
requires: Record<string, Requirement[]>;
|
|
48
|
+
/** Tables whose order could not be decided, grouped by the cycle they are in. */
|
|
49
|
+
cycles: string[][];
|
|
50
|
+
/** Tables that point at themselves: an order *within* the table. */
|
|
51
|
+
selfReferencing: string[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @param tables The tables to order. Omitted means every table in the schema.
|
|
55
|
+
* Names are resolved through `findTable`, so a bare name works where the
|
|
56
|
+
* schema qualifies it.
|
|
57
|
+
*/
|
|
58
|
+
export declare function insertOrder(schema: DatabaseSchema, tables?: string[]): OrderPlan;
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What has to exist first, and what comes apart in which order.
|
|
3
|
+
*
|
|
4
|
+
* Every foreign key is a statement about time: a row cannot point at a row
|
|
5
|
+
* that is not there yet, and a row that is pointed at cannot leave before the
|
|
6
|
+
* rows pointing at it. Building test data means knowing that order, and
|
|
7
|
+
* deriving it by hand from a catalog is exactly the work this tool already
|
|
8
|
+
* did to draw the graph.
|
|
9
|
+
*
|
|
10
|
+
* A topological sort, with the two things a topological sort usually leaves
|
|
11
|
+
* out said out loud:
|
|
12
|
+
*
|
|
13
|
+
* - **Cycles.** Two tables that point at each other have no order. Rather
|
|
14
|
+
* than picking one and pretending, the cycle is named — and where one of
|
|
15
|
+
* its edges is nullable, the way through is named too: insert with the
|
|
16
|
+
* column null, then update it once the other row exists.
|
|
17
|
+
* - **Self-references.** `work_order.parent_id → work_order` is not a
|
|
18
|
+
* cycle between tables and does not affect the order at all, but it does
|
|
19
|
+
* mean the rows inside that table have an order of their own. Reported
|
|
20
|
+
* separately, because it is a different problem with a different answer.
|
|
21
|
+
*
|
|
22
|
+
* Ties break alphabetically. A stable answer is worth more than a marginally
|
|
23
|
+
* shorter one: an order that changes between runs makes a fixture that
|
|
24
|
+
* "sometimes works", which is the failure this exists to prevent.
|
|
25
|
+
*/
|
|
26
|
+
import { findTable } from './schema.js';
|
|
27
|
+
/**
|
|
28
|
+
* @param tables The tables to order. Omitted means every table in the schema.
|
|
29
|
+
* Names are resolved through `findTable`, so a bare name works where the
|
|
30
|
+
* schema qualifies it.
|
|
31
|
+
*/
|
|
32
|
+
export function insertOrder(schema, tables) {
|
|
33
|
+
const wanted = tables?.length
|
|
34
|
+
? tables.map((name) => findTable(schema, name)?.id ?? name)
|
|
35
|
+
: schema.tables.filter((t) => !t.isView).map((t) => t.id);
|
|
36
|
+
const inSet = new Set(wanted);
|
|
37
|
+
const requires = {};
|
|
38
|
+
const selfReferencing = [];
|
|
39
|
+
/* `after.get(a)` holds the tables that must come *after* a — the edges of
|
|
40
|
+
the sort, pointing the way an insert travels. */
|
|
41
|
+
const after = new Map(wanted.map((id) => [id, new Set()]));
|
|
42
|
+
const waitingOn = new Map(wanted.map((id) => [id, 0]));
|
|
43
|
+
for (const fk of schema.foreignKeys) {
|
|
44
|
+
const from = fk.from.table;
|
|
45
|
+
const to = fk.to.table;
|
|
46
|
+
if (!inSet.has(from))
|
|
47
|
+
continue;
|
|
48
|
+
if (from === to) {
|
|
49
|
+
if (!selfReferencing.includes(from))
|
|
50
|
+
selfReferencing.push(from);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
/* A reference out of the set is still a requirement — the row it points
|
|
54
|
+
at has to exist — but it cannot be ordered, because it is not part of
|
|
55
|
+
what was asked about. It belongs in `requires` and not in the sort. */
|
|
56
|
+
const columns = findTable(schema, from)?.columns ?? [];
|
|
57
|
+
const optional = fk.from.columns.every((name) => columns.find((c) => c.name === name)?.nullable !== false);
|
|
58
|
+
(requires[from] ??= []).push({ table: to, via: fk.from.columns, optional });
|
|
59
|
+
if (!inSet.has(to))
|
|
60
|
+
continue;
|
|
61
|
+
if (after.get(to).has(from))
|
|
62
|
+
continue;
|
|
63
|
+
after.get(to).add(from);
|
|
64
|
+
waitingOn.set(from, (waitingOn.get(from) ?? 0) + 1);
|
|
65
|
+
}
|
|
66
|
+
const insert = [];
|
|
67
|
+
const ready = wanted.filter((id) => !waitingOn.get(id)).sort();
|
|
68
|
+
while (ready.length) {
|
|
69
|
+
const id = ready.shift();
|
|
70
|
+
insert.push(id);
|
|
71
|
+
/* Sorted on the way in, so the answer does not depend on the order the
|
|
72
|
+
catalog happened to list the keys in. */
|
|
73
|
+
for (const next of [...after.get(id)].sort()) {
|
|
74
|
+
const left = (waitingOn.get(next) ?? 0) - 1;
|
|
75
|
+
waitingOn.set(next, left);
|
|
76
|
+
if (left === 0) {
|
|
77
|
+
ready.push(next);
|
|
78
|
+
ready.sort();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/* Whatever is left is in a cycle, or behind one. Grouped so the answer
|
|
83
|
+
names the knot rather than listing its members. */
|
|
84
|
+
const stuck = wanted.filter((id) => !insert.includes(id));
|
|
85
|
+
const cycles = groupCycles(stuck, after);
|
|
86
|
+
for (const list of Object.values(requires)) {
|
|
87
|
+
list.sort((a, b) => a.table.localeCompare(b.table));
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
insert,
|
|
91
|
+
remove: [...insert].reverse(),
|
|
92
|
+
requires,
|
|
93
|
+
cycles,
|
|
94
|
+
selfReferencing: selfReferencing.sort(),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The knots, as knots.
|
|
99
|
+
*
|
|
100
|
+
* Two tables pointing at each other and a third waiting behind them are one
|
|
101
|
+
* problem with one fix, and three lines saying "could not be ordered" is
|
|
102
|
+
* three problems to work out are the same one.
|
|
103
|
+
*/
|
|
104
|
+
function groupCycles(stuck, after) {
|
|
105
|
+
const left = new Set(stuck);
|
|
106
|
+
const groups = [];
|
|
107
|
+
while (left.size) {
|
|
108
|
+
const start = [...left].sort()[0];
|
|
109
|
+
const group = new Set([start]);
|
|
110
|
+
const queue = [start];
|
|
111
|
+
while (queue.length) {
|
|
112
|
+
const id = queue.shift();
|
|
113
|
+
for (const next of after.get(id) ?? []) {
|
|
114
|
+
if (!left.has(next) || group.has(next))
|
|
115
|
+
continue;
|
|
116
|
+
group.add(next);
|
|
117
|
+
queue.push(next);
|
|
118
|
+
}
|
|
119
|
+
/* Both directions: a cycle is only visible if the walk can go back the
|
|
120
|
+
way the arrows came. */
|
|
121
|
+
for (const [other, targets] of after) {
|
|
122
|
+
if (!left.has(other) || group.has(other) || !targets.has(id))
|
|
123
|
+
continue;
|
|
124
|
+
group.add(other);
|
|
125
|
+
queue.push(other);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const id of group)
|
|
129
|
+
left.delete(id);
|
|
130
|
+
groups.push([...group].sort());
|
|
131
|
+
}
|
|
132
|
+
return groups;
|
|
133
|
+
}
|