Skip to content

feat: server-side A/B experiment assignment (Phase 1)#699

Merged
wRLSS merged 3 commits into
masterfrom
feat/ab-testing
Jul 8, 2026
Merged

feat: server-side A/B experiment assignment (Phase 1)#699
wRLSS merged 3 commits into
masterfrom
feat/ab-testing

Conversation

@wRLSS

@wRLSS wRLSS commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Introduces server-side A/B experiment assignment in ILC (Phase 1).

ILC resolves a single experiment variant per visitor in the onRequest hook, before any fragment renders, and propagates it to every fragment via appProps.experiments and to the browser via inlined ilcState + sticky cookies. Assignment is deterministic (hash-based), cookie-sticky, config-driven, and fail-safe — any failure falls back to the baseline variant. A global kill-switch turns the whole layer off without a deploy.

See docs/ab-testing.md for the full design: what Phase 1 supports (and what it intentionally does not do yet), how to define experiments in configuration, and how apps read the assigned variant.

The consuming side — a useExperiment hook plus generic appProps delivery — ships as a companion change in the React application library.

Comment thread ilc/server/experiments/index.ts Outdated
// so neither server-router nor ClientRouter merges an empty `experiments` into every
// app's appProps, and nothing extra is inlined into the page.
if (!experimentsEnabled()) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we expire stale cookies when experiments are disabled? eg. users who already have x-ab-* cookies keep readable variant cookies for up to 90 days. Clients can continue seeing/applying a variant even while the kill-switch is expected to put everyone in control.

protocol: 'ILC_CLIENT_PROTOCOL',
},
experiments: {
enabled: 'EXPERIMENTS_ENABLED',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

prefix with ILC_? Not sure, but it looks like half of the variables follow this convention.

const { experiments } = this.#ilcState;
const experimentsProps = experiments ? { appProps: { experiments } } : {};

return deepmerge.all([appConfigProps, routeProps, experimentsProps]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a bit expensive operation. I do not see alternative now but it could be a bottleneck potentially

*
* @param options.secure emit cookies with `Secure` (set when the site is https).
*/
export function assignExperiments(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you use function by purpose ? I could be complex to scale functions maybe it make sense to create responsible class ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since it's a pure resolver without any internal mutable state to encapsulate and safe to call once per request with no lifecycle. constructor would add additional step without owning any state

import { createHash } from 'node:crypto';
import type { ExperimentId, ExperimentVariant, VariantName } from './interfaces';

const BUCKET_COUNT = 100;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it make sense to put it into configuration ?

@wRLSS wRLSS Jul 7, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think to be honest at the moment it's valuable enough, it's actually should be considered in percentage mass - that's why it's like not any number is fit here

// ILC mints its own session id (gateway-agnostic, ILC-public like `ilc-i18n`), so the
// feature works in OSS ILC without depending on any deployment's identity headers.
/** Stable per-visitor session id minted by ILC; seeds deterministic bucketing. */
export const SESSION_COOKIE = 'ilc-sid';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

point to back here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Who is responsible for establish the cookie ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added additional comments regarding this

@wRLSS wRLSS changed the title Introduce ability to bypass experiments. More information on Confluence docs and in .md file feat: server-side A/B experiment assignment (Phase 1) Jul 7, 2026
- kill-switch now expires stale x-ab-* cookies so disabling puts
  mid-experiment visitors back on control instead of leaving a readable
  variant cookie for up to 90 days
- rename env var EXPERIMENTS_ENABLED -> ILC_EXPERIMENTS_ENABLED to match
  the ILC_ convention used by the other ILC-specific settings
- clarify in cookies.ts that it only defines cookie names/options; index.ts
  is what actually writes them
- fill docs/ab-testing.md: a Phase 1 guide for product (what you can/can't
  do) and developers (defining/reading experiments)
@wRLSS wRLSS requested review from blackrabbit99 and m2broth July 7, 2026 13:36
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown

Coverage Report

Ilc/server

Commit SHA:61d34c18a7cc506825097d72a844f3ca81bc5726

Test coverage results 🧪

Code coverage diff between base branch:master and head branch: feat/ab-testing 
File details
Status File % Stmts % Branch % Funcs % Lines
🔴 total 95.06 (-0.33) 90.16 (-1.28) 90.1 (-1.46) 95.23 (-0.42)
/codebase/common/DefaultCacheWrapper.ts 100 100 100 100
/codebase/common/EvictingCacheStorage.ts 100 100 100 100
/codebase/common/utils.ts 100 100 100 100
/codebase/common/router/Router.ts 98 91.66 100 98
/codebase/common/router/errors.ts 100 100 100 100
/codebase/common/transition-hooks/ActionType.ts 100 100 100 100
/codebase/common/transition-hooks/errors.ts 100 100 100 100
/codebase/server/TransitionHooksExecutor.ts 100 100 100 100
🔴 /codebase/server/app.js 96.96 (-1.42) 81.81 (0) 100 (0) 96.96 (-1.42)
/codebase/server/i18n.js 97.95 95.83 100 97.82
/codebase/server/index.js 0 100 0 0
/codebase/server/objectToBase64.js 100 100 100 100
/codebase/server/serveStatic.ts 29.41 0 16.66 33.33
/codebase/server/server.js 0 0 0 0
/codebase/server/application/application.ts 100 100 75 100
/codebase/server/context/context.ts 88.88 50 75 88.88
/codebase/server/errorHandler/ErrorHandler.ts 100 100 100 100
/codebase/server/errorHandler/factory.js 100 100 100 100
✨ 🆕 /codebase/server/experiments/StaticConfigRulesetProvider.ts 73.33 0 100 73.33
✨ 🆕 /codebase/server/experiments/assign.ts 100 100 83.33 100
✨ 🆕 /codebase/server/experiments/bucket.ts 100 100 100 100
✨ 🆕 /codebase/server/experiments/consent.ts 100 66.66 100 100
✨ 🆕 /codebase/server/experiments/cookies.ts 100 100 100 100
✨ 🆕 /codebase/server/experiments/index.ts 88.23 70 25 86.66
✨ 🆕 /codebase/server/experiments/ruleset.ts 100 75 100 100
✨ 🆕 /codebase/server/experiments/validate.ts 88.09 76.47 100 88.09
/codebase/server/logger/accessLogger.js 100 87.5 100 100
/codebase/server/logger/enhanceLogger.js 100 100 100 100
/codebase/server/plugins/PluginsLoader.js 82.35 100 50 86.66
/codebase/server/plugins/pluginManager.js 100 100 100 100
/codebase/server/plugins/reportingPlugin.js 100 50 100 100
/codebase/server/registry/Registry.js 92.36 79.06 83.33 93.75
/codebase/server/registry/TemplateParser.js 100 100 100 100
/codebase/server/registry/errors.ts 100 100 100 100
/codebase/server/registry/factory.ts 90.9 100 50 90
/codebase/server/registry/isTemplateValid.js 100 100 100 100
/codebase/server/routes/pingPluginFactory.ts 100 100 100 100
/codebase/server/routes/renderTemplateHandlerFactory.ts 100 100 100 100
/codebase/server/routes/wildcardRequestHandlerFactory.ts 100 100 100 100
/codebase/server/services/CanonicalTagService.ts 100 100 100 100
/codebase/server/services/CspBuilderService.js 100 91.66 100 100
/codebase/server/services/HrefLangService.js 92.59 62.5 100 92.59
🟢 /codebase/server/tailor/configs-injector.ts 97.27 (0.03) 91.66 (0) 100 (0) 97.27 (0.03)
/codebase/server/tailor/error-handler.js 100 100 100 100
/codebase/server/tailor/errors.js 100 100 100 100
/codebase/server/tailor/factory.js 100 0 100 100
/codebase/server/tailor/fetch-template.ts 100 100 100 100
/codebase/server/tailor/filter-headers.ts 100 90 100 100
/codebase/server/tailor/fragment-hooks.js 100 100 100 100
/codebase/server/tailor/merge-configs.ts 100 90.62 100 100
/codebase/server/tailor/parse-override-config.js 100 100 100 100
/codebase/server/tailor/process-fragment-response.js 100 93.75 100 100
/codebase/server/tailor/request-fragment.js 96.55 92 100 96.55
🟢 /codebase/server/tailor/server-router.js 98.61 (0.04) 96.42 (0.27) 100 (0) 98.59 (0.04)
/codebase/server/types/FastifyReply.ts 100 100 100 100
/codebase/server/types/IlcRequest.ts 100 100 100 100
/codebase/server/types/PatchedHttpRequest.ts 100 100 100 100
/codebase/server/utils/helpers.ts 100 100 100 100
/codebase/server/utils/utils.js 100 100 100 100

Ilc/client

Commit SHA:61d34c18a7cc506825097d72a844f3ca81bc5726

Test coverage results 🧪

Code coverage diff between base branch:master and head branch: feat/ab-testing 
File details
Status File % Stmts % Branch % Funcs % Lines
🟢 total 94.36 (0) 86.77 (0.07) 93.31 (0) 94.56 (0.01)
/codebase/client.plugins.manifest.js 100 100 100 100
/codebase/client/AsyncBootUp.js 100 80 100 100
/codebase/client/BundleLoader.ts 92.72 97.05 81.25 92.45
/codebase/client/CanonicalTagHandler.ts 100 93.75 100 100
/codebase/client/Client.js 89.92 79.48 88.23 89.85
🟢 /codebase/client/ClientRouter.js 95.29 (0.06) 90.9 (0.38) 95.65 (0) 95.09 (0.06)
/codebase/client/CssTrackedApp.ts 94.04 88.57 92.3 96.15
/codebase/client/HrefLangHandler.js 100 100 100 100
/codebase/client/ParcelApi.js 97.05 87.5 100 96.96
/codebase/client/PluginsLoader.js 55.55 25 33.33 62.5
/codebase/client/TransitionHooksExecutor.js 96.15 88.88 100 96.15
/codebase/client/WrapApp.js 97.18 76.47 93.75 98.52
/codebase/client/composeAppSlotPairsToRegister.js 100 100 100 100
/codebase/client/dispatchSynchronizedEvent.js 96.96 100 100 96.55
/codebase/client/i18n.js 90.9 86.66 90.9 90.47
/codebase/client/initIlcState.js 100 100 100 100
/codebase/client/registerSpaApps.js 78.46 59.09 53.33 79.36
/codebase/client/utils.js 92 80.95 90 95.83
/codebase/client/ErrorHandlerManager/ErrorHandlerManager.js 100 90 100 100
/codebase/client/Sdk/SdkAdapterFactory.js 100 100 100 100
/codebase/client/Sdk/SdkFactoryBuilder.js 100 100 100 100
/codebase/client/TransitionManager/TransitionBlocker.js 93.93 87.5 100 93.93
/codebase/client/TransitionManager/TransitionBlockerList.js 94.73 50 100 93.33
/codebase/client/TransitionManager/TransitionManager.js 92.19 81.48 89.28 92.14
/codebase/client/TransitionManager/GlobalSpinner/GlobalSpinner.js 100 100 100 100
/codebase/client/TransitionManager/ScrollController/ScrollController.js 95.83 100 100 95.83
/codebase/client/TransitionManager/SlotRenderObserver/SlotRenderObserver.js 85.18 79.16 100 84.61
/codebase/client/TransitionManager/TransitionHooks/BaseTransitionHook.js 0 100 0 0
/codebase/client/TransitionManager/TransitionHooks/PerformanceTransitionHook.js 100 100 100 100
/codebase/client/TransitionManager/TransitionHooks/TitleCheckerTransitionHook.js 100 100 100 100
/codebase/client/TransitionManager/TransitionHooks/TransitionHooks.js 100 80 100 100
/codebase/client/TransitionManager/errors/CriticalSlotTransitionError.js 100 100 100 100
/codebase/client/configuration/IlcConfigRoot.js 92.3 60 100 92.3
/codebase/client/configuration/SystemJSImportMap.js 93.33 75 100 93.33
/codebase/client/configuration/getIlcConfigRoot.js 100 100 100 100
/codebase/client/constants/ilcEvents.js 100 100 100 100
/codebase/client/errors/BaseError.js 100 86.66 100 100
/codebase/client/errors/CorsError.js 100 100 100 100
/codebase/client/errors/CriticalFragmentError.js 100 100 100 100
/codebase/client/errors/CriticalInternalError.js 100 100 100 100
/codebase/client/errors/CriticalRuntimeError.js 100 100 100 100
/codebase/client/errors/FetchTemplateError.js 100 100 100 100
/codebase/client/errors/FragmentError.js 100 100 100 100
/codebase/client/errors/InternalError.js 100 100 100 100
/codebase/client/errors/NavigationError.js 100 100 100 100
/codebase/client/errors/RuntimeError.js 100 100 100 100
/codebase/client/errors/UnhandledError.js 100 100 100 100
/codebase/client/navigationEvents/index.js 100 100 100 100
/codebase/client/navigationEvents/setupEvents.js 90.24 88.09 94.11 90
/codebase/client/registry/BrowserCacheStorage.ts 100 100 100 100
/codebase/client/registry/Registry.js 90 50 100 90
/codebase/client/registry/errors.js 100 100 100 100
/codebase/client/registry/factory.ts 100 100 100 100
/codebase/client/utils/exponentialRetry.ts 100 100 100 100
/codebase/common/DefaultCacheWrapper.ts 98.07 95.45 100 97.95
/codebase/common/Environment.js 100 100 100 100
/codebase/common/EvictingCacheStorage.ts 100 100 100 100
/codebase/common/SdkOptions.js 100 100 100 100
/codebase/common/UrlProcessor.js 100 100 100 100
/codebase/common/constants.js 100 100 100 100
/codebase/common/i18nCookie.js 100 100 100 100
/codebase/common/utils.ts 100 100 100 100
/codebase/common/Slot/Slot.js 100 100 100 100
/codebase/common/Slot/SlotCollection.js 100 100 100 100
/codebase/common/Slot/SpaSlot.js 100 100 100 100
/codebase/common/Slot/SpaSlotCollection.js 100 100 100 100
/codebase/common/router/Router.ts 97.87 93.54 100 97.87
/codebase/common/router/errors.ts 100 100 100 100
/codebase/common/transition-hooks/errors.ts 100 100 100 100

Registry

Commit SHA:61d34c18a7cc506825097d72a844f3ca81bc5726

Test coverage results 🧪

Code coverage diff between base branch:master and head branch: feat/ab-testing 
File details
Status File % Stmts % Branch % Funcs % Lines
total 90.07 78.45 81.34 90.14
/codebase/newrelic.js 100 50 100 100
/codebase/server.plugins.manifest.ts 100 100 100 100
/codebase/lde/oauth-server.ts 0 100 0 0
/codebase/server/app.ts 100 50 100 100
/codebase/server/index.ts 0 100 0 0
/codebase/server/runnerAssetsDiscovery.ts 0 0 0 0
/codebase/server/server.ts 0 0 0 0
/codebase/server/appRoutes/interfaces/index.ts 100 100 100 100
/codebase/server/appRoutes/routes/RoutesService.ts 100 100 100 100
/codebase/server/appRoutes/routes/createAppRoute.ts 97.22 100 100 97.22
/codebase/server/appRoutes/routes/deleteAppRoute.ts 100 100 100 100
/codebase/server/appRoutes/routes/getAppRoute.ts 100 100 100 100
/codebase/server/appRoutes/routes/getAppRoutes.ts 95.83 87.5 100 95.83
/codebase/server/appRoutes/routes/index.ts 100 100 100 100
/codebase/server/appRoutes/routes/updateAppRoute.ts 100 100 100 100
/codebase/server/appRoutes/services/prepareAppRoute.ts 100 60 100 100
/codebase/server/appRoutes/services/resolveDomainAlias.ts 100 100 100 100
/codebase/server/appRoutes/services/transformSpecialRoutes.ts 100 100 100 100
/codebase/server/apps/interfaces/index.ts 95 100 75 95
/codebase/server/apps/repositories/AppsRepository.ts 97.43 86.66 100 97.43
/codebase/server/apps/routes/createApp.ts 100 100 100 100
/codebase/server/apps/routes/deleteApp.ts 100 100 100 100
/codebase/server/apps/routes/getApp.ts 100 100 100 100
/codebase/server/apps/routes/getApps.ts 100 50 100 100
/codebase/server/apps/routes/index.ts 100 100 100 100
/codebase/server/apps/routes/updateApp.ts 96.29 85.71 100 96.29
/codebase/server/apps/services/resolveDomainAlias.ts 100 100 100 100
/codebase/server/auth/index.ts 97.5 0 100 97.5
/codebase/server/auth/handlers/availableMethodsHandler.ts 100 100 100 100
/codebase/server/auth/handlers/localLoginHandler.ts 100 100 100 100
/codebase/server/auth/handlers/logoutHandler.ts 75 25 100 81.81
/codebase/server/auth/handlers/openIdAuthCallbackHandler.ts 94.44 66.66 100 94.44
/codebase/server/auth/middleware/bearerAuthenticationMiddleware.ts 100 100 100 100
/codebase/server/auth/middleware/initializeOpenIdMiddleware.ts 92.85 66.66 100 92.85
/codebase/server/auth/middleware/rolesMiddleware.ts 100 100 100 100
/codebase/server/auth/services/AuthService.ts 100 100 100 100
/codebase/server/auth/services/OpenIdService.ts 100 100 100 100
/codebase/server/auth/strategies/CustomOIDCStrategy.ts 88.88 60 100 88.88
/codebase/server/auth/strategies/bearer.ts 100 100 100 100
/codebase/server/auth/strategies/local.ts 100 100 100 100
/codebase/server/auth/strategies/oidc.ts 94.11 73.07 100 93.93
/codebase/server/authEntities/interfaces.ts 100 100 100 100
/codebase/server/authEntities/routes/create.ts 100 100 100 100
/codebase/server/authEntities/routes/deleteRoute.ts 100 100 100 100
/codebase/server/authEntities/routes/get.ts 100 100 100 100
/codebase/server/authEntities/routes/getAll.ts 100 100 100 100
/codebase/server/authEntities/routes/index.ts 100 100 100 100
/codebase/server/authEntities/routes/update.ts 100 100 100 100
/codebase/server/common/services/json.ts 81.81 84 91.66 80
/codebase/server/common/services/preProcessResponse.ts 85.71 100 0 85.71
/codebase/server/common/services/validateRequest.ts 92.59 80 100 92.3
/codebase/server/common/services/assets/AssetsDiscovery.ts 95 76.47 93.33 95
/codebase/server/common/services/assets/AssetsDiscoveryProcessor.ts 94.11 66.66 100 94.11
/codebase/server/common/services/assets/AssetsDiscoveryWhiteLists.ts 100 100 100 100
/codebase/server/common/services/assets/AssetsManifestReader.ts 100 100 100 100
/codebase/server/common/services/assets/AssetsValidator.ts 100 100 100 100
/codebase/server/common/services/assets/assetsManifestProcessor.ts 100 100 100 100
/codebase/server/common/services/assets/errors/AssetsManifestError.ts 100 100 100 100
/codebase/server/common/services/entries/ApplicationEntry.ts 95.16 81.81 100 95.16
/codebase/server/common/services/entries/Entry.ts 0 0 0 0
/codebase/server/common/services/entries/EntryFactory.ts 95.23 80 100 95.23
/codebase/server/common/services/entries/SharedLibEntry.ts 97.56 85.71 100 97.56
/codebase/server/common/services/entries/error/EntryError.ts 100 100 100 100
/codebase/server/common/services/entries/error/IncorrectEntryError.ts 100 100 100 100
/codebase/server/common/services/entries/error/NotFoundApplicationError.ts 100 100 100 100
/codebase/server/common/services/entries/error/NotFoundFqrnError.ts 100 100 100 100
/codebase/server/common/services/entries/error/NotFoundSharedLibraryError.ts 100 100 100 100
/codebase/server/common/services/entries/error/ValidationFqrnError.ts 100 100 100 100
/codebase/server/config/ConfigService.ts 97.18 91.89 100 97.1
/codebase/server/config/getConfig.ts 100 100 100 100
/codebase/server/config/index.ts 100 100 100 100
/codebase/server/config/transformConfig.ts 95.83 80.64 100 95.34
/codebase/server/config/updateConfig.ts 93.33 100 100 93.33
/codebase/server/config/validateConfig.ts 100 100 100 100
/codebase/server/db/cascadeTruncate.ts 71.42 50 100 71.42
/codebase/server/db/index.ts 100 80 100 100
/codebase/server/db/logger.ts 100 100 100 100
/codebase/server/db/range.ts 100 100 100 100
/codebase/server/db/structure.ts 100 100 100 100
/codebase/server/db/syncSequence.ts 100 100 100 100
/codebase/server/db/versioning.ts 93.33 0 100 93.33
/codebase/server/entries/entries.ts 87.09 85.71 100 87.09
/codebase/server/errorHandler/httpErrors.ts 100 100 100 100
/codebase/server/errorHandler/index.ts 100 100 100 100
/codebase/server/errorHandler/noticeError.ts 100 0 100 100
/codebase/server/middleware/context.ts 100 66.66 100 100
/codebase/server/middleware/filters.ts 100 100 100 100
/codebase/server/middleware/unless.ts 100 75 100 100
/codebase/server/middleware/userContext.ts 100 100 100 100
/codebase/server/middleware/validatelocales.ts 95.23 66.66 100 95
/codebase/server/migrations/20191016185102_apps.ts 100 100 66.66 100
/codebase/server/migrations/20191017131220_templates.ts 100 100 66.66 100
/codebase/server/migrations/20191017131749_routes.ts 100 100 66.66 100
/codebase/server/migrations/20191017144455_route_slots.ts 100 100 66.66 100
/codebase/server/migrations/20200113141956_apps.ts 66.66 100 50 66.66
/codebase/server/migrations/20200113142437_route_slots.ts 66.66 100 50 66.66
/codebase/server/migrations/20200120162838_apps_config_selector.ts 66.66 100 50 66.66
/codebase/server/migrations/20200121110723_shared_props.ts 83.33 100 66.66 83.33
/codebase/server/migrations/20200409184919_auth_entitites.ts 100 100 66.66 100
/codebase/server/migrations/20200409190157_auth_entitites_default.ts 100 100 50 100
/codebase/server/migrations/20200410180130_sessions.ts 88.88 50 66.66 88.88
/codebase/server/migrations/20200518134531_apps_initProps_removal.ts 66.66 100 50 66.66
/codebase/server/migrations/20200729141256_settings.ts 100 100 66.66 100
/codebase/server/migrations/20201012152003_settings_meta.ts 58.33 100 50 58.33
/codebase/server/migrations/20201013140633_settings_default.ts 90.9 50 75 90.9
/codebase/server/migrations/20201027180112_settings_globalSpinner.ts 80 100 50 80
/codebase/server/migrations/20201028142200_settings_i18n.ts 80 100 50 80
/codebase/server/migrations/20201029122727_settings_AuthOpenIdUniqueIdentifierClaimName.ts 80 100 50 80
/codebase/server/migrations/20201105155522_versioning.ts 90.9 100 66.66 90.9
/codebase/server/migrations/20201130141801_i18n_enabled_by_default.ts 80 100 50 80
/codebase/server/migrations/20201228201314_route_meta.ts 66.66 100 50 66.66
/codebase/server/migrations/20210125185210_app_wrapper_kind.ts 66.66 25 75 66.66
/codebase/server/migrations/20210125185211_apps_wrappedWith.ts 66.66 100 50 66.66
/codebase/server/migrations/20210219174348_settings_overrideConfigTrustedOrigins.ts 80 100 50 80
/codebase/server/migrations/20210226191151_apps_ssrProps.ts 66.66 100 50 66.66
/codebase/server/migrations/20210226191205_shared_props_ssrProps.ts 66.66 100 50 66.66
/codebase/server/migrations/20210405164831_router_domains.ts 85.71 100 66.66 85.71
/codebase/server/migrations/20210405182655_routes_domainId.ts 63.46 37.5 59.09 63.46
/codebase/server/migrations/20210426163602_routes_orderPosIsNullable.ts 66 37.5 54.16 66
/codebase/server/migrations/20210430154258_routes_uniqfromSpecialRoleToRoute.ts 62.5 100 50 62.5
/codebase/server/migrations/20210430154639_routes_moveSpecialRolesToRoute.ts 35.29 0 37.5 35.29
/codebase/server/migrations/20210430155514_routes_removeColumnSpecialRole.ts 66.66 100 50 66.66
/codebase/server/migrations/20210505151225_routes_domainIdIdxble.ts 46.15 40 33.33 46.15
/codebase/server/migrations/20210505181754_routes_orderPos_unique_per_domain.ts 62.5 100 50 62.5
/codebase/server/migrations/20210505182004_routes_route_unique_per_domain.ts 62.5 100 50 62.5
/codebase/server/migrations/20210505182425_old_tbls_cleanup.ts 80 50 50 80
/codebase/server/migrations/20210521125202_routes_drop_unique_route.ts 66.66 100 50 66.66
/codebase/server/migrations/20210607160910_apps_discoveryMetadata.ts 66.66 100 50 66.66
/codebase/server/migrations/20210607161242_apps_adminNotes.ts 66.66 100 50 66.66
/codebase/server/migrations/20210625150840_roles_userToReadonly.ts 50 50 50 50
/codebase/server/migrations/20210701183133_auth_entity_readonly.ts 80 100 50 80
/codebase/server/migrations/20210826144904_shared_libs.ts 88.88 100 66.66 88.88
/codebase/server/migrations/20220121115756_settings_onPropsUpdate.ts 80 100 50 80
/codebase/server/migrations/20220315155008_increase-template-size.ts 66.66 100 50 66.66
/codebase/server/migrations/20220316133143_versioning-text-update.ts 62.5 100 50 62.5
/codebase/server/migrations/20220323123155_add-locale-to-template.ts 88.88 100 66.66 88.88
/codebase/server/migrations/20220520083801_apps_enforceDomain.ts 66.66 100 50 66.66
/codebase/server/migrations/20220815164948_l20nManifest.ts 66.66 100 50 66.66
/codebase/server/migrations/20220819204836_rename-use-l10n.ts 66.66 100 50 66.66
/codebase/server/migrations/20220928161155_shared-lib-add-localization.ts 66.66 100 50 66.66
/codebase/server/migrations/20221118164122_add_csp_settings.ts 80 100 50 80
/codebase/server/migrations/20221123163817_csp-available-host-for-local.ts 80 100 50 80
/codebase/server/migrations/20221201191407_csp_enable_scrict_mode.ts 100 100 50 100
/codebase/server/migrations/20230303174003_settings-add-primary-key.ts 66.66 100 50 66.66
/codebase/server/migrations/20230303175443_settings-domain-value-table.ts 90 100 66.66 90
/codebase/server/migrations/20230703130802_remove-spa-bundle-constraint.ts 66.66 100 50 66.66
/codebase/server/migrations/20231003103643_routes_meta.ts 44.44 0 25 44.44
/codebase/server/migrations/20240315141721_pg_versioning_idx.ts 57.14 0 50 57.14
/codebase/server/migrations/20250225163431_unique_route.ts 70 100 50 70
/codebase/server/migrations/20250227154210_unique_app.ts 70 100 50 70
/codebase/server/migrations/20250303125703_orderpos_sequence.ts 30.76 0 25 30.76
/codebase/server/migrations/20250313162453_unique_route_v2.ts 63.63 50 50 63.63
/codebase/server/migrations/20250331085251_routeIdCascadeDelete.ts 62.5 100 50 62.5
/codebase/server/migrations/20250404133940_orderpos_sequence_revert.ts 30.76 0 25 30.76
/codebase/server/migrations/20250618105344_add_props_to_router_domains.ts 62.5 100 50 62.5
/codebase/server/migrations/20250818155232_canonical_domain_to_router_domain.ts 66.66 100 50 66.66
/codebase/server/migrations/20260113105120_sanitize_versioning_secrets.ts 44.44 0 50 42.3
/codebase/server/migrations/20260216120000_add_alias_to_router_domains.ts 66.66 100 50 66.66
/codebase/server/migrations/20260319000000_settings_proxyHeaders.ts 80 100 50 80
/codebase/server/public/interfaces.ts 0 0 0 0
/codebase/server/public/routes/appDiscovery.ts 100 100 100 100
/codebase/server/public/routes/index.ts 100 100 100 100
/codebase/server/routerDomains/interfaces/index.ts 100 100 100 100
/codebase/server/routerDomains/routes/createRouterDomains.ts 100 100 100 100
/codebase/server/routerDomains/routes/deleteRouterDomains.ts 94.11 100 100 94.11
/codebase/server/routerDomains/routes/getAllRouterDomains.ts 100 100 100 100
/codebase/server/routerDomains/routes/getRouterDomains.ts 100 100 100 100
/codebase/server/routerDomains/routes/index.ts 100 100 100 100
/codebase/server/routerDomains/routes/updateRouterDomains.ts 95.83 100 100 95.83
/codebase/server/routes/routes.ts 100 100 100 100
/codebase/server/seeds/00_cleanup.ts 81.81 0 100 81.81
/codebase/server/seeds/01_apps.ts 100 100 100 100
/codebase/server/seeds/02_templates.ts 100 100 100 100
/codebase/server/seeds/03_routerDomains.ts 100 100 100 100
/codebase/server/seeds/04_routes.ts 100 100 100 100
/codebase/server/seeds/05_route_slots.ts 100 100 100 100
/codebase/server/seeds/06_settings.ts 90.9 50 100 90.9
/codebase/server/seeds/07_rootPwd.ts 83.33 0 100 83.33
/codebase/server/settings/interfaces/cspSchema.ts 100 100 100 100
/codebase/server/settings/interfaces/index.ts 100 100 100 100
/codebase/server/settings/routes/createSetting.ts 100 100 100 100
/codebase/server/settings/routes/deleteDomainSetting.ts 100 100 100 100
/codebase/server/settings/routes/getSetting.ts 100 50 100 100
/codebase/server/settings/routes/getSettings.ts 100 82.35 100 100
/codebase/server/settings/routes/index.ts 100 100 100 100
/codebase/server/settings/routes/updateSetting.ts 100 100 100 100
/codebase/server/settings/services/SettingsService.ts 88.97 75.43 100 95.2
/codebase/server/sharedLibs/interfaces/index.ts 100 100 100 100
/codebase/server/sharedLibs/repositories/SharedLibsRepository.ts 100 100 100 100
/codebase/server/sharedLibs/routes/createSharedLib.ts 95 100 100 95
/codebase/server/sharedLibs/routes/deleteSharedLib.ts 100 100 100 100
/codebase/server/sharedLibs/routes/getSharedLib.ts 100 100 100 100
/codebase/server/sharedLibs/routes/getSharedLibs.ts 100 50 100 100
/codebase/server/sharedLibs/routes/index.ts 100 100 100 100
/codebase/server/sharedLibs/routes/updateSharedLib.ts 92.59 85.71 100 92.59
/codebase/server/sharedProps/interfaces/index.ts 100 100 100 100
/codebase/server/sharedProps/routes/createSharedProps.ts 100 100 100 100
/codebase/server/sharedProps/routes/deleteSharedProps.ts 100 100 100 100
/codebase/server/sharedProps/routes/getAllSharedProps.ts 100 100 100 100
/codebase/server/sharedProps/routes/getSharedProps.ts 100 100 100 100
/codebase/server/sharedProps/routes/index.ts 100 100 100 100
/codebase/server/sharedProps/routes/updateSharedProps.ts 100 100 100 100
/codebase/server/templates/errors.ts 100 100 100 100
/codebase/server/templates/interfaces/index.ts 0 0 0 0
/codebase/server/templates/routes/createTemplate.ts 92.85 100 100 92.85
/codebase/server/templates/routes/deleteTemplate.ts 100 100 100 100
/codebase/server/templates/routes/deleteTemplateLocalizedVersion.ts 100 66.66 100 100
/codebase/server/templates/routes/getRenderedTemplate.ts 96.55 94.73 100 96.55
/codebase/server/templates/routes/getTemplate.ts 100 100 100 100
/codebase/server/templates/routes/getTemplates.ts 100 50 100 100
/codebase/server/templates/routes/index.ts 100 100 100 100
/codebase/server/templates/routes/partialUpdateTemplate.ts 100 66.66 100 100
/codebase/server/templates/routes/updateTemplate.ts 100 80 100 100
/codebase/server/templates/routes/upsertTemplateLocalizedVersion.ts 100 66.66 100 100
/codebase/server/templates/routes/validation.ts 93.33 0 100 93.33
/codebase/server/templates/services/parseLinkHeader.ts 100 100 100 100
/codebase/server/templates/services/renderTemplate.ts 97.33 90 100 97.1
/codebase/server/templates/services/templatesRepository.ts 98.16 86.95 100 98.11
/codebase/server/templates/services/resources/Attributes.ts 100 100 100 100
/codebase/server/templates/services/resources/Resource.ts 100 100 100 100
/codebase/server/templates/services/resources/ResourceLinkParser.ts 100 100 100 100
/codebase/server/templates/services/resources/ResourcePreload.ts 100 100 100 100
/codebase/server/templates/services/resources/ResourceScript.ts 100 100 100 100
/codebase/server/templates/services/resources/ResourceStylesheet.ts 100 100 100 100
/codebase/server/templates/services/resources/buildAttributes.ts 100 100 100 100
/codebase/server/templates/services/resources/filterObject.ts 100 100 100 100
/codebase/server/util/TemplateParser.ts 100 100 100 100
/codebase/server/util/TypedMap.ts 100 100 100 100
/codebase/server/util/axiosErrorTransformer.ts 93.54 84.61 100 93.54
/codebase/server/util/axiosExponentialRetry.ts 100 100 100 100
/codebase/server/util/db.ts 100 92.3 100 100
/codebase/server/util/exhaustiveCheck.ts 50 100 0 50
/codebase/server/util/extendError.ts 100 100 100 100
/codebase/server/util/helpers.ts 97.61 94.73 100 97.5
/codebase/server/util/hmac.ts 100 100 100 100
/codebase/server/util/isTemplateValid.ts 87.5 66.66 100 87.5
/codebase/server/util/logger.ts 73.68 84.61 40 72.97
/codebase/server/util/normalizeArray.ts 83.33 75 100 83.33
/codebase/server/util/ping.ts 100 100 100 100
/codebase/server/util/pluginManager.ts 88.88 50 100 88.88
/codebase/server/util/set.ts 100 100 100 100
/codebase/server/versioning/config.ts 100 100 100 100
/codebase/server/versioning/errors.ts 100 100 100 100
/codebase/server/versioning/interfaces.ts 100 100 100 100
/codebase/server/versioning/routes/getVersions.ts 86.66 57.14 100 85.71
/codebase/server/versioning/routes/index.ts 100 100 100 100
/codebase/server/versioning/routes/revertVersion.ts 53.33 0 100 53.33
/codebase/server/versioning/services/Versioning.ts 87.61 75 100 87
/codebase/server/versioning/utils/secretSanitizer.ts 95.23 91.66 100 94.73
/codebase/typings/PaginatedResult.ts 0 0 0 0
/codebase/typings/User.ts 0 0 0 0

@wRLSS wRLSS merged commit acb7b18 into master Jul 8, 2026
42 of 43 checks passed
@wRLSS wRLSS deleted the feat/ab-testing branch July 8, 2026 09:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants