@hot-updater/server 1.0.0-rc.14 → 1.0.0-rc.16
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/dist/adapters/drizzle.cjs +35 -74
- package/dist/adapters/drizzle.d.cts +13 -5
- package/dist/adapters/drizzle.d.mts +13 -5
- package/dist/adapters/drizzle.mjs +34 -75
- package/dist/adapters/drizzleExecutor.cjs +114 -0
- package/dist/adapters/drizzleExecutor.d.cts +9 -0
- package/dist/adapters/drizzleExecutor.d.mts +9 -0
- package/dist/adapters/drizzleExecutor.mjs +112 -0
- package/dist/adapters/kysely.cjs +25 -31
- package/dist/adapters/kysely.d.cts +10 -6
- package/dist/adapters/kysely.d.mts +10 -6
- package/dist/adapters/kysely.mjs +25 -32
- package/dist/adapters/kyselyExecutor.cjs +32 -0
- package/dist/adapters/kyselyExecutor.d.cts +12 -0
- package/dist/adapters/kyselyExecutor.d.mts +12 -0
- package/dist/adapters/kyselyExecutor.mjs +32 -0
- package/dist/adapters/mongodb.cjs +28 -62
- package/dist/adapters/mongodb.d.cts +10 -5
- package/dist/adapters/mongodb.d.mts +10 -5
- package/dist/adapters/mongodb.mjs +28 -63
- package/dist/adapters/mongodbAdapter.cjs +174 -0
- package/dist/adapters/mongodbAdapter.d.cts +9 -0
- package/dist/adapters/mongodbAdapter.d.mts +9 -0
- package/dist/adapters/mongodbAdapter.mjs +173 -0
- package/dist/adapters/prisma.cjs +38 -257
- package/dist/adapters/prisma.d.cts +12 -7
- package/dist/adapters/prisma.d.mts +12 -7
- package/dist/adapters/prisma.mjs +38 -257
- package/dist/adapters/prismaExecutor.cjs +64 -0
- package/dist/adapters/prismaExecutor.mjs +64 -0
- package/dist/adapters/sqlProviders.cjs +9 -0
- package/dist/adapters/sqlProviders.mjs +9 -0
- package/dist/apiKeys.cjs +2 -6
- package/dist/apiKeys.d.cts +1 -23
- package/dist/apiKeys.d.mts +1 -23
- package/dist/apiKeys.mjs +2 -6
- package/dist/assembly/assemblePlugins.cjs +147 -0
- package/dist/assembly/assemblePlugins.d.cts +12 -0
- package/dist/assembly/assemblePlugins.d.mts +12 -0
- package/dist/assembly/assemblePlugins.mjs +146 -0
- package/dist/assembly/databasePlugins.cjs +23 -0
- package/dist/assembly/databasePlugins.d.cts +43 -0
- package/dist/assembly/databasePlugins.d.mts +43 -0
- package/dist/assembly/databasePlugins.mjs +22 -0
- package/dist/core/api.cjs +91 -0
- package/dist/core/api.d.cts +65 -0
- package/dist/core/api.d.mts +65 -0
- package/dist/core/api.mjs +87 -0
- package/dist/core/baseCandidates.cjs +71 -0
- package/dist/core/baseCandidates.d.cts +17 -0
- package/dist/core/baseCandidates.d.mts +17 -0
- package/dist/core/baseCandidates.mjs +69 -0
- package/dist/core/operations.cjs +350 -0
- package/dist/core/operations.mjs +350 -0
- package/dist/core/reads.cjs +273 -0
- package/dist/core/reads.d.cts +48 -0
- package/dist/core/reads.d.mts +48 -0
- package/dist/core/reads.mjs +267 -0
- package/dist/core/releases.cjs +193 -0
- package/dist/core/releases.mjs +190 -0
- package/dist/core/schema.cjs +279 -0
- package/dist/core/schema.d.cts +307 -0
- package/dist/core/schema.d.mts +307 -0
- package/dist/core/schema.mjs +277 -0
- package/dist/core/writes.cjs +96 -0
- package/dist/core/writes.mjs +91 -0
- package/dist/createHotUpdaterCore.cjs +58 -75
- package/dist/createHotUpdaterCore.d.cts +52 -44
- package/dist/createHotUpdaterCore.d.mts +52 -44
- package/dist/createHotUpdaterCore.mjs +59 -75
- package/dist/database/cursor.cjs +44 -0
- package/dist/database/cursor.d.cts +7 -0
- package/dist/database/cursor.d.mts +7 -0
- package/dist/database/cursor.mjs +40 -0
- package/dist/database/database.cjs +44 -0
- package/dist/database/database.d.cts +123 -0
- package/dist/database/database.d.mts +123 -0
- package/dist/database/database.mjs +44 -0
- package/dist/database/definitions.d.cts +68 -0
- package/dist/database/definitions.d.mts +68 -0
- package/dist/database/engine.cjs +37 -0
- package/dist/database/engine.d.cts +40 -0
- package/dist/database/engine.d.mts +40 -0
- package/dist/database/engine.mjs +37 -0
- package/dist/database/engineAggregates.cjs +115 -0
- package/dist/database/engineAggregates.mjs +112 -0
- package/dist/database/engineReads.cjs +180 -0
- package/dist/database/engineReads.d.cts +35 -0
- package/dist/database/engineReads.d.mts +35 -0
- package/dist/database/engineReads.mjs +179 -0
- package/dist/database/engineTransaction.cjs +403 -0
- package/dist/database/engineTransaction.d.cts +26 -0
- package/dist/database/engineTransaction.d.mts +26 -0
- package/dist/database/engineTransaction.mjs +402 -0
- package/dist/database/errors.cjs +27 -0
- package/dist/database/errors.d.cts +21 -0
- package/dist/database/errors.d.mts +21 -0
- package/dist/database/errors.mjs +24 -0
- package/dist/database/fence.cjs +124 -0
- package/dist/database/fence.d.cts +42 -0
- package/dist/database/fence.d.mts +42 -0
- package/dist/database/fence.mjs +116 -0
- package/dist/database/index.cjs +127 -0
- package/dist/database/index.d.cts +17 -0
- package/dist/database/index.d.mts +17 -0
- package/dist/database/index.mjs +15 -0
- package/dist/database/kv/kvAdapter.cjs +273 -0
- package/dist/database/kv/kvAdapter.d.cts +101 -0
- package/dist/database/kv/kvAdapter.d.mts +101 -0
- package/dist/database/kv/kvAdapter.mjs +272 -0
- package/dist/database/resolveSchema.cjs +196 -0
- package/dist/database/resolveSchema.d.cts +42 -0
- package/dist/database/resolveSchema.d.mts +42 -0
- package/dist/database/resolveSchema.mjs +193 -0
- package/dist/database/schema.cjs +21 -0
- package/dist/database/schema.d.cts +61 -0
- package/dist/database/schema.d.mts +61 -0
- package/dist/database/schema.mjs +20 -0
- package/dist/database/sql/sqlAdapter.cjs +282 -0
- package/dist/database/sql/sqlAdapter.d.cts +46 -0
- package/dist/database/sql/sqlAdapter.d.mts +46 -0
- package/dist/database/sql/sqlAdapter.mjs +279 -0
- package/dist/database/sql/sqlSchema.cjs +115 -0
- package/dist/database/sql/sqlSchema.d.cts +8 -0
- package/dist/database/sql/sqlSchema.d.mts +8 -0
- package/dist/database/sql/sqlSchema.mjs +111 -0
- package/dist/db/builtInDatabase.cjs +104 -0
- package/dist/db/builtInDatabase.d.cts +38 -0
- package/dist/db/builtInDatabase.d.mts +38 -0
- package/dist/db/builtInDatabase.mjs +97 -0
- package/dist/db/createBundleDiff.cjs +4 -4
- package/dist/db/createBundleDiff.d.cts +3 -2
- package/dist/db/createBundleDiff.d.mts +3 -2
- package/dist/db/createBundleDiff.mjs +5 -5
- package/dist/db/engineDrizzleSchema.cjs +54 -0
- package/dist/db/engineDrizzleSchema.mjs +54 -0
- package/dist/db/engineMigrator.cjs +53 -0
- package/dist/db/engineMigrator.mjs +53 -0
- package/dist/db/enginePrismaSchema.cjs +85 -0
- package/dist/db/enginePrismaSchema.d.cts +5 -0
- package/dist/db/enginePrismaSchema.d.mts +5 -0
- package/dist/db/enginePrismaSchema.mjs +84 -0
- package/dist/db/engineSql.cjs +26 -0
- package/dist/db/engineSql.d.cts +17 -0
- package/dist/db/engineSql.d.mts +17 -0
- package/dist/db/engineSql.mjs +25 -0
- package/dist/db/engineSqlMigrator.cjs +66 -0
- package/dist/db/engineSqlMigrator.mjs +66 -0
- package/dist/db/fixedMigratorShared.cjs +0 -11
- package/dist/db/fixedMigratorShared.mjs +1 -8
- package/dist/db/index.cjs +23 -8
- package/dist/db/index.d.cts +10 -3
- package/dist/db/index.d.mts +10 -3
- package/dist/db/index.mjs +16 -8
- package/dist/db/releaseCatalog.cjs +20 -43
- package/dist/db/releaseCatalog.d.cts +2 -2
- package/dist/db/releaseCatalog.d.mts +2 -2
- package/dist/db/releaseCatalog.mjs +20 -44
- package/dist/db/schemaSettings.cjs +63 -0
- package/dist/db/schemaSettings.d.cts +12 -0
- package/dist/db/schemaSettings.d.mts +12 -0
- package/dist/db/schemaSettings.mjs +62 -0
- package/dist/db/settingsMigrator.cjs +92 -0
- package/dist/db/settingsMigrator.mjs +89 -0
- package/dist/db/types.cjs +1 -12
- package/dist/db/types.d.cts +26 -66
- package/dist/db/types.d.mts +26 -66
- package/dist/db/types.mjs +2 -11
- package/dist/db/updateArtifacts.cjs +38 -67
- package/dist/db/updateArtifacts.mjs +40 -69
- package/dist/handler.cjs +72 -43
- package/dist/handler.d.cts +3 -5
- package/dist/handler.d.mts +3 -5
- package/dist/handler.mjs +73 -43
- package/dist/handlerAdminRoutes.cjs +375 -0
- package/dist/handlerAdminRoutes.mjs +373 -0
- package/dist/handlerParameters.cjs +6 -11
- package/dist/handlerParameters.mjs +6 -10
- package/dist/handlerReleaseCatalogRoutes.cjs +11 -13
- package/dist/handlerReleaseCatalogRoutes.mjs +11 -13
- package/dist/handlerTypes.d.cts +2 -55
- package/dist/handlerTypes.d.mts +2 -55
- package/dist/handlerVersionRoutes.cjs +20 -4
- package/dist/handlerVersionRoutes.mjs +20 -4
- package/dist/index.cjs +4 -7
- package/dist/index.d.cts +8 -7
- package/dist/index.d.mts +8 -7
- package/dist/index.mjs +4 -4
- package/dist/insights/domain.d.cts +12 -0
- package/dist/insights/domain.d.mts +12 -0
- package/dist/insights/errors.cjs +34 -0
- package/dist/insights/errors.mjs +34 -1
- package/dist/insights/eventInput.cjs +14 -19
- package/dist/insights/eventInput.mjs +15 -20
- package/dist/insights/provider.cjs +47 -23
- package/dist/insights/provider.mjs +47 -24
- package/dist/insights/routes.cjs +79 -14
- package/dist/insights/routes.mjs +77 -14
- package/dist/node.d.cts +1 -1
- package/dist/node.d.mts +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.mjs +1 -1
- package/dist/plugins/api-keys/index.cjs +50 -0
- package/dist/plugins/api-keys/index.d.cts +85 -0
- package/dist/plugins/api-keys/index.d.mts +85 -0
- package/dist/plugins/api-keys/index.mjs +47 -0
- package/dist/plugins/api-keys/model.cjs +58 -0
- package/dist/plugins/api-keys/model.d.cts +8 -0
- package/dist/plugins/api-keys/model.d.mts +8 -0
- package/dist/plugins/api-keys/model.mjs +58 -0
- package/dist/plugins/api-keys/schema.cjs +38 -0
- package/dist/plugins/api-keys/schema.d.cts +44 -0
- package/dist/plugins/api-keys/schema.d.mts +44 -0
- package/dist/plugins/api-keys/schema.mjs +39 -0
- package/dist/plugins/builtIn.cjs +7 -0
- package/dist/plugins/builtIn.mjs +6 -0
- package/dist/plugins/definePlugin.cjs +5 -0
- package/dist/plugins/definePlugin.d.cts +73 -0
- package/dist/plugins/definePlugin.d.mts +73 -0
- package/dist/plugins/definePlugin.mjs +5 -0
- package/dist/plugins/index.cjs +17 -0
- package/dist/plugins/index.d.cts +9 -0
- package/dist/plugins/index.d.mts +9 -0
- package/dist/plugins/index.mjs +7 -0
- package/dist/plugins/insights/index.cjs +48 -0
- package/dist/plugins/insights/index.d.cts +295 -0
- package/dist/plugins/insights/index.d.mts +295 -0
- package/dist/plugins/insights/index.mjs +44 -0
- package/dist/plugins/insights/model.cjs +17 -0
- package/dist/plugins/insights/model.d.cts +10 -0
- package/dist/plugins/insights/model.d.mts +10 -0
- package/dist/plugins/insights/model.mjs +17 -0
- package/dist/plugins/insights/reads.cjs +471 -0
- package/dist/plugins/insights/reads.mjs +466 -0
- package/dist/plugins/insights/recordEvent.cjs +135 -0
- package/dist/plugins/insights/recordEvent.d.cts +13 -0
- package/dist/plugins/insights/recordEvent.d.mts +13 -0
- package/dist/plugins/insights/recordEvent.mjs +132 -0
- package/dist/plugins/insights/schema.cjs +347 -0
- package/dist/plugins/insights/schema.d.cts +258 -0
- package/dist/plugins/insights/schema.d.mts +258 -0
- package/dist/plugins/insights/schema.mjs +344 -0
- package/dist/types/index.d.cts +2 -28
- package/dist/types/index.d.mts +2 -28
- package/package.json +28 -5
- package/src/adapters/drizzle.conformance.integration.spec.ts +34 -0
- package/src/adapters/drizzle.readBudgets.integration.spec.ts +41 -0
- package/src/adapters/drizzle.spec.ts +270 -399
- package/src/adapters/drizzle.ts +48 -140
- package/src/adapters/drizzleExecutor.ts +166 -0
- package/src/adapters/kysely.conformance.integration.spec.ts +36 -0
- package/src/adapters/kysely.readBudgets.integration.spec.ts +42 -0
- package/src/adapters/kysely.spec.ts +204 -171
- package/src/adapters/kysely.ts +32 -93
- package/src/adapters/kyselyExecutor.ts +53 -0
- package/src/adapters/mongodb.integration.spec.ts +143 -446
- package/src/adapters/mongodb.readBudgets.integration.spec.ts +61 -0
- package/src/adapters/mongodb.ts +36 -123
- package/src/adapters/mongodbAdapter.ts +293 -0
- package/src/adapters/prisma.conformance.integration.spec.ts +36 -0
- package/src/adapters/prisma.integration.spec.ts +138 -0
- package/src/adapters/prisma.readBudgets.integration.spec.ts +40 -0
- package/src/adapters/prisma.spec.ts +216 -433
- package/src/adapters/prisma.ts +60 -524
- package/src/adapters/prismaExecutor.ts +107 -0
- package/src/adapters/prismaTestClients.ts +175 -0
- package/src/adapters/sqlProviders.ts +14 -0
- package/src/apiKeys.integration.spec.ts +19 -119
- package/src/apiKeys.spec.ts +39 -35
- package/src/apiKeys.ts +2 -8
- package/src/assembly/assemblePlugins.ts +269 -0
- package/src/assembly/assembly.spec.ts +325 -0
- package/src/assembly/assembly.types.spec.ts +155 -0
- package/src/assembly/builtInRoutes.spec.ts +213 -0
- package/src/assembly/databasePlugins.spec.ts +71 -0
- package/src/assembly/databasePlugins.ts +96 -0
- package/src/core/api.ts +139 -0
- package/src/core/baseCandidates.spec.ts +378 -0
- package/src/core/baseCandidates.ts +136 -0
- package/src/core/index.ts +44 -0
- package/src/core/operations.spec.ts +415 -0
- package/src/core/operations.ts +551 -0
- package/src/core/reads.spec.ts +300 -0
- package/src/core/reads.ts +417 -0
- package/src/core/releases.spec.ts +308 -0
- package/src/core/releases.ts +345 -0
- package/src/core/schema.ts +173 -0
- package/src/core/writes.ts +160 -0
- package/src/createHotUpdaterCore.ts +191 -181
- package/src/database/cursor.ts +65 -0
- package/src/database/database.ts +335 -0
- package/src/database/database.types.spec.ts +135 -0
- package/src/database/definitions.ts +72 -0
- package/src/database/engine.ts +62 -0
- package/src/database/engineAggregates.spec.ts +539 -0
- package/src/database/engineAggregates.ts +193 -0
- package/src/database/engineReads.spec.ts +219 -0
- package/src/database/engineReads.ts +302 -0
- package/src/database/engineTransaction.spec.ts +710 -0
- package/src/database/engineTransaction.ts +588 -0
- package/src/database/errors.ts +30 -0
- package/src/database/fence.spec.ts +223 -0
- package/src/database/fence.ts +171 -0
- package/src/database/index.ts +154 -0
- package/src/database/kv/kvAdapter.conformance.integration.spec.ts +17 -0
- package/src/database/kv/kvAdapter.readBudgets.integration.spec.ts +17 -0
- package/src/database/kv/kvAdapter.spec.ts +468 -0
- package/src/database/kv/kvAdapter.ts +450 -0
- package/src/database/kv/kvTestStore.ts +91 -0
- package/src/database/memory.readBudgets.integration.spec.ts +13 -0
- package/src/database/resolveSchema.spec.ts +230 -0
- package/src/database/resolveSchema.ts +372 -0
- package/src/database/schema.ts +169 -0
- package/src/database/schema.types.spec.ts +94 -0
- package/src/database/sql/docker-compose.yml +36 -0
- package/src/database/sql/sqlAdapter.integration.spec.ts +148 -0
- package/src/database/sql/sqlAdapter.readBudgets.integration.spec.ts +109 -0
- package/src/database/sql/sqlAdapter.spec.ts +255 -0
- package/src/database/sql/sqlAdapter.ts +532 -0
- package/src/database/sql/sqlSchema.ts +205 -0
- package/src/database/sql/sqlTestExecutors.ts +183 -0
- package/src/databaseTestSuite.spec.ts +39 -0
- package/src/db/builtInDatabase.ts +149 -0
- package/src/db/bundleRows.spec.ts +3 -3
- package/src/db/createBundleDiff.spec.ts +43 -29
- package/src/db/createBundleDiff.ts +13 -7
- package/src/db/engineDrizzleSchema.ts +72 -0
- package/src/db/engineMigrator.ts +105 -0
- package/src/db/enginePrismaSchema.ts +147 -0
- package/src/db/engineSql.spec.ts +129 -0
- package/src/db/engineSql.ts +48 -0
- package/src/db/engineSqlMigrator.ts +116 -0
- package/src/db/fixedMigratorShared.ts +1 -20
- package/src/db/index.spec.ts +116 -829
- package/src/db/index.ts +43 -14
- package/src/db/pluginTables.spec.ts +218 -0
- package/src/db/releaseCatalog.ts +48 -90
- package/src/db/schemaSettings.ts +104 -0
- package/src/db/settingsMigrator.spec.ts +65 -0
- package/src/db/settingsMigrator.ts +152 -0
- package/src/db/types.ts +25 -171
- package/src/db/updateArtifacts.spec.ts +170 -294
- package/src/db/updateArtifacts.ts +74 -142
- package/src/db/updateCheck.bench.ts +47 -0
- package/src/handler-standalone.integration.spec.ts +204 -410
- package/src/handler.spec.ts +134 -51
- package/src/handler.testFixtures.ts +14 -19
- package/src/handler.ts +163 -75
- package/src/handlerAdminRoutes.spec.ts +183 -0
- package/src/handlerAdminRoutes.ts +536 -0
- package/src/handlerAuth.integration.spec.ts +3 -3
- package/src/handlerManagement.spec.ts +136 -196
- package/src/handlerReleaseCatalogRoutes.ts +15 -17
- package/src/handlerTypes.ts +3 -80
- package/src/handlerVersionRoutes.ts +20 -7
- package/src/index.ts +5 -12
- package/src/insights/domain.ts +12 -0
- package/src/insights/errors.spec.ts +48 -0
- package/src/insights/errors.ts +51 -0
- package/src/insights/eventInput.ts +27 -24
- package/src/insights/insights.integration.spec.ts +228 -78
- package/src/insights/provider.spec.ts +203 -25
- package/src/insights/provider.ts +88 -32
- package/src/insights/routes.ts +95 -20
- package/src/lintRules.spec.ts +76 -0
- package/src/plugins/api-keys/apiKeysPlugin.spec.ts +172 -0
- package/src/plugins/api-keys/index.ts +66 -0
- package/src/plugins/api-keys/model.ts +69 -0
- package/src/plugins/api-keys/schema.ts +22 -0
- package/src/plugins/builtIn.ts +5 -0
- package/src/plugins/definePlugin.ts +100 -0
- package/src/plugins/index.ts +55 -0
- package/src/plugins/insights/index.ts +86 -0
- package/src/plugins/insights/insightsRollout.integration.spec.ts +187 -0
- package/src/plugins/insights/model.spec.ts +66 -0
- package/src/plugins/insights/model.ts +19 -0
- package/src/plugins/insights/reads.spec.ts +725 -0
- package/src/plugins/insights/reads.ts +707 -0
- package/src/plugins/insights/recordEvent.spec.ts +443 -0
- package/src/plugins/insights/recordEvent.ts +238 -0
- package/src/plugins/insights/schema.ts +229 -0
- package/src/plugins/pluginTestHarness.spec.ts +56 -0
- package/src/readBudgets.testFixtures.ts +15 -0
- package/src/releaseCatalogRoutes.integration.spec.ts +47 -92
- package/src/runtime.spec.ts +91 -77
- package/src/runtime.testFixtures.ts +28 -44
- package/src/runtimeBundles.integration.spec.ts +112 -0
- package/src/testUtilsMutation.integration.spec.ts +215 -0
- package/src/testUtilsPackage.integration.spec.ts +176 -0
- package/src/types/index.ts +0 -32
- package/dist/adapters/databaseConstraintErrors.cjs +0 -22
- package/dist/adapters/databaseConstraintErrors.mjs +0 -21
- package/dist/adapters/databasePluginUtils.cjs +0 -130
- package/dist/adapters/databasePluginUtils.mjs +0 -118
- package/dist/adapters/drizzleCrud.cjs +0 -340
- package/dist/adapters/drizzleCrud.mjs +0 -337
- package/dist/adapters/drizzleLazyDB.cjs +0 -103
- package/dist/adapters/drizzleLazyDB.mjs +0 -103
- package/dist/adapters/drizzleQuery.cjs +0 -69
- package/dist/adapters/drizzleQuery.mjs +0 -69
- package/dist/adapters/kyselyCrud.cjs +0 -293
- package/dist/adapters/kyselyCrud.mjs +0 -292
- package/dist/adapters/kyselyQuery.cjs +0 -56
- package/dist/adapters/kyselyQuery.mjs +0 -56
- package/dist/adapters/mongodbCollections.cjs +0 -38
- package/dist/adapters/mongodbCollections.mjs +0 -32
- package/dist/adapters/mongodbQuery.cjs +0 -90
- package/dist/adapters/mongodbQuery.mjs +0 -83
- package/dist/adapters/mongodbReads.cjs +0 -206
- package/dist/adapters/mongodbReads.mjs +0 -206
- package/dist/adapters/mongodbWrites.cjs +0 -133
- package/dist/adapters/mongodbWrites.mjs +0 -133
- package/dist/adapters/prismaInsights.cjs +0 -99
- package/dist/adapters/prismaInsights.mjs +0 -97
- package/dist/adapters/prismaQuery.cjs +0 -57
- package/dist/adapters/prismaQuery.mjs +0 -56
- package/dist/adapters/prismaRows.cjs +0 -197
- package/dist/adapters/prismaRows.mjs +0 -188
- package/dist/db/databasePluginCore.cjs +0 -137
- package/dist/db/databasePluginCore.mjs +0 -137
- package/dist/db/fixedMigrator.cjs +0 -79
- package/dist/db/fixedMigrator.mjs +0 -78
- package/dist/db/fixedMigratorMongo.cjs +0 -321
- package/dist/db/fixedMigratorMongo.mjs +0 -321
- package/dist/db/mongoMigrationExecution.cjs +0 -11
- package/dist/db/mongoMigrationExecution.mjs +0 -11
- package/dist/db/schema/insightsCollation.cjs +0 -14
- package/dist/db/schema/insightsCollation.mjs +0 -14
- package/dist/db/schema/mongodb.cjs +0 -25
- package/dist/db/schema/mongodb.mjs +0 -25
- package/dist/db/schema/registry.cjs +0 -21
- package/dist/db/schema/registry.mjs +0 -17
- package/dist/db/schema/sql.cjs +0 -105
- package/dist/db/schema/sql.mjs +0 -97
- package/dist/db/schema/sqlOperations.cjs +0 -27
- package/dist/db/schema/sqlOperations.mjs +0 -26
- package/dist/db/schemaGenerators.cjs +0 -276
- package/dist/db/schemaGenerators.mjs +0 -274
- package/dist/db/schemaReadiness.cjs +0 -26
- package/dist/db/schemaReadiness.d.cts +0 -9
- package/dist/db/schemaReadiness.d.mts +0 -9
- package/dist/db/schemaReadiness.mjs +0 -25
- package/dist/db/sqlMigrationExecution.cjs +0 -67
- package/dist/db/sqlMigrationExecution.mjs +0 -67
- package/dist/handlerBundleRoutes.cjs +0 -155
- package/dist/handlerBundleRoutes.mjs +0 -155
- package/dist/handlerReleaseManagementRoutes.cjs +0 -124
- package/dist/handlerReleaseManagementRoutes.mjs +0 -124
- package/dist/schema/dsl.cjs +0 -103
- package/dist/schema/dsl.mjs +0 -87
- package/dist/schema/index.cjs +0 -20
- package/dist/schema/index.mjs +0 -7
- package/dist/schema/settings.cjs +0 -9
- package/dist/schema/settings.mjs +0 -9
- package/dist/schema/types.cjs +0 -8
- package/dist/schema/types.mjs +0 -6
- package/dist/schema/v1_0_0.cjs +0 -393
- package/dist/schema/v1_0_0.mjs +0 -385
- package/src/adapters/databaseConstraintErrors.ts +0 -25
- package/src/adapters/databasePluginTestDatabase.ts +0 -116
- package/src/adapters/databasePluginUtils.spec.ts +0 -29
- package/src/adapters/databasePluginUtils.ts +0 -238
- package/src/adapters/drizzleCrud.ts +0 -610
- package/src/adapters/drizzleLazyDB.ts +0 -284
- package/src/adapters/drizzleQuery.ts +0 -164
- package/src/adapters/kyselyCrud.ts +0 -696
- package/src/adapters/kyselyInsights.spec.ts +0 -168
- package/src/adapters/kyselyQuery.ts +0 -128
- package/src/adapters/mongodb.spec.ts +0 -230
- package/src/adapters/mongodbCollections.ts +0 -78
- package/src/adapters/mongodbQuery.ts +0 -245
- package/src/adapters/mongodbReads.ts +0 -387
- package/src/adapters/mongodbRows.spec.ts +0 -64
- package/src/adapters/mongodbRows.ts +0 -118
- package/src/adapters/mongodbTestClient.ts +0 -443
- package/src/adapters/mongodbTestFilter.ts +0 -170
- package/src/adapters/mongodbWrites.ts +0 -261
- package/src/adapters/prismaInsights.ts +0 -190
- package/src/adapters/prismaQuery.ts +0 -129
- package/src/adapters/prismaRows.spec.ts +0 -98
- package/src/adapters/prismaRows.ts +0 -308
- package/src/adapters/prismaTestClient.ts +0 -478
- package/src/calculatePagination.ts +0 -34
- package/src/db/databasePluginCore.spec.ts +0 -62
- package/src/db/databasePluginCore.testFixtures.ts +0 -76
- package/src/db/databasePluginCore.ts +0 -185
- package/src/db/databasePluginUpdateCheck.bench.ts +0 -117
- package/src/db/fixedMigrator.spec.ts +0 -294
- package/src/db/fixedMigrator.ts +0 -147
- package/src/db/fixedMigratorMongo.spec.ts +0 -253
- package/src/db/fixedMigratorMongo.ts +0 -425
- package/src/db/hotUpdaterSchema.ts +0 -5
- package/src/db/mongoMigrationExecution.ts +0 -23
- package/src/db/schema/definitions.ts +0 -1
- package/src/db/schema/insightsCollation.ts +0 -21
- package/src/db/schema/mongodb.ts +0 -40
- package/src/db/schema/registry.ts +0 -55
- package/src/db/schema/sql.ts +0 -244
- package/src/db/schema/sqlOperations.ts +0 -63
- package/src/db/schema/types.ts +0 -1
- package/src/db/schemaGenerators.ts +0 -495
- package/src/db/schemaReadiness.ts +0 -34
- package/src/db/sqlMigrationExecution.spec.ts +0 -65
- package/src/db/sqlMigrationExecution.ts +0 -108
- package/src/db/types.spec.ts +0 -63
- package/src/handlerBundleRoutes.ts +0 -259
- package/src/handlerReleaseManagementRoutes.ts +0 -213
- package/src/schema/dsl-all-versions.spec.ts +0 -35
- package/src/schema/dsl.ts +0 -187
- package/src/schema/index.ts +0 -10
- package/src/schema/settings.ts +0 -15
- package/src/schema/types.ts +0 -79
- package/src/schema/v1_0_0.spec.ts +0 -220
- package/src/schema/v1_0_0.ts +0 -511
package/dist/adapters/prisma.mjs
CHANGED
|
@@ -1,265 +1,46 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { createPrismaOrderBy, createPrismaWhere } from "./prismaQuery.mjs";
|
|
8
|
-
import { DatabasePluginInputError, createDatabasePlugin } from "@hot-updater/plugin-core";
|
|
9
|
-
import { createDatabasePluginAdapter } from "@hot-updater/plugin-core/internal";
|
|
1
|
+
import { createSettingsMigrator } from "../db/settingsMigrator.mjs";
|
|
2
|
+
import { builtInSettings, builtInTarget, createEngineDatabase } from "../db/builtInDatabase.mjs";
|
|
3
|
+
import { createSqlAdapter } from "../database/sql/sqlAdapter.mjs";
|
|
4
|
+
import { checkSqlProvider } from "./sqlProviders.mjs";
|
|
5
|
+
import { generatePrismaEngineSchema, prismaCollationStatements } from "../db/enginePrismaSchema.mjs";
|
|
6
|
+
import { prismaExecutor } from "./prismaExecutor.mjs";
|
|
10
7
|
//#region src/adapters/prisma.ts
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
where: createPrismaWhere(input.where, provider),
|
|
32
|
-
...orderBy ? { orderBy } : {},
|
|
33
|
-
skip: input.offset,
|
|
34
|
-
take: input.limit
|
|
35
|
-
});
|
|
36
|
-
switch (input.model) {
|
|
37
|
-
case "bundles": return parsePrismaRows(rows, parsePrismaBundleRow);
|
|
38
|
-
case "bundle_patches": return parsePrismaRows(rows, parsePrismaPatchRow);
|
|
39
|
-
case "bundle_events": return parsePrismaRows(rows, parsePrismaBundleEventRow);
|
|
40
|
-
case "channels": return parsePrismaRows(rows, parsePrismaChannelRow);
|
|
41
|
-
case "api_keys": return parsePrismaRows(rows, parsePrismaApiKeyRow);
|
|
42
|
-
case "releases": return parsePrismaRows(rows, parsePrismaReleaseRow);
|
|
43
|
-
case "release_catalogs": return parsePrismaRows(rows, parsePrismaReleaseCatalogRow);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
const assertPatchReferences = async (client, bundleId, baseBundleId) => {
|
|
47
|
-
const ids = Array.from(/* @__PURE__ */ new Set([bundleId, baseBundleId]));
|
|
48
|
-
if (await getPrismaDelegate(client, "bundles").count({ where: { id: { in: ids } } }) !== ids.length) throw new PrismaAdapterError("patch references a missing bundle");
|
|
49
|
-
};
|
|
50
|
-
const createCrudImplementation = (client, provider, relationMode) => ({
|
|
51
|
-
deleteChannel: async ({ id }) => {
|
|
52
|
-
const channels = getPrismaDelegate(client, "channels");
|
|
53
|
-
if (await channels.findFirst({ where: { id } }) === null) return {
|
|
54
|
-
deleted: false,
|
|
55
|
-
reason: "not_found"
|
|
56
|
-
};
|
|
57
|
-
if (await getPrismaDelegate(client, "releases").count({ where: { channel_id: id } }) > 0) return {
|
|
58
|
-
deleted: false,
|
|
59
|
-
reason: "not_empty"
|
|
60
|
-
};
|
|
61
|
-
try {
|
|
62
|
-
await channels.deleteMany({ where: { id } });
|
|
63
|
-
} catch (error) {
|
|
64
|
-
if (isChannelDeleteReferencedError(error)) return {
|
|
65
|
-
deleted: false,
|
|
66
|
-
reason: "not_empty"
|
|
8
|
+
/**
|
|
9
|
+
* Hot Updater's database on a Prisma client: the storage engine through the
|
|
10
|
+
* shared SQL core, fenced by the schema settings. `db generate` writes the
|
|
11
|
+
* models Prisma applies; `db migrate` then sets the collations Prisma cannot
|
|
12
|
+
* declare and writes the settings rows the fence checks.
|
|
13
|
+
*/
|
|
14
|
+
const prismaAdapter = (config) => {
|
|
15
|
+
const provider = checkSqlProvider("prismaAdapter", config.provider);
|
|
16
|
+
const executor = prismaExecutor(config.prisma, provider);
|
|
17
|
+
return {
|
|
18
|
+
...createEngineDatabase({
|
|
19
|
+
name: "prisma",
|
|
20
|
+
adapter: createSqlAdapter({ executor })
|
|
21
|
+
}),
|
|
22
|
+
provider,
|
|
23
|
+
generateSchema: ((version, _name, { schema } = builtInTarget) => {
|
|
24
|
+
if (version !== "latest" && version !== builtInSettings["schema.core"]) throw new Error(`Invalid version ${version}`);
|
|
25
|
+
return {
|
|
26
|
+
code: generatePrismaEngineSchema(provider, schema),
|
|
27
|
+
path: "prisma/schema.prisma"
|
|
67
28
|
};
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
where: { name: input.row.name },
|
|
81
|
-
create: input.row,
|
|
82
|
-
update: {}
|
|
83
|
-
}));
|
|
84
|
-
return {
|
|
85
|
-
row,
|
|
86
|
-
inserted: row.id === input.row.id
|
|
87
|
-
};
|
|
88
|
-
},
|
|
89
|
-
create: async (input) => {
|
|
90
|
-
if (input.model === "bundle_patches") await assertPatchReferences(client, input.data.bundle_id, input.data.base_bundle_id);
|
|
91
|
-
const delegate = getPrismaDelegate(client, input.model);
|
|
92
|
-
let row;
|
|
93
|
-
if (input.onConflict === "ignore") {
|
|
94
|
-
const where = input.model === "channels" ? { name: input.data.name } : { hash: input.data.hash };
|
|
95
|
-
row = await delegate.upsert({
|
|
96
|
-
where,
|
|
97
|
-
create: input.data,
|
|
98
|
-
update: {}
|
|
99
|
-
});
|
|
100
|
-
} else row = await delegate.create({ data: input.data });
|
|
101
|
-
switch (input.model) {
|
|
102
|
-
case "bundles": return parsePrismaBundleRow(row);
|
|
103
|
-
case "bundle_patches": return parsePrismaPatchRow(row);
|
|
104
|
-
case "bundle_events": return parsePrismaBundleEventRow(row);
|
|
105
|
-
case "channels": return parsePrismaChannelRow(row);
|
|
106
|
-
case "api_keys": return parsePrismaApiKeyRow(row);
|
|
107
|
-
case "releases": return parsePrismaReleaseRow(row);
|
|
108
|
-
case "release_catalogs": return parsePrismaReleaseCatalogRow(row);
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
|
-
update: async (input) => {
|
|
112
|
-
const id = input.where[0]?.value;
|
|
113
|
-
if (typeof id !== "string") throw new PrismaAdapterError(`${input.model} update requires a string id`);
|
|
114
|
-
if (input.model === "api_keys") {
|
|
115
|
-
const delegate = getPrismaDelegate(client, "api_keys");
|
|
116
|
-
if (await delegate.findFirst({ where: { id } }) === null) return null;
|
|
117
|
-
await delegate.update({
|
|
118
|
-
where: { id },
|
|
119
|
-
data: input.update
|
|
120
|
-
});
|
|
121
|
-
const stored = await delegate.findFirst({ where: { id } });
|
|
122
|
-
return stored === null ? null : parsePrismaApiKeyRow(stored);
|
|
123
|
-
}
|
|
124
|
-
if (input.model === "releases") {
|
|
125
|
-
const delegate = getPrismaDelegate(client, "releases");
|
|
126
|
-
if (await delegate.findFirst({ where: { id } }) === null) return null;
|
|
127
|
-
await delegate.update({
|
|
128
|
-
where: { id },
|
|
129
|
-
data: input.update
|
|
29
|
+
}),
|
|
30
|
+
createMigrator: ({ schema, settings } = builtInTarget) => {
|
|
31
|
+
const collations = prismaCollationStatements(provider, schema);
|
|
32
|
+
return createSettingsMigrator({
|
|
33
|
+
adapterName: "prisma",
|
|
34
|
+
executor,
|
|
35
|
+
settings,
|
|
36
|
+
applyTables: "`prisma db push` (or `prisma migrate`)",
|
|
37
|
+
...collations.length === 0 ? {} : { fixups: {
|
|
38
|
+
description: "Set the collations Prisma cannot declare, so strings compare by their bytes",
|
|
39
|
+
statements: collations
|
|
40
|
+
} }
|
|
130
41
|
});
|
|
131
|
-
const stored = await delegate.findFirst({ where: { id } });
|
|
132
|
-
return stored === null ? null : parsePrismaReleaseRow(stored);
|
|
133
42
|
}
|
|
134
|
-
if (input.model === "release_catalogs") {
|
|
135
|
-
const delegate = getPrismaDelegate(client, "release_catalogs");
|
|
136
|
-
if (await delegate.findFirst({ where: { scope_key: id } }) === null) return null;
|
|
137
|
-
await delegate.update({
|
|
138
|
-
where: { scope_key: id },
|
|
139
|
-
data: input.update
|
|
140
|
-
});
|
|
141
|
-
const stored = await delegate.findFirst({ where: { scope_key: id } });
|
|
142
|
-
return stored === null ? null : parsePrismaReleaseCatalogRow(stored);
|
|
143
|
-
}
|
|
144
|
-
const delegate = getPrismaDelegate(client, "bundles");
|
|
145
|
-
if (delegate.updateMany === void 0) throw new PrismaAdapterError("model delegate \"bundles\" requires updateMany");
|
|
146
|
-
if (await delegate.findFirst({ where: { id } }) === null) return null;
|
|
147
|
-
await delegate.updateMany({
|
|
148
|
-
where: { id },
|
|
149
|
-
data: input.update
|
|
150
|
-
});
|
|
151
|
-
const stored = await delegate.findFirst({ where: { id } });
|
|
152
|
-
if (stored === null) return null;
|
|
153
|
-
return parsePrismaBundleRow(stored);
|
|
154
|
-
},
|
|
155
|
-
delete: async (input) => {
|
|
156
|
-
if (input.model === "bundles" && relationMode === "prisma") {
|
|
157
|
-
const rows = await getPrismaDelegate(client, "bundles").findMany({ where: createPrismaWhere(input.where, provider) });
|
|
158
|
-
const ids = parsePrismaRows(rows, parsePrismaBundleRow).map(({ id }) => id);
|
|
159
|
-
if (ids.length === 0) return;
|
|
160
|
-
await getPrismaDelegate(client, "bundle_patches").deleteMany({ where: { OR: [{ bundle_id: { in: ids } }, { base_bundle_id: { in: ids } }] } });
|
|
161
|
-
}
|
|
162
|
-
try {
|
|
163
|
-
await getPrismaDelegate(client, input.model).deleteMany({ where: createPrismaWhere(input.where, provider) });
|
|
164
|
-
} catch (error) {
|
|
165
|
-
if (input.model === "channels") translateChannelDeleteError(error);
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
count: async (input) => {
|
|
170
|
-
if (input.distinct !== void 0) throw new DatabasePluginInputError("invalid-operation");
|
|
171
|
-
return getPrismaDelegate(client, input.model).count({ where: createPrismaWhere(input.where, provider) });
|
|
172
|
-
},
|
|
173
|
-
findOne: async (input) => {
|
|
174
|
-
const row = await getPrismaDelegate(client, input.model).findFirst({ where: createPrismaWhere(input.where, provider) });
|
|
175
|
-
if (row === null) return null;
|
|
176
|
-
switch (input.model) {
|
|
177
|
-
case "bundles": return parsePrismaBundleRow(row);
|
|
178
|
-
case "bundle_patches": return parsePrismaPatchRow(row);
|
|
179
|
-
case "channels": return parsePrismaChannelRow(row);
|
|
180
|
-
case "api_keys": return parsePrismaApiKeyRow(row);
|
|
181
|
-
case "releases": return parsePrismaReleaseRow(row);
|
|
182
|
-
case "release_catalogs": return parsePrismaReleaseCatalogRow(row);
|
|
183
|
-
}
|
|
184
|
-
},
|
|
185
|
-
findMany: (input) => findMany(client, input, provider)
|
|
186
|
-
});
|
|
187
|
-
const createPrismaImplementation = (client, relationMode, provider) => {
|
|
188
|
-
const crud = createCrudImplementation(client, provider, relationMode);
|
|
189
|
-
const implementation = {
|
|
190
|
-
...crud,
|
|
191
|
-
async recordInsights({ event }) {
|
|
192
|
-
if (!hasCallbackTransaction(client)) return recordPrismaEventWithCte(client, provider, event);
|
|
193
|
-
const events = getPrismaDelegate(client, "bundle_events");
|
|
194
|
-
try {
|
|
195
|
-
await runPrismaTransaction(client, provider === "cockroachdb" ? "serializable" : "default", async (transaction) => {
|
|
196
|
-
await getPrismaDelegate(transaction, "bundle_events").create({ data: event });
|
|
197
|
-
await updatePrismaEventHead(transaction, provider, event);
|
|
198
|
-
});
|
|
199
|
-
} catch (error) {
|
|
200
|
-
if (typeof error !== "object" || error === null || !("code" in error) || error.code !== "P2002") throw error;
|
|
201
|
-
if (await events.findFirst({ where: { id: event.id } }) === null) throw error;
|
|
202
|
-
}
|
|
203
|
-
},
|
|
204
|
-
async findLatestInsightsEvents(input) {
|
|
205
|
-
const rows = await queryPrismaLatestEvents(client, provider, input);
|
|
206
|
-
if (typeof rows === "number") throw new PrismaAdapterError("invalid latest-event rows");
|
|
207
|
-
return rows;
|
|
208
|
-
},
|
|
209
|
-
async countLatestInsightsEvents(input) {
|
|
210
|
-
const count = await queryPrismaLatestEvents(client, provider, input);
|
|
211
|
-
if (typeof count !== "number") throw new PrismaAdapterError("invalid latest-event count");
|
|
212
|
-
return count;
|
|
213
|
-
},
|
|
214
|
-
deleteChannel: (input) => {
|
|
215
|
-
if (!hasCallbackTransaction(client)) throw new PrismaAdapterError("channel deletion requires callback transactions");
|
|
216
|
-
return runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).deleteChannel(input));
|
|
217
|
-
},
|
|
218
|
-
delete: (input) => {
|
|
219
|
-
if (input.model !== "bundles" || relationMode === "foreign-keys") return crud.delete(input);
|
|
220
|
-
if (!hasCallbackTransaction(client)) throw new PrismaAdapterError("relation mode \"prisma\" requires callback transactions");
|
|
221
|
-
return runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).delete(input));
|
|
222
|
-
}
|
|
223
|
-
};
|
|
224
|
-
if (relationMode === "prisma" && !hasCallbackTransaction(client)) throw new PrismaAdapterError("relation mode \"prisma\" requires callback transactions");
|
|
225
|
-
if (!hasCallbackTransaction(client)) return implementation;
|
|
226
|
-
if (relationMode === "prisma") implementation.create = (input) => runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).create(input));
|
|
227
|
-
implementation.update = (input) => runPrismaTransaction(client, relationMode === "prisma" ? "serializable" : "default", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).update(input));
|
|
228
|
-
return {
|
|
229
|
-
...implementation,
|
|
230
|
-
transaction: (callback) => runPrismaTransaction(client, "serializable", async (transactionClient) => {
|
|
231
|
-
return callback(createCrudImplementation(transactionClient, provider, relationMode));
|
|
232
|
-
})
|
|
233
|
-
};
|
|
234
|
-
};
|
|
235
|
-
const prismaAdapter = (config) => {
|
|
236
|
-
assertPrismaProvider(config.provider);
|
|
237
|
-
const adapter = createDatabasePluginAdapter("prisma", createPrismaImplementation(config.prisma, config.relationMode ?? "foreign-keys", config.provider));
|
|
238
|
-
const unsupportedMssqlInsights = async () => {
|
|
239
|
-
throw new PrismaAdapterError("SQL Server Insights is unsupported: string keys pad trailing spaces and do not provide the required exact UTF-8 identity ordering");
|
|
240
43
|
};
|
|
241
|
-
const insights = config.provider === "mssql" ? {
|
|
242
|
-
recordEvent: unsupportedMssqlInsights,
|
|
243
|
-
listEvents: unsupportedMssqlInsights,
|
|
244
|
-
findLatestEvents: unsupportedMssqlInsights,
|
|
245
|
-
countLatestEvents: unsupportedMssqlInsights,
|
|
246
|
-
countEvents: unsupportedMssqlInsights
|
|
247
|
-
} : adapter.models.insights;
|
|
248
|
-
return Object.assign(createDatabasePlugin({
|
|
249
|
-
name: "prisma",
|
|
250
|
-
models: {
|
|
251
|
-
...adapter.models,
|
|
252
|
-
insights
|
|
253
|
-
},
|
|
254
|
-
commit: adapter.commit
|
|
255
|
-
}), {
|
|
256
|
-
adapterName: "prisma",
|
|
257
|
-
provider: config.provider,
|
|
258
|
-
generateSchema: ((version) => ({
|
|
259
|
-
code: generatePrismaSchema(config.provider, version === "latest" ? hotUpdaterSchema : getHotUpdaterSchemaVersion(version)),
|
|
260
|
-
path: "./prisma/schema/hot_updater.prisma"
|
|
261
|
-
}))
|
|
262
|
-
});
|
|
263
44
|
};
|
|
264
45
|
//#endregion
|
|
265
46
|
export { prismaAdapter };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const require_fence = require("../database/fence.cjs");
|
|
2
|
+
const require_sqlSchema = require("../database/sql/sqlSchema.cjs");
|
|
3
|
+
//#region src/adapters/prismaExecutor.ts
|
|
4
|
+
/**
|
|
5
|
+
* Prisma reports a raw query's database error as P2010 with the database's
|
|
6
|
+
* code in `meta.code`, and a failed transaction as P2034. The error thrown on
|
|
7
|
+
* carries that code, as the SQL core classifies it, with Prisma's as `cause`.
|
|
8
|
+
*/
|
|
9
|
+
const withDatabaseCode = (dialect, error) => {
|
|
10
|
+
const { code, meta } = error ?? {};
|
|
11
|
+
const database = code === "P2034" ? "40001" : meta?.code === void 0 ? void 0 : String(meta.code);
|
|
12
|
+
if (database === void 0) return error;
|
|
13
|
+
return Object.assign(new Error(String(meta?.message ?? error.message), { cause: error }), { code: dialect === "sqlite" ? `SQLITE:${database}` : database });
|
|
14
|
+
};
|
|
15
|
+
/** MySQL's ASCII keys are `VarBinary` in Prisma's schema, and read back as bytes. */
|
|
16
|
+
const decoder = new TextDecoder();
|
|
17
|
+
const decodeRow = (row) => {
|
|
18
|
+
for (const [column, value] of Object.entries(row)) if (value instanceof Uint8Array) row[column] = decoder.decode(value);
|
|
19
|
+
return row;
|
|
20
|
+
};
|
|
21
|
+
const over = (dialect, client) => ({ async execute({ sql, params }) {
|
|
22
|
+
try {
|
|
23
|
+
if (/^\s*SELECT\b/iu.test(sql)) return {
|
|
24
|
+
rows: (await client.$queryRawUnsafe(sql, ...params)).map(decodeRow),
|
|
25
|
+
changes: 0
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
rows: [],
|
|
29
|
+
changes: Number(await client.$executeRawUnsafe(sql, ...params))
|
|
30
|
+
};
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw withDatabaseCode(dialect, error);
|
|
33
|
+
}
|
|
34
|
+
} });
|
|
35
|
+
/** Taking the write lock first makes a SQLite transaction behave as BEGIN IMMEDIATE. */
|
|
36
|
+
const writeLock = (dialect) => `UPDATE ${require_sqlSchema.quoteSql(dialect, require_fence.SETTINGS_TABLE.name)} SET ${require_sqlSchema.quoteSql(dialect, "_v")} = ${require_sqlSchema.quoteSql(dialect, "_v")} WHERE 0 = 1`;
|
|
37
|
+
/**
|
|
38
|
+
* The SQL core's executor over a Prisma client, through raw queries and
|
|
39
|
+
* interactive transactions. A SQLite transaction takes the write lock with
|
|
40
|
+
* its first statement, as BEGIN IMMEDIATE would.
|
|
41
|
+
*/
|
|
42
|
+
const prismaExecutor = (client, dialect) => ({
|
|
43
|
+
dialect,
|
|
44
|
+
...over(dialect, client),
|
|
45
|
+
async transaction(fn) {
|
|
46
|
+
try {
|
|
47
|
+
return await client.$transaction(async (tx) => {
|
|
48
|
+
const connection = over(dialect, tx);
|
|
49
|
+
if (dialect === "sqlite") await connection.execute({
|
|
50
|
+
sql: writeLock(dialect),
|
|
51
|
+
params: []
|
|
52
|
+
});
|
|
53
|
+
return fn(connection);
|
|
54
|
+
}, {
|
|
55
|
+
maxWait: 1e4,
|
|
56
|
+
timeout: 3e4
|
|
57
|
+
});
|
|
58
|
+
} catch (error) {
|
|
59
|
+
throw withDatabaseCode(dialect, error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
//#endregion
|
|
64
|
+
exports.prismaExecutor = prismaExecutor;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { SETTINGS_TABLE } from "../database/fence.mjs";
|
|
2
|
+
import { quoteSql } from "../database/sql/sqlSchema.mjs";
|
|
3
|
+
//#region src/adapters/prismaExecutor.ts
|
|
4
|
+
/**
|
|
5
|
+
* Prisma reports a raw query's database error as P2010 with the database's
|
|
6
|
+
* code in `meta.code`, and a failed transaction as P2034. The error thrown on
|
|
7
|
+
* carries that code, as the SQL core classifies it, with Prisma's as `cause`.
|
|
8
|
+
*/
|
|
9
|
+
const withDatabaseCode = (dialect, error) => {
|
|
10
|
+
const { code, meta } = error ?? {};
|
|
11
|
+
const database = code === "P2034" ? "40001" : meta?.code === void 0 ? void 0 : String(meta.code);
|
|
12
|
+
if (database === void 0) return error;
|
|
13
|
+
return Object.assign(new Error(String(meta?.message ?? error.message), { cause: error }), { code: dialect === "sqlite" ? `SQLITE:${database}` : database });
|
|
14
|
+
};
|
|
15
|
+
/** MySQL's ASCII keys are `VarBinary` in Prisma's schema, and read back as bytes. */
|
|
16
|
+
const decoder = new TextDecoder();
|
|
17
|
+
const decodeRow = (row) => {
|
|
18
|
+
for (const [column, value] of Object.entries(row)) if (value instanceof Uint8Array) row[column] = decoder.decode(value);
|
|
19
|
+
return row;
|
|
20
|
+
};
|
|
21
|
+
const over = (dialect, client) => ({ async execute({ sql, params }) {
|
|
22
|
+
try {
|
|
23
|
+
if (/^\s*SELECT\b/iu.test(sql)) return {
|
|
24
|
+
rows: (await client.$queryRawUnsafe(sql, ...params)).map(decodeRow),
|
|
25
|
+
changes: 0
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
rows: [],
|
|
29
|
+
changes: Number(await client.$executeRawUnsafe(sql, ...params))
|
|
30
|
+
};
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw withDatabaseCode(dialect, error);
|
|
33
|
+
}
|
|
34
|
+
} });
|
|
35
|
+
/** Taking the write lock first makes a SQLite transaction behave as BEGIN IMMEDIATE. */
|
|
36
|
+
const writeLock = (dialect) => `UPDATE ${quoteSql(dialect, SETTINGS_TABLE.name)} SET ${quoteSql(dialect, "_v")} = ${quoteSql(dialect, "_v")} WHERE 0 = 1`;
|
|
37
|
+
/**
|
|
38
|
+
* The SQL core's executor over a Prisma client, through raw queries and
|
|
39
|
+
* interactive transactions. A SQLite transaction takes the write lock with
|
|
40
|
+
* its first statement, as BEGIN IMMEDIATE would.
|
|
41
|
+
*/
|
|
42
|
+
const prismaExecutor = (client, dialect) => ({
|
|
43
|
+
dialect,
|
|
44
|
+
...over(dialect, client),
|
|
45
|
+
async transaction(fn) {
|
|
46
|
+
try {
|
|
47
|
+
return await client.$transaction(async (tx) => {
|
|
48
|
+
const connection = over(dialect, tx);
|
|
49
|
+
if (dialect === "sqlite") await connection.execute({
|
|
50
|
+
sql: writeLock(dialect),
|
|
51
|
+
params: []
|
|
52
|
+
});
|
|
53
|
+
return fn(connection);
|
|
54
|
+
}, {
|
|
55
|
+
maxWait: 1e4,
|
|
56
|
+
timeout: 3e4
|
|
57
|
+
});
|
|
58
|
+
} catch (error) {
|
|
59
|
+
throw withDatabaseCode(dialect, error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
//#endregion
|
|
64
|
+
export { prismaExecutor };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const require_types = require("../db/types.cjs");
|
|
2
|
+
//#region src/adapters/sqlProviders.ts
|
|
3
|
+
/** The provider an adapter was given, when Hot Updater's SQL core runs on it. */
|
|
4
|
+
const checkSqlProvider = (adapter, provider) => {
|
|
5
|
+
if (!require_types.sqlProviders.includes(provider)) throw new Error(`${adapter}: provider "${String(provider)}" is not supported. Use ${require_types.sqlProviders.map((name) => `"${name}"`).join(", ")}; CockroachDB and SQL Server were dropped in 1.0.`);
|
|
6
|
+
return provider;
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
exports.checkSqlProvider = checkSqlProvider;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { sqlProviders } from "../db/types.mjs";
|
|
2
|
+
//#region src/adapters/sqlProviders.ts
|
|
3
|
+
/** The provider an adapter was given, when Hot Updater's SQL core runs on it. */
|
|
4
|
+
const checkSqlProvider = (adapter, provider) => {
|
|
5
|
+
if (!sqlProviders.includes(provider)) throw new Error(`${adapter}: provider "${String(provider)}" is not supported. Use ${sqlProviders.map((name) => `"${name}"`).join(", ")}; CockroachDB and SQL Server were dropped in 1.0.`);
|
|
6
|
+
return provider;
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { checkSqlProvider };
|
package/dist/apiKeys.cjs
CHANGED
|
@@ -18,13 +18,13 @@ const isApiKey = (value) => {
|
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
const normalizeApiKeyHeaderName = (value = API_KEY_HEADER_NAME) => {
|
|
21
|
-
if (typeof value !== "string" || value.length === 0) throw new TypeError("
|
|
21
|
+
if (typeof value !== "string" || value.length === 0) throw new TypeError("apiKeys({ headerName }) must name a valid header.");
|
|
22
22
|
try {
|
|
23
23
|
const headers = new Headers();
|
|
24
24
|
headers.set(value, "");
|
|
25
25
|
return headers.keys().next().value;
|
|
26
26
|
} catch {
|
|
27
|
-
throw new TypeError("
|
|
27
|
+
throw new TypeError("apiKeys({ headerName }) must name a valid header.");
|
|
28
28
|
}
|
|
29
29
|
};
|
|
30
30
|
const hashApiKey = async (apiKey) => {
|
|
@@ -100,13 +100,11 @@ const authenticateApiKey = async (input) => {
|
|
|
100
100
|
const apiKey = input.request.headers.get(normalizeApiKeyHeaderName(input.headerName));
|
|
101
101
|
if (apiKey === null || !isApiKey(apiKey)) return false;
|
|
102
102
|
const hash = await hashApiKey(apiKey);
|
|
103
|
-
await input.beforeLookup?.();
|
|
104
103
|
const record = await input.apiKeys.findByHash(hash);
|
|
105
104
|
return record !== null && record.hash === hash && record.role === "client" && record.revoked_at_ms === null;
|
|
106
105
|
};
|
|
107
106
|
const createApiKeyManagement = (input) => Object.freeze({
|
|
108
107
|
async create({ name }) {
|
|
109
|
-
await input.beforeOperation();
|
|
110
108
|
const created = await createApiKey({
|
|
111
109
|
apiKeys: input.apiKeys,
|
|
112
110
|
name
|
|
@@ -117,11 +115,9 @@ const createApiKeyManagement = (input) => Object.freeze({
|
|
|
117
115
|
});
|
|
118
116
|
},
|
|
119
117
|
async list() {
|
|
120
|
-
await input.beforeOperation();
|
|
121
118
|
return Object.freeze((await input.apiKeys.list()).map(toApiKeyMetadata));
|
|
122
119
|
},
|
|
123
120
|
async revoke({ id }) {
|
|
124
|
-
await input.beforeOperation();
|
|
125
121
|
const record = await input.apiKeys.revoke({
|
|
126
122
|
id,
|
|
127
123
|
revokedAtMs: Date.now()
|
package/dist/apiKeys.d.cts
CHANGED
|
@@ -23,27 +23,5 @@ interface ApiKeyManagementAPI {
|
|
|
23
23
|
readonly id: string;
|
|
24
24
|
}): Promise<ApiKeyMetadata | null>;
|
|
25
25
|
}
|
|
26
|
-
declare const registerApiKey: (input: {
|
|
27
|
-
readonly apiKey: string;
|
|
28
|
-
readonly apiKeys: ApiKeyModel;
|
|
29
|
-
readonly createdAtMs?: number;
|
|
30
|
-
readonly name: string;
|
|
31
|
-
}) => Promise<CreatedApiKey>;
|
|
32
|
-
declare const createApiKey: (input: {
|
|
33
|
-
readonly apiKeys: ApiKeyModel;
|
|
34
|
-
readonly name: string;
|
|
35
|
-
}) => Promise<CreatedApiKey>;
|
|
36
|
-
/**
|
|
37
|
-
* Provisions the client API key used by managed init.
|
|
38
|
-
*
|
|
39
|
-
* A saved plaintext key is registered idempotently; otherwise a new key is
|
|
40
|
-
* created. Callers must persist or display the returned plaintext because the
|
|
41
|
-
* database stores only its hash.
|
|
42
|
-
*/
|
|
43
|
-
declare const provisionApiKey: (input: {
|
|
44
|
-
readonly apiKeys: ApiKeyModel;
|
|
45
|
-
readonly existingApiKey?: string;
|
|
46
|
-
readonly name: string;
|
|
47
|
-
}) => Promise<CreatedApiKey>;
|
|
48
26
|
//#endregion
|
|
49
|
-
export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey
|
|
27
|
+
export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey };
|
package/dist/apiKeys.d.mts
CHANGED
|
@@ -23,27 +23,5 @@ interface ApiKeyManagementAPI {
|
|
|
23
23
|
readonly id: string;
|
|
24
24
|
}): Promise<ApiKeyMetadata | null>;
|
|
25
25
|
}
|
|
26
|
-
declare const registerApiKey: (input: {
|
|
27
|
-
readonly apiKey: string;
|
|
28
|
-
readonly apiKeys: ApiKeyModel;
|
|
29
|
-
readonly createdAtMs?: number;
|
|
30
|
-
readonly name: string;
|
|
31
|
-
}) => Promise<CreatedApiKey>;
|
|
32
|
-
declare const createApiKey: (input: {
|
|
33
|
-
readonly apiKeys: ApiKeyModel;
|
|
34
|
-
readonly name: string;
|
|
35
|
-
}) => Promise<CreatedApiKey>;
|
|
36
|
-
/**
|
|
37
|
-
* Provisions the client API key used by managed init.
|
|
38
|
-
*
|
|
39
|
-
* A saved plaintext key is registered idempotently; otherwise a new key is
|
|
40
|
-
* created. Callers must persist or display the returned plaintext because the
|
|
41
|
-
* database stores only its hash.
|
|
42
|
-
*/
|
|
43
|
-
declare const provisionApiKey: (input: {
|
|
44
|
-
readonly apiKeys: ApiKeyModel;
|
|
45
|
-
readonly existingApiKey?: string;
|
|
46
|
-
readonly name: string;
|
|
47
|
-
}) => Promise<CreatedApiKey>;
|
|
48
26
|
//#endregion
|
|
49
|
-
export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey
|
|
27
|
+
export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey };
|
package/dist/apiKeys.mjs
CHANGED
|
@@ -18,13 +18,13 @@ const isApiKey = (value) => {
|
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
const normalizeApiKeyHeaderName = (value = API_KEY_HEADER_NAME) => {
|
|
21
|
-
if (typeof value !== "string" || value.length === 0) throw new TypeError("
|
|
21
|
+
if (typeof value !== "string" || value.length === 0) throw new TypeError("apiKeys({ headerName }) must name a valid header.");
|
|
22
22
|
try {
|
|
23
23
|
const headers = new Headers();
|
|
24
24
|
headers.set(value, "");
|
|
25
25
|
return headers.keys().next().value;
|
|
26
26
|
} catch {
|
|
27
|
-
throw new TypeError("
|
|
27
|
+
throw new TypeError("apiKeys({ headerName }) must name a valid header.");
|
|
28
28
|
}
|
|
29
29
|
};
|
|
30
30
|
const hashApiKey = async (apiKey) => {
|
|
@@ -100,13 +100,11 @@ const authenticateApiKey = async (input) => {
|
|
|
100
100
|
const apiKey = input.request.headers.get(normalizeApiKeyHeaderName(input.headerName));
|
|
101
101
|
if (apiKey === null || !isApiKey(apiKey)) return false;
|
|
102
102
|
const hash = await hashApiKey(apiKey);
|
|
103
|
-
await input.beforeLookup?.();
|
|
104
103
|
const record = await input.apiKeys.findByHash(hash);
|
|
105
104
|
return record !== null && record.hash === hash && record.role === "client" && record.revoked_at_ms === null;
|
|
106
105
|
};
|
|
107
106
|
const createApiKeyManagement = (input) => Object.freeze({
|
|
108
107
|
async create({ name }) {
|
|
109
|
-
await input.beforeOperation();
|
|
110
108
|
const created = await createApiKey({
|
|
111
109
|
apiKeys: input.apiKeys,
|
|
112
110
|
name
|
|
@@ -117,11 +115,9 @@ const createApiKeyManagement = (input) => Object.freeze({
|
|
|
117
115
|
});
|
|
118
116
|
},
|
|
119
117
|
async list() {
|
|
120
|
-
await input.beforeOperation();
|
|
121
118
|
return Object.freeze((await input.apiKeys.list()).map(toApiKeyMetadata));
|
|
122
119
|
},
|
|
123
120
|
async revoke({ id }) {
|
|
124
|
-
await input.beforeOperation();
|
|
125
121
|
const record = await input.apiKeys.revoke({
|
|
126
122
|
id,
|
|
127
123
|
revokedAtMs: Date.now()
|