@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
|
@@ -1,47 +1,6 @@
|
|
|
1
1
|
import { parseCompiledCatalog } from "../db/releaseCatalog.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import { normalizeRange, rangesIntersect } from "verkit";
|
|
2
|
+
import { rangesIntersect } from "verkit";
|
|
4
3
|
//#region src/core/baseCandidates.ts
|
|
5
|
-
/**
|
|
6
|
-
* A new bundle's base-candidate key: the Release Catalog scope its devices
|
|
7
|
-
* update from, and for an app version its normalized range; null for a
|
|
8
|
-
* target without a valid range.
|
|
9
|
-
*/
|
|
10
|
-
const targetBaseCandidateKey = (target) => {
|
|
11
|
-
const channelKey = encodeChannelKey(target.channel);
|
|
12
|
-
if (target.fingerprintHash) return JSON.stringify([createReleaseCatalogScopeKey({
|
|
13
|
-
channelKey,
|
|
14
|
-
fingerprintHash: target.fingerprintHash,
|
|
15
|
-
platform: target.platform,
|
|
16
|
-
strategy: "FINGERPRINT"
|
|
17
|
-
})]);
|
|
18
|
-
const range = target.appVersion === null ? null : normalizeRange(target.appVersion);
|
|
19
|
-
return range === null ? null : JSON.stringify([createReleaseCatalogScopeKey({
|
|
20
|
-
channelKey,
|
|
21
|
-
platform: target.platform,
|
|
22
|
-
strategy: "APP_VERSION"
|
|
23
|
-
}), range]);
|
|
24
|
-
};
|
|
25
|
-
/** The scope and range a base-candidate key names; null for any other string. */
|
|
26
|
-
const parseBaseCandidateKey = (key) => {
|
|
27
|
-
try {
|
|
28
|
-
const parsed = JSON.parse(key);
|
|
29
|
-
if (!Array.isArray(parsed) || typeof parsed[0] !== "string") return null;
|
|
30
|
-
const [scopeKey, text] = parsed;
|
|
31
|
-
const { strategy } = parseReleaseCatalogScopeKey(scopeKey);
|
|
32
|
-
if (strategy === "FINGERPRINT") return parsed.length === 1 ? {
|
|
33
|
-
scopeKey,
|
|
34
|
-
range: null
|
|
35
|
-
} : null;
|
|
36
|
-
const range = parsed.length === 2 && typeof text === "string" ? normalizeRange(text) : null;
|
|
37
|
-
return range === null ? null : {
|
|
38
|
-
scopeKey,
|
|
39
|
-
range
|
|
40
|
-
};
|
|
41
|
-
} catch {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
4
|
/** A compiled segment as a range: its version when it holds exactly one. */
|
|
46
5
|
const segmentRange = ({ lower, upper }) => lower?.inclusive && upper?.inclusive && lower.version === upper.version ? lower.version : [lower === null ? "" : `${lower.inclusive ? ">=" : ">"}${lower.version}`, upper === null ? "" : `${upper.inclusive ? "<=" : "<"}${upper.version}`].join(" ").trim() || "*";
|
|
47
6
|
/**
|
|
@@ -66,4 +25,4 @@ const baseBundleIdsOf = (row, range, bundleId, limit) => {
|
|
|
66
25
|
return ids;
|
|
67
26
|
};
|
|
68
27
|
//#endregion
|
|
69
|
-
export { baseBundleIdsOf
|
|
28
|
+
export { baseBundleIdsOf };
|
package/dist/core/operations.cjs
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
const require_errors = require("../database/errors.cjs");
|
|
2
1
|
const require_reads = require("./reads.cjs");
|
|
3
2
|
const require_writes = require("./writes.cjs");
|
|
4
3
|
const require_releases = require("./releases.cjs");
|
|
5
4
|
let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
|
|
6
|
-
let
|
|
7
|
-
let _hot_updater_core = require("@hot-updater/core");
|
|
5
|
+
let _hot_updater_protocol = require("@hot-updater/protocol");
|
|
8
6
|
//#region src/core/operations.ts
|
|
9
7
|
/** Carries a preflight's result out of the transaction it stops, so nothing is written. */
|
|
10
8
|
var Preflight = class extends Error {
|
|
@@ -27,13 +25,13 @@ const dryRun = async (db, read) => {
|
|
|
27
25
|
};
|
|
28
26
|
/** A channel's catalog scope for a platform, and a fingerprint when it has one. */
|
|
29
27
|
const scopeOf = (channel, platform, fingerprintHash) => {
|
|
30
|
-
const channelKey = (0,
|
|
28
|
+
const channelKey = (0, _hot_updater_protocol.encodeChannelKey)(channel.name);
|
|
31
29
|
return fingerprintHash === null ? {
|
|
32
30
|
channelId: channel.id,
|
|
33
31
|
channelName: channel.name,
|
|
34
32
|
fingerprintHash,
|
|
35
33
|
platform,
|
|
36
|
-
scopeKey: (0,
|
|
34
|
+
scopeKey: (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
|
|
37
35
|
channelKey,
|
|
38
36
|
platform,
|
|
39
37
|
strategy: "APP_VERSION"
|
|
@@ -44,7 +42,7 @@ const scopeOf = (channel, platform, fingerprintHash) => {
|
|
|
44
42
|
channelName: channel.name,
|
|
45
43
|
fingerprintHash,
|
|
46
44
|
platform,
|
|
47
|
-
scopeKey: (0,
|
|
45
|
+
scopeKey: (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
|
|
48
46
|
channelKey,
|
|
49
47
|
fingerprintHash,
|
|
50
48
|
platform,
|
|
@@ -65,7 +63,7 @@ const loadTarget = async (tx, { releaseId, expectedRevision }) => {
|
|
|
65
63
|
release,
|
|
66
64
|
scope: {
|
|
67
65
|
channelId: release.channel_id,
|
|
68
|
-
channelName: (0,
|
|
66
|
+
channelName: (0, _hot_updater_protocol.decodeChannelKey)(catalog.channel_key),
|
|
69
67
|
fingerprintHash: release.fingerprint_hash,
|
|
70
68
|
platform: release.platform,
|
|
71
69
|
scopeKey: release.scope_key,
|
|
@@ -96,7 +94,7 @@ const catalogScope = async (tx, scopeKey) => {
|
|
|
96
94
|
if (row === null) throw new Error(`Release catalog "${scopeKey}" was not found.`);
|
|
97
95
|
return {
|
|
98
96
|
channelId: row.channel_id,
|
|
99
|
-
channelName: (0,
|
|
97
|
+
channelName: (0, _hot_updater_protocol.decodeChannelKey)(row.channel_key),
|
|
100
98
|
fingerprintHash: row.fingerprint_hash,
|
|
101
99
|
platform: row.platform,
|
|
102
100
|
scopeKey: row.scope_key,
|
|
@@ -110,7 +108,7 @@ const catalogScope = async (tx, scopeKey) => {
|
|
|
110
108
|
*/
|
|
111
109
|
const createCoreOperations = (db, { now = Date.now } = {}) => {
|
|
112
110
|
const ensureChannel = async (name) => (await require_writes.insertChannel(db, {
|
|
113
|
-
id: `channel:${(0,
|
|
111
|
+
id: `channel:${(0, _hot_updater_protocol.encodeChannelKey)(name)}`,
|
|
114
112
|
name
|
|
115
113
|
})).row;
|
|
116
114
|
/**
|
|
@@ -121,7 +119,7 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
|
|
|
121
119
|
for (let attempt = 1;; attempt += 1) try {
|
|
122
120
|
return await write();
|
|
123
121
|
} catch (error) {
|
|
124
|
-
if (attempt < 3 && error instanceof
|
|
122
|
+
if (attempt < 3 && error instanceof _hot_updater_plugin_core.DatabaseConstraintError && error.reason === "not_found" && error.model === "channels") continue;
|
|
125
123
|
throw error;
|
|
126
124
|
}
|
|
127
125
|
};
|
|
@@ -218,7 +216,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
|
|
|
218
216
|
deleteRelease: (input) => db.transaction(async (tx) => {
|
|
219
217
|
const { release, scope } = await loadTarget(tx, input);
|
|
220
218
|
if (release.enabled) throw new _hot_updater_plugin_core.ReleaseManagementError("ENABLED_RELEASE", `Disable Release "${release.id}" before hard deletion.`);
|
|
221
|
-
|
|
219
|
+
const bundle = release.bundle_id === null ? null : await tx.findOne("bundles", { id: release.bundle_id });
|
|
220
|
+
const result = mutationResult(await require_releases.changeRelease(tx, {
|
|
222
221
|
scope,
|
|
223
222
|
change: {
|
|
224
223
|
operation: "delete",
|
|
@@ -226,6 +225,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
|
|
|
226
225
|
},
|
|
227
226
|
updatedAtMs: now()
|
|
228
227
|
}));
|
|
228
|
+
if (bundle !== null && (bundle._refs_releases_bundle_id ?? 0) <= 1) await require_writes.deleteBundle(tx, bundle);
|
|
229
|
+
return result;
|
|
229
230
|
}),
|
|
230
231
|
promoteRelease: (input) => withChannels(async () => {
|
|
231
232
|
const checkSource = (source) => {
|
|
@@ -340,7 +341,7 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
|
|
|
340
341
|
}
|
|
341
342
|
});
|
|
342
343
|
} catch (error) {
|
|
343
|
-
if (error instanceof
|
|
344
|
+
if (error instanceof _hot_updater_plugin_core.DatabaseConstraintError && error.reason === "referenced") throw new _hot_updater_plugin_core.DatabaseRowReferencedError();
|
|
344
345
|
throw error;
|
|
345
346
|
}
|
|
346
347
|
}
|
package/dist/core/operations.mjs
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { DatabaseConstraintError } from "../database/errors.mjs";
|
|
2
1
|
import { toBundleRow, toReleaseRow } from "./reads.mjs";
|
|
3
2
|
import { deleteBundle, deleteChannel, insertChannel, replaceBundlePatches, updateBundle } from "./writes.mjs";
|
|
4
3
|
import { changeRelease, changeReleases, readCatalog, rebuildScope } from "./releases.mjs";
|
|
5
|
-
import { DatabaseBundleNotFoundError, ReleaseCatalogMutationError, ReleaseManagementError, bundleToPatchRows, bundleToRow, createUUIDv7After, isUUIDv7, rowToBundle } from "@hot-updater/plugin-core";
|
|
6
|
-
import {
|
|
7
|
-
import { createReleaseCatalogScopeKey, decodeChannelKey, encodeChannelKey } from "@hot-updater/core";
|
|
4
|
+
import { DatabaseBundleNotFoundError, DatabaseConstraintError, DatabaseRowReferencedError, ReleaseCatalogMutationError, ReleaseManagementError, bundleToPatchRows, bundleToRow, createUUIDv7After, isUUIDv7, rowToBundle } from "@hot-updater/plugin-core";
|
|
5
|
+
import { createReleaseCatalogScopeKey, decodeChannelKey, encodeChannelKey } from "@hot-updater/protocol";
|
|
8
6
|
//#region src/core/operations.ts
|
|
9
7
|
/** Carries a preflight's result out of the transaction it stops, so nothing is written. */
|
|
10
8
|
var Preflight = class extends Error {
|
|
@@ -218,7 +216,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
|
|
|
218
216
|
deleteRelease: (input) => db.transaction(async (tx) => {
|
|
219
217
|
const { release, scope } = await loadTarget(tx, input);
|
|
220
218
|
if (release.enabled) throw new ReleaseManagementError("ENABLED_RELEASE", `Disable Release "${release.id}" before hard deletion.`);
|
|
221
|
-
|
|
219
|
+
const bundle = release.bundle_id === null ? null : await tx.findOne("bundles", { id: release.bundle_id });
|
|
220
|
+
const result = mutationResult(await changeRelease(tx, {
|
|
222
221
|
scope,
|
|
223
222
|
change: {
|
|
224
223
|
operation: "delete",
|
|
@@ -226,6 +225,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
|
|
|
226
225
|
},
|
|
227
226
|
updatedAtMs: now()
|
|
228
227
|
}));
|
|
228
|
+
if (bundle !== null && (bundle._refs_releases_bundle_id ?? 0) <= 1) await deleteBundle(tx, bundle);
|
|
229
|
+
return result;
|
|
229
230
|
}),
|
|
230
231
|
promoteRelease: (input) => withChannels(async () => {
|
|
231
232
|
const checkSource = (source) => {
|
package/dist/core/reads.cjs
CHANGED
|
@@ -2,7 +2,7 @@ const require_releaseCatalog = require("../db/releaseCatalog.cjs");
|
|
|
2
2
|
const require_updateArtifacts = require("../db/updateArtifacts.cjs");
|
|
3
3
|
const require_baseCandidates = require("./baseCandidates.cjs");
|
|
4
4
|
let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
|
|
5
|
-
let
|
|
5
|
+
let _hot_updater_protocol = require("@hot-updater/protocol");
|
|
6
6
|
//#region src/core/reads.ts
|
|
7
7
|
const PAGE = 500;
|
|
8
8
|
const pick = (fields) => (row) => Object.fromEntries(fields.map((field) => [field, row[field]]));
|
|
@@ -108,8 +108,8 @@ const createCoreReads = (db, storage) => {
|
|
|
108
108
|
/** Artifact resolution: one batch read of both bundles and one unique read of their patch. */
|
|
109
109
|
async getArtifactInfo(targetBundleId, currentBundleId, artifactProtocolVersion) {
|
|
110
110
|
const { readStorageText } = storage;
|
|
111
|
-
if (artifactProtocolVersion !==
|
|
112
|
-
const withCurrent = currentBundleId !==
|
|
111
|
+
if (artifactProtocolVersion !== _hot_updater_protocol.ARTIFACT_PROTOCOL_VERSION || readStorageText === void 0) return null;
|
|
112
|
+
const withCurrent = currentBundleId !== _hot_updater_protocol.NIL_UUID;
|
|
113
113
|
const [[target, current], patch] = await Promise.all([db.findByKeys("bundles", withCurrent ? [{ id: targetBundleId }, { id: currentBundleId }] : [{ id: targetBundleId }]), withCurrent ? db.findOne("bundle_patches", {
|
|
114
114
|
bundle_id: targetBundleId,
|
|
115
115
|
base_bundle_id: currentBundleId
|
|
@@ -172,7 +172,7 @@ const createCoreReads = (db, storage) => {
|
|
|
172
172
|
},
|
|
173
173
|
/** Auto-patch bases for a new bundle: one point read of its scope's catalog. */
|
|
174
174
|
async findBaseBundleIds(candidateKey, bundleId, limit) {
|
|
175
|
-
const query =
|
|
175
|
+
const query = (0, _hot_updater_plugin_core.parseBaseCandidateKey)(candidateKey);
|
|
176
176
|
if (query === null) return [];
|
|
177
177
|
const row = await db.findOne("release_catalogs", { scope_key: query.scopeKey });
|
|
178
178
|
return row === null ? [] : require_baseCandidates.baseBundleIdsOf(toCatalogRow(row), query.range, bundleId, limit);
|
package/dist/core/reads.d.cts
CHANGED
|
@@ -1,48 +1,9 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import { HotUpdaterDatabase } from "../database/database.cjs";
|
|
3
|
-
import { ReleaseCatalogRequest } from "../db/releaseCatalog.cjs";
|
|
4
|
-
import { CoreSchema } from "./schema.cjs";
|
|
5
|
-
import { BundleDetail, BundlePatchRow, ChannelRow, KeysetInput, ReleaseCatalogRow, ReleaseFilter, ReleaseRow } from "@hot-updater/plugin-core";
|
|
6
|
-
import { ArtifactInfo, ReleaseCatalog } from "@hot-updater/core";
|
|
1
|
+
import { CoreSchema, HotUpdaterDatabase } from "@hot-updater/plugin-core";
|
|
7
2
|
//#region src/core/reads.d.ts
|
|
8
3
|
type CoreDatabase = HotUpdaterDatabase<CoreSchema>;
|
|
9
4
|
interface CoreStorage {
|
|
10
5
|
readonly readStorageText?: (storageUri: string) => Promise<string | null>;
|
|
11
6
|
readonly resolveFileUrl: (storageUri: string | null) => Promise<string | null>;
|
|
12
7
|
}
|
|
13
|
-
/** Core's reads, each through one declared index or key. */
|
|
14
|
-
declare const createCoreReads: (db: CoreDatabase, storage: CoreStorage) => {
|
|
15
|
-
/** The update check: one point read of its scope's catalog. */
|
|
16
|
-
getReleaseCatalog(input: ReleaseCatalogRequest): Promise<ReleaseCatalog | null>;
|
|
17
|
-
/** Artifact resolution: one batch read of both bundles and one unique read of their patch. */
|
|
18
|
-
getArtifactInfo(targetBundleId: string, currentBundleId: string, artifactProtocolVersion: 1): Promise<ArtifactInfo | null>;
|
|
19
|
-
/** A bundle, its patches, and how many patches start from it. */
|
|
20
|
-
getBundle(id: string): Promise<BundleDetail | null>;
|
|
21
|
-
/** One page of the patches that start from a bundle, by target bundle id. */
|
|
22
|
-
/** Each base bundle's reference counter: one batch read of the bundle rows, and no patches. */
|
|
23
|
-
countBundleChildren(baseBundleIds: readonly string[]): Promise<Record<string, number>>;
|
|
24
|
-
listPatchesFromBase(baseBundleId: string, input: KeysetInput): Promise<BundlePatchRow[]>;
|
|
25
|
-
/** One page of bundles with their patches, oldest or newest first, optionally for one platform. */
|
|
26
|
-
listBundles(input: KeysetInput & {
|
|
27
|
-
readonly platform?: "ios" | "android";
|
|
28
|
-
}): Promise<BundleDetail[]>;
|
|
29
|
-
/** Bundles in total or for one platform: one counter row. */
|
|
30
|
-
countBundles(platform?: "ios" | "android"): Promise<number>;
|
|
31
|
-
/** Auto-patch bases for a new bundle: one point read of its scope's catalog. */
|
|
32
|
-
findBaseBundleIds(candidateKey: string, bundleId: string, limit: number): Promise<string[]>;
|
|
33
|
-
getRelease(id: string): Promise<ReleaseRow | null>;
|
|
34
|
-
/** One page of releases through the index its filter names. */
|
|
35
|
-
listReleases(input: KeysetInput & {
|
|
36
|
-
readonly filter: ReleaseFilter;
|
|
37
|
-
}): Promise<ReleaseRow[]>;
|
|
38
|
-
/** A scope's newest release id: `byScope` descending, limit 1. */
|
|
39
|
-
latestReleaseId(scopeKey: string): Promise<string | null>;
|
|
40
|
-
getReleaseCatalogRow(scopeKey: string): Promise<ReleaseCatalogRow | null>;
|
|
41
|
-
listReleaseCatalogs(input: KeysetInput): Promise<ReleaseCatalogRow[]>;
|
|
42
|
-
/** Every channel, by name. */
|
|
43
|
-
listChannels(): Promise<ChannelRow[]>;
|
|
44
|
-
findChannelByName(name: string): Promise<ChannelRow | null>;
|
|
45
|
-
};
|
|
46
|
-
type CoreReads = ReturnType<typeof createCoreReads>;
|
|
47
8
|
//#endregion
|
|
48
|
-
export {
|
|
9
|
+
export { CoreDatabase, CoreStorage };
|
package/dist/core/reads.d.mts
CHANGED
|
@@ -1,48 +1,9 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import { HotUpdaterDatabase } from "../database/database.mjs";
|
|
3
|
-
import { ReleaseCatalogRequest } from "../db/releaseCatalog.mjs";
|
|
4
|
-
import { CoreSchema } from "./schema.mjs";
|
|
5
|
-
import { BundleDetail, BundlePatchRow, ChannelRow, KeysetInput, ReleaseCatalogRow, ReleaseFilter, ReleaseRow } from "@hot-updater/plugin-core";
|
|
6
|
-
import { ArtifactInfo, ReleaseCatalog } from "@hot-updater/core";
|
|
1
|
+
import { CoreSchema, HotUpdaterDatabase } from "@hot-updater/plugin-core";
|
|
7
2
|
//#region src/core/reads.d.ts
|
|
8
3
|
type CoreDatabase = HotUpdaterDatabase<CoreSchema>;
|
|
9
4
|
interface CoreStorage {
|
|
10
5
|
readonly readStorageText?: (storageUri: string) => Promise<string | null>;
|
|
11
6
|
readonly resolveFileUrl: (storageUri: string | null) => Promise<string | null>;
|
|
12
7
|
}
|
|
13
|
-
/** Core's reads, each through one declared index or key. */
|
|
14
|
-
declare const createCoreReads: (db: CoreDatabase, storage: CoreStorage) => {
|
|
15
|
-
/** The update check: one point read of its scope's catalog. */
|
|
16
|
-
getReleaseCatalog(input: ReleaseCatalogRequest): Promise<ReleaseCatalog | null>;
|
|
17
|
-
/** Artifact resolution: one batch read of both bundles and one unique read of their patch. */
|
|
18
|
-
getArtifactInfo(targetBundleId: string, currentBundleId: string, artifactProtocolVersion: 1): Promise<ArtifactInfo | null>;
|
|
19
|
-
/** A bundle, its patches, and how many patches start from it. */
|
|
20
|
-
getBundle(id: string): Promise<BundleDetail | null>;
|
|
21
|
-
/** One page of the patches that start from a bundle, by target bundle id. */
|
|
22
|
-
/** Each base bundle's reference counter: one batch read of the bundle rows, and no patches. */
|
|
23
|
-
countBundleChildren(baseBundleIds: readonly string[]): Promise<Record<string, number>>;
|
|
24
|
-
listPatchesFromBase(baseBundleId: string, input: KeysetInput): Promise<BundlePatchRow[]>;
|
|
25
|
-
/** One page of bundles with their patches, oldest or newest first, optionally for one platform. */
|
|
26
|
-
listBundles(input: KeysetInput & {
|
|
27
|
-
readonly platform?: "ios" | "android";
|
|
28
|
-
}): Promise<BundleDetail[]>;
|
|
29
|
-
/** Bundles in total or for one platform: one counter row. */
|
|
30
|
-
countBundles(platform?: "ios" | "android"): Promise<number>;
|
|
31
|
-
/** Auto-patch bases for a new bundle: one point read of its scope's catalog. */
|
|
32
|
-
findBaseBundleIds(candidateKey: string, bundleId: string, limit: number): Promise<string[]>;
|
|
33
|
-
getRelease(id: string): Promise<ReleaseRow | null>;
|
|
34
|
-
/** One page of releases through the index its filter names. */
|
|
35
|
-
listReleases(input: KeysetInput & {
|
|
36
|
-
readonly filter: ReleaseFilter;
|
|
37
|
-
}): Promise<ReleaseRow[]>;
|
|
38
|
-
/** A scope's newest release id: `byScope` descending, limit 1. */
|
|
39
|
-
latestReleaseId(scopeKey: string): Promise<string | null>;
|
|
40
|
-
getReleaseCatalogRow(scopeKey: string): Promise<ReleaseCatalogRow | null>;
|
|
41
|
-
listReleaseCatalogs(input: KeysetInput): Promise<ReleaseCatalogRow[]>;
|
|
42
|
-
/** Every channel, by name. */
|
|
43
|
-
listChannels(): Promise<ChannelRow[]>;
|
|
44
|
-
findChannelByName(name: string): Promise<ChannelRow | null>;
|
|
45
|
-
};
|
|
46
|
-
type CoreReads = ReturnType<typeof createCoreReads>;
|
|
47
8
|
//#endregion
|
|
48
|
-
export {
|
|
9
|
+
export { CoreDatabase, CoreStorage };
|
package/dist/core/reads.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { projectReleaseCatalogRow, releaseCatalogScopeKeyOf } from "../db/releaseCatalog.mjs";
|
|
2
2
|
import { resolveManifestArtifacts } from "../db/updateArtifacts.mjs";
|
|
3
|
-
import { baseBundleIdsOf
|
|
4
|
-
import { rowToBundle } from "@hot-updater/plugin-core";
|
|
5
|
-
import { ARTIFACT_PROTOCOL_VERSION, NIL_UUID } from "@hot-updater/
|
|
3
|
+
import { baseBundleIdsOf } from "./baseCandidates.mjs";
|
|
4
|
+
import { parseBaseCandidateKey, rowToBundle } from "@hot-updater/plugin-core";
|
|
5
|
+
import { ARTIFACT_PROTOCOL_VERSION, NIL_UUID } from "@hot-updater/protocol";
|
|
6
6
|
//#region src/core/reads.ts
|
|
7
7
|
const PAGE = 500;
|
|
8
8
|
const pick = (fields) => (row) => Object.fromEntries(fields.map((field) => [field, row[field]]));
|
package/dist/core/releases.cjs
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
const require_reads = require("./reads.cjs");
|
|
2
2
|
const require_writes = require("./writes.cjs");
|
|
3
3
|
let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
|
|
4
|
-
let
|
|
4
|
+
let _hot_updater_protocol = require("@hot-updater/protocol");
|
|
5
5
|
//#region src/core/releases.ts
|
|
6
6
|
const PAGE = 500;
|
|
7
7
|
const fail = (code, message) => {
|
|
8
8
|
throw new _hot_updater_plugin_core.ReleaseCatalogMutationError(code, message);
|
|
9
9
|
};
|
|
10
10
|
const checkScope = (scope) => {
|
|
11
|
-
const channelKey = (0,
|
|
12
|
-
const expected = scope.strategy === "APP_VERSION" ? (0,
|
|
11
|
+
const channelKey = (0, _hot_updater_protocol.encodeChannelKey)(scope.channelName);
|
|
12
|
+
const expected = scope.strategy === "APP_VERSION" ? (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
|
|
13
13
|
channelKey,
|
|
14
14
|
platform: scope.platform,
|
|
15
15
|
strategy: "APP_VERSION"
|
|
16
|
-
}) : (0,
|
|
16
|
+
}) : (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
|
|
17
17
|
channelKey,
|
|
18
18
|
fingerprintHash: scope.fingerprintHash ?? "",
|
|
19
19
|
platform: scope.platform,
|
|
@@ -63,7 +63,7 @@ const writeCatalog = async (tx, scope, stored, enabled, updatedAtMs) => {
|
|
|
63
63
|
catalog_id: stored.catalog?.catalog_id ?? (0, _hot_updater_plugin_core.createUUIDv7)(),
|
|
64
64
|
strategy: scope.strategy,
|
|
65
65
|
channel_id: scope.channelId,
|
|
66
|
-
channel_key: (0,
|
|
66
|
+
channel_key: (0, _hot_updater_protocol.encodeChannelKey)(scope.channelName),
|
|
67
67
|
platform: scope.platform,
|
|
68
68
|
fingerprint_hash: scope.fingerprintHash,
|
|
69
69
|
generation,
|
|
@@ -172,7 +172,7 @@ const rebuildScope = async (tx, scope, updatedAtMs) => {
|
|
|
172
172
|
releases: enabled.map(_hot_updater_plugin_core.releaseRowToRelease)
|
|
173
173
|
});
|
|
174
174
|
const current = stored.catalog;
|
|
175
|
-
if (current !== null && current.strategy === scope.strategy && current.channel_id === scope.channelId && current.channel_key === (0,
|
|
175
|
+
if (current !== null && current.strategy === scope.strategy && current.channel_id === scope.channelId && current.channel_key === (0, _hot_updater_protocol.encodeChannelKey)(scope.channelName) && current.platform === scope.platform && current.fingerprint_hash === scope.fingerprintHash && current.catalog_hash === compilation.catalogHash) return {
|
|
176
176
|
catalog: current,
|
|
177
177
|
current,
|
|
178
178
|
changed: false,
|
package/dist/core/releases.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toCatalogRow, toReleaseRow } from "./reads.mjs";
|
|
2
2
|
import { insertBundle } from "./writes.mjs";
|
|
3
3
|
import { ReleaseCatalogMutationError, compileReleaseCatalog, createUUIDv7, createUUIDv7After, isUUIDv7, releaseRowToRelease } from "@hot-updater/plugin-core";
|
|
4
|
-
import { createReleaseCatalogScopeKey, encodeChannelKey } from "@hot-updater/
|
|
4
|
+
import { createReleaseCatalogScopeKey, encodeChannelKey } from "@hot-updater/protocol";
|
|
5
5
|
//#region src/core/releases.ts
|
|
6
6
|
const PAGE = 500;
|
|
7
7
|
const fail = (code, message) => {
|
package/dist/core/writes.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const require_errors = require("../database/errors.cjs");
|
|
2
1
|
const require_reads = require("./reads.cjs");
|
|
2
|
+
let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
|
|
3
3
|
//#region src/core/writes.ts
|
|
4
4
|
const PAGE = 500;
|
|
5
5
|
/** Moves one bundle into or out of its platform's total and the overall total. */
|
|
@@ -69,7 +69,7 @@ const insertChannel = async (db, row) => {
|
|
|
69
69
|
};
|
|
70
70
|
});
|
|
71
71
|
} catch (error) {
|
|
72
|
-
if (attempt < 3 && error instanceof
|
|
72
|
+
if (attempt < 3 && error instanceof _hot_updater_plugin_core.DatabaseConstraintError && (error.reason === "unique" || error.reason === "exists")) continue;
|
|
73
73
|
throw error;
|
|
74
74
|
}
|
|
75
75
|
};
|
package/dist/core/writes.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DatabaseConstraintError } from "../database/errors.mjs";
|
|
2
1
|
import { toChannelRow } from "./reads.mjs";
|
|
2
|
+
import { DatabaseConstraintError } from "@hot-updater/plugin-core";
|
|
3
3
|
//#region src/core/writes.ts
|
|
4
4
|
const PAGE = 500;
|
|
5
5
|
/** Moves one bundle into or out of its platform's total and the overall total. */
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const
|
|
2
|
-
const require_configError = require("./assembly/configError.cjs");
|
|
1
|
+
const require_clientPlugins = require("./assembly/clientPlugins.cjs");
|
|
3
2
|
const require_assemblePlugins = require("./assembly/assemblePlugins.cjs");
|
|
4
3
|
const require_handler = require("./handler.cjs");
|
|
5
4
|
const require_storageAccess = require("./storageAccess.cjs");
|
|
@@ -16,42 +15,34 @@ const isAdapter = (value) => isRecord(value) && [
|
|
|
16
15
|
const databaseOf = (value) => {
|
|
17
16
|
if (isRecord(value) && typeof value.name === "string") {
|
|
18
17
|
if (isAdapter(value.adapter)) return value;
|
|
19
|
-
if ("core" in value && "fetchAdmin" in value) throw new
|
|
18
|
+
if ("core" in value && "fetchAdmin" in value) throw new _hot_updater_plugin_core.HotUpdaterConfigError("standaloneRepository reaches a server's admin API from the CLI and console. createHotUpdater needs the server's own database, such as kyselyAdapter(...).");
|
|
20
19
|
}
|
|
21
|
-
throw new
|
|
20
|
+
throw new _hot_updater_plugin_core.HotUpdaterConfigError("database must be a Hot Updater 1.0 database, such as kyselyAdapter(...) or postgres(...). Upgrade the provider package that created it.");
|
|
22
21
|
};
|
|
23
22
|
/** `"public"`, or nothing; a `clientAccess` object says what replaced it. */
|
|
24
23
|
const isPublic = (value) => {
|
|
25
24
|
if (value === void 0) return false;
|
|
26
25
|
if (value === "public") return true;
|
|
27
|
-
throw new
|
|
26
|
+
throw new _hot_updater_plugin_core.HotUpdaterConfigError(isRecord(value) ? "clientAccess objects were removed in 1.0. Set clientAccess: \"public\", or add a plugin that provides clientAuth to plugins." : "clientAccess must be \"public\"; to protect client routes, add a plugin that provides clientAuth to plugins.");
|
|
28
27
|
};
|
|
29
|
-
const hotUpdaterCoreMetadata = Symbol.for("@hot-updater/server/core-metadata");
|
|
30
|
-
function getHotUpdaterCoreMetadata(hotUpdater) {
|
|
31
|
-
return hotUpdater[hotUpdaterCoreMetadata];
|
|
32
|
-
}
|
|
33
28
|
function createHotUpdater(options) {
|
|
34
29
|
for (const key of ["authorityId", "catalogId"]) if (Object.hasOwn(options, key)) throw new TypeError(`Remove ${key} from createHotUpdater options. Catalog identity is managed internally.`);
|
|
35
30
|
const database = databaseOf(options.database);
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
return storage;
|
|
39
|
-
});
|
|
40
|
-
const { downloadStorageObject, readStorageText, resolveFileUrl } = require_storageAccess.createStorageAccess(storagePlugins);
|
|
31
|
+
const storage = Object.freeze([...options.storage ?? []]);
|
|
32
|
+
const { downloadStorageObject, readStorageText, resolveFileUrl } = require_storageAccess.createStorageAccess(storage);
|
|
41
33
|
const publicClients = isPublic(options.clientAccess);
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
...database.aggregateBatching === void 0 ? {} : { batching: database.aggregateBatching }
|
|
49
|
-
});
|
|
34
|
+
const configured = Object.freeze([...options.plugins ?? []]);
|
|
35
|
+
const plugins = require_assemblePlugins.assemblePlugins(configured, database, { storage: {
|
|
36
|
+
readStorageText,
|
|
37
|
+
resolveFileUrl
|
|
38
|
+
} });
|
|
39
|
+
const clientPlugins = Object.freeze(require_clientPlugins.clientPluginsOf(configured));
|
|
50
40
|
const clientAuth = plugins.clientAuth;
|
|
51
|
-
if (clientAuth !== void 0 && publicClients) throw new
|
|
52
|
-
if (clientAuth === void 0 && !publicClients) throw new
|
|
41
|
+
if (clientAuth !== void 0 && publicClients) throw new _hot_updater_plugin_core.HotUpdaterConfigError(`Plugin "${clientAuth.plugin}" provides clientAuth, so remove clientAccess.`);
|
|
42
|
+
if (clientAuth === void 0 && !publicClients) throw new _hot_updater_plugin_core.HotUpdaterConfigError("Set clientAccess to \"public\", or add a plugin that provides clientAuth.");
|
|
43
|
+
const varyHeaders = Object.freeze((clientAuth?.varyHeaders ?? []).map((header) => header.toLowerCase()));
|
|
53
44
|
const clientPolicy = clientAuth === void 0 ? void 0 : {
|
|
54
|
-
varyHeaders
|
|
45
|
+
varyHeaders,
|
|
55
46
|
authenticate: (request) => clientAuth.authenticate(request.headers)
|
|
56
47
|
};
|
|
57
48
|
const handlers = require_handler.createHotUpdaterHandlers({
|
|
@@ -61,24 +52,33 @@ function createHotUpdater(options) {
|
|
|
61
52
|
endpoints: plugins.endpoints,
|
|
62
53
|
plugins: Object.keys(plugins.api)
|
|
63
54
|
});
|
|
64
|
-
|
|
55
|
+
let serving = false;
|
|
56
|
+
return {
|
|
65
57
|
adapterName: database.name,
|
|
66
|
-
handlers
|
|
58
|
+
get handlers() {
|
|
59
|
+
if (!serving) {
|
|
60
|
+
for (const adapter of storage) (0, _hot_updater_plugin_core.assertStorageOperations)(adapter, ["get", "getDownloadUrl"]);
|
|
61
|
+
serving = true;
|
|
62
|
+
}
|
|
63
|
+
return handlers;
|
|
64
|
+
},
|
|
67
65
|
core: plugins.core,
|
|
68
66
|
api: plugins.api,
|
|
69
|
-
flush: plugins.flush
|
|
67
|
+
flush: plugins.flush,
|
|
68
|
+
database,
|
|
69
|
+
storage,
|
|
70
|
+
plugins: configured,
|
|
71
|
+
clientPlugins,
|
|
72
|
+
clientEndpoints: Object.freeze(plugins.endpoints.filter((endpoint) => endpoint.access === "client").map(({ plugin, method, path }) => Object.freeze({
|
|
73
|
+
plugin,
|
|
74
|
+
method,
|
|
75
|
+
path
|
|
76
|
+
}))),
|
|
77
|
+
...clientAuth === void 0 ? {} : { clientAuth: Object.freeze({
|
|
78
|
+
plugin: clientAuth.plugin,
|
|
79
|
+
varyHeaders
|
|
80
|
+
}) }
|
|
70
81
|
};
|
|
71
|
-
Object.defineProperty(api, hotUpdaterCoreMetadata, {
|
|
72
|
-
enumerable: false,
|
|
73
|
-
value: {
|
|
74
|
-
database,
|
|
75
|
-
target: require_coreDatabase.toolingTargetOf(options.plugins ?? []),
|
|
76
|
-
plugins: options.plugins ?? []
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
return api;
|
|
80
82
|
}
|
|
81
83
|
//#endregion
|
|
82
84
|
exports.createHotUpdater = createHotUpdater;
|
|
83
|
-
exports.getHotUpdaterCoreMetadata = getHotUpdaterCoreMetadata;
|
|
84
|
-
exports.hotUpdaterCoreMetadata = hotUpdaterCoreMetadata;
|
|
@@ -1,15 +1,43 @@
|
|
|
1
|
-
import { ToolingDatabase } from "./db/types.cjs";
|
|
2
|
-
import { AnyHotUpdaterPlugin, PluginApis } from "./plugins/definePlugin.cjs";
|
|
3
1
|
import { CoreApi } from "./core/api.cjs";
|
|
2
|
+
import { AnyHotUpdaterPlugin, PluginApis } from "./plugins/definePlugin.cjs";
|
|
4
3
|
import { HotUpdaterHandlers } from "./handlerTypes.cjs";
|
|
5
4
|
import "./handler.cjs";
|
|
6
|
-
import {
|
|
5
|
+
import { PluginClientPlugin, StorageAdapter, ToolingDatabase } from "@hot-updater/plugin-core";
|
|
7
6
|
//#region src/createHotUpdaterCore.d.ts
|
|
7
|
+
/** A plugin's endpoint on `handlers.client`. */
|
|
8
|
+
interface ClientEndpoint {
|
|
9
|
+
/** The id of the plugin that adds it. */
|
|
10
|
+
readonly plugin: string;
|
|
11
|
+
readonly method: string;
|
|
12
|
+
/** Relative to the handler's mount; `:name` segments are parameters. */
|
|
13
|
+
readonly path: string;
|
|
14
|
+
}
|
|
15
|
+
/** The plugin that decides who may call client routes. */
|
|
16
|
+
interface ClientAuthProvider {
|
|
17
|
+
/** Its id. */
|
|
18
|
+
readonly plugin: string;
|
|
19
|
+
/**
|
|
20
|
+
* The request headers its decision reads, lowercase: what a cache in
|
|
21
|
+
* front of the server, such as a CDN, keys client routes on.
|
|
22
|
+
*/
|
|
23
|
+
readonly varyHeaders: readonly string[];
|
|
24
|
+
}
|
|
8
25
|
type RuntimeHotUpdaterAPI<TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly AnyHotUpdaterPlugin[]> = {
|
|
26
|
+
/**
|
|
27
|
+
* The routes a host mounts. On first access every storage adapter must
|
|
28
|
+
* serve downloads (`get` and `getDownloadUrl`), so a server fails where it
|
|
29
|
+
* mounts them, while tooling that only reads the definition, such as the
|
|
30
|
+
* CLI, can list storage that only uploads.
|
|
31
|
+
*/
|
|
9
32
|
readonly handlers: HotUpdaterHandlers;
|
|
10
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Core's reads and typed writes: bundles, Releases, Catalogs, and
|
|
35
|
+
* channels. The CLI and the console write through it, so their writes
|
|
36
|
+
* take the server's path: the plugins' schema fence, pruning during
|
|
37
|
+
* writes, the storage's file URLs, and the database's CDN purge.
|
|
38
|
+
*/
|
|
11
39
|
readonly core: CoreApi;
|
|
12
|
-
/** Each plugin's API by plugin id. */
|
|
40
|
+
/** Each plugin's API by plugin id, which the CLI's and the console's plugin features call. */
|
|
13
41
|
readonly api: PluginApis<TPlugins>;
|
|
14
42
|
/** The database's name, which `hot-updater db` commands read. */
|
|
15
43
|
readonly adapterName: string;
|
|
@@ -20,6 +48,28 @@ type RuntimeHotUpdaterAPI<TPlugins extends readonly AnyHotUpdaterPlugin[] = read
|
|
|
20
48
|
* it before it exits.
|
|
21
49
|
*/
|
|
22
50
|
readonly flush: () => Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* The database as configured. `hot-updater db` runs its tooling
|
|
53
|
+
* (`createMigrator`, `generateSchema`), and tooling done with the server
|
|
54
|
+
* closes it (`dispose`).
|
|
55
|
+
*/
|
|
56
|
+
readonly database: ToolingDatabase;
|
|
57
|
+
/** The storage as configured, in order, as a frozen copy. */
|
|
58
|
+
readonly storage: readonly StorageAdapter[];
|
|
59
|
+
/** The plugins as configured, as a frozen copy, whose tables tooling creates. */
|
|
60
|
+
readonly plugins: TPlugins;
|
|
61
|
+
/**
|
|
62
|
+
* The client plugins an app adds to `HotUpdater.init`'s `plugins` for
|
|
63
|
+
* these plugins, each once, in plugin order: what init prints.
|
|
64
|
+
*/
|
|
65
|
+
readonly clientPlugins: readonly PluginClientPlugin[];
|
|
66
|
+
/**
|
|
67
|
+
* The plugins' endpoints on `handlers.client`, which a host that routes
|
|
68
|
+
* by path, such as a CDN in front of the server, sends to it.
|
|
69
|
+
*/
|
|
70
|
+
readonly clientEndpoints: readonly ClientEndpoint[];
|
|
71
|
+
/** The plugin that guards client routes; absent when they are public. */
|
|
72
|
+
readonly clientAuth?: ClientAuthProvider;
|
|
23
73
|
};
|
|
24
74
|
type HotUpdaterAPI = RuntimeHotUpdaterAPI;
|
|
25
75
|
declare const REMOVED_CLIENT_ACCESS = "clientAccess objects were removed in 1.0: set clientAccess: \"public\", or add a plugin that provides clientAuth";
|
|
@@ -62,11 +112,14 @@ type ClientAccessRule<TPlugins extends readonly AnyHotUpdaterPlugin[]> = number
|
|
|
62
112
|
type CreateHotUpdaterOptions<TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly []> = {
|
|
63
113
|
/** A provider's database on the storage engine, such as `kyselyAdapter(...)` or `postgres(...)`. */
|
|
64
114
|
readonly database: ToolingDatabase;
|
|
65
|
-
/**
|
|
66
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Where bundles are stored: the server reads and signs the URIs of each
|
|
117
|
+
* adapter's protocol.
|
|
118
|
+
*/
|
|
119
|
+
readonly storage?: readonly StorageAdapter[];
|
|
67
120
|
/** The plugins the server runs; at most one provides clientAuth. Defaults to none. */
|
|
68
121
|
readonly plugins?: TPlugins;
|
|
69
122
|
} & ClientAccessRule<TPlugins>;
|
|
70
123
|
declare function createHotUpdater<const TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly []>(options: CreateHotUpdaterOptions<TPlugins>): RuntimeHotUpdaterAPI<NoInfer<TPlugins>>;
|
|
71
124
|
//#endregion
|
|
72
|
-
export { ClientAccessPolicy, ClientAccessRule, CreateHotUpdaterOptions, HotUpdaterAPI, RemovedClientAccess, RuntimeHotUpdaterAPI, createHotUpdater };
|
|
125
|
+
export { ClientAccessPolicy, ClientAccessRule, ClientAuthProvider, ClientEndpoint, CreateHotUpdaterOptions, HotUpdaterAPI, RemovedClientAccess, RuntimeHotUpdaterAPI, createHotUpdater };
|