@hot-updater/server 1.0.0-rc.1 → 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/_virtual/_rolldown/runtime.cjs +1 -1
- package/dist/adapters/drizzle.cjs +35 -69
- package/dist/adapters/drizzle.d.cts +13 -6
- package/dist/adapters/drizzle.d.mts +13 -6
- package/dist/adapters/drizzle.mjs +34 -69
- 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 -7
- package/dist/adapters/kysely.d.mts +10 -7
- package/dist/adapters/kysely.mjs +25 -31
- 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 -27
- package/dist/adapters/mongodb.d.cts +10 -5
- package/dist/adapters/mongodb.d.mts +10 -5
- package/dist/adapters/mongodb.mjs +28 -27
- 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 -220
- package/dist/adapters/prisma.d.cts +12 -8
- package/dist/adapters/prisma.d.mts +12 -8
- package/dist/adapters/prisma.mjs +38 -219
- 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 +8 -8
- package/dist/apiKeys.d.cts +1 -24
- package/dist/apiKeys.d.mts +1 -24
- package/dist/apiKeys.mjs +5 -9
- 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 +61 -63
- package/dist/createHotUpdaterCore.d.cts +53 -45
- package/dist/createHotUpdaterCore.d.mts +53 -45
- package/dist/createHotUpdaterCore.mjs +61 -63
- 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 +6 -6
- package/dist/db/createBundleDiff.d.cts +4 -7
- package/dist/db/createBundleDiff.d.mts +4 -7
- 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 -4
- package/dist/db/index.d.mts +10 -4
- package/dist/db/index.mjs +16 -8
- package/dist/db/releaseCatalog.cjs +20 -44
- package/dist/db/releaseCatalog.d.cts +2 -3
- package/dist/db/releaseCatalog.d.mts +2 -3
- 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 +3 -12
- package/dist/db/types.d.cts +26 -69
- package/dist/db/types.d.mts +26 -69
- package/dist/db/types.mjs +2 -11
- package/dist/db/updateArtifacts.cjs +38 -68
- package/dist/db/updateArtifacts.mjs +40 -69
- package/dist/handler.cjs +72 -43
- package/dist/handler.d.cts +3 -6
- package/dist/handler.d.mts +3 -6
- 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 -14
- package/dist/handlerReleaseCatalogRoutes.mjs +11 -13
- package/dist/handlerTypes.d.cts +2 -56
- package/dist/handlerTypes.d.mts +2 -56
- package/dist/handlerVersionRoutes.cjs +20 -4
- package/dist/handlerVersionRoutes.d.cts +1 -0
- package/dist/handlerVersionRoutes.d.mts +1 -0
- package/dist/handlerVersionRoutes.mjs +20 -4
- package/dist/index.cjs +4 -7
- package/dist/index.d.cts +10 -9
- package/dist/index.d.mts +10 -9
- package/dist/index.mjs +4 -4
- package/dist/insights/domain.d.cts +53 -70
- package/dist/insights/domain.d.mts +53 -70
- package/dist/insights/errors.cjs +35 -8
- package/dist/insights/errors.mjs +35 -8
- package/dist/insights/eventInput.cjs +64 -24
- package/dist/insights/eventInput.mjs +63 -25
- package/dist/insights/provider.cjs +356 -0
- package/dist/insights/provider.d.cts +6 -0
- package/dist/insights/provider.d.mts +6 -0
- package/dist/insights/provider.mjs +355 -0
- package/dist/insights/queryInput.cjs +78 -43
- package/dist/insights/queryInput.mjs +76 -40
- package/dist/insights/routes.cjs +94 -34
- package/dist/insights/routes.mjs +93 -35
- package/dist/insights/types.d.cts +27 -12
- package/dist/insights/types.d.mts +27 -12
- package/dist/node.d.cts +1 -2
- package/dist/node.d.mts +1 -2
- 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/storageAccess.cjs +0 -1
- package/dist/types/index.d.cts +2 -29
- package/dist/types/index.d.mts +2 -29
- package/package.json +30 -7
- 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 +277 -208
- package/src/adapters/drizzle.ts +48 -128
- 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 +212 -117
- package/src/adapters/kysely.ts +32 -87
- package/src/adapters/kyselyExecutor.ts +53 -0
- package/src/adapters/mongodb.integration.spec.ts +180 -0
- package/src/adapters/mongodb.readBudgets.integration.spec.ts +61 -0
- package/src/adapters/mongodb.ts +36 -65
- 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 +226 -173
- package/src/adapters/prisma.ts +60 -451
- 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 -167
- 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 -824
- 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 -165
- 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 -412
- 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 +7 -14
- package/src/insights/domain.ts +56 -77
- package/src/insights/errors.spec.ts +48 -0
- package/src/insights/errors.ts +50 -6
- package/src/insights/eventInput.ts +80 -27
- package/src/insights/insights.integration.spec.ts +525 -44
- package/src/insights/provider.spec.ts +574 -0
- package/src/insights/provider.ts +667 -0
- package/src/insights/queryInput.ts +113 -73
- package/src/insights/routes.ts +125 -69
- package/src/insights/types.ts +47 -36
- 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 -23
- package/dist/adapters/databaseConstraintErrors.mjs +0 -21
- package/dist/adapters/databasePluginUtils.cjs +0 -117
- package/dist/adapters/databasePluginUtils.mjs +0 -106
- package/dist/adapters/drizzleCrud.cjs +0 -250
- package/dist/adapters/drizzleCrud.mjs +0 -249
- package/dist/adapters/drizzleLazyDB.cjs +0 -101
- package/dist/adapters/drizzleLazyDB.mjs +0 -101
- package/dist/adapters/drizzleQuery.cjs +0 -68
- package/dist/adapters/drizzleQuery.mjs +0 -67
- package/dist/adapters/kyselyCrud.cjs +0 -254
- package/dist/adapters/kyselyCrud.mjs +0 -253
- package/dist/adapters/kyselyQuery.cjs +0 -56
- package/dist/adapters/kyselyQuery.mjs +0 -55
- package/dist/adapters/mongodbCollections.cjs +0 -36
- package/dist/adapters/mongodbCollections.mjs +0 -30
- package/dist/adapters/mongodbQuery.cjs +0 -77
- package/dist/adapters/mongodbQuery.mjs +0 -70
- package/dist/adapters/mongodbReads.cjs +0 -148
- package/dist/adapters/mongodbReads.mjs +0 -147
- package/dist/adapters/mongodbWrites.cjs +0 -134
- package/dist/adapters/mongodbWrites.mjs +0 -133
- package/dist/adapters/prismaQuery.cjs +0 -58
- package/dist/adapters/prismaQuery.mjs +0 -56
- package/dist/adapters/prismaRows.cjs +0 -198
- package/dist/adapters/prismaRows.mjs +0 -188
- package/dist/db/databasePluginCore.cjs +0 -138
- 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 -319
- package/dist/db/fixedMigratorMongo.mjs +0 -319
- package/dist/db/mongoMigrationExecution.cjs +0 -11
- package/dist/db/mongoMigrationExecution.mjs +0 -11
- 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 -101
- 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 -256
- package/dist/db/schemaGenerators.mjs +0 -254
- package/dist/db/schemaReadiness.cjs +0 -24
- package/dist/db/schemaReadiness.d.cts +0 -8
- package/dist/db/schemaReadiness.d.mts +0 -8
- package/dist/db/schemaReadiness.mjs +0 -23
- package/dist/db/sqlMigrationExecution.cjs +0 -67
- package/dist/db/sqlMigrationExecution.mjs +0 -66
- package/dist/handlerBundleRoutes.cjs +0 -155
- package/dist/handlerBundleRoutes.mjs +0 -155
- package/dist/handlerReleaseManagementRoutes.cjs +0 -125
- package/dist/handlerReleaseManagementRoutes.mjs +0 -124
- package/dist/insights/bounded/activeOverview.cjs +0 -87
- package/dist/insights/bounded/activeOverview.mjs +0 -85
- package/dist/insights/bounded/installationSearch.cjs +0 -42
- package/dist/insights/bounded/installationSearch.mjs +0 -42
- package/dist/insights/bounded/persistence.cjs +0 -39
- package/dist/insights/bounded/persistence.mjs +0 -38
- package/dist/insights/bounded/provider.cjs +0 -170
- package/dist/insights/bounded/provider.d.cts +0 -7
- package/dist/insights/bounded/provider.d.mts +0 -7
- package/dist/insights/bounded/provider.mjs +0 -170
- package/dist/insights/bounded/scan.cjs +0 -144
- package/dist/insights/bounded/scan.mjs +0 -138
- package/dist/insights/persistence.d.cts +0 -6
- package/dist/insights/persistence.d.mts +0 -6
- package/dist/schema/dsl.cjs +0 -103
- package/dist/schema/dsl.mjs +0 -87
- package/dist/schema/index.cjs +0 -6
- 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 -364
- package/dist/schema/v1_0_0.mjs +0 -357
- package/src/adapters/databaseConstraintErrors.ts +0 -25
- package/src/adapters/databasePluginTestDatabase.ts +0 -106
- package/src/adapters/databasePluginUtils.spec.ts +0 -29
- package/src/adapters/databasePluginUtils.ts +0 -214
- package/src/adapters/drizzleCrud.ts +0 -419
- package/src/adapters/drizzleLazyDB.ts +0 -257
- package/src/adapters/drizzleQuery.ts +0 -164
- package/src/adapters/kyselyCrud.ts +0 -588
- package/src/adapters/kyselyQuery.ts +0 -128
- package/src/adapters/mongodb.spec.ts +0 -141
- package/src/adapters/mongodbCollections.ts +0 -62
- package/src/adapters/mongodbQuery.ts +0 -226
- package/src/adapters/mongodbReads.ts +0 -311
- package/src/adapters/mongodbRows.spec.ts +0 -64
- package/src/adapters/mongodbRows.ts +0 -118
- package/src/adapters/mongodbTestClient.ts +0 -342
- package/src/adapters/mongodbTestFilter.ts +0 -166
- package/src/adapters/mongodbWrites.ts +0 -260
- package/src/adapters/prismaQuery.ts +0 -129
- package/src/adapters/prismaRows.spec.ts +0 -98
- package/src/adapters/prismaRows.ts +0 -301
- package/src/adapters/prismaTestClient.ts +0 -396
- 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 -107
- package/src/db/fixedMigrator.spec.ts +0 -231
- package/src/db/fixedMigrator.ts +0 -147
- package/src/db/fixedMigratorMongo.spec.ts +0 -192
- 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/mongodb.ts +0 -40
- package/src/db/schema/registry.ts +0 -55
- package/src/db/schema/sql.ts +0 -241
- package/src/db/schema/sqlOperations.ts +0 -63
- package/src/db/schema/types.ts +0 -1
- package/src/db/schemaGenerators.ts +0 -466
- 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 -55
- package/src/handlerBundleRoutes.ts +0 -259
- package/src/handlerReleaseManagementRoutes.ts +0 -213
- package/src/insights/bounded/activeOverview.spec.ts +0 -189
- package/src/insights/bounded/activeOverview.ts +0 -148
- package/src/insights/bounded/installationSearch.spec.ts +0 -130
- package/src/insights/bounded/installationSearch.ts +0 -69
- package/src/insights/bounded/persistence.ts +0 -43
- package/src/insights/bounded/provider.spec.ts +0 -219
- package/src/insights/bounded/provider.ts +0 -229
- package/src/insights/bounded/scan.ts +0 -235
- package/src/insights/persistence.ts +0 -10
- 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 -146
- package/src/schema/v1_0_0.ts +0 -465
package/dist/adapters/prisma.mjs
CHANGED
|
@@ -1,227 +1,46 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { DatabasePluginInputError, createDatabasePlugin } from "@hot-updater/plugin-core";
|
|
8
|
-
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";
|
|
9
7
|
//#region src/adapters/prisma.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
where: createPrismaWhere(input.where, provider),
|
|
31
|
-
...orderBy ? { orderBy } : {},
|
|
32
|
-
skip: input.offset,
|
|
33
|
-
take: input.limit
|
|
34
|
-
});
|
|
35
|
-
switch (input.model) {
|
|
36
|
-
case "bundles": return parsePrismaRows(rows, parsePrismaBundleRow);
|
|
37
|
-
case "bundle_patches": return parsePrismaRows(rows, parsePrismaPatchRow);
|
|
38
|
-
case "bundle_events": return parsePrismaRows(rows, parsePrismaBundleEventRow);
|
|
39
|
-
case "channels": return parsePrismaRows(rows, parsePrismaChannelRow);
|
|
40
|
-
case "api_keys": return parsePrismaRows(rows, parsePrismaApiKeyRow);
|
|
41
|
-
case "releases": return parsePrismaRows(rows, parsePrismaReleaseRow);
|
|
42
|
-
case "release_catalogs": return parsePrismaRows(rows, parsePrismaReleaseCatalogRow);
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
const assertPatchReferences = async (client, bundleId, baseBundleId) => {
|
|
46
|
-
const ids = Array.from(new Set([bundleId, baseBundleId]));
|
|
47
|
-
if (await getPrismaDelegate(client, "bundles").count({ where: { id: { in: ids } } }) !== ids.length) throw new PrismaAdapterError("patch references a missing bundle");
|
|
48
|
-
};
|
|
49
|
-
const createCrudImplementation = (client, provider, relationMode) => ({
|
|
50
|
-
deleteChannel: async ({ id }) => {
|
|
51
|
-
const channels = getPrismaDelegate(client, "channels");
|
|
52
|
-
if (await channels.findFirst({ where: { id } }) === null) return {
|
|
53
|
-
deleted: false,
|
|
54
|
-
reason: "not_found"
|
|
55
|
-
};
|
|
56
|
-
if (await getPrismaDelegate(client, "releases").count({ where: { channel_id: id } }) > 0) return {
|
|
57
|
-
deleted: false,
|
|
58
|
-
reason: "not_empty"
|
|
59
|
-
};
|
|
60
|
-
try {
|
|
61
|
-
await channels.deleteMany({ where: { id } });
|
|
62
|
-
} catch (error) {
|
|
63
|
-
if (isChannelDeleteReferencedError(error)) return {
|
|
64
|
-
deleted: false,
|
|
65
|
-
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"
|
|
66
28
|
};
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
where: { name: input.row.name },
|
|
80
|
-
create: input.row,
|
|
81
|
-
update: {}
|
|
82
|
-
}));
|
|
83
|
-
return {
|
|
84
|
-
row,
|
|
85
|
-
inserted: row.id === input.row.id
|
|
86
|
-
};
|
|
87
|
-
},
|
|
88
|
-
create: async (input) => {
|
|
89
|
-
if (input.model === "bundle_patches") await assertPatchReferences(client, input.data.bundle_id, input.data.base_bundle_id);
|
|
90
|
-
const delegate = getPrismaDelegate(client, input.model);
|
|
91
|
-
let row;
|
|
92
|
-
if (input.onConflict === "ignore") {
|
|
93
|
-
const where = input.model === "channels" ? { name: input.data.name } : { hash: input.data.hash };
|
|
94
|
-
row = await delegate.upsert({
|
|
95
|
-
where,
|
|
96
|
-
create: input.data,
|
|
97
|
-
update: {}
|
|
98
|
-
});
|
|
99
|
-
} else row = await delegate.create({ data: input.data });
|
|
100
|
-
switch (input.model) {
|
|
101
|
-
case "bundles": return parsePrismaBundleRow(row);
|
|
102
|
-
case "bundle_patches": return parsePrismaPatchRow(row);
|
|
103
|
-
case "bundle_events": return parsePrismaBundleEventRow(row);
|
|
104
|
-
case "channels": return parsePrismaChannelRow(row);
|
|
105
|
-
case "api_keys": return parsePrismaApiKeyRow(row);
|
|
106
|
-
case "releases": return parsePrismaReleaseRow(row);
|
|
107
|
-
case "release_catalogs": return parsePrismaReleaseCatalogRow(row);
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
update: async (input) => {
|
|
111
|
-
const id = input.where[0]?.value;
|
|
112
|
-
if (typeof id !== "string") throw new PrismaAdapterError(`${input.model} update requires a string id`);
|
|
113
|
-
if (input.model === "api_keys") {
|
|
114
|
-
const delegate = getPrismaDelegate(client, "api_keys");
|
|
115
|
-
if (await delegate.findFirst({ where: { id } }) === null) return null;
|
|
116
|
-
await delegate.update({
|
|
117
|
-
where: { id },
|
|
118
|
-
data: input.update
|
|
119
|
-
});
|
|
120
|
-
const stored = await delegate.findFirst({ where: { id } });
|
|
121
|
-
return stored === null ? null : parsePrismaApiKeyRow(stored);
|
|
122
|
-
}
|
|
123
|
-
if (input.model === "releases") {
|
|
124
|
-
const delegate = getPrismaDelegate(client, "releases");
|
|
125
|
-
if (await delegate.findFirst({ where: { id } }) === null) return null;
|
|
126
|
-
await delegate.update({
|
|
127
|
-
where: { id },
|
|
128
|
-
data: input.update
|
|
129
|
-
});
|
|
130
|
-
const stored = await delegate.findFirst({ where: { id } });
|
|
131
|
-
return stored === null ? null : parsePrismaReleaseRow(stored);
|
|
132
|
-
}
|
|
133
|
-
if (input.model === "release_catalogs") {
|
|
134
|
-
const delegate = getPrismaDelegate(client, "release_catalogs");
|
|
135
|
-
if (await delegate.findFirst({ where: { scope_key: id } }) === null) return null;
|
|
136
|
-
await delegate.update({
|
|
137
|
-
where: { scope_key: id },
|
|
138
|
-
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
|
+
} }
|
|
139
41
|
});
|
|
140
|
-
const stored = await delegate.findFirst({ where: { scope_key: id } });
|
|
141
|
-
return stored === null ? null : parsePrismaReleaseCatalogRow(stored);
|
|
142
|
-
}
|
|
143
|
-
const delegate = getPrismaDelegate(client, "bundles");
|
|
144
|
-
if (delegate.updateMany === void 0) throw new PrismaAdapterError("model delegate \"bundles\" requires updateMany");
|
|
145
|
-
if (await delegate.findFirst({ where: { id } }) === null) return null;
|
|
146
|
-
await delegate.updateMany({
|
|
147
|
-
where: { id },
|
|
148
|
-
data: input.update
|
|
149
|
-
});
|
|
150
|
-
const stored = await delegate.findFirst({ where: { id } });
|
|
151
|
-
if (stored === null) return null;
|
|
152
|
-
return parsePrismaBundleRow(stored);
|
|
153
|
-
},
|
|
154
|
-
delete: async (input) => {
|
|
155
|
-
if (input.model === "bundles" && relationMode === "prisma") {
|
|
156
|
-
const ids = parsePrismaRows(await getPrismaDelegate(client, "bundles").findMany({ where: createPrismaWhere(input.where, provider) }), parsePrismaBundleRow).map(({ id }) => id);
|
|
157
|
-
if (ids.length === 0) return;
|
|
158
|
-
await getPrismaDelegate(client, "bundle_patches").deleteMany({ where: { OR: [{ bundle_id: { in: ids } }, { base_bundle_id: { in: ids } }] } });
|
|
159
|
-
}
|
|
160
|
-
try {
|
|
161
|
-
await getPrismaDelegate(client, input.model).deleteMany({ where: createPrismaWhere(input.where, provider) });
|
|
162
|
-
} catch (error) {
|
|
163
|
-
if (input.model === "channels") translateChannelDeleteError(error);
|
|
164
|
-
throw error;
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
count: async (input) => {
|
|
168
|
-
if (input.distinct !== void 0) throw new DatabasePluginInputError("invalid-operation");
|
|
169
|
-
return getPrismaDelegate(client, input.model).count({ where: createPrismaWhere(input.where, provider) });
|
|
170
|
-
},
|
|
171
|
-
findOne: async (input) => {
|
|
172
|
-
const row = await getPrismaDelegate(client, input.model).findFirst({ where: createPrismaWhere(input.where, provider) });
|
|
173
|
-
if (row === null) return null;
|
|
174
|
-
switch (input.model) {
|
|
175
|
-
case "bundles": return parsePrismaBundleRow(row);
|
|
176
|
-
case "bundle_patches": return parsePrismaPatchRow(row);
|
|
177
|
-
case "channels": return parsePrismaChannelRow(row);
|
|
178
|
-
case "api_keys": return parsePrismaApiKeyRow(row);
|
|
179
|
-
case "releases": return parsePrismaReleaseRow(row);
|
|
180
|
-
case "release_catalogs": return parsePrismaReleaseCatalogRow(row);
|
|
181
42
|
}
|
|
182
|
-
},
|
|
183
|
-
findMany: (input) => findMany(client, input, provider)
|
|
184
|
-
});
|
|
185
|
-
const createPrismaImplementation = (client, relationMode, provider) => {
|
|
186
|
-
const crud = createCrudImplementation(client, provider, relationMode);
|
|
187
|
-
const implementation = {
|
|
188
|
-
...crud,
|
|
189
|
-
deleteChannel: (input) => {
|
|
190
|
-
if (!hasCallbackTransaction(client)) throw new PrismaAdapterError("channel deletion requires callback transactions");
|
|
191
|
-
return runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).deleteChannel(input));
|
|
192
|
-
},
|
|
193
|
-
delete: (input) => {
|
|
194
|
-
if (input.model !== "bundles" || relationMode === "foreign-keys") return crud.delete(input);
|
|
195
|
-
if (!hasCallbackTransaction(client)) throw new PrismaAdapterError("relation mode \"prisma\" requires callback transactions");
|
|
196
|
-
return runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).delete(input));
|
|
197
|
-
}
|
|
198
|
-
};
|
|
199
|
-
if (relationMode === "prisma" && !hasCallbackTransaction(client)) throw new PrismaAdapterError("relation mode \"prisma\" requires callback transactions");
|
|
200
|
-
if (!hasCallbackTransaction(client)) return implementation;
|
|
201
|
-
if (relationMode === "prisma") implementation.create = (input) => runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).create(input));
|
|
202
|
-
implementation.update = (input) => runPrismaTransaction(client, relationMode === "prisma" ? "serializable" : "default", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).update(input));
|
|
203
|
-
return {
|
|
204
|
-
...implementation,
|
|
205
|
-
transaction: (callback) => runPrismaTransaction(client, "serializable", async (transactionClient) => {
|
|
206
|
-
return callback(createCrudImplementation(transactionClient, provider, relationMode));
|
|
207
|
-
})
|
|
208
43
|
};
|
|
209
44
|
};
|
|
210
|
-
const prismaAdapter = (config) => {
|
|
211
|
-
assertPrismaProvider(config.provider);
|
|
212
|
-
const adapter = createDatabasePluginAdapter("prisma", createPrismaImplementation(config.prisma, config.relationMode ?? "foreign-keys", config.provider));
|
|
213
|
-
return Object.assign(createDatabasePlugin({
|
|
214
|
-
name: "prisma",
|
|
215
|
-
models: adapter.models,
|
|
216
|
-
commit: adapter.commit
|
|
217
|
-
}), {
|
|
218
|
-
adapterName: "prisma",
|
|
219
|
-
provider: config.provider,
|
|
220
|
-
generateSchema: ((version) => ({
|
|
221
|
-
code: generatePrismaSchema(config.provider, version === "latest" ? hotUpdaterSchema : getHotUpdaterSchemaVersion(version)),
|
|
222
|
-
path: "./prisma/schema/hot_updater.prisma"
|
|
223
|
-
}))
|
|
224
|
-
});
|
|
225
|
-
};
|
|
226
45
|
//#endregion
|
|
227
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) => {
|
|
@@ -33,7 +33,7 @@ const hashApiKey = async (apiKey) => {
|
|
|
33
33
|
return bytesToBase64Url(new Uint8Array(digest));
|
|
34
34
|
};
|
|
35
35
|
const apiKeyId = () => {
|
|
36
|
-
const bytes = new Uint8Array(16);
|
|
36
|
+
const bytes = /* @__PURE__ */ new Uint8Array(16);
|
|
37
37
|
crypto.getRandomValues(bytes);
|
|
38
38
|
return `api-${bytesToBase64Url(bytes)}`;
|
|
39
39
|
};
|
|
@@ -70,7 +70,7 @@ const registerApiKey = async (input) => {
|
|
|
70
70
|
});
|
|
71
71
|
};
|
|
72
72
|
const createApiKey = (input) => {
|
|
73
|
-
const bytes = new Uint8Array(32);
|
|
73
|
+
const bytes = /* @__PURE__ */ new Uint8Array(32);
|
|
74
74
|
crypto.getRandomValues(bytes);
|
|
75
75
|
return registerApiKey({
|
|
76
76
|
apiKey: bytesToBase64Url(bytes),
|
|
@@ -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()
|
|
@@ -131,9 +127,13 @@ const createApiKeyManagement = (input) => Object.freeze({
|
|
|
131
127
|
});
|
|
132
128
|
//#endregion
|
|
133
129
|
exports.API_KEY_HEADER_NAME = API_KEY_HEADER_NAME;
|
|
130
|
+
exports.apiKeyId = apiKeyId;
|
|
134
131
|
exports.authenticateApiKey = authenticateApiKey;
|
|
135
132
|
exports.createApiKey = createApiKey;
|
|
136
133
|
exports.createApiKeyManagement = createApiKeyManagement;
|
|
134
|
+
exports.hashApiKey = hashApiKey;
|
|
135
|
+
exports.isApiKey = isApiKey;
|
|
137
136
|
exports.normalizeApiKeyHeaderName = normalizeApiKeyHeaderName;
|
|
137
|
+
exports.normalizeApiKeyName = normalizeApiKeyName;
|
|
138
138
|
exports.provisionApiKey = provisionApiKey;
|
|
139
139
|
exports.registerApiKey = registerApiKey;
|
package/dist/apiKeys.d.cts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ApiKeyModel, ApiKeyRow } from "@hot-updater/plugin-core";
|
|
2
|
-
|
|
3
2
|
//#region src/apiKeys.d.ts
|
|
4
3
|
declare const API_KEY_HEADER_NAME = "x-api-key";
|
|
5
4
|
type ApiKeyMetadata = Omit<ApiKeyRow, "hash">;
|
|
@@ -24,27 +23,5 @@ interface ApiKeyManagementAPI {
|
|
|
24
23
|
readonly id: string;
|
|
25
24
|
}): Promise<ApiKeyMetadata | null>;
|
|
26
25
|
}
|
|
27
|
-
declare const registerApiKey: (input: {
|
|
28
|
-
readonly apiKey: string;
|
|
29
|
-
readonly apiKeys: ApiKeyModel;
|
|
30
|
-
readonly createdAtMs?: number;
|
|
31
|
-
readonly name: string;
|
|
32
|
-
}) => Promise<CreatedApiKey>;
|
|
33
|
-
declare const createApiKey: (input: {
|
|
34
|
-
readonly apiKeys: ApiKeyModel;
|
|
35
|
-
readonly name: string;
|
|
36
|
-
}) => Promise<CreatedApiKey>;
|
|
37
|
-
/**
|
|
38
|
-
* Provisions the client API key used by managed init.
|
|
39
|
-
*
|
|
40
|
-
* A saved plaintext key is registered idempotently; otherwise a new key is
|
|
41
|
-
* created. Callers must persist or display the returned plaintext because the
|
|
42
|
-
* database stores only its hash.
|
|
43
|
-
*/
|
|
44
|
-
declare const provisionApiKey: (input: {
|
|
45
|
-
readonly apiKeys: ApiKeyModel;
|
|
46
|
-
readonly existingApiKey?: string;
|
|
47
|
-
readonly name: string;
|
|
48
|
-
}) => Promise<CreatedApiKey>;
|
|
49
26
|
//#endregion
|
|
50
|
-
export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey
|
|
27
|
+
export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey };
|
package/dist/apiKeys.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ApiKeyModel, ApiKeyRow } from "@hot-updater/plugin-core";
|
|
2
|
-
|
|
3
2
|
//#region src/apiKeys.d.ts
|
|
4
3
|
declare const API_KEY_HEADER_NAME = "x-api-key";
|
|
5
4
|
type ApiKeyMetadata = Omit<ApiKeyRow, "hash">;
|
|
@@ -24,27 +23,5 @@ interface ApiKeyManagementAPI {
|
|
|
24
23
|
readonly id: string;
|
|
25
24
|
}): Promise<ApiKeyMetadata | null>;
|
|
26
25
|
}
|
|
27
|
-
declare const registerApiKey: (input: {
|
|
28
|
-
readonly apiKey: string;
|
|
29
|
-
readonly apiKeys: ApiKeyModel;
|
|
30
|
-
readonly createdAtMs?: number;
|
|
31
|
-
readonly name: string;
|
|
32
|
-
}) => Promise<CreatedApiKey>;
|
|
33
|
-
declare const createApiKey: (input: {
|
|
34
|
-
readonly apiKeys: ApiKeyModel;
|
|
35
|
-
readonly name: string;
|
|
36
|
-
}) => Promise<CreatedApiKey>;
|
|
37
|
-
/**
|
|
38
|
-
* Provisions the client API key used by managed init.
|
|
39
|
-
*
|
|
40
|
-
* A saved plaintext key is registered idempotently; otherwise a new key is
|
|
41
|
-
* created. Callers must persist or display the returned plaintext because the
|
|
42
|
-
* database stores only its hash.
|
|
43
|
-
*/
|
|
44
|
-
declare const provisionApiKey: (input: {
|
|
45
|
-
readonly apiKeys: ApiKeyModel;
|
|
46
|
-
readonly existingApiKey?: string;
|
|
47
|
-
readonly name: string;
|
|
48
|
-
}) => Promise<CreatedApiKey>;
|
|
49
26
|
//#endregion
|
|
50
|
-
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) => {
|
|
@@ -33,7 +33,7 @@ const hashApiKey = async (apiKey) => {
|
|
|
33
33
|
return bytesToBase64Url(new Uint8Array(digest));
|
|
34
34
|
};
|
|
35
35
|
const apiKeyId = () => {
|
|
36
|
-
const bytes = new Uint8Array(16);
|
|
36
|
+
const bytes = /* @__PURE__ */ new Uint8Array(16);
|
|
37
37
|
crypto.getRandomValues(bytes);
|
|
38
38
|
return `api-${bytesToBase64Url(bytes)}`;
|
|
39
39
|
};
|
|
@@ -70,7 +70,7 @@ const registerApiKey = async (input) => {
|
|
|
70
70
|
});
|
|
71
71
|
};
|
|
72
72
|
const createApiKey = (input) => {
|
|
73
|
-
const bytes = new Uint8Array(32);
|
|
73
|
+
const bytes = /* @__PURE__ */ new Uint8Array(32);
|
|
74
74
|
crypto.getRandomValues(bytes);
|
|
75
75
|
return registerApiKey({
|
|
76
76
|
apiKey: bytesToBase64Url(bytes),
|
|
@@ -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()
|
|
@@ -130,4 +126,4 @@ const createApiKeyManagement = (input) => Object.freeze({
|
|
|
130
126
|
}
|
|
131
127
|
});
|
|
132
128
|
//#endregion
|
|
133
|
-
export { API_KEY_HEADER_NAME, authenticateApiKey, createApiKey, createApiKeyManagement, normalizeApiKeyHeaderName, provisionApiKey, registerApiKey };
|
|
129
|
+
export { API_KEY_HEADER_NAME, apiKeyId, authenticateApiKey, createApiKey, createApiKeyManagement, hashApiKey, isApiKey, normalizeApiKeyHeaderName, normalizeApiKeyName, provisionApiKey, registerApiKey };
|