@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,376 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Row scopes: the per-resource row filters a server-owned policy supplies,
|
|
3
|
+
* captured within fixed limits, and the scoped relations a read or write is
|
|
4
|
+
* compiled against. Shared so views and breakdowns compile under a scope
|
|
5
|
+
* through the same builder as a plain read.
|
|
6
|
+
*/
|
|
7
|
+
import { buildWhere, OPS } from './filter.js';
|
|
8
|
+
import { Refusal } from './refusal.js';
|
|
9
|
+
import { findTable } from './schema.js';
|
|
10
|
+
import { isFixedScopeCatalog } from './scopeCatalog.js';
|
|
11
|
+
import { qualifiedTable } from './sqlRelation.js';
|
|
12
|
+
import { tryResolvePath } from './viewPaths.js';
|
|
13
|
+
/** Composition must budget expanded data against the same capture limits. */
|
|
14
|
+
export const ROW_SCOPE_LIMITS = Object.freeze({
|
|
15
|
+
resources: 256,
|
|
16
|
+
conditions: 2048,
|
|
17
|
+
array: 4096,
|
|
18
|
+
nodes: 16_384,
|
|
19
|
+
string: 16_384,
|
|
20
|
+
characters: 262_144,
|
|
21
|
+
});
|
|
22
|
+
const invalid = () => {
|
|
23
|
+
throw new Refusal('Invalid row scope.');
|
|
24
|
+
};
|
|
25
|
+
/** Copy before validation so accessors, prototypes and later mutation cannot
|
|
26
|
+
* change what was checked. Bounds apply to the entire scope, not each table.
|
|
27
|
+
* Frozen nested values stay private; Readonly<Record> alone is not a snapshot.
|
|
28
|
+
*/
|
|
29
|
+
export function captureRowScope(input) {
|
|
30
|
+
let nodes = 0;
|
|
31
|
+
let characters = 0;
|
|
32
|
+
const copy = (value, depth = 0) => {
|
|
33
|
+
if (++nodes > ROW_SCOPE_LIMITS.nodes || depth > 8)
|
|
34
|
+
return invalid();
|
|
35
|
+
if (typeof value === 'string') {
|
|
36
|
+
characters += value.length;
|
|
37
|
+
if (value.length > ROW_SCOPE_LIMITS.string || characters > ROW_SCOPE_LIMITS.characters)
|
|
38
|
+
return invalid();
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
if (typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value)))
|
|
42
|
+
return value;
|
|
43
|
+
if (!value || typeof value !== 'object')
|
|
44
|
+
return invalid();
|
|
45
|
+
const array = Array.isArray(value);
|
|
46
|
+
const proto = Object.getPrototypeOf(value);
|
|
47
|
+
if (array ? proto !== Array.prototype : proto !== Object.prototype && proto !== null)
|
|
48
|
+
return invalid();
|
|
49
|
+
const keys = Reflect.ownKeys(value);
|
|
50
|
+
if (keys.length > ROW_SCOPE_LIMITS.array + 1)
|
|
51
|
+
return invalid();
|
|
52
|
+
if (array) {
|
|
53
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
54
|
+
if (!Number.isInteger(length) || length > ROW_SCOPE_LIMITS.array || keys.length !== length + 1)
|
|
55
|
+
return invalid();
|
|
56
|
+
const result = [];
|
|
57
|
+
for (let i = 0; i < length; i++) {
|
|
58
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(i));
|
|
59
|
+
if (!descriptor || !('value' in descriptor) || !descriptor.enumerable)
|
|
60
|
+
return invalid();
|
|
61
|
+
result.push(copy(descriptor.value, depth + 1));
|
|
62
|
+
}
|
|
63
|
+
return Object.freeze(result);
|
|
64
|
+
}
|
|
65
|
+
const result = Object.create(null);
|
|
66
|
+
for (const key of keys) {
|
|
67
|
+
if (typeof key !== 'string')
|
|
68
|
+
return invalid();
|
|
69
|
+
characters += key.length;
|
|
70
|
+
if (key.length > ROW_SCOPE_LIMITS.string || characters > ROW_SCOPE_LIMITS.characters)
|
|
71
|
+
return invalid();
|
|
72
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
73
|
+
if (!('value' in descriptor) || !descriptor.enumerable)
|
|
74
|
+
return invalid();
|
|
75
|
+
result[key] = copy(descriptor.value, depth + 1);
|
|
76
|
+
}
|
|
77
|
+
return Object.freeze(result);
|
|
78
|
+
};
|
|
79
|
+
const scope = copy(input);
|
|
80
|
+
if (!scope || typeof scope !== 'object' || Array.isArray(scope) || Object.keys(scope).length > ROW_SCOPE_LIMITS.resources)
|
|
81
|
+
return invalid();
|
|
82
|
+
return scope;
|
|
83
|
+
}
|
|
84
|
+
/* The scopes this module copied, froze and checked, each with the catalogs it
|
|
85
|
+
was checked against. A tenant read snapshotted one request's scope again at
|
|
86
|
+
every layer it crossed — composed, authorized, bound, and once more per
|
|
87
|
+
statement — each a full copy and a scan of the catalog for every resource:
|
|
88
|
+
a field report's profile put it among the largest costs of a page. A
|
|
89
|
+
snapshot is frozen all the way down and was made here, never by a caller,
|
|
90
|
+
so checking it again against the same catalog object could only pass and
|
|
91
|
+
copy it to an equal value: it is handed back as it is. A catalog that can
|
|
92
|
+
still change is checked afresh every time, as before; anything a caller
|
|
93
|
+
built, however frozen, is copied every time and then found by its text
|
|
94
|
+
(below), never handed back as itself. */
|
|
95
|
+
const snapshots = new WeakMap();
|
|
96
|
+
const checkedAgainst = (scope, schema) => snapshots.get(scope)?.has(schema) === true;
|
|
97
|
+
/* And by what they say. A policy that names its reader (`owner_account_id = <the account>`) builds its scope afresh
|
|
98
|
+
on every request: a new object each time, equal to the last, so every request copied and checked it again, and
|
|
99
|
+
every cache keyed by a scope's identity downstream (tenantReadScope.ts compositions, the scoped reads' kept
|
|
100
|
+
statements) missed, composing and compiling afresh too — a field report's tenant App, whose staff scope names
|
|
101
|
+
two hundred tables and the reader, spent a sixth of a tenant enter there. The copy is still made, so nothing the
|
|
102
|
+
caller holds can change what is checked; it is then looked up by its text against a catalog nothing can change,
|
|
103
|
+
and an equal scope already checked against it is handed back. The text is the copy's own — plain strings,
|
|
104
|
+
booleans, finite numbers, arrays and records, nothing else survives captureRowScope — so equal text is an equal
|
|
105
|
+
scope. Bounded per catalog; a reader past the bound is checked as before. */
|
|
106
|
+
const byText = new WeakMap();
|
|
107
|
+
const BY_TEXT_HELD = 256;
|
|
108
|
+
/** A scope's text, where the text says all of it: undefined for anything JSON would say the same as something else
|
|
109
|
+
* (an undefined value, which it drops; a non-finite number; an object that is not a plain record). Only for data
|
|
110
|
+
* nothing can intercept — a copy this module or the tenant capture made — never a caller's live object, whose
|
|
111
|
+
* accessors JSON.stringify would run. */
|
|
112
|
+
export function rowScopeText(value) {
|
|
113
|
+
let plain = true;
|
|
114
|
+
const text = JSON.stringify(value, (_key, item) => {
|
|
115
|
+
if (item === undefined ||
|
|
116
|
+
(typeof item === 'number' && !Number.isFinite(item)) ||
|
|
117
|
+
(item !== null && typeof item === 'object' && !Array.isArray(item) && ![null, Object.prototype].includes(Object.getPrototypeOf(item))))
|
|
118
|
+
plain = false;
|
|
119
|
+
return item;
|
|
120
|
+
});
|
|
121
|
+
return plain ? text : undefined;
|
|
122
|
+
}
|
|
123
|
+
/** Test-only: how many row scopes were copied and checked in full rather than handed back. */
|
|
124
|
+
export const rowScopeCounters = { checked: 0 };
|
|
125
|
+
/** Whether `value` is a row scope snapshotRowScope made: plain data, frozen all the way down, that nothing can change. */
|
|
126
|
+
export function isRowScopeSnapshot(value) {
|
|
127
|
+
return value !== null && typeof value === 'object' && snapshots.has(value);
|
|
128
|
+
}
|
|
129
|
+
/** Capture can precede an async catalog load; catalog validation cannot. */
|
|
130
|
+
export function snapshotRowScope(schema, input) {
|
|
131
|
+
if (input !== null && typeof input === 'object' && checkedAgainst(input, schema))
|
|
132
|
+
return input;
|
|
133
|
+
const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
134
|
+
/* A snapshot checked against another catalog — the same policy's constant scope under a second deployment of the
|
|
135
|
+
App in this process, after a reload — is already plain frozen data this module made, so it is checked as it is
|
|
136
|
+
and kept against this catalog too. Copied, its copy was a new object each time, which the caches keyed by a
|
|
137
|
+
scope (tenantReadScope.ts) never found again: every request after a reload checked and composed afresh. */
|
|
138
|
+
const scope = isRowScopeSnapshot(input) ? input : captureRowScope(input);
|
|
139
|
+
const fixed = isFixedScopeCatalog(schema);
|
|
140
|
+
const text = fixed && scope !== input ? rowScopeText(scope) : undefined;
|
|
141
|
+
const held = text === undefined ? undefined : byText.get(schema);
|
|
142
|
+
const known = text === undefined ? undefined : held?.get(text);
|
|
143
|
+
if (known)
|
|
144
|
+
return known;
|
|
145
|
+
rowScopeCounters.checked++;
|
|
146
|
+
let conditions = 0;
|
|
147
|
+
for (const [id, policy] of Object.entries(scope)) {
|
|
148
|
+
const table = findTable(schema, id);
|
|
149
|
+
if (!table)
|
|
150
|
+
return invalid();
|
|
151
|
+
if (typeof policy === 'boolean')
|
|
152
|
+
continue;
|
|
153
|
+
if (!record(policy) ||
|
|
154
|
+
Object.keys(policy).some((key) => key !== 'groups' && key !== 'binary') ||
|
|
155
|
+
!Array.isArray(policy.groups) ||
|
|
156
|
+
!policy.groups.length)
|
|
157
|
+
return invalid();
|
|
158
|
+
if (Object.hasOwn(policy, 'binary')) {
|
|
159
|
+
if (schema.dialect !== 'sqlite' ||
|
|
160
|
+
!Array.isArray(policy.binary) ||
|
|
161
|
+
policy.binary.some((name) => typeof name !== 'string' || !table.columns.some((column) => column.name === name)) ||
|
|
162
|
+
new Set(policy.binary).size !== policy.binary.length)
|
|
163
|
+
return invalid();
|
|
164
|
+
}
|
|
165
|
+
for (const group of policy.groups) {
|
|
166
|
+
if (!Array.isArray(group) || !group.length)
|
|
167
|
+
return invalid();
|
|
168
|
+
for (const condition of group) {
|
|
169
|
+
if (++conditions > ROW_SCOPE_LIMITS.conditions || !record(condition))
|
|
170
|
+
return invalid();
|
|
171
|
+
if (Object.keys(condition).some((key) => !['column', 'op', 'value'].includes(key)))
|
|
172
|
+
return invalid();
|
|
173
|
+
if (typeof condition.column !== 'string' || !table.columns.some((column) => column.name === condition.column))
|
|
174
|
+
return invalid();
|
|
175
|
+
if (typeof condition.op !== 'string' || !OPS.has(condition.op))
|
|
176
|
+
return invalid();
|
|
177
|
+
if (condition.op === 'isNull' || condition.op === 'isNotNull') {
|
|
178
|
+
if (Object.hasOwn(condition, 'value'))
|
|
179
|
+
return invalid();
|
|
180
|
+
}
|
|
181
|
+
else if (condition.op === 'in') {
|
|
182
|
+
if (!Array.isArray(condition.value) || condition.value.some((value) => typeof value !== 'string' && typeof value !== 'number'))
|
|
183
|
+
return invalid();
|
|
184
|
+
}
|
|
185
|
+
else if (['contains', 'startsWith', 'endsWith', 'like'].includes(condition.op)) {
|
|
186
|
+
if (typeof condition.value !== 'string')
|
|
187
|
+
return invalid();
|
|
188
|
+
}
|
|
189
|
+
else if (!['string', 'number', 'boolean'].includes(typeof condition.value))
|
|
190
|
+
return invalid();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Kept only against a catalog nothing can change; checked against one that can, it is checked again next time.
|
|
195
|
+
if (fixed) {
|
|
196
|
+
const against = snapshots.get(scope);
|
|
197
|
+
if (against)
|
|
198
|
+
against.add(schema);
|
|
199
|
+
else
|
|
200
|
+
snapshots.set(scope, new WeakSet([schema]));
|
|
201
|
+
if (text !== undefined) {
|
|
202
|
+
let kept = held;
|
|
203
|
+
if (!kept)
|
|
204
|
+
byText.set(schema, (kept = new Map()));
|
|
205
|
+
if (kept.size >= BY_TEXT_HELD)
|
|
206
|
+
kept.delete(kept.keys().next().value);
|
|
207
|
+
kept.set(text, scope);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return scope;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* A scope with each group's repeated conditions said once. Composed scopes
|
|
214
|
+
* repeat themselves — a tenant's ownership condition and a membership rule
|
|
215
|
+
* that names the same column and value — and `"tenant_id" = $1 AND
|
|
216
|
+
* "tenant_id" = $2` is the same rows as either half, while the planner
|
|
217
|
+
* estimates it as two independent predicates and misjudges every join above
|
|
218
|
+
* it. Only a condition identical in every field is dropped:
|
|
219
|
+
* a conjunction of one condition with itself is that condition, so no row
|
|
220
|
+
* the scope admits or refuses changes.
|
|
221
|
+
*/
|
|
222
|
+
function withoutRepeats(policy) {
|
|
223
|
+
return {
|
|
224
|
+
groups: policy.groups.map((group) => {
|
|
225
|
+
const seen = new Set();
|
|
226
|
+
return group.filter((condition) => {
|
|
227
|
+
// Every field, in a fixed order: a collation or a column comparison is a different condition.
|
|
228
|
+
const key = JSON.stringify(Object.keys(condition)
|
|
229
|
+
.sort()
|
|
230
|
+
.map((name) => [name, condition[name]]));
|
|
231
|
+
if (seen.has(key))
|
|
232
|
+
return false;
|
|
233
|
+
seen.add(key);
|
|
234
|
+
return true;
|
|
235
|
+
});
|
|
236
|
+
}),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/* A catalog's table names, lower-cased: what a scoped relation's name must not
|
|
240
|
+
shadow. The same for every statement compiled over a catalog nothing can
|
|
241
|
+
change, so it is listed once for such a catalog, not once per statement. */
|
|
242
|
+
const reservedOf = new WeakMap();
|
|
243
|
+
function reservedNames(schema) {
|
|
244
|
+
const kept = reservedOf.get(schema);
|
|
245
|
+
if (kept)
|
|
246
|
+
return kept;
|
|
247
|
+
const names = schema.tables.map((table) => table.name.toLowerCase());
|
|
248
|
+
if (isFixedScopeCatalog(schema))
|
|
249
|
+
reservedOf.set(schema, names);
|
|
250
|
+
return names;
|
|
251
|
+
}
|
|
252
|
+
/** Every occurrence of a resource reads the same filtered relation, including
|
|
253
|
+
* LEFT JOIN targets and correlated aggregate children. CTE bindings precede
|
|
254
|
+
* outer filters, independent of SQL SELECT/FROM expression order. Call finish
|
|
255
|
+
* only after all relations have been discovered, then number outer bindings.
|
|
256
|
+
*/
|
|
257
|
+
export class ScopedRelations {
|
|
258
|
+
schema;
|
|
259
|
+
style;
|
|
260
|
+
scope;
|
|
261
|
+
names = new Map();
|
|
262
|
+
reserved;
|
|
263
|
+
definitions = [];
|
|
264
|
+
params = [];
|
|
265
|
+
finished = false;
|
|
266
|
+
ordinal = 0;
|
|
267
|
+
constructor(schema, style, scope) {
|
|
268
|
+
this.schema = schema;
|
|
269
|
+
this.style = style;
|
|
270
|
+
this.scope = scope === undefined ? undefined : snapshotRowScope(schema, scope);
|
|
271
|
+
this.reserved = new Set(reservedNames(schema));
|
|
272
|
+
}
|
|
273
|
+
table = (id) => {
|
|
274
|
+
if (this.scope === undefined)
|
|
275
|
+
return qualifiedTable(this.schema, id, this.style);
|
|
276
|
+
const existing = this.names.get(id);
|
|
277
|
+
if (existing)
|
|
278
|
+
return this.style.quote(existing);
|
|
279
|
+
if (this.finished)
|
|
280
|
+
throw new Error('Row scope relations must be planned before outer parameters.');
|
|
281
|
+
const table = findTable(this.schema, id);
|
|
282
|
+
if (!table || !table.columns.length)
|
|
283
|
+
return invalid();
|
|
284
|
+
// '$' cannot occur in JoinPlan's sanitized aliases; catalog names still
|
|
285
|
+
// need a case-insensitive collision check to avoid CTE self-shadowing.
|
|
286
|
+
let name;
|
|
287
|
+
do {
|
|
288
|
+
name = `_tw_scope$${++this.ordinal}`;
|
|
289
|
+
} while (this.reserved.has(name.toLowerCase()));
|
|
290
|
+
this.reserved.add(name.toLowerCase());
|
|
291
|
+
this.names.set(id, name);
|
|
292
|
+
const policy = this.scope[id] ?? false;
|
|
293
|
+
const where = typeof policy === 'boolean'
|
|
294
|
+
? { text: policy ? '' : ' WHERE 1 = 0', params: [] }
|
|
295
|
+
: buildWhere(withoutRepeats(policy), this.style, this.params.length + 1, (column) => this.style.quote(column) + (policy.binary?.includes(column) ? ' COLLATE BINARY' : ''));
|
|
296
|
+
const columns = table.columns.map((column) => this.style.quote(column.name)).join(', ');
|
|
297
|
+
// The style's hint (cteHint) goes between AS and the body: Postgres inlines the CTE, so the
|
|
298
|
+
// scope's predicate meets the read's own filter, sort and limit instead of a copied slice.
|
|
299
|
+
this.definitions.push(`${this.style.quote(name)} AS${this.style.cteHint ?? ''} (SELECT ${columns} FROM ${qualifiedTable(this.schema, id, this.style)}${where.text})`);
|
|
300
|
+
this.params.push(...where.params);
|
|
301
|
+
return this.style.quote(name);
|
|
302
|
+
};
|
|
303
|
+
narrowed = new Map();
|
|
304
|
+
/**
|
|
305
|
+
* A table's rows narrowed by an authored filter over its own columns — the
|
|
306
|
+
* rows a rollup counts (rollups.ts) — as one more definition here. A CTE
|
|
307
|
+
* rather than a WHERE inside the correlated subquery, for the parameters:
|
|
308
|
+
* a subquery can sit in the SELECT list, the WHERE and the ORDER BY at
|
|
309
|
+
* once, and `?` placeholders bind by position, so values written there
|
|
310
|
+
* would interleave with the outer filter's. Here they bind first, with the
|
|
311
|
+
* scope's, and the subquery names the relation with no values of its own.
|
|
312
|
+
* Read from the scoped relation where there is a scope, so the filter
|
|
313
|
+
* narrows within the reader's rows, never beside them.
|
|
314
|
+
*/
|
|
315
|
+
filtered = (id, filter, written) => {
|
|
316
|
+
const key = `${id}\u0000${JSON.stringify(filter)}\u0000${Object.keys(written ?? {}).join(',')}`;
|
|
317
|
+
const existing = this.narrowed.get(key);
|
|
318
|
+
if (existing)
|
|
319
|
+
return this.style.quote(existing);
|
|
320
|
+
if (this.finished)
|
|
321
|
+
throw new Error('Filtered relations must be planned before outer parameters.');
|
|
322
|
+
const source = this.table(id);
|
|
323
|
+
const table = findTable(this.schema, id);
|
|
324
|
+
if (!table || !table.columns.length)
|
|
325
|
+
return invalid();
|
|
326
|
+
let name;
|
|
327
|
+
do {
|
|
328
|
+
name = `_tw_scope$${++this.ordinal}`;
|
|
329
|
+
} while (this.reserved.has(name.toLowerCase()));
|
|
330
|
+
this.reserved.add(name.toLowerCase());
|
|
331
|
+
this.narrowed.set(key, name);
|
|
332
|
+
const q = this.style.quote;
|
|
333
|
+
/* A path (`sales_order_id.status`) is the column it lands on, read by one scalar subquery that walks
|
|
334
|
+
its references from this row through the statement's relations — so a row policy on the order
|
|
335
|
+
narrows what the path can see, as it does a list's join. Planned before the WHERE is written, for
|
|
336
|
+
the parameters: a relation's own scope binds ahead of this filter's values. */
|
|
337
|
+
const named = filter.groups.flatMap((group) => group.flatMap((c) => [c.column, ...(c.other === undefined ? [] : [c.other])]));
|
|
338
|
+
const row = named.some((column) => column.includes('.')) ? '_tw_row' : undefined;
|
|
339
|
+
const own = (column) => (row ? `${q(row)}.${q(column)}` : q(column));
|
|
340
|
+
const paths = new Map();
|
|
341
|
+
for (const path of named) {
|
|
342
|
+
// A computed column of the row (a rollup's query, rollups.ts `computed`): its expression over this row's columns.
|
|
343
|
+
if (written && Object.hasOwn(written, path)) {
|
|
344
|
+
if (!paths.has(path))
|
|
345
|
+
paths.set(path, `(${written[path](own)})`);
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (!path.includes('.') || paths.has(path))
|
|
349
|
+
continue;
|
|
350
|
+
const { resolved } = tryResolvePath(this.schema, id, path);
|
|
351
|
+
if (!resolved || !resolved.hops.length || resolved.rollup || resolved.computed || resolved.tags || resolved.jsonKey)
|
|
352
|
+
return invalid();
|
|
353
|
+
const aliases = resolved.hops.map(() => `_tw_hop$${++this.ordinal}`);
|
|
354
|
+
const joins = resolved.hops.map((hop, at) => {
|
|
355
|
+
const on = hop.to.columns
|
|
356
|
+
.map((to, i) => `${q(aliases[at])}.${q(to)} = ${at ? `${q(aliases[at - 1])}.${q(hop.from.columns[i])}` : own(hop.from.columns[i])}`)
|
|
357
|
+
.join(' AND ');
|
|
358
|
+
return { relation: `${this.table(hop.to.table)} ${q(aliases[at])}`, on };
|
|
359
|
+
});
|
|
360
|
+
const [first, ...rest] = joins;
|
|
361
|
+
paths.set(path, `(SELECT ${q(aliases[aliases.length - 1])}.${q(resolved.column.name)} FROM ${first.relation}` +
|
|
362
|
+
rest.map((join) => ` JOIN ${join.relation} ON ${join.on}`).join('') +
|
|
363
|
+
` WHERE ${first.on})`);
|
|
364
|
+
}
|
|
365
|
+
const local = (column) => paths.get(column) ?? own(column);
|
|
366
|
+
const where = buildWhere(filter, this.style, this.params.length + 1, local, local);
|
|
367
|
+
const columns = table.columns.map((column) => q(column.name)).join(', ');
|
|
368
|
+
this.definitions.push(`${q(name)} AS (SELECT ${columns} FROM ${source}${row ? ` ${q(row)}` : ''}${where.text})`);
|
|
369
|
+
this.params.push(...where.params);
|
|
370
|
+
return this.style.quote(name);
|
|
371
|
+
};
|
|
372
|
+
finish() {
|
|
373
|
+
this.finished = true;
|
|
374
|
+
return { text: this.definitions.length ? `WITH ${this.definitions.join(',\n ')}\n` : '', params: [...this.params] };
|
|
375
|
+
}
|
|
376
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare const RUNTIME_TABLE_PREFIXES: readonly ["__mistri_"];
|
|
2
|
+
/** Reserved physical table names are runtime state, never App resources.
|
|
3
|
+
* Pass an unqualified table name, not a SQL fragment or logical alias. */
|
|
4
|
+
export declare const isRuntimeTable: (name: string) => boolean;
|
|
5
|
+
export type RuntimeDialect = 'postgres' | 'sqlite';
|
|
6
|
+
/** The PostgreSQL schema every runtime table lives in, under its plain name: the command journal,
|
|
7
|
+
* the tenant store, sign-in (Better Auth's tables, renamed `auth_*`), flags (`flag_*`),
|
|
8
|
+
* experiments (`experiment_*`), analytics (`analytics_*`) and a suite's stores (`suite_*`).
|
|
9
|
+
* A schema rather than a prefix in `public` because a grant on `public` then reaches none of it,
|
|
10
|
+
* `pg_dump -n` splits the App from the runtime, and the migration diff, scoped to the App's
|
|
11
|
+
* schema, never sees it. The database browser and the App catalog hide it by this name. */
|
|
12
|
+
export declare const RUNTIME_SCHEMA = "mistri";
|
|
13
|
+
/** The one placement function: a runtime table's qualified, quoted SQL name. Postgres
|
|
14
|
+
* `mistri."x"`, SQLite `main."__mistri_x"`. */
|
|
15
|
+
export declare const runtimeTable: (dialect: RuntimeDialect, name: string) => string;
|
|
16
|
+
/** The schema a dialect's runtime tables sit in: for the pinned layouts and catalog readers that
|
|
17
|
+
* name a schema without a table. */
|
|
18
|
+
export declare const runtimeSchema: (dialect: 'postgres' | 'sqlite') => string;
|
|
19
|
+
/** The same placement as catalog coordinates: what `information_schema`, `pg_class` and
|
|
20
|
+
* `sqlite_schema` readers compare against. Postgres names the table plainly; the others keep the prefix. */
|
|
21
|
+
export declare const runtimeRelation: (dialect: RuntimeDialect, name: string) => {
|
|
22
|
+
schema: string;
|
|
23
|
+
relname: string;
|
|
24
|
+
};
|
|
25
|
+
/** A runtime name as this dialect spells it, unqualified: an index, a sequence or a key a store
|
|
26
|
+
* pins beside its tables, or a store's name prefix for a catalog scan (`__mistri_job_` is
|
|
27
|
+
* `job_` inside the Postgres schema). */
|
|
28
|
+
export declare const runtimeName: (dialect: RuntimeDialect, name: string) => string;
|
|
29
|
+
/** Whether a catalog relation is runtime state on this dialect: on Postgres anything in the
|
|
30
|
+
* runtime schema, whatever it is called; elsewhere a prefixed name (in `main` on SQLite). */
|
|
31
|
+
export declare const isRuntimeRelation: (dialect: RuntimeDialect, schema: string | null, name: string) => boolean;
|
|
32
|
+
/** The functions the runtime schema may hold beside its tables, each a store's own (the epoch
|
|
33
|
+
* trigger's, and the append-only triggers of flags, experiments and analytics). Ownership checks
|
|
34
|
+
* count anything else there, a function, operator or type, as planted: Better Auth resolves its
|
|
35
|
+
* unqualified names through this schema. */
|
|
36
|
+
export declare const RUNTIME_SCHEMA_FUNCTIONS: readonly string[];
|
|
37
|
+
/** The store prefixes whose owner may be a role other than the schema's: a suite's flag or
|
|
38
|
+
* experiment control can run as its own role, granted USAGE and CREATE on the runtime schema.
|
|
39
|
+
* Such a grant is not a foreign one (adapters/postgresRuntimeSchema.ts). */
|
|
40
|
+
export declare const RUNTIME_CONTROL_PREFIXES: readonly string[];
|
|
41
|
+
/** A store's table names (each as its SQLite layout pins it) as PostgreSQL spells them
|
|
42
|
+
* inside the runtime schema: what its pinned PostgreSQL layout and the names derived from a
|
|
43
|
+
* table's (`<table>_pkey`, `<table>_id_seq`) are built from. */
|
|
44
|
+
export declare const postgresRuntimeNames: <T extends Readonly<Record<string, string>>>(tables: T) => { readonly [K in keyof T]: string; };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** The prefix every table of the App framework's own runtime state carries on SQLite, in
|
|
2
|
+
* the App's own database. On PostgreSQL the runtime has a schema of its own instead (`RUNTIME_SCHEMA`),
|
|
3
|
+
* but an App table named with the prefix is still refused there (adapters/reservedSql.ts), so one
|
|
4
|
+
* rule about names holds on every engine. */
|
|
5
|
+
const RUNTIME_TABLE_PREFIX = '__mistri_';
|
|
6
|
+
export const RUNTIME_TABLE_PREFIXES = Object.freeze([RUNTIME_TABLE_PREFIX]);
|
|
7
|
+
/** Reserved physical table names are runtime state, never App resources.
|
|
8
|
+
* Pass an unqualified table name, not a SQL fragment or logical alias. */
|
|
9
|
+
export const isRuntimeTable = (name) => {
|
|
10
|
+
const lower = name.toLowerCase();
|
|
11
|
+
return RUNTIME_TABLE_PREFIXES.some((prefix) => lower.startsWith(prefix));
|
|
12
|
+
};
|
|
13
|
+
/** The PostgreSQL schema every runtime table lives in, under its plain name: the command journal,
|
|
14
|
+
* the tenant store, sign-in (Better Auth's tables, renamed `auth_*`), flags (`flag_*`),
|
|
15
|
+
* experiments (`experiment_*`), analytics (`analytics_*`) and a suite's stores (`suite_*`).
|
|
16
|
+
* A schema rather than a prefix in `public` because a grant on `public` then reaches none of it,
|
|
17
|
+
* `pg_dump -n` splits the App from the runtime, and the migration diff, scoped to the App's
|
|
18
|
+
* schema, never sees it. The database browser and the App catalog hide it by this name. */
|
|
19
|
+
export const RUNTIME_SCHEMA = 'mistri';
|
|
20
|
+
/** Where each dialect puts the runtime tables. */
|
|
21
|
+
const PLACEMENT = Object.freeze({
|
|
22
|
+
postgres: RUNTIME_SCHEMA,
|
|
23
|
+
sqlite: 'main',
|
|
24
|
+
});
|
|
25
|
+
/** A runtime table's logical name, whether the caller holds it bare (`history_change`) or as the
|
|
26
|
+
* physical name its store pins on SQLite (`__mistri_history_change`). Anything else is not
|
|
27
|
+
* a table name, so it is refused here instead of being quoted. */
|
|
28
|
+
const logicalName = (name) => {
|
|
29
|
+
const bare = name.startsWith(RUNTIME_TABLE_PREFIX) ? name.slice(RUNTIME_TABLE_PREFIX.length) : name;
|
|
30
|
+
if (bare === '' || /[^a-z0-9_$]/i.test(bare))
|
|
31
|
+
throw new Error(`Not a runtime table name: ${JSON.stringify(name)}.`);
|
|
32
|
+
return bare;
|
|
33
|
+
};
|
|
34
|
+
/** The one placement function: a runtime table's qualified, quoted SQL name. Postgres
|
|
35
|
+
* `mistri."x"`, SQLite `main."__mistri_x"`. */
|
|
36
|
+
export const runtimeTable = (dialect, name) => {
|
|
37
|
+
const { schema, relname } = runtimeRelation(dialect, name);
|
|
38
|
+
return `${schema}."${relname}"`;
|
|
39
|
+
};
|
|
40
|
+
/** The schema a dialect's runtime tables sit in: for the pinned layouts and catalog readers that
|
|
41
|
+
* name a schema without a table. */
|
|
42
|
+
export const runtimeSchema = (dialect) => PLACEMENT[dialect];
|
|
43
|
+
/** The same placement as catalog coordinates: what `information_schema`, `pg_class` and
|
|
44
|
+
* `sqlite_schema` readers compare against. Postgres names the table plainly; the others keep the prefix. */
|
|
45
|
+
export const runtimeRelation = (dialect, name) => ({
|
|
46
|
+
schema: PLACEMENT[dialect],
|
|
47
|
+
relname: dialect === 'postgres' ? logicalName(name) : `${RUNTIME_TABLE_PREFIX}${logicalName(name)}`,
|
|
48
|
+
});
|
|
49
|
+
/** A runtime name as this dialect spells it, unqualified: an index, a sequence or a key a store
|
|
50
|
+
* pins beside its tables, or a store's name prefix for a catalog scan (`__mistri_job_` is
|
|
51
|
+
* `job_` inside the Postgres schema). */
|
|
52
|
+
export const runtimeName = (dialect, name) => runtimeRelation(dialect, name).relname;
|
|
53
|
+
/** Whether a catalog relation is runtime state on this dialect: on Postgres anything in the
|
|
54
|
+
* runtime schema, whatever it is called; elsewhere a prefixed name (in `main` on SQLite). */
|
|
55
|
+
export const isRuntimeRelation = (dialect, schema, name) => {
|
|
56
|
+
if (dialect === 'postgres')
|
|
57
|
+
return schema !== null && schema.toLowerCase() === RUNTIME_SCHEMA;
|
|
58
|
+
if (dialect === 'sqlite' && schema !== PLACEMENT.sqlite)
|
|
59
|
+
return false;
|
|
60
|
+
return isRuntimeTable(name);
|
|
61
|
+
};
|
|
62
|
+
/** The functions the runtime schema may hold beside its tables, each a store's own (the epoch
|
|
63
|
+
* trigger's, and the append-only triggers of flags, experiments and analytics). Ownership checks
|
|
64
|
+
* count anything else there, a function, operator or type, as planted: Better Auth resolves its
|
|
65
|
+
* unqualified names through this schema. */
|
|
66
|
+
export const RUNTIME_SCHEMA_FUNCTIONS = Object.freeze([
|
|
67
|
+
'schema_epoch_bump',
|
|
68
|
+
'flag_immutable',
|
|
69
|
+
'experiment_immutable',
|
|
70
|
+
'analytics_append_only',
|
|
71
|
+
]);
|
|
72
|
+
/** The store prefixes whose owner may be a role other than the schema's: a suite's flag or
|
|
73
|
+
* experiment control can run as its own role, granted USAGE and CREATE on the runtime schema.
|
|
74
|
+
* Such a grant is not a foreign one (adapters/postgresRuntimeSchema.ts). */
|
|
75
|
+
export const RUNTIME_CONTROL_PREFIXES = Object.freeze(['flag_', 'experiment_']);
|
|
76
|
+
/** A store's table names (each as its SQLite layout pins it) as PostgreSQL spells them
|
|
77
|
+
* inside the runtime schema: what its pinned PostgreSQL layout and the names derived from a
|
|
78
|
+
* table's (`<table>_pkey`, `<table>_id_seq`) are built from. */
|
|
79
|
+
export const postgresRuntimeNames = (tables) => Object.freeze(Object.fromEntries(Object.entries(tables).map(([key, name]) => [key, runtimeName('postgres', name)])));
|