@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/core/api.ts
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
EngineDatabase,
|
|
3
|
-
HotUpdaterCoreApi,
|
|
4
|
-
} from "@hot-updater/plugin-core";
|
|
5
|
-
import type { DatabaseAdapter } from "@hot-updater/plugin-core/internal";
|
|
6
|
-
|
|
7
|
-
import { createDatabaseEngine } from "../database/database";
|
|
8
|
-
import { resolveSchema } from "../database/resolveSchema";
|
|
9
|
-
import { createCoreOperations } from "./operations";
|
|
10
|
-
import { createCoreReads, type CoreDatabase, type CoreStorage } from "./reads";
|
|
11
|
-
import { coreModule } from "./schema";
|
|
12
|
-
|
|
13
|
-
export interface CoreApiOptions {
|
|
14
|
-
readonly now?: () => number;
|
|
15
|
-
/** The database's CDN purge, called after a write that changes a Release Catalog. */
|
|
16
|
-
readonly onCachedRoutesChange?: () => Promise<void>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* The update check answers from one Release Catalog row, so a transaction
|
|
21
|
-
* changes what the cacheable client routes answer only when it writes one.
|
|
22
|
-
* The purge runs once, after the attempt that commits.
|
|
23
|
-
*/
|
|
24
|
-
const purgingCachedRoutes = (
|
|
25
|
-
db: CoreDatabase,
|
|
26
|
-
onCachedRoutesChange: (() => Promise<void>) | undefined,
|
|
27
|
-
): CoreDatabase => {
|
|
28
|
-
if (onCachedRoutesChange === undefined) return db;
|
|
29
|
-
return {
|
|
30
|
-
...db,
|
|
31
|
-
async transaction(fn) {
|
|
32
|
-
let changed = false;
|
|
33
|
-
const result = await db.transaction((tx) => {
|
|
34
|
-
changed = false;
|
|
35
|
-
return fn({
|
|
36
|
-
...tx,
|
|
37
|
-
create: (model, row) => {
|
|
38
|
-
changed ||= model === "release_catalogs";
|
|
39
|
-
tx.create(model, row);
|
|
40
|
-
},
|
|
41
|
-
update: (model, row, set) => {
|
|
42
|
-
changed ||= model === "release_catalogs";
|
|
43
|
-
tx.update(model, row, set);
|
|
44
|
-
},
|
|
45
|
-
delete: (model, row) => {
|
|
46
|
-
changed ||= model === "release_catalogs";
|
|
47
|
-
return tx.delete(model, row);
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
if (changed) await onCachedRoutesChange();
|
|
52
|
-
return result;
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
/** Core's reads and typed writes over one database handle. */
|
|
58
|
-
export const createCoreApi = (
|
|
59
|
-
db: CoreDatabase,
|
|
60
|
-
storage: CoreStorage,
|
|
61
|
-
options: CoreApiOptions = {},
|
|
62
|
-
) => {
|
|
63
|
-
const reads = createCoreReads(db, storage);
|
|
64
|
-
return {
|
|
65
|
-
...reads,
|
|
66
|
-
...createCoreOperations(
|
|
67
|
-
purgingCachedRoutes(db, options.onCachedRoutesChange),
|
|
68
|
-
options,
|
|
69
|
-
),
|
|
70
|
-
/** One read, which checks the schema settings first. */
|
|
71
|
-
ready: async (): Promise<void> => {
|
|
72
|
-
await reads.listReleaseCatalogs({ limit: 1 });
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export type CoreApi = ReturnType<typeof createCoreApi>;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Core's API in process, on a database's storage adapter: how the CLI reads
|
|
81
|
-
* and writes a database that runs on the storage engine.
|
|
82
|
-
*/
|
|
83
|
-
export const createInProcessCoreApi = (
|
|
84
|
-
adapter: DatabaseAdapter,
|
|
85
|
-
options: CoreApiOptions = {},
|
|
86
|
-
): CoreApi =>
|
|
87
|
-
createCoreApi(
|
|
88
|
-
createDatabaseEngine({
|
|
89
|
-
adapter,
|
|
90
|
-
schema: resolveSchema([coreModule]),
|
|
91
|
-
}).database(coreModule),
|
|
92
|
-
{ resolveFileUrl: async () => null },
|
|
93
|
-
options,
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
97
|
-
typeof value === "object" && value !== null;
|
|
98
|
-
|
|
99
|
-
const isAdapter = (value: unknown): value is DatabaseAdapter =>
|
|
100
|
-
isRecord(value) &&
|
|
101
|
-
["fits", "get", "query", "write"].every(
|
|
102
|
-
(method) => typeof value[method] === "function",
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
/** The storage adapter a configured database runs on, if it is on the engine. */
|
|
106
|
-
export const engineAdapterOf = (
|
|
107
|
-
database: unknown,
|
|
108
|
-
): DatabaseAdapter | undefined =>
|
|
109
|
-
isRecord(database) && isAdapter(database.adapter)
|
|
110
|
-
? database.adapter
|
|
111
|
-
: isAdapter(database)
|
|
112
|
-
? database
|
|
113
|
-
: undefined;
|
|
114
|
-
|
|
115
|
-
export const OFF_ENGINE_DATABASE =
|
|
116
|
-
"This database does not run on Hot Updater's storage engine. Upgrade its provider package to 1.0.";
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Core's API for a configured database, as the CLI uses it: a self-hosted
|
|
120
|
-
* server's admin API when the database is `standaloneRepository`, or the
|
|
121
|
-
* database's own storage adapter, in process.
|
|
122
|
-
*/
|
|
123
|
-
export const createDatabaseCoreApi = (
|
|
124
|
-
database: unknown,
|
|
125
|
-
options: { readonly now?: () => number } = {},
|
|
126
|
-
): HotUpdaterCoreApi => {
|
|
127
|
-
if (isRecord(database) && isRecord(database.core)) {
|
|
128
|
-
return database.core as unknown as HotUpdaterCoreApi;
|
|
129
|
-
}
|
|
130
|
-
const adapter = engineAdapterOf(database);
|
|
131
|
-
if (adapter === undefined) throw new Error(OFF_ENGINE_DATABASE);
|
|
132
|
-
const engineDatabase = database as Partial<EngineDatabase>;
|
|
133
|
-
return createInProcessCoreApi(adapter, {
|
|
134
|
-
...options,
|
|
135
|
-
...(typeof engineDatabase.onCachedRoutesChange === "function"
|
|
136
|
-
? { onCachedRoutesChange: () => engineDatabase.onCachedRoutesChange!() }
|
|
137
|
-
: {}),
|
|
138
|
-
});
|
|
139
|
-
};
|
|
@@ -1,378 +0,0 @@
|
|
|
1
|
-
import type { Bundle } from "@hot-updater/core";
|
|
2
|
-
import type { HotUpdaterCoreApi } from "@hot-updater/plugin-core";
|
|
3
|
-
import { createMemoryAdapter } from "@hot-updater/plugin-core/internal";
|
|
4
|
-
import { normalizeRange, rangesIntersect } from "verkit";
|
|
5
|
-
import { describe, expect, it } from "vitest";
|
|
6
|
-
|
|
7
|
-
import { createBundleFixture } from "../../../test-utils/src/databaseTestFixtures";
|
|
8
|
-
import { createInProcessCoreApi } from "./api";
|
|
9
|
-
import {
|
|
10
|
-
parseBaseCandidateKey,
|
|
11
|
-
targetBaseCandidateKey,
|
|
12
|
-
type BaseCandidateTarget,
|
|
13
|
-
} from "./baseCandidates";
|
|
14
|
-
|
|
15
|
-
type Target = Pick<BaseCandidateTarget, "appVersion" | "fingerprintHash">;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* The rule `deploy.ts` used before base candidates came from the catalog
|
|
19
|
-
* (`getPatchBaseBundles` on `next`): page the channel and platform's enabled
|
|
20
|
-
* releases newest first, keep bundle releases older than the new bundle with
|
|
21
|
-
* the same fingerprint or an intersecting range, each bundle once.
|
|
22
|
-
*/
|
|
23
|
-
const referenceBaseBundleIds = async (
|
|
24
|
-
core: HotUpdaterCoreApi,
|
|
25
|
-
channel: string,
|
|
26
|
-
target: Target,
|
|
27
|
-
bundleId: string,
|
|
28
|
-
maxBaseBundles: number,
|
|
29
|
-
): Promise<string[]> => {
|
|
30
|
-
const channelRow = await core.findChannelByName(channel);
|
|
31
|
-
if (channelRow === null) return [];
|
|
32
|
-
const pageSize = Math.max(maxBaseBundles * 3, 10);
|
|
33
|
-
const found: string[] = [];
|
|
34
|
-
let after: string | undefined;
|
|
35
|
-
while (found.length < maxBaseBundles) {
|
|
36
|
-
const releases = await core.listReleases({
|
|
37
|
-
filter: {
|
|
38
|
-
kind: "channelPlatform",
|
|
39
|
-
channelId: channelRow.id,
|
|
40
|
-
platform: "ios",
|
|
41
|
-
enabled: true,
|
|
42
|
-
},
|
|
43
|
-
order: "desc",
|
|
44
|
-
limit: pageSize,
|
|
45
|
-
...(after === undefined ? {} : { after }),
|
|
46
|
-
});
|
|
47
|
-
for (const release of releases) {
|
|
48
|
-
const left = target.appVersion && normalizeRange(target.appVersion);
|
|
49
|
-
const right =
|
|
50
|
-
release.target_app_version &&
|
|
51
|
-
normalizeRange(release.target_app_version);
|
|
52
|
-
const compatible = target.fingerprintHash
|
|
53
|
-
? release.strategy === "FINGERPRINT" &&
|
|
54
|
-
release.fingerprint_hash === target.fingerprintHash
|
|
55
|
-
: release.strategy === "APP_VERSION" &&
|
|
56
|
-
!!left &&
|
|
57
|
-
!!right &&
|
|
58
|
-
rangesIntersect(left, right);
|
|
59
|
-
const id = release.bundle_id;
|
|
60
|
-
if (
|
|
61
|
-
compatible &&
|
|
62
|
-
release.kind === "BUNDLE" &&
|
|
63
|
-
id !== null &&
|
|
64
|
-
id < bundleId &&
|
|
65
|
-
!found.includes(id) &&
|
|
66
|
-
found.length < maxBaseBundles
|
|
67
|
-
) {
|
|
68
|
-
found.push(id);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (releases.length < pageSize) break;
|
|
72
|
-
after = releases.at(-1)!.id;
|
|
73
|
-
}
|
|
74
|
-
return found;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const baseBundleIds = (
|
|
78
|
-
core: HotUpdaterCoreApi,
|
|
79
|
-
channel: string,
|
|
80
|
-
target: Target,
|
|
81
|
-
bundleId: string,
|
|
82
|
-
maxBaseBundles: number,
|
|
83
|
-
): Promise<string[]> => {
|
|
84
|
-
const key = targetBaseCandidateKey({ channel, platform: "ios", ...target });
|
|
85
|
-
return key === null
|
|
86
|
-
? Promise.resolve([])
|
|
87
|
-
: core.findBaseBundleIds(key, bundleId, maxBaseBundles);
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
const bundleOf = (n: number): Bundle => ({
|
|
91
|
-
...createBundleFixture(String(n)),
|
|
92
|
-
patches: [],
|
|
93
|
-
});
|
|
94
|
-
const idOf = (n: number) => createBundleFixture(String(n)).id;
|
|
95
|
-
const NEWEST = idOf(999);
|
|
96
|
-
|
|
97
|
-
const policy = (overrides: {
|
|
98
|
-
readonly channel?: string;
|
|
99
|
-
readonly targetAppVersion?: string | null;
|
|
100
|
-
readonly fingerprintHash?: string | null;
|
|
101
|
-
}) => ({
|
|
102
|
-
channel: "production",
|
|
103
|
-
enabled: true,
|
|
104
|
-
fingerprintHash: null,
|
|
105
|
-
message: null,
|
|
106
|
-
shouldForceUpdate: false,
|
|
107
|
-
targetAppVersion: null,
|
|
108
|
-
...overrides,
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
const RELEASE_RANGES = [
|
|
112
|
-
"1.0.0",
|
|
113
|
-
"1.2.3",
|
|
114
|
-
"1.2.9",
|
|
115
|
-
"1.3.0",
|
|
116
|
-
"2.0.0",
|
|
117
|
-
"0.2.5",
|
|
118
|
-
"1.2.3-beta.1",
|
|
119
|
-
"1.2",
|
|
120
|
-
"1.2.x",
|
|
121
|
-
"2.x",
|
|
122
|
-
"~1.2.3",
|
|
123
|
-
"~1.2.5",
|
|
124
|
-
"^0.2.3",
|
|
125
|
-
">=1.0.0 <1.4.0",
|
|
126
|
-
">=1.2.0 <=1.2.5",
|
|
127
|
-
"1.2.3 - 1.4.0",
|
|
128
|
-
">=1.0.0 <1.16.0",
|
|
129
|
-
"1.2.x || 1.5.x",
|
|
130
|
-
"1.0.0 || 2.0.0",
|
|
131
|
-
"1.x",
|
|
132
|
-
"^1.2.3",
|
|
133
|
-
">=1.2.0",
|
|
134
|
-
"<2.0.0",
|
|
135
|
-
"*",
|
|
136
|
-
"1.20.0",
|
|
137
|
-
"1.20.x",
|
|
138
|
-
">=1.5.0 <2.1.0",
|
|
139
|
-
"3.0.0",
|
|
140
|
-
];
|
|
141
|
-
|
|
142
|
-
const TARGET_RANGES = [
|
|
143
|
-
"1.0.0",
|
|
144
|
-
"1.2.0",
|
|
145
|
-
"1.2.3",
|
|
146
|
-
"1.2.4",
|
|
147
|
-
"1.2.9",
|
|
148
|
-
"1.3.0",
|
|
149
|
-
"1.5.2",
|
|
150
|
-
"1.15.2",
|
|
151
|
-
"1.16.0",
|
|
152
|
-
"1.20.0",
|
|
153
|
-
"2.0.0",
|
|
154
|
-
"3.0.0",
|
|
155
|
-
"0.2.5",
|
|
156
|
-
"1.2",
|
|
157
|
-
"1.2.x",
|
|
158
|
-
"~1.2.3",
|
|
159
|
-
"^1.2.3",
|
|
160
|
-
"1.x",
|
|
161
|
-
"2.x",
|
|
162
|
-
"0.x",
|
|
163
|
-
">=1.2.0 <2",
|
|
164
|
-
">=1.0.0",
|
|
165
|
-
"1.2.3 || 2.0.0",
|
|
166
|
-
"*",
|
|
167
|
-
];
|
|
168
|
-
|
|
169
|
-
describe("base candidate keys", () => {
|
|
170
|
-
it("names the target's catalog scope and normalized range", () => {
|
|
171
|
-
const key = targetBaseCandidateKey({
|
|
172
|
-
channel: "채널-🚀",
|
|
173
|
-
platform: "ios",
|
|
174
|
-
fingerprintHash: null,
|
|
175
|
-
appVersion: "1.2.x",
|
|
176
|
-
})!;
|
|
177
|
-
expect(key).toMatch(/^[\x20-\x7e]+$/u);
|
|
178
|
-
expect(parseBaseCandidateKey(key)).toEqual({
|
|
179
|
-
scopeKey: expect.stringMatching(/^v1:app-version:ios:/),
|
|
180
|
-
range: ">=1.2.0 <1.3.0-0",
|
|
181
|
-
});
|
|
182
|
-
expect(
|
|
183
|
-
parseBaseCandidateKey(
|
|
184
|
-
targetBaseCandidateKey({
|
|
185
|
-
channel: "production",
|
|
186
|
-
platform: "android",
|
|
187
|
-
fingerprintHash: "fp",
|
|
188
|
-
appVersion: "1.x",
|
|
189
|
-
})!,
|
|
190
|
-
),
|
|
191
|
-
).toEqual({
|
|
192
|
-
scopeKey: expect.stringMatching(/^v1:fingerprint:android:.*:fp$/),
|
|
193
|
-
range: null,
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
it("names nothing for an invalid range or key", () => {
|
|
198
|
-
expect(
|
|
199
|
-
targetBaseCandidateKey({
|
|
200
|
-
channel: "production",
|
|
201
|
-
platform: "ios",
|
|
202
|
-
fingerprintHash: null,
|
|
203
|
-
appVersion: "not a range",
|
|
204
|
-
}),
|
|
205
|
-
).toBeNull();
|
|
206
|
-
for (const key of [
|
|
207
|
-
"",
|
|
208
|
-
"[]",
|
|
209
|
-
'["v1:app-version:ios"]',
|
|
210
|
-
'["x", "*"]',
|
|
211
|
-
'["v1:app-version:ios:cHJvZHVjdGlvbg", "not a range"]',
|
|
212
|
-
]) {
|
|
213
|
-
expect(parseBaseCandidateKey(key)).toBeNull();
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
describe("auto-patch bases against the rule deploy used before", () => {
|
|
219
|
-
it("finds exactly the bases the reference finds, for every range pair", async () => {
|
|
220
|
-
const core = createInProcessCoreApi(createMemoryAdapter());
|
|
221
|
-
for (const [n, range] of RELEASE_RANGES.entries()) {
|
|
222
|
-
await core.deploy([
|
|
223
|
-
{
|
|
224
|
-
bundle: bundleOf(100 + n),
|
|
225
|
-
release: policy({ targetAppVersion: range }),
|
|
226
|
-
},
|
|
227
|
-
]);
|
|
228
|
-
}
|
|
229
|
-
const differences: string[] = [];
|
|
230
|
-
const withoutBases: string[] = [];
|
|
231
|
-
let matches = 0;
|
|
232
|
-
for (const range of TARGET_RANGES) {
|
|
233
|
-
const target = { appVersion: range, fingerprintHash: null };
|
|
234
|
-
const reference = await referenceBaseBundleIds(
|
|
235
|
-
core,
|
|
236
|
-
"production",
|
|
237
|
-
target,
|
|
238
|
-
NEWEST,
|
|
239
|
-
100,
|
|
240
|
-
);
|
|
241
|
-
matches += reference.length;
|
|
242
|
-
if (reference.length === 0) withoutBases.push(range);
|
|
243
|
-
const found = await baseBundleIds(
|
|
244
|
-
core,
|
|
245
|
-
"production",
|
|
246
|
-
target,
|
|
247
|
-
NEWEST,
|
|
248
|
-
100,
|
|
249
|
-
);
|
|
250
|
-
if (JSON.stringify(found) !== JSON.stringify(reference)) {
|
|
251
|
-
differences.push(range);
|
|
252
|
-
}
|
|
253
|
-
// `maxBaseBundles` keeps the newest releases first, as before
|
|
254
|
-
await expect(
|
|
255
|
-
baseBundleIds(core, "production", target, NEWEST, 3),
|
|
256
|
-
).resolves.toEqual(reference.slice(0, 3));
|
|
257
|
-
}
|
|
258
|
-
expect(differences).toEqual([]);
|
|
259
|
-
// 299 of the 672 pairs meet, and every target, `*` and `1.x` included,
|
|
260
|
-
// finds bases
|
|
261
|
-
expect(matches).toBe(299);
|
|
262
|
-
expect(withoutBases).toEqual([]);
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
it("pairs no target in the gap of a lone release's range", async () => {
|
|
266
|
-
const core = createInProcessCoreApi(createMemoryAdapter());
|
|
267
|
-
await core.deploy([
|
|
268
|
-
{
|
|
269
|
-
bundle: bundleOf(100),
|
|
270
|
-
release: policy({ targetAppVersion: "1.2.x || 1.5.x" }),
|
|
271
|
-
},
|
|
272
|
-
]);
|
|
273
|
-
for (const [appVersion, bases] of [
|
|
274
|
-
["1.4.0", []],
|
|
275
|
-
["1.2.4", [idOf(100)]],
|
|
276
|
-
["1.5.2", [idOf(100)]],
|
|
277
|
-
] as const) {
|
|
278
|
-
const target = { appVersion, fingerprintHash: null };
|
|
279
|
-
await expect(
|
|
280
|
-
referenceBaseBundleIds(core, "production", target, NEWEST, 3),
|
|
281
|
-
).resolves.toEqual(bases);
|
|
282
|
-
await expect(
|
|
283
|
-
baseBundleIds(core, "production", target, NEWEST, 3),
|
|
284
|
-
).resolves.toEqual(bases);
|
|
285
|
-
}
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it("differs only for an exact prerelease target that a release names", async () => {
|
|
289
|
-
// Both rules pair `1.2.3-beta.1` only with ranges that allow its
|
|
290
|
-
// prerelease; the catalog keeps no range text, so once a release names
|
|
291
|
-
// that prerelease, the other ranges around it pair with it too. No
|
|
292
|
-
// device runs a prerelease app version: the update check coerces it.
|
|
293
|
-
const core = createInProcessCoreApi(createMemoryAdapter());
|
|
294
|
-
for (const [n, range] of ["1.2.x", "1.2.3-beta.1"].entries()) {
|
|
295
|
-
await core.deploy([
|
|
296
|
-
{
|
|
297
|
-
bundle: bundleOf(100 + n),
|
|
298
|
-
release: policy({ targetAppVersion: range }),
|
|
299
|
-
},
|
|
300
|
-
]);
|
|
301
|
-
}
|
|
302
|
-
const target = { appVersion: "1.2.3-beta.1", fingerprintHash: null };
|
|
303
|
-
await expect(
|
|
304
|
-
referenceBaseBundleIds(core, "production", target, NEWEST, 3),
|
|
305
|
-
).resolves.toEqual([idOf(101)]);
|
|
306
|
-
await expect(
|
|
307
|
-
baseBundleIds(core, "production", target, NEWEST, 3),
|
|
308
|
-
).resolves.toEqual([idOf(101), idOf(100)]);
|
|
309
|
-
const ranged = { appVersion: "1.2.x", fingerprintHash: null };
|
|
310
|
-
await expect(
|
|
311
|
-
baseBundleIds(core, "production", ranged, NEWEST, 3),
|
|
312
|
-
).resolves.toEqual(
|
|
313
|
-
await referenceBaseBundleIds(core, "production", ranged, NEWEST, 3),
|
|
314
|
-
);
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
it("orders by release like the reference: promotions, republishes, disabled releases, fingerprints", async () => {
|
|
318
|
-
const core = createInProcessCoreApi(createMemoryAdapter());
|
|
319
|
-
const both = async (target: Target) => {
|
|
320
|
-
const reference = await referenceBaseBundleIds(
|
|
321
|
-
core,
|
|
322
|
-
"production",
|
|
323
|
-
target,
|
|
324
|
-
NEWEST,
|
|
325
|
-
3,
|
|
326
|
-
);
|
|
327
|
-
await expect(
|
|
328
|
-
baseBundleIds(core, "production", target, NEWEST, 3),
|
|
329
|
-
).resolves.toEqual(reference);
|
|
330
|
-
return reference;
|
|
331
|
-
};
|
|
332
|
-
const v1 = { appVersion: "1.0.0", fingerprintHash: null };
|
|
333
|
-
const [staged] = await core.deploy([
|
|
334
|
-
{
|
|
335
|
-
bundle: bundleOf(10),
|
|
336
|
-
release: policy({ channel: "staging", targetAppVersion: "1.0.0" }),
|
|
337
|
-
},
|
|
338
|
-
]);
|
|
339
|
-
const releaseIds: string[] = [];
|
|
340
|
-
for (let n = 11; n <= 15; n += 1) {
|
|
341
|
-
const [deployed] = await core.deploy([
|
|
342
|
-
{ bundle: bundleOf(n), release: policy({ targetAppVersion: "1.0.0" }) },
|
|
343
|
-
]);
|
|
344
|
-
releaseIds.push(deployed!.release!.id);
|
|
345
|
-
}
|
|
346
|
-
expect(await both(v1)).toEqual([15, 14, 13].map(idOf));
|
|
347
|
-
// a promotion is the newest release of an older bundle
|
|
348
|
-
await core.promoteRelease({
|
|
349
|
-
releaseId: staged!.release!.id,
|
|
350
|
-
targetChannel: "production",
|
|
351
|
-
});
|
|
352
|
-
expect(await both(v1)).toEqual([10, 15, 14].map(idOf));
|
|
353
|
-
await core.deploy([
|
|
354
|
-
{ bundleId: idOf(11), release: policy({ targetAppVersion: "1.0.0" }) },
|
|
355
|
-
]);
|
|
356
|
-
expect(await both(v1)).toEqual([11, 10, 15].map(idOf));
|
|
357
|
-
await core.updateReleasePolicy({
|
|
358
|
-
releaseId: releaseIds[4]!,
|
|
359
|
-
patch: { enabled: false },
|
|
360
|
-
});
|
|
361
|
-
expect(await both(v1)).toEqual([11, 10, 14].map(idOf));
|
|
362
|
-
for (let n = 20; n <= 23; n += 1) {
|
|
363
|
-
await core.deploy([
|
|
364
|
-
{
|
|
365
|
-
bundle: bundleOf(n),
|
|
366
|
-
release: policy({ fingerprintHash: n === 22 ? "fp-b" : "fp-a" }),
|
|
367
|
-
},
|
|
368
|
-
]);
|
|
369
|
-
}
|
|
370
|
-
expect(await both({ appVersion: null, fingerprintHash: "fp-a" })).toEqual(
|
|
371
|
-
[23, 21, 20].map(idOf),
|
|
372
|
-
);
|
|
373
|
-
// the new bundle is never its own base, nor is a newer one
|
|
374
|
-
await expect(
|
|
375
|
-
baseBundleIds(core, "production", v1, idOf(14), 3),
|
|
376
|
-
).resolves.toEqual([11, 10, 13].map(idOf));
|
|
377
|
-
});
|
|
378
|
-
});
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createReleaseCatalogScopeKey,
|
|
3
|
-
encodeChannelKey,
|
|
4
|
-
parseReleaseCatalogScopeKey,
|
|
5
|
-
} from "@hot-updater/core";
|
|
6
|
-
import type {
|
|
7
|
-
CompiledCatalogSegment,
|
|
8
|
-
ReleaseCatalogRow,
|
|
9
|
-
} from "@hot-updater/plugin-core";
|
|
10
|
-
import { normalizeRange, rangesIntersect } from "verkit";
|
|
11
|
-
|
|
12
|
-
import { parseCompiledCatalog } from "../db/releaseCatalog";
|
|
13
|
-
|
|
14
|
-
/** A new bundle's auto-patch target: where it is released, and to whom. */
|
|
15
|
-
export interface BaseCandidateTarget {
|
|
16
|
-
readonly channel: string;
|
|
17
|
-
readonly platform: "ios" | "android";
|
|
18
|
-
readonly fingerprintHash: string | null;
|
|
19
|
-
readonly appVersion: string | null;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** What a base-candidate key names: a catalog scope, and an app-version scope's target range. */
|
|
23
|
-
export interface BaseCandidateQuery {
|
|
24
|
-
readonly scopeKey: string;
|
|
25
|
-
readonly range: string | null;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* A new bundle's base-candidate key: the Release Catalog scope its devices
|
|
30
|
-
* update from, and for an app version its normalized range; null for a
|
|
31
|
-
* target without a valid range.
|
|
32
|
-
*/
|
|
33
|
-
export const targetBaseCandidateKey = (
|
|
34
|
-
target: BaseCandidateTarget,
|
|
35
|
-
): string | null => {
|
|
36
|
-
const channelKey = encodeChannelKey(target.channel);
|
|
37
|
-
if (target.fingerprintHash) {
|
|
38
|
-
return JSON.stringify([
|
|
39
|
-
createReleaseCatalogScopeKey({
|
|
40
|
-
channelKey,
|
|
41
|
-
fingerprintHash: target.fingerprintHash,
|
|
42
|
-
platform: target.platform,
|
|
43
|
-
strategy: "FINGERPRINT",
|
|
44
|
-
}),
|
|
45
|
-
]);
|
|
46
|
-
}
|
|
47
|
-
const range =
|
|
48
|
-
target.appVersion === null ? null : normalizeRange(target.appVersion);
|
|
49
|
-
return range === null
|
|
50
|
-
? null
|
|
51
|
-
: JSON.stringify([
|
|
52
|
-
createReleaseCatalogScopeKey({
|
|
53
|
-
channelKey,
|
|
54
|
-
platform: target.platform,
|
|
55
|
-
strategy: "APP_VERSION",
|
|
56
|
-
}),
|
|
57
|
-
range,
|
|
58
|
-
]);
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
/** The scope and range a base-candidate key names; null for any other string. */
|
|
62
|
-
export const parseBaseCandidateKey = (
|
|
63
|
-
key: string,
|
|
64
|
-
): BaseCandidateQuery | null => {
|
|
65
|
-
try {
|
|
66
|
-
const parsed: unknown = JSON.parse(key);
|
|
67
|
-
if (!Array.isArray(parsed) || typeof parsed[0] !== "string") return null;
|
|
68
|
-
const [scopeKey, text] = parsed as [string, unknown];
|
|
69
|
-
const { strategy } = parseReleaseCatalogScopeKey(scopeKey);
|
|
70
|
-
if (strategy === "FINGERPRINT") {
|
|
71
|
-
return parsed.length === 1 ? { scopeKey, range: null } : null;
|
|
72
|
-
}
|
|
73
|
-
const range =
|
|
74
|
-
parsed.length === 2 && typeof text === "string"
|
|
75
|
-
? normalizeRange(text)
|
|
76
|
-
: null;
|
|
77
|
-
return range === null ? null : { scopeKey, range };
|
|
78
|
-
} catch {
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
/** A compiled segment as a range: its version when it holds exactly one. */
|
|
84
|
-
const segmentRange = ({ lower, upper }: CompiledCatalogSegment): string =>
|
|
85
|
-
lower?.inclusive && upper?.inclusive && lower.version === upper.version
|
|
86
|
-
? lower.version
|
|
87
|
-
: [
|
|
88
|
-
lower === null ? "" : `${lower.inclusive ? ">=" : ">"}${lower.version}`,
|
|
89
|
-
upper === null ? "" : `${upper.inclusive ? "<=" : "<"}${upper.version}`,
|
|
90
|
-
]
|
|
91
|
-
.join(" ")
|
|
92
|
-
.trim() || "*";
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Auto-patch bases from a scope's compiled Release Catalog, which holds
|
|
96
|
-
* every enabled bundle release of the scope: those whose range intersects
|
|
97
|
-
* `range` (all of them in a fingerprint scope), newest release first, each
|
|
98
|
-
* bundle once and older than `bundleId`, at most `limit`.
|
|
99
|
-
*/
|
|
100
|
-
export const baseBundleIdsOf = (
|
|
101
|
-
row: ReleaseCatalogRow,
|
|
102
|
-
range: string | null,
|
|
103
|
-
bundleId: string,
|
|
104
|
-
limit: number,
|
|
105
|
-
): string[] => {
|
|
106
|
-
const catalog = parseCompiledCatalog(row.payload, row.strategy);
|
|
107
|
-
const serving = new Set(
|
|
108
|
-
catalog.strategy === "FINGERPRINT"
|
|
109
|
-
? catalog.rollbackReleaseIndexes
|
|
110
|
-
: catalog.segments.flatMap((segment) =>
|
|
111
|
-
range !== null && rangesIntersect(range, segmentRange(segment))
|
|
112
|
-
? segment.rollbackReleaseIndexes
|
|
113
|
-
: [],
|
|
114
|
-
),
|
|
115
|
-
);
|
|
116
|
-
const newestFirst = catalog.releaseDescriptors
|
|
117
|
-
.map((descriptor, index) => ({ descriptor, index }))
|
|
118
|
-
.sort((left, right) =>
|
|
119
|
-
left.descriptor.releaseId < right.descriptor.releaseId ? 1 : -1,
|
|
120
|
-
);
|
|
121
|
-
const ids: string[] = [];
|
|
122
|
-
for (const { descriptor, index } of newestFirst) {
|
|
123
|
-
if (ids.length >= limit) break;
|
|
124
|
-
const id = descriptor.bundleId;
|
|
125
|
-
if (
|
|
126
|
-
serving.has(index) &&
|
|
127
|
-
descriptor.kind === "BUNDLE" &&
|
|
128
|
-
id !== null &&
|
|
129
|
-
id < bundleId &&
|
|
130
|
-
!ids.includes(id)
|
|
131
|
-
) {
|
|
132
|
-
ids.push(id);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return ids;
|
|
136
|
-
};
|
package/src/core/index.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
targetBaseCandidateKey,
|
|
3
|
-
type BaseCandidateTarget,
|
|
4
|
-
} from "./baseCandidates";
|
|
5
|
-
export {
|
|
6
|
-
createCoreApi,
|
|
7
|
-
createDatabaseCoreApi,
|
|
8
|
-
createInProcessCoreApi,
|
|
9
|
-
type CoreApi,
|
|
10
|
-
} from "./api";
|
|
11
|
-
export { createCoreOperations } from "./operations";
|
|
12
|
-
export {
|
|
13
|
-
changeReleases,
|
|
14
|
-
rebuildCatalog,
|
|
15
|
-
type ReleaseChange,
|
|
16
|
-
type ReleaseChangeInput,
|
|
17
|
-
type ReleaseChangeResult,
|
|
18
|
-
} from "./releases";
|
|
19
|
-
export {
|
|
20
|
-
createCoreReads,
|
|
21
|
-
toBundleRow,
|
|
22
|
-
toCatalogRow,
|
|
23
|
-
toChannelRow,
|
|
24
|
-
toPatchRow,
|
|
25
|
-
toReleaseRow,
|
|
26
|
-
type BundleDetail,
|
|
27
|
-
type CoreDatabase,
|
|
28
|
-
type CoreReads,
|
|
29
|
-
type CoreStorage,
|
|
30
|
-
type KeysetInput,
|
|
31
|
-
type ReleaseFilter,
|
|
32
|
-
} from "./reads";
|
|
33
|
-
export {
|
|
34
|
-
coreModule,
|
|
35
|
-
coreSchema,
|
|
36
|
-
HOT_UPDATER_SCHEMA_VERSION,
|
|
37
|
-
type CoreSchema,
|
|
38
|
-
} from "./schema";
|
|
39
|
-
export {
|
|
40
|
-
deleteChannel,
|
|
41
|
-
insertBundle,
|
|
42
|
-
insertChannel,
|
|
43
|
-
type CoreTransaction,
|
|
44
|
-
} from "./writes";
|