@hot-updater/server 1.0.0-rc.18 → 1.0.0-rc.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +12 -14
- package/dist/adapters/drizzle.cjs +6 -8
- package/dist/adapters/drizzle.d.cts +2 -2
- package/dist/adapters/drizzle.d.mts +2 -2
- package/dist/adapters/drizzle.mjs +1 -3
- package/dist/adapters/drizzleExecutor.d.cts +1 -1
- package/dist/adapters/drizzleExecutor.d.mts +1 -1
- package/dist/adapters/kysely.cjs +4 -6
- package/dist/adapters/kysely.d.cts +3 -3
- package/dist/adapters/kysely.d.mts +3 -3
- package/dist/adapters/kysely.mjs +1 -3
- package/dist/adapters/kyselyExecutor.d.cts +1 -2
- package/dist/adapters/kyselyExecutor.d.mts +1 -2
- package/dist/adapters/mongodb.cjs +10 -21
- package/dist/adapters/mongodb.d.cts +1 -1
- package/dist/adapters/mongodb.d.mts +1 -1
- package/dist/adapters/mongodb.mjs +9 -20
- package/dist/adapters/mongodbAdapter.cjs +11 -11
- package/dist/adapters/mongodbAdapter.d.cts +1 -1
- package/dist/adapters/mongodbAdapter.d.mts +1 -1
- package/dist/adapters/mongodbAdapter.mjs +1 -1
- package/dist/adapters/prisma.cjs +7 -9
- package/dist/adapters/prisma.d.cts +1 -1
- package/dist/adapters/prisma.d.mts +1 -1
- package/dist/adapters/prisma.mjs +1 -3
- package/dist/adapters/prismaExecutor.cjs +2 -3
- package/dist/adapters/prismaExecutor.mjs +1 -2
- package/dist/adapters/sqlProviders.cjs +7 -2
- package/dist/adapters/sqlProviders.mjs +6 -1
- package/dist/assembly/assemblePlugins.cjs +26 -48
- package/dist/assembly/assemblePlugins.d.cts +2 -5
- package/dist/assembly/assemblePlugins.d.mts +2 -5
- package/dist/assembly/assemblePlugins.mjs +19 -45
- package/dist/assembly/clientPlugins.cjs +6 -4
- package/dist/assembly/clientPlugins.mjs +2 -0
- package/dist/assembly/configError.d.cts +1 -6
- package/dist/assembly/configError.d.mts +1 -6
- package/dist/assembly/configError.mjs +1 -6
- package/dist/core/api.cjs +0 -40
- package/dist/core/api.d.cts +5 -16
- package/dist/core/api.d.mts +5 -16
- package/dist/core/api.mjs +1 -37
- package/dist/core/baseCandidates.cjs +0 -43
- package/dist/core/baseCandidates.mjs +2 -43
- package/dist/core/operations.cjs +13 -12
- package/dist/core/operations.mjs +6 -5
- package/dist/core/reads.cjs +4 -4
- package/dist/core/reads.d.cts +2 -41
- package/dist/core/reads.d.mts +2 -41
- package/dist/core/reads.mjs +3 -3
- package/dist/core/releases.cjs +6 -6
- package/dist/core/releases.mjs +1 -1
- package/dist/core/writes.cjs +2 -2
- package/dist/core/writes.mjs +1 -1
- package/dist/createHotUpdaterCore.cjs +39 -39
- package/dist/createHotUpdaterCore.d.cts +61 -8
- package/dist/createHotUpdaterCore.d.mts +61 -8
- package/dist/createHotUpdaterCore.mjs +35 -32
- package/dist/db/engineDrizzleSchema.cjs +3 -4
- package/dist/db/engineDrizzleSchema.mjs +1 -2
- package/dist/db/enginePrismaSchema.cjs +4 -5
- package/dist/db/enginePrismaSchema.d.cts +1 -1
- package/dist/db/enginePrismaSchema.d.mts +1 -1
- package/dist/db/enginePrismaSchema.mjs +1 -2
- package/dist/db/releaseCatalog.cjs +6 -6
- package/dist/db/releaseCatalog.mjs +1 -1
- package/dist/db/updateArtifacts.cjs +6 -6
- package/dist/db/updateArtifacts.mjs +1 -1
- package/dist/handler.cjs +3 -4
- package/dist/handler.mjs +1 -1
- package/dist/handlerAdminRoutes.cjs +1 -2
- package/dist/handlerAdminRoutes.mjs +1 -2
- package/dist/handlerVersionRoutes.cjs +2 -2
- package/dist/handlerVersionRoutes.mjs +2 -2
- package/dist/index.cjs +9 -2
- package/dist/index.d.cts +4 -3
- package/dist/index.d.mts +4 -3
- package/dist/index.mjs +2 -1
- package/dist/node.cjs +3 -6
- package/dist/node.d.cts +3 -3
- package/dist/node.d.mts +3 -3
- package/dist/node.mjs +4 -4
- package/dist/package.cjs +1 -1
- package/dist/package.mjs +1 -1
- package/dist/plugins/api-keys/index.cjs +8 -52
- package/dist/plugins/api-keys/index.d.cts +1 -84
- package/dist/plugins/api-keys/index.d.mts +1 -84
- package/dist/plugins/api-keys/index.mjs +2 -49
- package/dist/plugins/definePlugin.d.cts +2 -200
- package/dist/plugins/definePlugin.d.mts +2 -200
- package/dist/plugins/insights/index.cjs +7 -126
- package/dist/plugins/insights/index.d.cts +1 -398
- package/dist/plugins/insights/index.d.mts +1 -398
- package/dist/plugins/insights/index.mjs +2 -121
- package/dist/plugins/official.cjs +30 -0
- package/dist/plugins/official.mjs +29 -0
- package/dist/storageAccess.cjs +13 -10
- package/dist/storageAccess.mjs +13 -10
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.mts +1 -1
- package/package.json +15 -37
- package/dist/_virtual/_rolldown/runtime.cjs +0 -23
- package/dist/assembly/clientPlugins.d.cts +0 -16
- package/dist/assembly/clientPlugins.d.mts +0 -16
- package/dist/assembly/configError.cjs +0 -7
- package/dist/assembly/databasePlugins.cjs +0 -27
- package/dist/assembly/databasePlugins.d.cts +0 -43
- package/dist/assembly/databasePlugins.d.mts +0 -43
- package/dist/assembly/databasePlugins.mjs +0 -26
- package/dist/assembly/pluginCli.cjs +0 -125
- package/dist/assembly/pluginCli.d.cts +0 -59
- package/dist/assembly/pluginCli.d.mts +0 -59
- package/dist/assembly/pluginCli.mjs +0 -121
- package/dist/core/baseCandidates.d.cts +0 -17
- package/dist/core/baseCandidates.d.mts +0 -17
- package/dist/core/schema.cjs +0 -279
- package/dist/core/schema.d.cts +0 -307
- package/dist/core/schema.d.mts +0 -307
- package/dist/core/schema.mjs +0 -277
- package/dist/database/aggregateBatching.cjs +0 -626
- package/dist/database/aggregateBatching.d.cts +0 -10
- package/dist/database/aggregateBatching.d.mts +0 -10
- package/dist/database/aggregateBatching.mjs +0 -625
- package/dist/database/busy.cjs +0 -36
- package/dist/database/busy.d.cts +0 -12
- package/dist/database/busy.d.mts +0 -12
- package/dist/database/busy.mjs +0 -36
- package/dist/database/cursor.cjs +0 -44
- package/dist/database/cursor.d.cts +0 -7
- package/dist/database/cursor.d.mts +0 -7
- package/dist/database/cursor.mjs +0 -40
- package/dist/database/database.cjs +0 -63
- package/dist/database/database.d.cts +0 -136
- package/dist/database/database.d.mts +0 -136
- package/dist/database/database.mjs +0 -63
- package/dist/database/definitions.d.cts +0 -78
- package/dist/database/definitions.d.mts +0 -78
- package/dist/database/engine.cjs +0 -37
- package/dist/database/engine.d.cts +0 -41
- package/dist/database/engine.d.mts +0 -41
- package/dist/database/engine.mjs +0 -37
- package/dist/database/engineAggregates.cjs +0 -118
- package/dist/database/engineAggregates.mjs +0 -115
- package/dist/database/engineReads.cjs +0 -182
- package/dist/database/engineReads.d.cts +0 -35
- package/dist/database/engineReads.d.mts +0 -35
- package/dist/database/engineReads.mjs +0 -181
- package/dist/database/engineTransaction.cjs +0 -399
- package/dist/database/engineTransaction.d.cts +0 -26
- package/dist/database/engineTransaction.d.mts +0 -26
- package/dist/database/engineTransaction.mjs +0 -398
- package/dist/database/errors.cjs +0 -27
- package/dist/database/errors.d.cts +0 -21
- package/dist/database/errors.d.mts +0 -21
- package/dist/database/errors.mjs +0 -24
- package/dist/database/fence.cjs +0 -125
- package/dist/database/fence.d.cts +0 -42
- package/dist/database/fence.d.mts +0 -42
- package/dist/database/fence.mjs +0 -117
- package/dist/database/index.cjs +0 -136
- package/dist/database/index.d.cts +0 -18
- package/dist/database/index.d.mts +0 -18
- package/dist/database/index.mjs +0 -16
- package/dist/database/kv/kvAdapter.cjs +0 -285
- package/dist/database/kv/kvAdapter.d.cts +0 -109
- package/dist/database/kv/kvAdapter.d.mts +0 -109
- package/dist/database/kv/kvAdapter.mjs +0 -284
- package/dist/database/resolveSchema.cjs +0 -199
- package/dist/database/resolveSchema.d.cts +0 -42
- package/dist/database/resolveSchema.d.mts +0 -42
- package/dist/database/resolveSchema.mjs +0 -196
- package/dist/database/retention.cjs +0 -92
- package/dist/database/retention.mjs +0 -90
- package/dist/database/schema.cjs +0 -24
- package/dist/database/schema.d.cts +0 -90
- package/dist/database/schema.d.mts +0 -90
- package/dist/database/schema.mjs +0 -23
- package/dist/database/sql/sqlAdapter.cjs +0 -290
- package/dist/database/sql/sqlAdapter.d.cts +0 -46
- package/dist/database/sql/sqlAdapter.d.mts +0 -46
- package/dist/database/sql/sqlAdapter.mjs +0 -287
- package/dist/database/sql/sqlSchema.cjs +0 -171
- package/dist/database/sql/sqlSchema.d.cts +0 -8
- package/dist/database/sql/sqlSchema.d.mts +0 -8
- package/dist/database/sql/sqlSchema.mjs +0 -165
- package/dist/db/coreDatabase.cjs +0 -85
- package/dist/db/coreDatabase.d.cts +0 -57
- package/dist/db/coreDatabase.d.mts +0 -57
- package/dist/db/coreDatabase.mjs +0 -78
- package/dist/db/createBundleDiff.cjs +0 -144
- package/dist/db/createBundleDiff.d.cts +0 -17
- package/dist/db/createBundleDiff.d.mts +0 -17
- package/dist/db/createBundleDiff.mjs +0 -141
- package/dist/db/engineMigrator.cjs +0 -53
- package/dist/db/engineMigrator.mjs +0 -53
- package/dist/db/engineSql.cjs +0 -26
- package/dist/db/engineSql.d.cts +0 -17
- package/dist/db/engineSql.d.mts +0 -17
- package/dist/db/engineSql.mjs +0 -25
- package/dist/db/engineSqlMigrator.cjs +0 -66
- package/dist/db/engineSqlMigrator.mjs +0 -66
- package/dist/db/fixedMigratorShared.cjs +0 -12
- package/dist/db/fixedMigratorShared.mjs +0 -11
- package/dist/db/index.cjs +0 -50
- package/dist/db/index.d.cts +0 -23
- package/dist/db/index.d.mts +0 -23
- package/dist/db/index.mjs +0 -33
- package/dist/db/releaseCatalog.d.cts +0 -16
- package/dist/db/releaseCatalog.d.mts +0 -16
- package/dist/db/schemaSettings.cjs +0 -63
- package/dist/db/schemaSettings.d.cts +0 -12
- package/dist/db/schemaSettings.d.mts +0 -12
- package/dist/db/schemaSettings.mjs +0 -62
- package/dist/db/settingsMigrator.cjs +0 -92
- package/dist/db/settingsMigrator.mjs +0 -89
- package/dist/db/types.cjs +0 -11
- package/dist/db/types.d.cts +0 -78
- package/dist/db/types.d.mts +0 -78
- package/dist/db/types.mjs +0 -10
- package/dist/diff.cjs +0 -3
- package/dist/diff.d.cts +0 -2
- package/dist/diff.d.mts +0 -2
- package/dist/diff.mjs +0 -2
- package/dist/plugins/api-keys/apiKeys.cjs +0 -139
- package/dist/plugins/api-keys/apiKeys.d.cts +0 -27
- package/dist/plugins/api-keys/apiKeys.d.mts +0 -27
- package/dist/plugins/api-keys/apiKeys.mjs +0 -129
- package/dist/plugins/api-keys/cli.cjs +0 -115
- package/dist/plugins/api-keys/cli.mjs +0 -114
- package/dist/plugins/api-keys/model.cjs +0 -58
- package/dist/plugins/api-keys/model.d.cts +0 -26
- package/dist/plugins/api-keys/model.d.mts +0 -26
- package/dist/plugins/api-keys/model.mjs +0 -58
- package/dist/plugins/api-keys/schema.cjs +0 -38
- package/dist/plugins/api-keys/schema.d.cts +0 -44
- package/dist/plugins/api-keys/schema.d.mts +0 -44
- package/dist/plugins/api-keys/schema.mjs +0 -39
- package/dist/plugins/definePlugin.cjs +0 -5
- package/dist/plugins/definePlugin.mjs +0 -5
- package/dist/plugins/index.cjs +0 -38
- package/dist/plugins/index.d.cts +0 -12
- package/dist/plugins/index.d.mts +0 -12
- package/dist/plugins/index.mjs +0 -9
- package/dist/plugins/insights/contract.cjs +0 -193
- package/dist/plugins/insights/contract.mjs +0 -189
- package/dist/plugins/insights/domain.d.cts +0 -149
- package/dist/plugins/insights/domain.d.mts +0 -149
- package/dist/plugins/insights/errors.cjs +0 -15
- package/dist/plugins/insights/errors.mjs +0 -14
- package/dist/plugins/insights/eventInput.cjs +0 -284
- package/dist/plugins/insights/eventInput.mjs +0 -282
- package/dist/plugins/insights/eventRow.cjs +0 -49
- package/dist/plugins/insights/eventRow.d.cts +0 -64
- package/dist/plugins/insights/eventRow.d.mts +0 -64
- package/dist/plugins/insights/eventRow.mjs +0 -47
- package/dist/plugins/insights/model.cjs +0 -17
- package/dist/plugins/insights/model.d.cts +0 -10
- package/dist/plugins/insights/model.d.mts +0 -10
- package/dist/plugins/insights/model.mjs +0 -17
- package/dist/plugins/insights/modelTypes.d.cts +0 -176
- package/dist/plugins/insights/modelTypes.d.mts +0 -176
- package/dist/plugins/insights/overview.cjs +0 -109
- package/dist/plugins/insights/overview.d.cts +0 -15
- package/dist/plugins/insights/overview.d.mts +0 -15
- package/dist/plugins/insights/overview.mjs +0 -107
- package/dist/plugins/insights/provider.cjs +0 -375
- package/dist/plugins/insights/provider.d.cts +0 -6
- package/dist/plugins/insights/provider.d.mts +0 -6
- package/dist/plugins/insights/provider.mjs +0 -374
- package/dist/plugins/insights/queryInput.cjs +0 -93
- package/dist/plugins/insights/queryInput.mjs +0 -91
- package/dist/plugins/insights/reads.cjs +0 -681
- package/dist/plugins/insights/reads.d.cts +0 -61
- package/dist/plugins/insights/reads.d.mts +0 -61
- package/dist/plugins/insights/reads.mjs +0 -674
- package/dist/plugins/insights/recordEvent.cjs +0 -319
- package/dist/plugins/insights/recordEvent.d.cts +0 -18
- package/dist/plugins/insights/recordEvent.d.mts +0 -18
- package/dist/plugins/insights/recordEvent.mjs +0 -316
- package/dist/plugins/insights/routes.cjs +0 -96
- package/dist/plugins/insights/routes.mjs +0 -95
- package/dist/plugins/insights/schema.cjs +0 -489
- package/dist/plugins/insights/schema.d.cts +0 -698
- package/dist/plugins/insights/schema.d.mts +0 -698
- package/dist/plugins/insights/schema.mjs +0 -483
- package/dist/plugins/insights/testing/eventRow.d.mts +0 -64
- package/dist/plugins/insights/testing/expectInsightsIndex.mjs +0 -18
- package/dist/plugins/insights/testing/fixtures.d.mts +0 -8
- package/dist/plugins/insights/testing/fixtures.mjs +0 -25
- package/dist/plugins/insights/testing/index.d.mts +0 -24
- package/dist/plugins/insights/testing/index.mjs +0 -25
- package/dist/plugins/insights/testing/insightsModelTests.mjs +0 -714
- package/dist/plugins/insights/testing/modelTypes.d.mts +0 -176
- package/dist/plugins/insights/testing/setupInsightsHttpTestSuite.d.mts +0 -11
- package/dist/plugins/insights/testing/setupInsightsHttpTestSuite.mjs +0 -107
- package/dist/plugins/insights/testing/setupInsightsModelTestSuite.d.mts +0 -11
- package/dist/plugins/insights/testing/setupInsightsModelTestSuite.mjs +0 -31
- package/dist/plugins/insights/testing/types.d.mts +0 -26
- package/dist/plugins/insights/types.d.cts +0 -33
- package/dist/plugins/insights/types.d.mts +0 -33
- package/src/adapters/drizzle.conformance.integration.spec.ts +0 -34
- package/src/adapters/drizzle.readBudgets.integration.spec.ts +0 -43
- package/src/adapters/drizzle.spec.ts +0 -314
- package/src/adapters/drizzle.ts +0 -64
- package/src/adapters/drizzleExecutor.ts +0 -166
- package/src/adapters/kysely.conformance.integration.spec.ts +0 -36
- package/src/adapters/kysely.readBudgets.integration.spec.ts +0 -44
- package/src/adapters/kysely.spec.ts +0 -244
- package/src/adapters/kysely.ts +0 -46
- package/src/adapters/kyselyExecutor.ts +0 -53
- package/src/adapters/mongodb.integration.spec.ts +0 -271
- package/src/adapters/mongodb.readBudgets.integration.spec.ts +0 -61
- package/src/adapters/mongodb.ts +0 -45
- package/src/adapters/mongodbAdapter.ts +0 -307
- package/src/adapters/prisma.conformance.integration.spec.ts +0 -36
- package/src/adapters/prisma.integration.spec.ts +0 -146
- package/src/adapters/prisma.readBudgets.integration.spec.ts +0 -43
- package/src/adapters/prisma.spec.ts +0 -257
- package/src/adapters/prisma.ts +0 -74
- package/src/adapters/prismaExecutor.ts +0 -107
- package/src/adapters/prismaTestClients.ts +0 -182
- package/src/adapters/sqlProviders.ts +0 -14
- package/src/assembly/assemblePlugins.ts +0 -302
- package/src/assembly/assembly.spec.ts +0 -377
- package/src/assembly/assembly.types.spec.ts +0 -203
- package/src/assembly/clientPlugins.ts +0 -113
- package/src/assembly/configError.ts +0 -4
- package/src/assembly/databasePlugins.spec.ts +0 -71
- package/src/assembly/databasePlugins.ts +0 -102
- package/src/assembly/pluginCli.spec.ts +0 -254
- package/src/assembly/pluginCli.ts +0 -248
- package/src/assembly/pluginRoutes.spec.ts +0 -186
- package/src/core/api.ts +0 -139
- package/src/core/baseCandidates.spec.ts +0 -378
- package/src/core/baseCandidates.ts +0 -136
- package/src/core/index.ts +0 -44
- package/src/core/operations.spec.ts +0 -415
- package/src/core/operations.ts +0 -551
- package/src/core/reads.spec.ts +0 -300
- package/src/core/reads.ts +0 -417
- package/src/core/releases.spec.ts +0 -308
- package/src/core/releases.ts +0 -345
- package/src/core/schema.ts +0 -173
- package/src/core/writes.ts +0 -160
- package/src/createHotUpdaterCore.ts +0 -260
- package/src/database/aggregateBatching.spec.ts +0 -577
- package/src/database/aggregateBatching.ts +0 -803
- package/src/database/busy.spec.ts +0 -45
- package/src/database/busy.ts +0 -50
- package/src/database/cursor.ts +0 -65
- package/src/database/database.ts +0 -366
- package/src/database/database.types.spec.ts +0 -135
- package/src/database/definitions.ts +0 -76
- package/src/database/engine.ts +0 -62
- package/src/database/engineAggregates.spec.ts +0 -536
- package/src/database/engineAggregates.ts +0 -189
- package/src/database/engineReads.spec.ts +0 -219
- package/src/database/engineReads.ts +0 -304
- package/src/database/engineTransaction.spec.ts +0 -710
- package/src/database/engineTransaction.ts +0 -582
- package/src/database/errors.ts +0 -30
- package/src/database/fence.spec.ts +0 -223
- package/src/database/fence.ts +0 -175
- package/src/database/index.ts +0 -160
- package/src/database/kv/kvAdapter.batching.integration.spec.ts +0 -15
- package/src/database/kv/kvAdapter.conformance.integration.spec.ts +0 -19
- package/src/database/kv/kvAdapter.readBudgets.integration.spec.ts +0 -17
- package/src/database/kv/kvAdapter.spec.ts +0 -595
- package/src/database/kv/kvAdapter.ts +0 -479
- package/src/database/kv/kvTestStore.ts +0 -118
- package/src/database/memory.readBudgets.integration.spec.ts +0 -13
- package/src/database/resolveSchema.spec.ts +0 -230
- package/src/database/resolveSchema.ts +0 -375
- package/src/database/retention.spec.ts +0 -314
- package/src/database/retention.ts +0 -129
- package/src/database/schema.ts +0 -213
- package/src/database/schema.types.spec.ts +0 -94
- package/src/database/sql/docker-compose.yml +0 -36
- package/src/database/sql/sqlAdapter.integration.spec.ts +0 -145
- package/src/database/sql/sqlAdapter.readBudgets.integration.spec.ts +0 -123
- package/src/database/sql/sqlAdapter.spec.ts +0 -343
- package/src/database/sql/sqlAdapter.ts +0 -552
- package/src/database/sql/sqlSchema.ts +0 -286
- package/src/database/sql/sqlTestExecutors.ts +0 -183
- package/src/databaseTestSuite.spec.ts +0 -44
- package/src/db/bundleRows.spec.ts +0 -164
- package/src/db/bundleRows.ts +0 -10
- package/src/db/coreDatabase.ts +0 -153
- package/src/db/createBundleDiff.spec.ts +0 -464
- package/src/db/createBundleDiff.ts +0 -370
- package/src/db/engineDrizzleSchema.ts +0 -72
- package/src/db/engineMigrator.ts +0 -105
- package/src/db/enginePrismaSchema.ts +0 -147
- package/src/db/engineSql.spec.ts +0 -130
- package/src/db/engineSql.ts +0 -48
- package/src/db/engineSqlMigrator.ts +0 -116
- package/src/db/fixedMigratorShared.ts +0 -17
- package/src/db/index.spec.ts +0 -554
- package/src/db/index.ts +0 -93
- package/src/db/node-sqlite.d.ts +0 -25
- package/src/db/pluginTables.spec.ts +0 -248
- package/src/db/releaseCatalog.ts +0 -106
- package/src/db/schemaSettings.ts +0 -104
- package/src/db/settingsMigrator.spec.ts +0 -65
- package/src/db/settingsMigrator.ts +0 -152
- package/src/db/types.ts +0 -82
- package/src/db/updateArtifacts.spec.ts +0 -235
- package/src/db/updateArtifacts.ts +0 -473
- package/src/db/updateCheck.bench.ts +0 -47
- package/src/diff.ts +0 -6
- package/src/handler-standalone.integration.spec.ts +0 -321
- package/src/handler.spec.ts +0 -273
- package/src/handler.testFixtures.ts +0 -25
- package/src/handler.ts +0 -302
- package/src/handlerAdminRoutes.spec.ts +0 -183
- package/src/handlerAdminRoutes.ts +0 -536
- package/src/handlerAuth.integration.spec.ts +0 -33
- package/src/handlerErrors.ts +0 -7
- package/src/handlerManagement.spec.ts +0 -202
- package/src/handlerParameters.ts +0 -105
- package/src/handlerReleaseCatalogRoutes.ts +0 -176
- package/src/handlerTypes.ts +0 -19
- package/src/handlerVersionRoutes.ts +0 -25
- package/src/index.ts +0 -13
- package/src/internalRouter.ts +0 -104
- package/src/lintRules.spec.ts +0 -76
- package/src/node.spec.ts +0 -119
- package/src/node.ts +0 -111
- package/src/plugins/api-keys/apiKeys.integration.spec.ts +0 -92
- package/src/plugins/api-keys/apiKeys.spec.ts +0 -166
- package/src/plugins/api-keys/apiKeys.ts +0 -214
- package/src/plugins/api-keys/apiKeysPlugin.spec.ts +0 -168
- package/src/plugins/api-keys/cli.spec.ts +0 -187
- package/src/plugins/api-keys/cli.ts +0 -140
- package/src/plugins/api-keys/index.ts +0 -73
- package/src/plugins/api-keys/model.ts +0 -88
- package/src/plugins/api-keys/schema.ts +0 -22
- package/src/plugins/definePlugin.ts +0 -242
- package/src/plugins/index.ts +0 -73
- package/src/plugins/insights/contract.spec.ts +0 -285
- package/src/plugins/insights/contract.ts +0 -372
- package/src/plugins/insights/domain.ts +0 -176
- package/src/plugins/insights/errors.ts +0 -11
- package/src/plugins/insights/eventInput.ts +0 -381
- package/src/plugins/insights/eventRow.ts +0 -209
- package/src/plugins/insights/index.ts +0 -222
- package/src/plugins/insights/insights.integration.spec.ts +0 -921
- package/src/plugins/insights/insightsRollout.integration.spec.ts +0 -186
- package/src/plugins/insights/model.spec.ts +0 -64
- package/src/plugins/insights/model.ts +0 -18
- package/src/plugins/insights/modelTypes.ts +0 -197
- package/src/plugins/insights/overview.spec.ts +0 -64
- package/src/plugins/insights/overview.ts +0 -214
- package/src/plugins/insights/provider.spec.ts +0 -585
- package/src/plugins/insights/provider.ts +0 -704
- package/src/plugins/insights/queryInput.ts +0 -142
- package/src/plugins/insights/reads.spec.ts +0 -1013
- package/src/plugins/insights/reads.ts +0 -1037
- package/src/plugins/insights/recordEvent.spec.ts +0 -897
- package/src/plugins/insights/recordEvent.ts +0 -476
- package/src/plugins/insights/retention.spec.ts +0 -115
- package/src/plugins/insights/routes.ts +0 -149
- package/src/plugins/insights/schema.ts +0 -409
- package/src/plugins/insights/testing/expectInsightsIndex.spec.ts +0 -42
- package/src/plugins/insights/testing/expectInsightsIndex.ts +0 -20
- package/src/plugins/insights/testing/fixtures.ts +0 -30
- package/src/plugins/insights/testing/index.ts +0 -45
- package/src/plugins/insights/testing/insightsModelTests.ts +0 -860
- package/src/plugins/insights/testing/setupInsightsHttpTestSuite.ts +0 -152
- package/src/plugins/insights/testing/setupInsightsModelTestSuite.ts +0 -36
- package/src/plugins/insights/testing/types.ts +0 -30
- package/src/plugins/insights/types.ts +0 -55
- package/src/plugins/pluginTestHarness.spec.ts +0 -56
- package/src/readBudgets.testFixtures.ts +0 -15
- package/src/releaseCatalogRoutes.integration.spec.ts +0 -200
- package/src/retention.spec.ts +0 -73
- package/src/runtime.spec.ts +0 -207
- package/src/runtime.testFixtures.ts +0 -60
- package/src/runtimeBundles.integration.spec.ts +0 -112
- package/src/storageAccess.spec.ts +0 -152
- package/src/storageAccess.ts +0 -141
- package/src/testUtilsMutation.integration.spec.ts +0 -216
- package/src/testUtilsPackage.integration.spec.ts +0 -180
- package/src/types/index.ts +0 -2
- package/src/version.ts +0 -3
package/src/db/index.spec.ts
DELETED
|
@@ -1,554 +0,0 @@
|
|
|
1
|
-
import { PGlite } from "@electric-sql/pglite";
|
|
2
|
-
import type { Bundle } from "@hot-updater/core";
|
|
3
|
-
import { NIL_UUID } from "@hot-updater/core";
|
|
4
|
-
import { createStoragePlugin } from "@hot-updater/plugin-core";
|
|
5
|
-
import { Kysely } from "kysely";
|
|
6
|
-
import { PGliteDialect } from "kysely-pglite-dialect";
|
|
7
|
-
import {
|
|
8
|
-
afterAll,
|
|
9
|
-
afterEach,
|
|
10
|
-
beforeAll,
|
|
11
|
-
beforeEach,
|
|
12
|
-
describe,
|
|
13
|
-
expect,
|
|
14
|
-
it,
|
|
15
|
-
vi,
|
|
16
|
-
} from "vitest";
|
|
17
|
-
|
|
18
|
-
import { drizzleAdapter } from "../adapters/drizzle";
|
|
19
|
-
import { kyselyAdapter } from "../adapters/kysely";
|
|
20
|
-
import { prismaAdapter } from "../adapters/prisma";
|
|
21
|
-
import { HotUpdaterSchemaMigrationRequiredError } from "../database/fence";
|
|
22
|
-
import {
|
|
23
|
-
createHotUpdater as createRuntimeHotUpdater,
|
|
24
|
-
type CreateHotUpdaterOptions,
|
|
25
|
-
} from "../index";
|
|
26
|
-
import { createMigrator, generateSchema } from "./index";
|
|
27
|
-
|
|
28
|
-
const createHotUpdater = (
|
|
29
|
-
options: Omit<CreateHotUpdaterOptions, "clientAccess">,
|
|
30
|
-
) =>
|
|
31
|
-
createRuntimeHotUpdater({
|
|
32
|
-
...options,
|
|
33
|
-
clientAccess: "public",
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
function createTestStoragePlugin(
|
|
37
|
-
protocol: string,
|
|
38
|
-
readText: (storageUri: string) => Promise<string | null> = async () => null,
|
|
39
|
-
) {
|
|
40
|
-
return createStoragePlugin({
|
|
41
|
-
name: `${protocol}TestStorage`,
|
|
42
|
-
protocol,
|
|
43
|
-
async get({ storageUri }) {
|
|
44
|
-
const text = await readText(storageUri);
|
|
45
|
-
return { response: text === null ? null : new Response(text) };
|
|
46
|
-
},
|
|
47
|
-
async getDownloadUrl({ storageUri }) {
|
|
48
|
-
const prefixes: Record<string, string> = {
|
|
49
|
-
gs: "https://firebase.example.com/",
|
|
50
|
-
r2: "https://r2.example.com/",
|
|
51
|
-
s3: "https://s3.example.com/",
|
|
52
|
-
"supabase-storage":
|
|
53
|
-
"https://supabase.example.com/storage/v1/object/sign/",
|
|
54
|
-
};
|
|
55
|
-
return {
|
|
56
|
-
url: storageUri
|
|
57
|
-
.replace(`${protocol}://`, prefixes[protocol] ?? "")
|
|
58
|
-
.replace(/([^:]\/)\/+/g, "$1"),
|
|
59
|
-
};
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
describe("server/db hotUpdater (PGlite + Kysely)", async () => {
|
|
65
|
-
const db = new PGlite();
|
|
66
|
-
|
|
67
|
-
const kysely = new Kysely<object>({ dialect: new PGliteDialect(db) });
|
|
68
|
-
const storageTexts = new Map<string, string | Error>();
|
|
69
|
-
const readStoredText = async (storageUri: string) => {
|
|
70
|
-
const text = storageTexts.get(storageUri);
|
|
71
|
-
if (text instanceof Error) {
|
|
72
|
-
throw text;
|
|
73
|
-
}
|
|
74
|
-
return text ?? null;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const hotUpdater = createHotUpdater({
|
|
78
|
-
database: kyselyAdapter({
|
|
79
|
-
db: kysely,
|
|
80
|
-
provider: "postgresql",
|
|
81
|
-
}),
|
|
82
|
-
storage: [
|
|
83
|
-
createTestStoragePlugin("s3", readStoredText),
|
|
84
|
-
createTestStoragePlugin("r2", readStoredText),
|
|
85
|
-
createTestStoragePlugin("supabase-storage", readStoredText),
|
|
86
|
-
createTestStoragePlugin("gs", readStoredText),
|
|
87
|
-
],
|
|
88
|
-
});
|
|
89
|
-
it("uses the default generated schema artifact path for Drizzle", () => {
|
|
90
|
-
const adapter = drizzleAdapter({ db: {}, provider: "sqlite" });
|
|
91
|
-
|
|
92
|
-
expect(adapter.generateSchema?.("latest").path).toBe(
|
|
93
|
-
"hot-updater-schema.ts",
|
|
94
|
-
);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
beforeAll(async () => {
|
|
98
|
-
const migrator = createMigrator(hotUpdater);
|
|
99
|
-
const result = await migrator.migrateToLatest({
|
|
100
|
-
mode: "from-schema",
|
|
101
|
-
updateSettings: true,
|
|
102
|
-
});
|
|
103
|
-
await result.execute();
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
beforeEach(async () => {
|
|
107
|
-
storageTexts.clear();
|
|
108
|
-
// Every table but the settings rows, aggregates included.
|
|
109
|
-
const { rows } = await db.query<{ tablename: string }>(
|
|
110
|
-
"SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename <> 'private_hot_updater_settings'",
|
|
111
|
-
);
|
|
112
|
-
await db.exec(
|
|
113
|
-
`TRUNCATE ${rows.map(({ tablename }) => `"${tablename}"`).join(", ")}`,
|
|
114
|
-
);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
/** Stores a bundle with a disabled release, one deploy each. */
|
|
118
|
-
const deployBundle = (bundle: Bundle) =>
|
|
119
|
-
hotUpdater.core.deploy([
|
|
120
|
-
{
|
|
121
|
-
bundle,
|
|
122
|
-
release: {
|
|
123
|
-
channel: "production",
|
|
124
|
-
enabled: false,
|
|
125
|
-
fingerprintHash: null,
|
|
126
|
-
message: null,
|
|
127
|
-
shouldForceUpdate: false,
|
|
128
|
-
targetAppVersion: "*",
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
]);
|
|
132
|
-
|
|
133
|
-
afterAll(async () => {
|
|
134
|
-
await kysely.destroy();
|
|
135
|
-
await db.close();
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
describe("schema generation", () => {
|
|
139
|
-
it("passes the Prisma adapter's engine models through unchanged", () => {
|
|
140
|
-
const database = prismaAdapter({ prisma: {}, provider: "postgresql" });
|
|
141
|
-
const code = generateSchema(
|
|
142
|
-
createHotUpdater({ database }),
|
|
143
|
-
"latest",
|
|
144
|
-
).code;
|
|
145
|
-
|
|
146
|
-
expect(code).toBe(database.generateSchema?.("latest").code);
|
|
147
|
-
expect(code).toContain("model bundle_totals {");
|
|
148
|
-
expect(code).toContain("model private_hot_updater_settings {");
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it("rejects generating a retired schema snapshot", () => {
|
|
152
|
-
const database = prismaAdapter({ prisma: {}, provider: "postgresql" });
|
|
153
|
-
expect(() =>
|
|
154
|
-
generateSchema(createHotUpdater({ database }), "0.21.0"),
|
|
155
|
-
).toThrow("Invalid version 0.21.0");
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it("passes the Drizzle adapter's engine schema through unchanged", () => {
|
|
159
|
-
const database = drizzleAdapter({ db: {}, provider: "postgresql" });
|
|
160
|
-
const code = generateSchema(
|
|
161
|
-
createHotUpdater({ database }),
|
|
162
|
-
"latest",
|
|
163
|
-
).code;
|
|
164
|
-
|
|
165
|
-
expect(code).toBe(database.generateSchema?.("latest").code);
|
|
166
|
-
expect(code).toContain('pgTable("bundle_totals"');
|
|
167
|
-
expect(code).toContain('pgTable("private_hot_updater_settings"');
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
describe("migrator enhancements", () => {
|
|
172
|
-
it("generates the engine's tables, indexes, and settings rows, without foreign keys", async () => {
|
|
173
|
-
const migrationDb = new PGlite();
|
|
174
|
-
const migrationKysely = new Kysely<object>({
|
|
175
|
-
dialect: new PGliteDialect(migrationDb),
|
|
176
|
-
});
|
|
177
|
-
const migrationHotUpdater = createHotUpdater({
|
|
178
|
-
database: kyselyAdapter({
|
|
179
|
-
db: migrationKysely,
|
|
180
|
-
provider: "postgresql",
|
|
181
|
-
}),
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
try {
|
|
185
|
-
const migrator = createMigrator(migrationHotUpdater);
|
|
186
|
-
const result = await migrator.migrateToLatest({
|
|
187
|
-
mode: "from-schema",
|
|
188
|
-
updateSettings: false,
|
|
189
|
-
});
|
|
190
|
-
const sql = result.getSQL?.() ?? "";
|
|
191
|
-
|
|
192
|
-
expect(sql).toContain(
|
|
193
|
-
'CREATE INDEX IF NOT EXISTS "releases_byScope" ON "releases" ("scope_key", "id")',
|
|
194
|
-
);
|
|
195
|
-
expect(sql).not.toContain("FOREIGN KEY");
|
|
196
|
-
expect(sql).toContain(
|
|
197
|
-
`INSERT INTO "private_hot_updater_settings" ("key", "value", "_v") VALUES ('schema.engine', '1', 0)`,
|
|
198
|
-
);
|
|
199
|
-
// `updateSettings: false` leaves the settings step out of the plan only
|
|
200
|
-
expect(result.operations).not.toContainEqual(
|
|
201
|
-
expect.objectContaining({ type: "custom" }),
|
|
202
|
-
);
|
|
203
|
-
} finally {
|
|
204
|
-
await migrationKysely.destroy();
|
|
205
|
-
await migrationDb.close();
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it("rejects an existing v0 Kysely schema instead of upgrading it", async () => {
|
|
210
|
-
const migrationDb = new PGlite();
|
|
211
|
-
const migrationKysely = new Kysely<object>({
|
|
212
|
-
dialect: new PGliteDialect(migrationDb),
|
|
213
|
-
});
|
|
214
|
-
const migrationHotUpdater = createHotUpdater({
|
|
215
|
-
database: kyselyAdapter({
|
|
216
|
-
db: migrationKysely,
|
|
217
|
-
provider: "postgresql",
|
|
218
|
-
}),
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
await migrationDb.exec(`
|
|
223
|
-
create table private_hot_updater_settings (
|
|
224
|
-
key varchar(255) primary key,
|
|
225
|
-
value text not null
|
|
226
|
-
);
|
|
227
|
-
insert into private_hot_updater_settings (key, value)
|
|
228
|
-
values ('version', '0.21.0');
|
|
229
|
-
`);
|
|
230
|
-
|
|
231
|
-
const migrator = createMigrator(migrationHotUpdater);
|
|
232
|
-
await expect(
|
|
233
|
-
migrator.migrateToLatest({
|
|
234
|
-
mode: "from-schema",
|
|
235
|
-
updateSettings: true,
|
|
236
|
-
}),
|
|
237
|
-
).rejects.toThrow("Hot Updater v1 cannot migrate schema 0.21.0");
|
|
238
|
-
} finally {
|
|
239
|
-
await migrationKysely.destroy();
|
|
240
|
-
await migrationDb.close();
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it("rejects from-database migrations explicitly", async () => {
|
|
245
|
-
const migrationDb = new PGlite();
|
|
246
|
-
const migrationKysely = new Kysely<object>({
|
|
247
|
-
dialect: new PGliteDialect(migrationDb),
|
|
248
|
-
});
|
|
249
|
-
const migrationHotUpdater = createHotUpdater({
|
|
250
|
-
database: kyselyAdapter({
|
|
251
|
-
db: migrationKysely,
|
|
252
|
-
provider: "postgresql",
|
|
253
|
-
}),
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
try {
|
|
257
|
-
await expect(
|
|
258
|
-
createMigrator(migrationHotUpdater).migrateToLatest({
|
|
259
|
-
mode: "from-database",
|
|
260
|
-
}),
|
|
261
|
-
).rejects.toThrow(
|
|
262
|
-
"Hot Updater migrations support only mode: 'from-schema'.",
|
|
263
|
-
);
|
|
264
|
-
} finally {
|
|
265
|
-
await migrationKysely.destroy();
|
|
266
|
-
await migrationDb.close();
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
it("rejects runtime access when a Kysely schema is not initialized", async () => {
|
|
271
|
-
const migrationDb = new PGlite();
|
|
272
|
-
const migrationKysely = new Kysely<object>({
|
|
273
|
-
dialect: new PGliteDialect(migrationDb),
|
|
274
|
-
});
|
|
275
|
-
const migrationHotUpdater = createHotUpdater({
|
|
276
|
-
database: kyselyAdapter({
|
|
277
|
-
db: migrationKysely,
|
|
278
|
-
provider: "postgresql",
|
|
279
|
-
}),
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
try {
|
|
283
|
-
await expect(
|
|
284
|
-
migrationHotUpdater.core.listBundles({ limit: 10 }),
|
|
285
|
-
).rejects.toThrow(
|
|
286
|
-
'Hot Updater schema setting "schema.engine" for kysely is missing',
|
|
287
|
-
);
|
|
288
|
-
} finally {
|
|
289
|
-
await migrationKysely.destroy();
|
|
290
|
-
await migrationDb.close();
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it("rejects runtime access when a Kysely schema is stale", async () => {
|
|
295
|
-
const migrationDb = new PGlite();
|
|
296
|
-
const migrationKysely = new Kysely<object>({
|
|
297
|
-
dialect: new PGliteDialect(migrationDb),
|
|
298
|
-
});
|
|
299
|
-
const migrationHotUpdater = createHotUpdater({
|
|
300
|
-
database: kyselyAdapter({
|
|
301
|
-
db: migrationKysely,
|
|
302
|
-
provider: "postgresql",
|
|
303
|
-
}),
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
try {
|
|
307
|
-
await migrationDb.exec(`
|
|
308
|
-
create table private_hot_updater_settings (
|
|
309
|
-
key varchar(255) primary key,
|
|
310
|
-
value text not null
|
|
311
|
-
);
|
|
312
|
-
insert into private_hot_updater_settings (key, value)
|
|
313
|
-
values ('version', '0.21.0');
|
|
314
|
-
`);
|
|
315
|
-
|
|
316
|
-
await expect(
|
|
317
|
-
migrationHotUpdater.core.listChannels(),
|
|
318
|
-
).rejects.toBeInstanceOf(HotUpdaterSchemaMigrationRequiredError);
|
|
319
|
-
} finally {
|
|
320
|
-
await migrationKysely.destroy();
|
|
321
|
-
await migrationDb.close();
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
describe("getBundle", () => {
|
|
327
|
-
it("should retrieve bundle by id without Prisma validation errors", async () => {
|
|
328
|
-
const bundle: Bundle = {
|
|
329
|
-
id: "00000000-0000-0000-0000-000000000010",
|
|
330
|
-
platform: "ios",
|
|
331
|
-
gitCommitHash: null,
|
|
332
|
-
manifestStorageUri: "s3://test-bucket/test/manifest.json",
|
|
333
|
-
manifestFileHash: "test-manifest-hash",
|
|
334
|
-
assetBaseStorageUri: "s3://test-bucket/assets",
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
await deployBundle(bundle);
|
|
338
|
-
|
|
339
|
-
const retrieved = await hotUpdater.core.getBundle(bundle.id);
|
|
340
|
-
|
|
341
|
-
expect(retrieved?.bundle).toMatchObject({
|
|
342
|
-
id: bundle.id,
|
|
343
|
-
platform: bundle.platform,
|
|
344
|
-
manifest_file_hash: bundle.manifestFileHash,
|
|
345
|
-
});
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
it("should return null for non-existent bundle id", async () => {
|
|
349
|
-
const retrieved = await hotUpdater.core.getBundle(
|
|
350
|
-
"99999999-9999-9999-9999-999999999999",
|
|
351
|
-
);
|
|
352
|
-
|
|
353
|
-
expect(retrieved).toBeNull();
|
|
354
|
-
});
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
describe("listChannels", () => {
|
|
358
|
-
it("lists channel rows by name", async () => {
|
|
359
|
-
await hotUpdater.core.ensureChannel("staging");
|
|
360
|
-
await hotUpdater.core.ensureChannel("production");
|
|
361
|
-
|
|
362
|
-
const channels = await hotUpdater.core.listChannels();
|
|
363
|
-
|
|
364
|
-
expect(channels).toHaveLength(2);
|
|
365
|
-
expect(channels.map(({ name }) => name)).toEqual([
|
|
366
|
-
"production",
|
|
367
|
-
"staging",
|
|
368
|
-
]);
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
it("should return empty array when no channels exist", async () => {
|
|
372
|
-
const channels = await hotUpdater.core.listChannels();
|
|
373
|
-
expect(channels).toEqual([]);
|
|
374
|
-
});
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
describe("getArtifactInfo with storage plugins", () => {
|
|
378
|
-
beforeEach(() => {
|
|
379
|
-
// Fix time for deterministic signed URLs
|
|
380
|
-
vi.useFakeTimers();
|
|
381
|
-
vi.setSystemTime(new Date("2025-10-15T12:21:00Z"));
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
afterEach(() => {
|
|
385
|
-
vi.useRealTimers();
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
it("resolves manifest and asset URIs via s3StoragePlugin", async () => {
|
|
389
|
-
const bundle: Bundle = {
|
|
390
|
-
id: "00000000-0000-0000-0000-000000000001",
|
|
391
|
-
platform: "ios",
|
|
392
|
-
gitCommitHash: null,
|
|
393
|
-
manifestStorageUri: "s3://test-bucket/bundles/bundle/manifest.json",
|
|
394
|
-
manifestFileHash: "manifest-hash",
|
|
395
|
-
assetBaseStorageUri: "s3://test-bucket/assets",
|
|
396
|
-
};
|
|
397
|
-
storageTexts.set(
|
|
398
|
-
bundle.manifestStorageUri,
|
|
399
|
-
JSON.stringify({
|
|
400
|
-
bundleId: bundle.id,
|
|
401
|
-
assets: { "assets/logo.png": { fileHash: "logo-hash" } },
|
|
402
|
-
}),
|
|
403
|
-
);
|
|
404
|
-
|
|
405
|
-
await deployBundle(bundle);
|
|
406
|
-
|
|
407
|
-
const updateInfo = await hotUpdater.core.getArtifactInfo(
|
|
408
|
-
bundle.id,
|
|
409
|
-
NIL_UUID,
|
|
410
|
-
1,
|
|
411
|
-
);
|
|
412
|
-
|
|
413
|
-
expect(updateInfo).not.toBeNull();
|
|
414
|
-
expect(updateInfo?.manifestUrl).toBe(
|
|
415
|
-
"https://s3.example.com/test-bucket/bundles/bundle/manifest.json",
|
|
416
|
-
);
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
it("returns manifest metadata and hbc patch descriptors", async () => {
|
|
420
|
-
const currentManifestStorageUri =
|
|
421
|
-
"s3://test-bucket/releases/bundles/00000000-0000-0000-0000-000000000101/manifest.json";
|
|
422
|
-
const nextManifestStorageUri =
|
|
423
|
-
"s3://test-bucket/releases/bundles/00000000-0000-0000-0000-000000000102/manifest.json";
|
|
424
|
-
const olderBundle: Bundle = {
|
|
425
|
-
id: "00000000-0000-0000-0000-000000000100",
|
|
426
|
-
platform: "ios",
|
|
427
|
-
gitCommitHash: null,
|
|
428
|
-
assetBaseStorageUri: "s3://test-bucket/releases/assets",
|
|
429
|
-
manifestFileHash: "manifest-older",
|
|
430
|
-
manifestStorageUri:
|
|
431
|
-
"s3://test-bucket/releases/bundles/00000000-0000-0000-0000-000000000100/manifest.json",
|
|
432
|
-
};
|
|
433
|
-
const currentBundle: Bundle = {
|
|
434
|
-
id: "00000000-0000-0000-0000-000000000101",
|
|
435
|
-
platform: "ios",
|
|
436
|
-
gitCommitHash: null,
|
|
437
|
-
assetBaseStorageUri: "s3://test-bucket/releases/assets",
|
|
438
|
-
manifestFileHash: "sig:manifest-current",
|
|
439
|
-
manifestStorageUri: currentManifestStorageUri,
|
|
440
|
-
};
|
|
441
|
-
const nextBundle: Bundle = {
|
|
442
|
-
id: "00000000-0000-0000-0000-000000000102",
|
|
443
|
-
platform: "ios",
|
|
444
|
-
gitCommitHash: null,
|
|
445
|
-
assetBaseStorageUri: "s3://test-bucket/releases/assets",
|
|
446
|
-
manifestFileHash: "sig:manifest-next",
|
|
447
|
-
manifestStorageUri: nextManifestStorageUri,
|
|
448
|
-
patches: [
|
|
449
|
-
{
|
|
450
|
-
baseBundleId: "00000000-0000-0000-0000-000000000100",
|
|
451
|
-
baseFileHash: "hash-older-bundle",
|
|
452
|
-
byteSize: 48,
|
|
453
|
-
patchFileHash: "hash-older-bsdiff",
|
|
454
|
-
patchStorageUri:
|
|
455
|
-
"s3://test-bucket/releases/bundles/00000000-0000-0000-0000-000000000102/patches/00000000-0000-0000-0000-000000000100/index.ios.bundle.bsdiff",
|
|
456
|
-
},
|
|
457
|
-
{
|
|
458
|
-
baseBundleId: currentBundle.id,
|
|
459
|
-
baseFileHash: "hash-old-bundle",
|
|
460
|
-
byteSize: 48,
|
|
461
|
-
patchFileHash: "hash-bsdiff",
|
|
462
|
-
patchStorageUri:
|
|
463
|
-
"s3://test-bucket/releases/bundles/00000000-0000-0000-0000-000000000102/patches/00000000-0000-0000-0000-000000000101/index.ios.bundle.bsdiff",
|
|
464
|
-
},
|
|
465
|
-
],
|
|
466
|
-
};
|
|
467
|
-
storageTexts.set(
|
|
468
|
-
currentManifestStorageUri,
|
|
469
|
-
JSON.stringify({
|
|
470
|
-
assets: {
|
|
471
|
-
"assets/logo.png": {
|
|
472
|
-
fileHash: "hash-logo",
|
|
473
|
-
},
|
|
474
|
-
"index.ios.bundle": {
|
|
475
|
-
fileHash: "hash-old-bundle",
|
|
476
|
-
},
|
|
477
|
-
},
|
|
478
|
-
bundleId: currentBundle.id,
|
|
479
|
-
}),
|
|
480
|
-
);
|
|
481
|
-
storageTexts.set(
|
|
482
|
-
nextManifestStorageUri,
|
|
483
|
-
JSON.stringify({
|
|
484
|
-
assets: {
|
|
485
|
-
"assets/logo.png": {
|
|
486
|
-
fileHash: "hash-logo",
|
|
487
|
-
},
|
|
488
|
-
"index.ios.bundle": {
|
|
489
|
-
fileHash: "hash-new-bundle",
|
|
490
|
-
},
|
|
491
|
-
},
|
|
492
|
-
bundleId: nextBundle.id,
|
|
493
|
-
}),
|
|
494
|
-
);
|
|
495
|
-
const fetchMock = vi.fn<typeof fetch>(async () => {
|
|
496
|
-
return new Response("manifest fetch should not be used", {
|
|
497
|
-
status: 500,
|
|
498
|
-
});
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
await deployBundle(olderBundle);
|
|
502
|
-
await deployBundle(currentBundle);
|
|
503
|
-
await deployBundle(nextBundle);
|
|
504
|
-
vi.stubGlobal("fetch", fetchMock);
|
|
505
|
-
|
|
506
|
-
try {
|
|
507
|
-
await expect(
|
|
508
|
-
hotUpdater.core.getArtifactInfo(nextBundle.id, currentBundle.id, 1),
|
|
509
|
-
).resolves.toMatchObject({
|
|
510
|
-
artifactProtocolVersion: 1,
|
|
511
|
-
assets: {
|
|
512
|
-
"assets/logo.png": {
|
|
513
|
-
file: { url: expect.any(String) },
|
|
514
|
-
fileHash: "hash-logo",
|
|
515
|
-
},
|
|
516
|
-
"index.ios.bundle": {
|
|
517
|
-
file: { url: expect.any(String) },
|
|
518
|
-
fileHash: "hash-new-bundle",
|
|
519
|
-
},
|
|
520
|
-
},
|
|
521
|
-
manifestFileHash: "sig:manifest-next",
|
|
522
|
-
manifestUrl:
|
|
523
|
-
"https://s3.example.com/test-bucket/releases/bundles/00000000-0000-0000-0000-000000000102/manifest.json",
|
|
524
|
-
});
|
|
525
|
-
expect(fetchMock).not.toHaveBeenCalled();
|
|
526
|
-
} finally {
|
|
527
|
-
vi.unstubAllGlobals();
|
|
528
|
-
}
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
it("propagates manifest storage read failures", async () => {
|
|
532
|
-
const nextManifestStorageUri =
|
|
533
|
-
"s3://test-bucket/releases/bundles/00000000-0000-0000-0000-000000000109/manifest.json";
|
|
534
|
-
const nextBundle: Bundle = {
|
|
535
|
-
id: "00000000-0000-0000-0000-000000000109",
|
|
536
|
-
platform: "ios",
|
|
537
|
-
gitCommitHash: null,
|
|
538
|
-
assetBaseStorageUri: "s3://test-bucket/releases/assets",
|
|
539
|
-
manifestFileHash: "sig:manifest-next",
|
|
540
|
-
manifestStorageUri: nextManifestStorageUri,
|
|
541
|
-
};
|
|
542
|
-
|
|
543
|
-
await deployBundle(nextBundle);
|
|
544
|
-
storageTexts.set(
|
|
545
|
-
nextManifestStorageUri,
|
|
546
|
-
new Error("storage read failed"),
|
|
547
|
-
);
|
|
548
|
-
|
|
549
|
-
await expect(
|
|
550
|
-
hotUpdater.core.getArtifactInfo(nextBundle.id, NIL_UUID, 1),
|
|
551
|
-
).rejects.toThrow("storage read failed");
|
|
552
|
-
});
|
|
553
|
-
});
|
|
554
|
-
});
|
package/src/db/index.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getHotUpdaterCoreMetadata,
|
|
3
|
-
type RuntimeHotUpdaterAPI,
|
|
4
|
-
} from "../createHotUpdaterCore";
|
|
5
|
-
import type { AnyHotUpdaterPlugin } from "../plugins/definePlugin";
|
|
6
|
-
import { type Migrator, type SchemaGenerator } from "./types";
|
|
7
|
-
|
|
8
|
-
export { createDatabaseCoreApi, type CoreApi } from "../core/api";
|
|
9
|
-
export {
|
|
10
|
-
createDatabasePluginApis,
|
|
11
|
-
createMeasuredDatabase,
|
|
12
|
-
type MeasuredDatabase,
|
|
13
|
-
type MeasuredDatabaseOptions,
|
|
14
|
-
} from "../assembly/databasePlugins";
|
|
15
|
-
export {
|
|
16
|
-
clientAuthOf,
|
|
17
|
-
clientPluginsOf,
|
|
18
|
-
generateClientCredential,
|
|
19
|
-
pluginCommandsOf,
|
|
20
|
-
provisionClientCredential,
|
|
21
|
-
type ClientAuthSpec,
|
|
22
|
-
type ClientCredentialSpec,
|
|
23
|
-
type ClientPluginSpec,
|
|
24
|
-
type PluginCommandEntry,
|
|
25
|
-
type ProvisionedClientCredential,
|
|
26
|
-
} from "../assembly/pluginCli";
|
|
27
|
-
export { targetBaseCandidateKey } from "../core/baseCandidates";
|
|
28
|
-
export {
|
|
29
|
-
generateEngineSql,
|
|
30
|
-
settingsStatements,
|
|
31
|
-
type EngineSqlOptions,
|
|
32
|
-
} from "./engineSql";
|
|
33
|
-
export type {
|
|
34
|
-
DatabaseTooling,
|
|
35
|
-
Migrator,
|
|
36
|
-
SchemaGenerator,
|
|
37
|
-
ToolingDatabase,
|
|
38
|
-
ToolingTarget,
|
|
39
|
-
} from "./types";
|
|
40
|
-
export { HotUpdaterSchemaMigrationRequiredError } from "../database/fence";
|
|
41
|
-
export { HOT_UPDATER_SERVER_VERSION } from "../version";
|
|
42
|
-
|
|
43
|
-
export type HotUpdaterDBTarget = {
|
|
44
|
-
readonly adapterName: string;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const getDBMetadata = (hotUpdater: HotUpdaterDBTarget) => {
|
|
48
|
-
const metadata = getHotUpdaterCoreMetadata(
|
|
49
|
-
hotUpdater as RuntimeHotUpdaterAPI,
|
|
50
|
-
);
|
|
51
|
-
if (!metadata) {
|
|
52
|
-
throw new Error(
|
|
53
|
-
"Database tooling requires a hotUpdater instance created by @hot-updater/server.",
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
return metadata;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/** A server's plugins as configured, whose commands the CLI adds. */
|
|
60
|
-
export const serverPluginsOf = (
|
|
61
|
-
hotUpdater: HotUpdaterDBTarget,
|
|
62
|
-
): readonly AnyHotUpdaterPlugin[] => getDBMetadata(hotUpdater).plugins;
|
|
63
|
-
|
|
64
|
-
/** Whether `hot-updater db generate` writes schema files for a server's database. */
|
|
65
|
-
export const generatesSchema = (hotUpdater: HotUpdaterDBTarget): boolean =>
|
|
66
|
-
getDBMetadata(hotUpdater).database.generateSchema !== undefined;
|
|
67
|
-
|
|
68
|
-
/** The migrator for a server's database: core's tables and its plugins' tables. */
|
|
69
|
-
export function createMigrator(hotUpdater: HotUpdaterDBTarget): Migrator {
|
|
70
|
-
const { database, target } = getDBMetadata(hotUpdater);
|
|
71
|
-
if (database.createMigrator === undefined) {
|
|
72
|
-
throw new Error(
|
|
73
|
-
database.generateSchema === undefined
|
|
74
|
-
? `The ${database.name} database has no migrator; its provider applies the schema.`
|
|
75
|
-
: `The ${database.name} database applies its schema from migration files: run \`hot-updater db generate\`, then apply the file with the provider's tooling.`,
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
return database.createMigrator(target);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function generateSchema(
|
|
82
|
-
hotUpdater: HotUpdaterDBTarget,
|
|
83
|
-
...args: Parameters<SchemaGenerator>
|
|
84
|
-
): ReturnType<SchemaGenerator> {
|
|
85
|
-
const { database, target } = getDBMetadata(hotUpdater);
|
|
86
|
-
if (database.generateSchema === undefined) {
|
|
87
|
-
throw new Error(
|
|
88
|
-
`The ${database.name} database has no schema generator; run \`hot-updater db migrate\` instead.`,
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
const [version, name] = args;
|
|
92
|
-
return database.generateSchema(version, name, target);
|
|
93
|
-
}
|
package/src/db/node-sqlite.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
declare module "node:sqlite" {
|
|
2
|
-
export type SqliteValue = bigint | null | number | string | Uint8Array;
|
|
3
|
-
|
|
4
|
-
export interface StatementSync {
|
|
5
|
-
all: (...parameters: SqliteValue[]) => Record<string, SqliteValue>[];
|
|
6
|
-
columns: () => readonly unknown[];
|
|
7
|
-
get: (
|
|
8
|
-
...parameters: SqliteValue[]
|
|
9
|
-
) => Record<string, SqliteValue> | undefined;
|
|
10
|
-
iterate: (
|
|
11
|
-
...parameters: SqliteValue[]
|
|
12
|
-
) => IterableIterator<Record<string, SqliteValue>>;
|
|
13
|
-
run: (...parameters: SqliteValue[]) => {
|
|
14
|
-
readonly changes: number | bigint;
|
|
15
|
-
readonly lastInsertRowid: number | bigint;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class DatabaseSync {
|
|
20
|
-
constructor(location: string);
|
|
21
|
-
close(): void;
|
|
22
|
-
exec(sql: string): void;
|
|
23
|
-
prepare(sql: string): StatementSync;
|
|
24
|
-
}
|
|
25
|
-
}
|