unleash-server 7.5.1 → 7.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/addons/feature-event-formatter-md-events.d.ts.map +1 -1
- package/dist/lib/addons/feature-event-formatter-md-events.js +16 -1
- package/dist/lib/addons/feature-event-formatter-md-events.js.map +1 -1
- package/dist/lib/addons/slack-app-definition.d.ts.map +1 -1
- package/dist/lib/addons/slack-app-definition.js +4 -1
- package/dist/lib/addons/slack-app-definition.js.map +1 -1
- package/dist/lib/app.d.ts.map +1 -1
- package/dist/lib/app.js +11 -25
- package/dist/lib/app.js.map +1 -1
- package/dist/lib/create-config.d.ts.map +1 -1
- package/dist/lib/create-config.js +3 -0
- package/dist/lib/create-config.js.map +1 -1
- package/dist/lib/db/api-token-store.d.ts +4 -1
- package/dist/lib/db/api-token-store.d.ts.map +1 -1
- package/dist/lib/db/api-token-store.js +17 -3
- package/dist/lib/db/api-token-store.js.map +1 -1
- package/dist/lib/error/bad-gateway-error.d.ts +7 -0
- package/dist/lib/error/bad-gateway-error.d.ts.map +1 -0
- package/dist/lib/error/bad-gateway-error.js +9 -0
- package/dist/lib/error/bad-gateway-error.js.map +1 -0
- package/dist/lib/error/gateway-timeout-error.d.ts +7 -0
- package/dist/lib/error/gateway-timeout-error.d.ts.map +1 -0
- package/dist/lib/error/gateway-timeout-error.js +9 -0
- package/dist/lib/error/gateway-timeout-error.js.map +1 -0
- package/dist/lib/error/index.d.ts +3 -1
- package/dist/lib/error/index.d.ts.map +1 -1
- package/dist/lib/error/index.js +3 -1
- package/dist/lib/error/index.js.map +1 -1
- package/dist/lib/error/unleash-error.d.ts +1 -1
- package/dist/lib/error/unleash-error.d.ts.map +1 -1
- package/dist/lib/error/unleash-error.js +2 -0
- package/dist/lib/error/unleash-error.js.map +1 -1
- package/dist/lib/events/index.d.ts +4 -1
- package/dist/lib/events/index.d.ts.map +1 -1
- package/dist/lib/events/index.js +6 -0
- package/dist/lib/events/index.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/client-feature-toggle-store.d.ts.map +1 -1
- package/dist/lib/features/client-feature-toggles/client-feature-toggle-store.js +5 -0
- package/dist/lib/features/client-feature-toggles/client-feature-toggle-store.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/client-feature-toggle-store.test.d.ts +2 -0
- package/dist/lib/features/client-feature-toggles/client-feature-toggle-store.test.d.ts.map +1 -0
- package/dist/lib/features/client-feature-toggles/client-feature-toggle-store.test.js +53 -0
- package/dist/lib/features/client-feature-toggles/client-feature-toggle-store.test.js.map +1 -0
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta-read-model.d.ts.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta-read-model.js +5 -0
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta-read-model.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta-read-model.test.d.ts +2 -0
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta-read-model.test.d.ts.map +1 -0
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta-read-model.test.js +59 -0
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta-read-model.test.js.map +1 -0
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta.d.ts +9 -3
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta.d.ts.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta.js +165 -92
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta.test.js +475 -1
- package/dist/lib/features/client-feature-toggles/delta/client-feature-toggle-delta.test.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/delta-cache.d.ts.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/delta-cache.js +3 -0
- package/dist/lib/features/client-feature-toggles/delta/delta-cache.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/delta-cache.test.js +15 -0
- package/dist/lib/features/client-feature-toggles/delta/delta-cache.test.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.d.ts +3 -0
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.d.ts.map +1 -0
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.js +16 -0
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.js.map +1 -0
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.test.d.ts +2 -0
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.test.d.ts.map +1 -0
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.test.js +25 -0
- package/dist/lib/features/client-feature-toggles/delta/visible-revision.test.js.map +1 -0
- package/dist/lib/features/context/context.d.ts +0 -1
- package/dist/lib/features/context/context.d.ts.map +1 -1
- package/dist/lib/features/context/context.js +7 -15
- package/dist/lib/features/context/context.js.map +1 -1
- package/dist/lib/features/edgetokens/edge-token-store.d.ts +2 -0
- package/dist/lib/features/edgetokens/edge-token-store.d.ts.map +1 -1
- package/dist/lib/features/edgetokens/edge-token-store.js +20 -0
- package/dist/lib/features/edgetokens/edge-token-store.js.map +1 -1
- package/dist/lib/features/edgetokens/fake-edge-token-store.d.ts +2 -0
- package/dist/lib/features/edgetokens/fake-edge-token-store.d.ts.map +1 -1
- package/dist/lib/features/edgetokens/fake-edge-token-store.js +6 -0
- package/dist/lib/features/edgetokens/fake-edge-token-store.js.map +1 -1
- package/dist/lib/features/events/event-store.d.ts +2 -4
- package/dist/lib/features/events/event-store.d.ts.map +1 -1
- package/dist/lib/features/events/event-store.js +1 -4
- package/dist/lib/features/events/event-store.js.map +1 -1
- package/dist/lib/features/feature-search/feature-search-controller.d.ts.map +1 -1
- package/dist/lib/features/feature-search/feature-search-controller.js +2 -1
- package/dist/lib/features/feature-search/feature-search-controller.js.map +1 -1
- package/dist/lib/features/feature-search/feature-search-service.d.ts.map +1 -1
- package/dist/lib/features/feature-search/feature-search-service.js +5 -0
- package/dist/lib/features/feature-search/feature-search-service.js.map +1 -1
- package/dist/lib/features/feature-search/feature-search-store.d.ts.map +1 -1
- package/dist/lib/features/feature-search/feature-search-store.js +17 -1
- package/dist/lib/features/feature-search/feature-search-store.js.map +1 -1
- package/dist/lib/features/feature-search/feature.search.e2e.test.js +56 -1
- package/dist/lib/features/feature-search/feature.search.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/configuration-revision-service.d.ts +1 -2
- package/dist/lib/features/feature-toggle/configuration-revision-service.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/configuration-revision-service.js +2 -10
- package/dist/lib/features/feature-toggle/configuration-revision-service.js.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.js +3 -2
- package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.js.map +1 -1
- package/dist/lib/features/feature-toggle/types/feature-toggle-strategies-store-type.d.ts +1 -0
- package/dist/lib/features/feature-toggle/types/feature-toggle-strategies-store-type.d.ts.map +1 -1
- package/dist/lib/features/frontend-api/frontend-api-service.d.ts.map +1 -1
- package/dist/lib/features/frontend-api/frontend-api-service.js +8 -0
- package/dist/lib/features/frontend-api/frontend-api-service.js.map +1 -1
- package/dist/lib/features/frontend-api/frontend-api.e2e.test.js +43 -0
- package/dist/lib/features/frontend-api/frontend-api.e2e.test.js.map +1 -1
- package/dist/lib/features/frontend-api/frontend-api.middleware.e2e.test.d.ts +3 -0
- package/dist/lib/features/frontend-api/frontend-api.middleware.e2e.test.d.ts.map +1 -0
- package/dist/lib/features/frontend-api/frontend-api.middleware.e2e.test.js +1071 -0
- package/dist/lib/features/frontend-api/frontend-api.middleware.e2e.test.js.map +1 -0
- package/dist/lib/features/index.d.ts +1 -0
- package/dist/lib/features/index.d.ts.map +1 -1
- package/dist/lib/features/index.js +1 -0
- package/dist/lib/features/index.js.map +1 -1
- package/dist/lib/features/instance-stats/instance-stats-service.d.ts.map +1 -1
- package/dist/lib/features/instance-stats/instance-stats-service.js +1 -3
- package/dist/lib/features/instance-stats/instance-stats-service.js.map +1 -1
- package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.js +12 -12
- package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.js.map +1 -1
- package/dist/lib/features/metrics/impact/metrics-translator.d.ts +5 -2
- package/dist/lib/features/metrics/impact/metrics-translator.d.ts.map +1 -1
- package/dist/lib/features/metrics/impact/metrics-translator.js +86 -102
- package/dist/lib/features/metrics/impact/metrics-translator.js.map +1 -1
- package/dist/lib/features/metrics/impact/metrics-translator.test.js +70 -112
- package/dist/lib/features/metrics/impact/metrics-translator.test.js.map +1 -1
- package/dist/lib/features/project/createProjectService.d.ts.map +1 -1
- package/dist/lib/features/project/createProjectService.js +6 -0
- package/dist/lib/features/project/createProjectService.js.map +1 -1
- package/dist/lib/features/project/project-service.d.ts +2 -1
- package/dist/lib/features/project/project-service.d.ts.map +1 -1
- package/dist/lib/features/project/project-service.js +3 -1
- package/dist/lib/features/project/project-service.js.map +1 -1
- package/dist/lib/features/project-environments/project-environments.e2e.test.js +37 -0
- package/dist/lib/features/project-environments/project-environments.e2e.test.js.map +1 -1
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-service.d.ts.map +1 -1
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-service.js +2 -5
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-service.js.map +1 -1
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-service.test.js +2 -2
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-service.test.js.map +1 -1
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-store.d.ts +2 -1
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-store.d.ts.map +1 -1
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-store.js +20 -3
- package/dist/lib/features/release-plans/release-plan-milestone-strategy-store.js.map +1 -1
- package/dist/lib/features/release-plans/release-plan-milestone-strategy.d.ts +2 -0
- package/dist/lib/features/release-plans/release-plan-milestone-strategy.d.ts.map +1 -1
- package/dist/lib/features/release-plans/release-plan-store.d.ts.map +1 -1
- package/dist/lib/features/release-plans/release-plan-store.js +2 -0
- package/dist/lib/features/release-plans/release-plan-store.js.map +1 -1
- package/dist/lib/features/release-plans/release-plan-template-store.d.ts.map +1 -1
- package/dist/lib/features/release-plans/release-plan-template-store.js +4 -3
- package/dist/lib/features/release-plans/release-plan-template-store.js.map +1 -1
- package/dist/lib/features/release-plans/release-plan-template-store.test.d.ts +2 -0
- package/dist/lib/features/release-plans/release-plan-template-store.test.d.ts.map +1 -0
- package/dist/lib/features/release-plans/release-plan-template-store.test.js +47 -0
- package/dist/lib/features/release-plans/release-plan-template-store.test.js.map +1 -0
- package/dist/lib/metric-events.d.ts +3 -2
- package/dist/lib/metric-events.d.ts.map +1 -1
- package/dist/lib/metric-events.js +2 -1
- package/dist/lib/metric-events.js.map +1 -1
- package/dist/lib/middleware/api-token-middleware.d.ts.map +1 -1
- package/dist/lib/middleware/api-token-middleware.js +1 -5
- package/dist/lib/middleware/api-token-middleware.js.map +1 -1
- package/dist/lib/middleware/api-token-middleware.test.js +35 -25
- package/dist/lib/middleware/api-token-middleware.test.js.map +1 -1
- package/dist/lib/middleware/backend-token-middleware.d.ts +5 -0
- package/dist/lib/middleware/backend-token-middleware.d.ts.map +1 -0
- package/dist/lib/middleware/backend-token-middleware.js +61 -0
- package/dist/lib/middleware/backend-token-middleware.js.map +1 -0
- package/dist/lib/middleware/backend-token-middleware.test.d.ts +2 -0
- package/dist/lib/middleware/backend-token-middleware.test.d.ts.map +1 -0
- package/dist/lib/middleware/backend-token-middleware.test.js +73 -0
- package/dist/lib/middleware/backend-token-middleware.test.js.map +1 -0
- package/dist/lib/middleware/conditional-middleware.d.ts +20 -0
- package/dist/lib/middleware/conditional-middleware.d.ts.map +1 -1
- package/dist/lib/middleware/conditional-middleware.js +26 -0
- package/dist/lib/middleware/conditional-middleware.js.map +1 -1
- package/dist/lib/middleware/conditional-middleware.test.d.ts +2 -0
- package/dist/lib/middleware/conditional-middleware.test.d.ts.map +1 -0
- package/dist/lib/middleware/conditional-middleware.test.js +31 -0
- package/dist/lib/middleware/conditional-middleware.test.js.map +1 -0
- package/dist/lib/middleware/frontend-token-middleware.d.ts +5 -0
- package/dist/lib/middleware/frontend-token-middleware.d.ts.map +1 -0
- package/dist/lib/middleware/frontend-token-middleware.js +61 -0
- package/dist/lib/middleware/frontend-token-middleware.js.map +1 -0
- package/dist/lib/middleware/user-token-client-api-logger-middleware.js +1 -1
- package/dist/lib/middleware/user-token-client-api-logger-middleware.js.map +1 -1
- package/dist/lib/openapi/spec/event-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/event-search-response-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/events-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/export-result-schema.d.ts +1018 -100
- package/dist/lib/openapi/spec/export-result-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/export-result-schema.js +4 -2
- package/dist/lib/openapi/spec/export-result-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-environment-safeguard-schema.d.ts +168 -0
- package/dist/lib/openapi/spec/feature-environment-safeguard-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/feature-environment-safeguard-schema.js +66 -0
- package/dist/lib/openapi/spec/feature-environment-safeguard-schema.js.map +1 -0
- package/dist/lib/openapi/spec/feature-environment-schema.d.ts +265 -7
- package/dist/lib/openapi/spec/feature-environment-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-environment-schema.js +13 -0
- package/dist/lib/openapi/spec/feature-environment-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-events-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/feature-schema.d.ts +475 -16
- package/dist/lib/openapi/spec/feature-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-schema.js +4 -2
- package/dist/lib/openapi/spec/feature-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-search-environment-schema.d.ts +688 -14
- package/dist/lib/openapi/spec/feature-search-environment-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-search-environment-schema.js +8 -0
- package/dist/lib/openapi/spec/feature-search-environment-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-search-query-parameters.d.ts +10 -1
- package/dist/lib/openapi/spec/feature-search-query-parameters.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-search-query-parameters.js +10 -0
- package/dist/lib/openapi/spec/feature-search-query-parameters.js.map +1 -1
- package/dist/lib/openapi/spec/feature-search-response-schema.d.ts +8097 -155
- package/dist/lib/openapi/spec/feature-search-response-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-search-response-schema.js +22 -0
- package/dist/lib/openapi/spec/feature-search-response-schema.js.map +1 -1
- package/dist/lib/openapi/spec/health-overview-schema.d.ts +1336 -210
- package/dist/lib/openapi/spec/health-overview-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/health-overview-schema.js +8 -0
- package/dist/lib/openapi/spec/health-overview-schema.js.map +1 -1
- package/dist/lib/openapi/spec/health-report-schema.d.ts +1336 -210
- package/dist/lib/openapi/spec/health-report-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/import-toggles-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/import-toggles-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/import-toggles-schema.js +4 -2
- package/dist/lib/openapi/spec/import-toggles-schema.js.map +1 -1
- package/dist/lib/openapi/spec/index.d.ts +4 -2
- package/dist/lib/openapi/spec/index.d.ts.map +1 -1
- package/dist/lib/openapi/spec/index.js +4 -2
- package/dist/lib/openapi/spec/index.js.map +1 -1
- package/dist/lib/openapi/spec/integration-event-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/integration-events-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/metric-query-schema.d.ts +6 -0
- package/dist/lib/openapi/spec/metric-query-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/metric-query-schema.js +6 -0
- package/dist/lib/openapi/spec/metric-query-schema.js.map +1 -1
- package/dist/lib/openapi/spec/profile-schema.d.ts +475 -16
- package/dist/lib/openapi/spec/profile-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/project-overview-schema.d.ts +1336 -210
- package/dist/lib/openapi/spec/project-overview-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/project-overview-schema.js +8 -0
- package/dist/lib/openapi/spec/project-overview-schema.js.map +1 -1
- package/dist/lib/openapi/spec/release-plan-milestone-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/release-plan-milestone-strategy-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/release-plan-milestone-strategy-schema.js +1 -1
- package/dist/lib/openapi/spec/release-plan-milestone-strategy-schema.js.map +1 -1
- package/dist/lib/openapi/spec/{safeguard-schema.d.ts → release-plan-safeguard-schema.d.ts} +16 -4
- package/dist/lib/openapi/spec/release-plan-safeguard-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/{safeguard-schema.js → release-plan-safeguard-schema.js} +3 -3
- package/dist/lib/openapi/spec/release-plan-safeguard-schema.js.map +1 -0
- package/dist/lib/openapi/spec/release-plan-schema.d.ts +23 -5
- package/dist/lib/openapi/spec/release-plan-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/release-plan-schema.js +3 -3
- package/dist/lib/openapi/spec/release-plan-schema.js.map +1 -1
- package/dist/lib/openapi/spec/release-plan-template-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/release-plan-templates-schema.d.ts +2897 -0
- package/dist/lib/openapi/spec/release-plan-templates-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/release-plan-templates-schema.js +29 -0
- package/dist/lib/openapi/spec/release-plan-templates-schema.js.map +1 -0
- package/dist/lib/openapi/spec/release-plans-schema.d.ts +45 -9
- package/dist/lib/openapi/spec/release-plans-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/release-plans-schema.js +2 -2
- package/dist/lib/openapi/spec/release-plans-schema.js.map +1 -1
- package/dist/lib/openapi/spec/search-features-schema.d.ts +13694 -5078
- package/dist/lib/openapi/spec/search-features-schema.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/api-token.js +1 -1
- package/dist/lib/routes/admin-api/api-token.js.map +1 -1
- package/dist/lib/routes/admin-api/project/api-token.js +1 -1
- package/dist/lib/routes/admin-api/project/api-token.js.map +1 -1
- package/dist/lib/routes/logout.js +1 -1
- package/dist/lib/routes/logout.js.map +1 -1
- package/dist/lib/routes/logout.test.js +4 -4
- package/dist/lib/routes/logout.test.js.map +1 -1
- package/dist/lib/schema/api-token-schema.d.ts.map +1 -1
- package/dist/lib/schema/api-token-schema.js +1 -0
- package/dist/lib/schema/api-token-schema.js.map +1 -1
- package/dist/lib/server-impl.d.ts +5 -5
- package/dist/lib/server-impl.d.ts.map +1 -1
- package/dist/lib/server-impl.js +3 -3
- package/dist/lib/server-impl.js.map +1 -1
- package/dist/lib/services/api-token-service.d.ts +2 -2
- package/dist/lib/services/api-token-service.d.ts.map +1 -1
- package/dist/lib/services/api-token-service.js +5 -3
- package/dist/lib/services/api-token-service.js.map +1 -1
- package/dist/lib/services/api-token-service.test.js +5 -4
- package/dist/lib/services/api-token-service.test.js.map +1 -1
- package/dist/lib/services/edge-service.d.ts +1 -0
- package/dist/lib/services/edge-service.d.ts.map +1 -1
- package/dist/lib/services/edge-service.js +5 -2
- package/dist/lib/services/edge-service.js.map +1 -1
- package/dist/lib/services/user-service.d.ts.map +1 -1
- package/dist/lib/services/user-service.js +0 -4
- package/dist/lib/services/user-service.js.map +1 -1
- package/dist/lib/types/experimental.d.ts +1 -1
- package/dist/lib/types/experimental.d.ts.map +1 -1
- package/dist/lib/types/experimental.js +7 -8
- package/dist/lib/types/experimental.js.map +1 -1
- package/dist/lib/types/model.d.ts +2 -1
- package/dist/lib/types/model.d.ts.map +1 -1
- package/dist/lib/types/model.js.map +1 -1
- package/dist/lib/types/option.d.ts +2 -0
- package/dist/lib/types/option.d.ts.map +1 -1
- package/dist/lib/types/stores/api-token-store.d.ts +2 -1
- package/dist/lib/types/stores/api-token-store.d.ts.map +1 -1
- package/dist/lib/types/stores/edge-store.d.ts +2 -0
- package/dist/lib/types/stores/edge-store.d.ts.map +1 -1
- package/dist/lib/types/stores/event-store.d.ts +1 -1
- package/dist/lib/types/stores/event-store.d.ts.map +1 -1
- package/dist/lib/util/clone-db-config.d.ts +3 -0
- package/dist/lib/util/clone-db-config.d.ts.map +1 -0
- package/dist/lib/util/clone-db-config.js +18 -0
- package/dist/lib/util/clone-db-config.js.map +1 -0
- package/dist/lib/util/clone-db-config.test.d.ts +2 -0
- package/dist/lib/util/clone-db-config.test.d.ts.map +1 -0
- package/dist/lib/util/clone-db-config.test.js +40 -0
- package/dist/lib/util/clone-db-config.test.js.map +1 -0
- package/dist/lib/util/db-lock.d.ts.map +1 -1
- package/dist/lib/util/db-lock.js +2 -3
- package/dist/lib/util/db-lock.js.map +1 -1
- package/dist/lib/util/sortStrategies.d.ts +1 -1
- package/dist/lib/util/sortStrategies.d.ts.map +1 -1
- package/dist/lib/util/sortStrategies.js +6 -2
- package/dist/lib/util/sortStrategies.js.map +1 -1
- package/dist/lib/util/sortStrategies.test.js +21 -0
- package/dist/lib/util/sortStrategies.test.js.map +1 -1
- package/dist/migrations/20260309125735-drop-cascade-for-edge-api-token.d.ts +3 -0
- package/dist/migrations/20260309125735-drop-cascade-for-edge-api-token.d.ts.map +1 -0
- package/dist/migrations/20260309125735-drop-cascade-for-edge-api-token.js +15 -0
- package/dist/migrations/20260309125735-drop-cascade-for-edge-api-token.js.map +1 -0
- package/dist/migrations/20260310134100-split-safeguards-table.d.ts +3 -0
- package/dist/migrations/20260310134100-split-safeguards-table.d.ts.map +1 -0
- package/dist/migrations/20260310134100-split-safeguards-table.js +31 -0
- package/dist/migrations/20260310134100-split-safeguards-table.js.map +1 -0
- package/dist/migrations/20260311073041-migrate-safeguards-data.d.ts +3 -0
- package/dist/migrations/20260311073041-migrate-safeguards-data.d.ts.map +1 -0
- package/dist/migrations/20260311073041-migrate-safeguards-data.js +42 -0
- package/dist/migrations/20260311073041-migrate-safeguards-data.js.map +1 -0
- package/dist/migrations/20260312100000-release-plans-fix-cascade-on-env-disconnect.d.ts +3 -0
- package/dist/migrations/20260312100000-release-plans-fix-cascade-on-env-disconnect.d.ts.map +1 -0
- package/dist/migrations/20260312100000-release-plans-fix-cascade-on-env-disconnect.js +31 -0
- package/dist/migrations/20260312100000-release-plans-fix-cascade-on-env-disconnect.js.map +1 -0
- package/dist/migrations/20260316113111-update-memory-usage-to-big-int.d.ts +3 -0
- package/dist/migrations/20260316113111-update-memory-usage-to-big-int.d.ts.map +1 -0
- package/dist/migrations/20260316113111-update-memory-usage-to-big-int.js +8 -0
- package/dist/migrations/20260316113111-update-memory-usage-to-big-int.js.map +1 -0
- package/dist/migrations/20260316140000-safeguards-fix-cascade-on-env-disconnect.d.ts +3 -0
- package/dist/migrations/20260316140000-safeguards-fix-cascade-on-env-disconnect.d.ts.map +1 -0
- package/dist/migrations/20260316140000-safeguards-fix-cascade-on-env-disconnect.js +54 -0
- package/dist/migrations/20260316140000-safeguards-fix-cascade-on-env-disconnect.js.map +1 -0
- package/dist/migrations/20260317140000-safeguards-drop-project-not-null.d.ts +3 -0
- package/dist/migrations/20260317140000-safeguards-drop-project-not-null.d.ts.map +1 -0
- package/dist/migrations/20260317140000-safeguards-drop-project-not-null.js +21 -0
- package/dist/migrations/20260317140000-safeguards-drop-project-not-null.js.map +1 -0
- package/dist/migrations/20260318100000-safeguards-drop-project-column.d.ts +3 -0
- package/dist/migrations/20260318100000-safeguards-drop-project-column.d.ts.map +1 -0
- package/dist/migrations/20260318100000-safeguards-drop-project-column.js +14 -0
- package/dist/migrations/20260318100000-safeguards-drop-project-column.js.map +1 -0
- package/dist/migrations/20260406132537-user-access-requests.d.ts +3 -0
- package/dist/migrations/20260406132537-user-access-requests.d.ts.map +1 -0
- package/dist/migrations/20260406132537-user-access-requests.js +16 -0
- package/dist/migrations/20260406132537-user-access-requests.js.map +1 -0
- package/dist/migrations/20260406161629-user-access-requests-unique-email.d.ts +3 -0
- package/dist/migrations/20260406161629-user-access-requests-unique-email.d.ts.map +1 -0
- package/dist/migrations/20260406161629-user-access-requests-unique-email.js +14 -0
- package/dist/migrations/20260406161629-user-access-requests-unique-email.js.map +1 -0
- package/dist/migrator.d.ts.map +1 -1
- package/dist/migrator.js +4 -3
- package/dist/migrator.js.map +1 -1
- package/dist/server-dev.js +4 -7
- package/dist/server-dev.js.map +1 -1
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +5 -5
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/api-token.e2e.test.js +3 -2
- package/dist/test/e2e/api/admin/api-token.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/conditional-middleware.e2e.test.js +106 -38
- package/dist/test/e2e/api/admin/conditional-middleware.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/context-api-include-query-params.e2e.test.js +1 -7
- package/dist/test/e2e/api/admin/context-api-include-query-params.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/api-token.e2e.test.js +2 -1
- package/dist/test/e2e/api/admin/project/api-token.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/project.api.tokens.e2e.test.js +5 -5
- package/dist/test/e2e/api/admin/project/project.api.tokens.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project-context.e2e.test.js +1 -7
- package/dist/test/e2e/api/admin/project-context.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +34 -1
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/api-token-service.e2e.test.js +21 -6
- package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/edge-service.e2e.test.js +4 -3
- package/dist/test/e2e/services/edge-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/api-token-store.e2e.test.js +15 -14
- package/dist/test/e2e/stores/api-token-store.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/event-store.e2e.test.js +8 -9
- package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
- package/dist/test/fixtures/fake-api-token-store.d.ts +2 -1
- package/dist/test/fixtures/fake-api-token-store.d.ts.map +1 -1
- package/dist/test/fixtures/fake-api-token-store.js +4 -1
- package/dist/test/fixtures/fake-api-token-store.js.map +1 -1
- package/dist/test/fixtures/fake-event-store.d.ts +1 -1
- package/dist/test/fixtures/fake-event-store.d.ts.map +1 -1
- package/dist/test/fixtures/fake-event-store.js +1 -1
- package/dist/test/fixtures/fake-event-store.js.map +1 -1
- package/dist/test/fixtures/fake-release-plan-milestone-strategy-store.d.ts +2 -2
- package/dist/test/fixtures/fake-release-plan-milestone-strategy-store.d.ts.map +1 -1
- package/dist/test/fixtures/fake-release-plan-milestone-strategy-store.js +3 -2
- package/dist/test/fixtures/fake-release-plan-milestone-strategy-store.js.map +1 -1
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/AdvancedPlayground-BTPrG6RW.js +3 -0
- package/frontend/build/static/BackendConnections-CRh8Vxoe.js +1 -0
- package/frontend/build/static/{CreateProject-DV-Ad8Sn.js → CreateProject-DEMalH1j.js} +1 -1
- package/frontend/build/static/EnterpriseEdge-Cp-pGMa0.js +6 -0
- package/frontend/build/static/FeatureMetricsChart-DQOE71LA.js +2 -0
- package/frontend/build/static/FeatureStaleDialog-B6BfnDiQ.js +689 -0
- package/frontend/build/static/{FeatureViewLazyExport-Bsw7-knb.js → FeatureViewLazyExport-BkNTNFqK.js} +4 -7
- package/frontend/build/static/FlagMetricsChart-zYDF9bet.js +2 -0
- package/frontend/build/static/FrontendNetworkTrafficUsage-CbxdFXH7.js +1 -0
- package/frontend/build/static/GridLayoutWrapper-Cq6Bzm36.js +3 -0
- package/frontend/build/static/ImpactMetricsPage-CFYXYXPb.js +1 -0
- package/frontend/build/static/LazyAdminExport-ByTh4iFa.js +38 -0
- package/frontend/build/static/LazyProjectExport-K12Xy3w9.js +46 -0
- package/frontend/build/static/{LifecycleChartComponent-cxR-TN3V.js → LifecycleChartComponent-DHvlFNd2.js} +3 -3
- package/frontend/build/static/LineChartComponent-BlhKm3cw.js +1 -0
- package/frontend/build/static/MarkCompletedDialogue-apmlFjVY.js +1 -0
- package/frontend/build/static/{NetworkOverview-DxaPXUzZ.js → NetworkOverview-BiLOuQ4c.js} +1 -1
- package/frontend/build/static/{NetworkPrometheusAPIWarning-ltyTlXFF.js → NetworkPrometheusAPIWarning-CYo3j2Tj.js} +1 -1
- package/frontend/build/static/{NetworkTraffic-Dhw4yIBs.js → NetworkTraffic-DONL5oIx.js} +1 -1
- package/frontend/build/static/NetworkTrafficUsage-DjQiYq0S.js +1 -0
- package/frontend/build/static/{PercentageDonut-JGNh2FVZ.js → PercentageDonut-CA9hYg3v.js} +1 -1
- package/frontend/build/static/{ReactJSONEditor-GHl7KvdS.js → ReactJSONEditor-9cJL1vJY.js} +31 -31
- package/frontend/build/static/{RoleCell-CjVCxBgl.js → RoleCell-ZzU5Oqy8.js} +1 -1
- package/frontend/build/static/Safeguard-DY1N4aPz.js +1 -0
- package/frontend/build/static/aggregateFeatureMetrics-D6bHft_C.js +1 -0
- package/frontend/build/static/{formatTickValue-BZb4ZIL9.js → formatTickValue-BcLsqREh.js} +2 -2
- package/frontend/build/static/{index-DcWBU_a4.js → index-B87DWXbl.js} +1 -1
- package/frontend/build/static/index-CoLhlfXP.js +565 -0
- package/frontend/build/static/loginBackground-CQx0IRYc.png +0 -0
- package/frontend/build/static/{networkTrafficUsageHighlightPlugin-BbfAyDiQ.js → networkTrafficUsageHighlightPlugin-CqEM-cK_.js} +1 -1
- package/frontend/build/static/passwordSuccess-fcvTEYOw.png +0 -0
- package/frontend/build/static/useApiTokens-ClWvohC9.js +1 -0
- package/frontend/package.json +50 -42
- package/package.json +11 -10
- package/dist/lib/openapi/spec/safeguard-schema.d.ts.map +0 -1
- package/dist/lib/openapi/spec/safeguard-schema.js.map +0 -1
- package/frontend/build/static/AdvancedPlayground-CF0hkpiE.js +0 -3
- package/frontend/build/static/BackendConnections-DhZczar-.js +0 -1
- package/frontend/build/static/EnterpriseEdge-D1To2ugP.js +0 -3
- package/frontend/build/static/FeatureMetricsChart-D8sRgx5P.js +0 -2
- package/frontend/build/static/FeatureStaleDialog-DOkhgvaj.js +0 -7
- package/frontend/build/static/FlagMetricsChart-CF_kEyQa.js +0 -2
- package/frontend/build/static/FrontendNetworkTrafficUsage-C8zJSvoc.js +0 -1
- package/frontend/build/static/GridLayoutWrapper-DpJcUbQB.js +0 -3
- package/frontend/build/static/ImpactMetricsPage-KLVv-tP4.js +0 -1
- package/frontend/build/static/LazyAdminExport-CWQiknO-.js +0 -38
- package/frontend/build/static/LazyProjectExport-DsMn4Yxm.js +0 -728
- package/frontend/build/static/LineChartComponent-_yZEp3dd.js +0 -1
- package/frontend/build/static/MarkCompletedDialogue-DFtLyDN0.js +0 -1
- package/frontend/build/static/NetworkTrafficUsage-deKWRhIS.js +0 -1
- package/frontend/build/static/aggregateFeatureMetrics-YEdZNNoV.js +0 -1
- package/frontend/build/static/index-DMSjiFEm.js +0 -583
- package/frontend/build/static/useApiTokens-DBB3NvXL.js +0 -1
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
import{E as Z,j as n,F as ee,A as ve,l as Se,C as ne,m as Fe,n as Ne,bf as Le,kp as $e,o as Ye,b as L,T as y,s as h,u as je,b7 as ze,r as x,b6 as te,b8 as ae,ba as Be,c0 as $,aN as _e,by as He,hQ as Ge,bA as qe,f as P,bB as We,b9 as se,bq as Me,ao as Ue,kq as Ve,bG as Je,kr as Qe,b5 as M,ks as Xe,jB as Ze,jr as en,i as E,h as T,kt as nn,cp as Ce,aQ as tn,aR as an,aO as sn,aU as Ae,be as de,bc as ke,ku as on,kv as rn,kw as ln,jp as cn,kx as dn,B as _,an as un,cq as pn,fV as hn,hh as gn,K as Y,ia as mn,cN as Ie,ai as Re,ky as I,kz as fn,kA as bn,kB as xn,kC as yn,kD as vn,kE as Sn,kF as jn,kG as _n,kH as Un,kI as Cn,kJ as An,kK as kn,kL as In,kM as Rn,kN as En,fA as V,cL as J,it as z,cy as Tn,ie as wn,aM as N,d as Pn,x as Dn,hL as On,w as Kn,d3 as Fn,i_ as Q,aB as Nn,c8 as Ln}from"./index-CoLhlfXP.js";var oe={},$n=ee;Object.defineProperty(oe,"__esModule",{value:!0});var Ee=oe.default=void 0,Yn=$n(Z()),zn=n,Bn=(0,Yn.default)((0,zn.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"}),"IndeterminateCheckBox");Ee=oe.default=Bn;const Hn=$e(),ja=({options:e,selectedOptions:t,indeterminateOptions:a,tagType:s,existingTags:o,disabled:r=!1,onChange:l})=>{const i=n.jsx(Ye,{fontSize:"small"}),d=u=>u.inputValue?u.inputValue:u.title,m=({key:u,...g},c,{selected:f})=>{const j=(a==null?void 0:a.some(v=>v.title===c.title))??!1;return n.jsxs("li",{...g,children:[n.jsx(ne,{condition:!!c.inputValue,show:n.jsx(Le,{sx:{mr:v=>v.spacing(.5)}}),elseShow:n.jsx(Fe,{icon:i,checkedIcon:n.jsx(Ne,{fontSize:"small"}),indeterminateIcon:n.jsx(Ee,{fontSize:"small"}),sx:{mr:v=>v.spacing(.5)},checked:f&&!j,indeterminate:j})}),c.title]},u)},b=(u,g)=>{const c=g.inputValue.trim(),f=Hn(u,{...g,inputValue:c}),j=u.some(v=>c===v.title);return c.length>=2&&!j&&f.push({inputValue:c,title:`Create new value "${c}"`}),f};return n.jsx(ve,{multiple:!0,id:"checkboxes-tag",sx:{marginTop:u=>u.spacing(2),width:500},disableCloseOnSelect:!0,options:e,value:t,isOptionEqualToValue:(u,g)=>g.inputValue&&g.inputValue!==""?u.title===g.inputValue:u.title===g.title,getOptionLabel:d,renderOption:m,filterOptions:b,ListboxProps:{style:{maxHeight:200,overflow:"auto"}},onChange:l,renderInput:u=>n.jsx(Se,{...u,label:"Select values",placeholder:"Select values"}),disabled:r})},Gn=h("li")({flexDirection:"column"}),_a=({options:e,value:t,disabled:a=!1,onChange:s})=>{const o=L();return n.jsx(ve,{disablePortal:!0,disabled:a,id:"tag-type-select",sx:{marginTop:r=>r.spacing(2),width:500},options:e,disableClearable:!0,value:t,getOptionLabel:r=>r.name,renderOption:({key:r,...l},i)=>n.jsxs(Gn,{...l,style:{alignItems:"flex-start",gap:o.spacing(.5)},children:[n.jsx(y,{variant:"body1",children:i.name}),n.jsx(y,{variant:"caption",children:i.description})]},r),renderInput:r=>n.jsx(Se,{...r,label:"Tag type",value:t}),onChange:s,ListboxProps:{style:{maxHeight:200,overflow:"auto"}}})},Ua=()=>{const{makeRequest:e,createRequest:t,errors:a,loading:s}=je({propagateErrors:!0});return{createTag:async l=>{const d=t("api/admin/tags",{method:"POST",body:JSON.stringify(l)});return e(d.caller,d.id)},bulkUpdateTags:async(l,i)=>{const d=`api/admin/projects/${i}/tags`,m=t(d,{method:"PUT",body:JSON.stringify(l)});return e(m.caller,m.id)},errors:a,loading:s}},Ca=(e,t={})=>{const a=async()=>{const m=te(`api/admin/tags/${e}`);return(await fetch(m,{method:"GET"}).then(ae("Tags"))).json()},s=`api/admin/tags/${e}`,{data:o,error:r}=ze(!!e,{tags:[]},s,a,t),[l,i]=x.useState(!r&&!o),d=()=>{Be(s)};return x.useEffect(()=>{i(!r&&!o)},[o,r]),{tags:(o==null?void 0:o.tags)||[],error:r,loading:l,refetch:d}},qn=(e,t)=>{var l,i;const{project:a,refetch:s}=$(e),o={name:"flexibleRollout",constraints:[],parameters:{rollout:"100",stickiness:a.defaultStickiness||"default",groupId:""}},r=(i=(l=a.environments)==null?void 0:l.find(d=>d.environment===t))==null?void 0:i.defaultStrategy;return{defaultStrategyFallback:o,strategy:r,refetch:s}},Aa=()=>{const e=_e("projectId"),t=He("environmentId"),{refetch:a}=$(e),{defaultStrategyFallback:s,strategy:o,refetch:r}=qn(e,t),[l,i]=x.useState(o||s),{updateDefaultStrategy:d,loading:m}=Ge(),{strategyDefinition:b}=qe(l.name),{setToastData:u,setToastApiError:g}=P(),c=We(),{uiConfig:f}=se(),{unleashUrl:j}=f,v=Me(),{trackEvent:R}=Ue(),k=Ve(l.constraints);if(!b)return null;const C=Wn(l),p=async()=>{const D=`/projects/${e}/settings/default-strategy`;try{await d(e,t,C),R("default_strategy",{props:{action:"edit",hasTitle:!!C.title}}),a(),u({text:"Default Strategy updated",type:"success"}),await r(),v(D)}catch(ce){g(T(ce))}};return n.jsx(Je,{modal:!0,disablePadding:!0,description:Vn,documentationLink:Jn,documentationLinkLabel:Qn,formatApiCode:()=>Mn(e,t,C,b,j),children:n.jsxs(Qe,{strategy:l,setStrategy:i,strategyDefinition:b,errors:c,groupIdTooltip:"Defaults to the feature flag name if not set.",onSubmit:p,children:[n.jsx(M,{permission:[Ze,en],projectId:e,environmentId:t,variant:"contained",color:"primary",type:"submit",disabled:m||!k||c.hasFormErrors(),"data-testid":Xe,children:"Save strategy"}),n.jsx(E,{type:"button",onClick:()=>v(`/projects/${e}/settings/default-strategy`),children:"Cancel"})]})})},Wn=e=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:Object.fromEntries(Object.entries(e.parameters??{}).filter(([,t])=>t!==void 0).map(([t,a])=>[t,String(a)])),variants:e.variants??[],segments:e.segments??[],disabled:e.disabled??!1}),Mn=(e,t,a,s,o)=>{if(!o)return"";const r={...a,parameters:nn(a.parameters??{},s)},l=`${o}/api/admin/projects/${e}/environments/${t}/default-strategy`,i=JSON.stringify(r,void 0,2);return`curl --location --request POST '${l}' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${i}'`},Vn=`
|
|
5
|
+
An activation strategy will only run when a feature flag is enabled and provides a way to control who will get access to the feature.
|
|
6
|
+
If any of a feature flag's activation strategies returns true, the user will get access.
|
|
7
|
+
`,Jn="https://docs.getunleash.io/concepts/projects#project-default-strategy",Qn="Default strategy documentation",ka=e=>{const{data:t,error:a,mutate:s}=Ce(te(`api/admin/environments/project/${e}`),Xn),o=x.useMemo(()=>t||[],[t]),r=x.useCallback(async()=>{await s()},[s]);return{environments:o,refetchEnvironments:r,loading:!a&&!t,error:a}},Xn=async e=>(await fetch(e).then(ae("Environments")).then(a=>a.json())).environments.sort((a,s)=>a.sortOrder-s.sortOrder),Zn=e=>{const{setToastData:t,setToastApiError:a}=P(),{addChange:s}=tn(),{refetch:o}=an(e),[r,l]=x.useState(!1),[i,d]=x.useState({isOpen:!1}),m=x.useCallback((g,c,f,j)=>{d({featureName:g,environment:c,enabled:f,shouldActivateDisabledStrategies:j,isOpen:!0})},[]),b=x.useCallback(()=>{d(g=>({...g,isOpen:!1}))},[]),u=x.useCallback(async()=>{try{l(!0),await s(e,i.environment,{feature:i.featureName,action:"updateEnabled",payload:{enabled:!!i.enabled,shouldActivateDisabledStrategies:!!i.shouldActivateDisabledStrategies}}),o(),d(g=>({...g,isOpen:!1})),t({type:"success",text:"Changes added to draft"})}catch(g){a(T(g)),d(c=>({...c,isOpen:!1}))}finally{l(!1)}},[s]);return{pending:r,onChangeRequestToggle:m,onChangeRequestToggleClose:b,onChangeRequestToggleConfirm:u,changeRequestDialogDetails:i}},et=({enabled:e,featureName:t,environment:a})=>n.jsxs(y,{"data-testid":"update-enabled-message",children:[n.jsx("strong",{children:e?"Enable":"Disable"})," feature flag"," ",n.jsx("strong",{children:t})," in ",n.jsx("strong",{children:a})]}),nt=h("ul")(({theme:e})=>({margin:e.spacing(1),paddingLeft:e.spacing(2)})),tt=({isOpen:e,onAddDefaultStrategy:t,onActivateDisabledStrategies:a,onClose:s,environment:o,featureId:r})=>{var b,u,g;const l=_e("projectId"),{feature:i}=sn(l,r),d=(g=(u=(b=i.environments)==null?void 0:b.find(({name:c})=>c===o))==null?void 0:u.strategies)==null?void 0:g.filter(({disabled:c})=>c).length,m=d?d===1?"1 disabled strategy":`${d} disabled strategies`:"disabled strategies";return n.jsxs(Ae,{open:e,secondaryButtonText:"Cancel",permissionButton:n.jsxs(n.Fragment,{children:[n.jsx(M,{type:"button",variant:"outlined",permission:de,projectId:l,environmentId:o,onClick:t,children:"Add default strategy"}),n.jsx(M,{type:"button",variant:"outlined",permission:de,projectId:l,environmentId:o,onClick:a,children:"Enable all strategies"})]}),onClose:s,title:`Enable feature flag in ${o}`,fullWidth:!0,children:[n.jsx(y,{sx:{mb:c=>c.spacing(3)},children:"A feature flag cannot be enabled without an enabled strategy."}),n.jsx(y,{children:"To enable this feature flag you can choose to:"}),n.jsxs(nt,{children:[n.jsx("li",{children:n.jsx(y,{children:n.jsx("strong",{children:"Add the default strategy"})})}),n.jsx("li",{children:n.jsxs(y,{children:[n.jsx("strong",{children:"Enable all the disabled strategies"})," ","(this feature flag has ",m,")"]})})]})]})},at=e=>{const t=a=>{a<e.length&&e[a](()=>t(a+1))};t(0)},Ia=e=>{const{toggleFeatureEnvironmentOn:t,toggleFeatureEnvironmentOff:a}=ke(),{setToastData:s,setToastApiError:o}=P(),[r,l]=x.useState({open:!1,label:"",loading:!1,onClose:()=>{},onClick:()=>{}}),[i,d]=x.useState({isOpen:!1,environment:"",featureId:"",onClose:()=>{},onActivateDisabledStrategies:()=>{},onAddDefaultStrategy:()=>{}}),{pending:m,onChangeRequestToggle:b,onChangeRequestToggleClose:u,onChangeRequestToggleConfirm:g,changeRequestDialogDetails:c}=Zn(e),[f,j]=x.useState(),v=x.useCallback(async(C,p)=>{let D=!1;return at([U=>{if(p.isChangeRequestEnabled||!ln(p.environmentType||""))return U();l({open:!0,label:`${C?"Enable":"Disable"} Environment`,loading:!1,onClose:()=>{var S;l(A=>({...A,open:!1})),(S=p.onRollback)==null||S.call(p)},onClick:()=>{l(S=>({...S,open:!1,loading:!0})),U()}})},U=>{if(C===!1||!p.hasStrategies||p.hasEnabledStrategies||p.hasReleasePlans)return U();d({isOpen:!0,environment:p.environmentName,featureId:p.featureId,onClose:()=>{var S;d(A=>({...A,isOpen:!1})),(S=p.onRollback)==null||S.call(p)},onActivateDisabledStrategies:()=>{d(S=>({...S,isOpen:!1})),D=!0,U()},onAddDefaultStrategy:()=>{d(S=>({...S,isOpen:!1})),U()}})},U=>{if(!p.isChangeRequestEnabled)return U();j(()=>{var S;j(void 0),(S=p.onRollback)==null||S.call(p)}),b(p.featureId,p.environmentName,C,D)},async U=>{var S,A;if(C!==!1)return U();try{await a(p.projectId,p.featureId,p.environmentName),s({type:"success",text:`Disabled in ${p.environmentName}`}),(S=p.onSuccess)==null||S.call(p)}catch(G){o(T(G)),(A=p.onRollback)==null||A.call(p)}},async U=>{var S,A;if(C!==!0)return U();try{await t(p.projectId,p.featureId,p.environmentName,D),s({type:"success",text:`Enabled in ${p.environmentName}`}),(S=p.onSuccess)==null||S.call(p)}catch(G){o(T(G)),(A=p.onRollback)==null||A.call(p)}}])},[l]),R=i.featureId.length!==0,k=n.jsxs(n.Fragment,{children:[n.jsx(on,{...r}),n.jsx(ne,{condition:R,show:n.jsx(tt,{...i})}),n.jsx(rn,{isOpen:c.isOpen,onClose:()=>{f==null||f(),u()},environment:c==null?void 0:c.environment,disabled:m,onConfirm:()=>{f==null||f(),g()},messageComponent:n.jsx(et,{enabled:c==null?void 0:c.enabled,featureName:c==null?void 0:c.featureName,environment:c.environment})})]});return{onToggle:v,modals:k}},st=e=>{const[t,a]=x.useState(e),s=x.useCallback(()=>a(e),[e]);return x.useEffect(()=>{a(e)},[e]),[t,a,s]},ot=h(_)(()=>({mx:"auto",...un})),Ra=({projectId:e,featureId:t,environmentName:a,value:s,onToggle:o})=>{const[r,l,i]=st(s),d=()=>{l(!r),requestAnimationFrame(()=>{o(!r,i)})},m=`${t}-${a}`;return n.jsx(n.Fragment,{children:n.jsx(ot,{"data-testid":`TOGGLE-${m}`,children:n.jsx(cn,{tooltip:r?`Disable flag in ${a}`:`Enable flag in ${a}`,checked:s,environmentId:a,projectId:e,permission:dn,inputProps:{"aria-label":a},onClick:d,"data-testid":"permission-switch",disabled:s!==r})},m)})};var ie={},it=ee;Object.defineProperty(ie,"__esModule",{value:!0});var rt=ie.default=void 0,lt=it(Z()),ct=n,dt=(0,lt.default)((0,ct.jsx)("path",{d:"M16 11h-1V3c0-1.1-.9-2-2-2h-2c-1.1 0-2 .9-2 2v8H8c-2.76 0-5 2.24-5 5v7h18v-7c0-2.76-2.24-5-5-5zm3 10h-2v-3c0-.55-.45-1-1-1s-1 .45-1 1v3h-2v-3c0-.55-.45-1-1-1s-1 .45-1 1v3H9v-3c0-.55-.45-1-1-1s-1 .45-1 1v3H5v-5c0-1.65 1.35-3 3-3h8c1.65 0 3 1.35 3 3v5z"}),"CleaningServices");rt=ie.default=dt;const ut="flag-reminders:v1",pt=50,ht=7,Ea=({days:e=ht,maxReminders:t=pt}={})=>{const[a,s]=pn(ut,{});return{shouldShowReminder:l=>{const i=a[l];return!i||gn(new Date,new Date(i))},snoozeReminder:(l,i=e)=>{const d=hn(new Date,i).getTime();s(m=>{const b={...m,[l]:d},u=Object.entries(b);if(u.length>t){u.sort((c,f)=>c[1]-f[1]);const g=u.slice(u.length-t);return Object.fromEntries(g)}return b})}}},gt=(e,t={})=>{const a=te(`api/admin/projects/${e}/api-tokens`),{data:s,error:o,mutate:r}=Ce(a,mt,t),l=x.useMemo(()=>s??[],[s]),i=x.useCallback(()=>{r().catch(console.warn)},[r]);return{tokens:l,error:o,loading:!o&&!s,refetch:i}},mt=async e=>(await(await fetch(e).then(ae("Project Api tokens"))).json()).tokens,ft=()=>{const{makeRequest:e,createRequest:t,errors:a,loading:s}=je({propagateErrors:!0});return{deleteToken:async(l,i)=>{const d=`api/admin/projects/${i}/api-tokens/${l}`,m=t(d,{method:"DELETE"});return e(m.caller,m.id)},createToken:async(l,i)=>{const d=`api/admin/projects/${i}/api-tokens`,m=t(d,{method:"POST",body:JSON.stringify(l)});return e(m.caller,m.id)},errors:a,loading:s}},bt=e=>{if(!e)return null;const[t,a]=e.split(":",2);if(!a)return null;const[s,o,...r]=a.split(".");return t&&s&&o&&r.length===0?{project:t,environment:s,secret:o}:null},w=h("div")(({theme:e})=>({fontWeight:e.typography.fontWeightBold,marginBottom:e.spacing(1),fontSize:e.typography.body1.fontSize})),B=h("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between",marginTop:e.spacing(2)})),xt=h("div")(({theme:e})=>({display:"flex",gap:e.spacing(1)})),yt=h("div")(({theme:e})=>({background:e.palette.background.application,borderRadius:e.shape.borderRadius,width:e.spacing(7),height:e.spacing(1)})),vt=h("div")(({theme:e})=>({background:e.palette.background.sidebar,borderRadius:e.shape.borderRadius,width:e.spacing(7),height:e.spacing(1)})),H=({active:e,steps:t})=>n.jsx(xt,{children:Array.from({length:t},(a,s)=>s===e?n.jsx(vt,{},s):n.jsx(yt,{},s))}),St=({environments:e,onSelect:t,currentEnvironment:a})=>{const s=Math.max(...e.map(o=>o.length));return n.jsx(mn,{tooltip:{header:""},description:"Select the environment where the API key will be created",options:e.map(o=>({label:o,value:o})),onChange:o=>{t(o)},button:{label:a,icon:n.jsx(Ie,{}),labelWidth:`${s+5}ch`},search:{label:"Filter project mode options",placeholder:"Select project mode"}})},jt=h("div")(({theme:e})=>({backgroundColor:e.palette.background.elevation1,borderRadius:e.shape.borderRadius,padding:e.spacing(3),display:"flex",flexDirection:"column",alignItems:"center"})),q=h("div")(({theme:e})=>({backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadius,padding:e.spacing(2),flex:1,color:e.palette.text.secondary,fontSize:e.typography.body2.fontSize})),_t=h(_)(({theme:e})=>({display:"flex",gap:e.spacing(2),alignItems:"flex-start",marginTop:e.spacing(8),flexWrap:"wrap"})),W=h("p")(({theme:e})=>({color:e.palette.text.secondary,fontSize:e.typography.body2.fontSize,marginBottom:e.spacing(2)})),Ut=h("div")(({theme:e})=>({padding:e.spacing(5,8,3,8),display:"flex",flexDirection:"column",gap:e.spacing(3)})),Ct=({project:e,environment:t,secret:a})=>{const s=L(),o=Re(s.breakpoints.up("lg"));return n.jsx(I.ArcherContainer,{strokeColor:s.palette.secondary.border,endMarker:!1,lineStyle:"curve",children:n.jsxs(jt,{children:[n.jsxs(_,{sx:{wordBreak:"break-all"},children:[n.jsx(I.ArcherElement,{id:"project",children:n.jsx("span",{children:e})}),":",n.jsx(I.ArcherElement,{id:"environment",children:n.jsx("span",{children:t})}),".",n.jsx(I.ArcherElement,{id:"secret",children:n.jsx("span",{children:a})})]}),o?n.jsxs(_t,{children:[n.jsx(I.ArcherElement,{id:"project-description",relations:[{targetId:"project",targetAnchor:"bottom",sourceAnchor:"top"}],children:n.jsx(q,{children:"The project this API key can retrieve feature flags from"})}),n.jsx(I.ArcherElement,{id:"environment-description",relations:[{targetId:"environment",targetAnchor:"bottom",sourceAnchor:"top"}],children:n.jsx(q,{children:"The environment this API key can retrieve feature flag configuration from"})}),n.jsx(I.ArcherElement,{id:"secret-description",relations:[{targetId:"secret",targetAnchor:"right",sourceAnchor:"top"}],children:n.jsx(q,{children:"The API key secret"})})]}):null]})})},At=({environments:e,environment:t,project:a,sdkType:s,onEnvSelect:o,onApiKey:r})=>{const{trackEvent:l}=Ue(),{tokens:i,refetch:d}=gt(a),{createToken:m,loading:b}=ft(),u=i.find(v=>v.environment===t&&v.type===s);x.useEffect(()=>{r((u==null?void 0:u.secret)||null)},[u]);const g=bt(u==null?void 0:u.secret),{setToastApiError:c}=P(),f=async()=>{try{await m({environment:t,type:s,projects:[a],tokenName:`api-key-${a}-${t}`},a),d(),j()}catch(v){c(T(v))}},j=()=>{l("onboarding",{props:{eventType:"api-key-generated"}})};return n.jsxs(Ut,{children:[n.jsx(y,{variant:"h2",children:"Connect an SDK to Unleash"}),n.jsxs(B,{children:[n.jsx(H,{active:1,steps:3}),n.jsx(Y,{color:"secondary",children:"2/3 - Generate API Key"})]}),n.jsxs(_,{sx:{mt:2},children:[n.jsx(w,{children:"Environment"}),n.jsx(W,{children:"The environment the SDK connects to to retrieve configuration."}),e.length>0?n.jsx(St,{environments:e,currentEnvironment:t,onSelect:o}):null]}),n.jsxs(_,{sx:{mt:3},children:[n.jsx(w,{children:"API Key"}),g?n.jsxs(W,{children:["Here is your generated API key. We will use it to connect to the ",n.jsx("b",{children:g.project})," project in the ",n.jsx("b",{children:g.environment})," environment."]}):n.jsx(W,{children:"You currently have no active API keys for this project/environment combination. Generate an API key to proceed with connecting your SDK."}),g?n.jsx(Ct,{project:g.project,environment:g.environment,secret:g.secret}):n.jsx(E,{variant:"contained",disabled:b,onClick:f,children:"Generate API Key"})]})]})},Te=[{name:"Node.js",icon:fn},{name:"Go",icon:bn},{name:"Ruby",icon:xn},{name:"PHP",icon:yn},{name:"Rust",icon:vn},{name:".NET",icon:Sn},{name:"Java",icon:jn},{name:"Python",icon:_n}],we=[{name:"JavaScript",icon:Un},{name:"React",icon:Cn},{name:"Vue",icon:An},{name:"Svelte",icon:kn},{name:"Swift",icon:In},{name:"Android",icon:Rn},{name:"Flutter",icon:En}],kt=[...Te,...we],It=h("div")(({theme:e})=>({padding:e.spacing(5,8,8,8),display:"flex",flexDirection:"column",gap:e.spacing(3)})),ue=h("div")(({theme:e})=>({marginTop:e.spacing(4),marginBottom:e.spacing(2),fontSize:e.typography.body1.fontSize})),pe=h("div")(({theme:e})=>({backgroundColor:e.palette.background.elevation1,borderRadius:e.shape.borderRadius,padding:e.spacing(6),display:"flex",columnGap:e.spacing(2),rowGap:e.spacing(5),alignItems:"center",justifyContent:"flex-start",flexWrap:"wrap"})),he=h("div")(({theme:e})=>({fontSize:e.typography.body2.fontSize,backgroundColor:e.palette.background.default,borderRadius:e.shape.borderRadius,padding:e.spacing(2,3),width:"170px",position:"relative"})),ge=h("div")(()=>({display:"flex",justifyContent:"space-between"})),me=h(z)(({theme:e})=>({position:"absolute",width:e.spacing(4),height:e.spacing(4),top:e.spacing(-2.75),left:e.spacing(2),boxShadow:e.shadows[2]})),Rt=({onSelect:e})=>n.jsxs(It,{children:[n.jsx(y,{variant:"h2",children:"Connect an SDK to Unleash"}),n.jsxs(B,{children:[n.jsx(H,{active:0,steps:3}),n.jsx(Y,{color:"secondary",children:"1/3 - Choose SDK"})]}),n.jsxs(_,{sx:{mt:2},children:[n.jsx(w,{children:"Select SDK"}),n.jsx(ue,{children:"Server side SDKs"}),n.jsx(pe,{children:Te.map(t=>n.jsxs(he,{children:[n.jsx(me,{src:V(t.icon)}),n.jsxs(ge,{children:[n.jsx("b",{children:t.name})," ",n.jsx(J,{onClick:()=>e({name:t.name,type:"client"}),component:"button",children:"Select"})]})]},t.name))}),n.jsx(ue,{children:"Client side SDKs"}),n.jsx(pe,{children:we.map(t=>n.jsxs(he,{children:[n.jsx(me,{src:V(t.icon)}),n.jsxs(ge,{children:[n.jsx("b",{children:t.name})," ",n.jsx(J,{onClick:()=>e({name:t.name,type:"frontend"}),component:"button",children:"Select"})]})]},t.name))})]})]}),Pe=h("div")(({theme:e})=>({backgroundColor:e.palette.background.sidebar,padding:e.spacing(12,6,6,6),flex:0,minWidth:"400px"})),O=h("p")(({theme:e})=>({color:e.palette.primary.contrastText,fontSize:e.typography.caption.fontSize,marginBottom:e.spacing(2)})),re=({theme:e})=>({color:e.palette.primary.contrastText,fontSize:e.typography.body2.fontSize,marginTop:e.spacing(.5)}),Et=h(wn)(re),Tt=h(Ie)(re),De=h(Tn)(re),K=h("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5),alignItems:"flex-start",marginTop:e.spacing(3)})),F=h("div")(({theme:e})=>({color:e.palette.primary.contrastText,fontSize:e.typography.body2.fontSize,fontWeight:e.typography.fontWeightBold,marginBottom:e.spacing(2)})),wt=()=>n.jsxs(Pe,{children:[n.jsxs(K,{children:[n.jsx(Et,{}),n.jsxs(_,{children:[n.jsx(F,{children:"Flags live in projects"}),n.jsx(O,{children:"Projects are containers for feature flags. Each flag belongs to the project where you create it."})]})]}),n.jsxs(K,{children:[n.jsx(Tt,{}),n.jsxs(_,{children:[n.jsx(F,{children:"Flags have configuration in environments"}),n.jsx(O,{children:"You can have multiple environments, and each feature flag has a different configuration per environment."})]})]}),n.jsxs(K,{children:[n.jsx(De,{}),n.jsxs(_,{children:[n.jsx(F,{children:"SDKs connect to Unleash to retrieve configuration"}),n.jsx(O,{children:"When you connect an SDK to Unleash, it uses the API key to identify which feature flags and configuration to retrieve from each environment."})]})]})]}),Pt=()=>n.jsx(Pe,{children:n.jsxs(K,{children:[n.jsx(De,{}),n.jsxs(_,{children:[n.jsx(F,{children:"SDKs and Unleash"}),n.jsx(O,{children:"SDKs serve to bind your application to Unleash. The SDK can connect to Unleash via HTTP and retrieve feature flag configuration that is then cached in your application. Making sure none of your application data ever leaves your servers."})]})]})}),Ta=h(z,{shouldForwardProp:e=>e!=="active"})(({theme:e,active:t})=>({transition:"background-color 0.5s ease",color:e.palette.common.white,backgroundColor:t?e.palette.primary.main:e.palette.divider,"@keyframes pulse":{"0%":{boxShadow:`0 0 0 0px ${N(e.palette.primary.main,.7)}`},"100%":{boxShadow:`0 0 0 20px ${N(e.palette.primary.main,0)}`}},animation:t?"pulse 2s infinite":""})),Dt=h(z,{shouldForwardProp:e=>e!=="active"})(({theme:e,active:t})=>({transition:"background-color 0.5s ease",color:e.palette.primary.main,backgroundColor:t?e.palette.background.default:e.palette.divider,"@keyframes pulse":{"0%":{boxShadow:`0 0 0 0px ${N(e.palette.background.default,.7)}`},"100%":{boxShadow:`0 0 0 20px ${N(e.palette.background.default,0)}`}},animation:t?"pulse 2s infinite":""}));var le={},Ot=ee;Object.defineProperty(le,"__esModule",{value:!0});var Oe=le.default=void 0,Kt=Ot(Z()),Ft=n,Nt=(0,Kt.default)((0,Ft.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7 13.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"}),"Pending");Oe=le.default=Nt;const Lt=h("div")(({theme:e})=>({backgroundColor:e.palette.background.sidebar,padding:e.spacing(6,9,6,9),minWidth:"400px",display:"flex",flexDirection:"column",color:e.palette.primary.contrastText})),$t=h(y)(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"center",fontWeight:e.typography.fontWeightBold})),Yt=h("div")(({theme:e})=>({display:"flex",flexDirection:"row",padding:e.spacing(4,0,12,0),justifyContent:"space-between",fontSize:e.spacing(1)})),fe=h("div")(({theme:e})=>({display:"flex",gap:e.spacing(1),flexDirection:"column"})),be=h("div")(({theme:e})=>({alignItems:"center",justifyContent:"center",display:"flex",gap:e.spacing(2),flexDirection:"column",fontSize:e.fontSizes.smallBody})),zt=h(Pn)(({theme:e})=>({color:e.palette.primary.main,backgroundColor:e.palette.background.paper,borderRadius:"50%",padding:e.spacing(1),width:"80px",height:"80px"})),Bt=({projectId:e,sdk:t,environment:a})=>{const s=L(),{project:o}=$(e,{refreshInterval:1e3}),r=o.onboardingStatus.status==="onboarded";return n.jsxs(Lt,{children:[n.jsx($t,{children:"Connection information"}),n.jsxs(Yt,{children:[n.jsxs(fe,{children:[n.jsx(y,{fontWeight:"bold",variant:"body2",children:"Environment"}),n.jsx(y,{variant:"body2",children:a})]}),n.jsxs(fe,{children:[n.jsx(y,{fontWeight:"bold",variant:"body2",children:"SDK"}),n.jsx(y,{variant:"body2",children:t})]})]}),r?n.jsxs(be,{children:[n.jsx(y,{fontWeight:"bold",variant:"body2",children:"Connection status"}),n.jsx(y,{sx:{mb:s.spacing(4)},variant:"body2",children:"Connected"}),n.jsx(zt,{}),n.jsx(y,{sx:{mb:s.spacing(4)},variant:"body2",children:"We received metrics from your application!"})]}):n.jsxs(be,{children:[n.jsx(y,{fontWeight:"bold",variant:"body2",children:"Connection status"}),n.jsx(y,{sx:{mb:s.spacing(4)},variant:"body2",children:"Waiting for SDK data..."}),n.jsx(Dt,{sx:{width:80,height:80},active:!0,children:n.jsx(Oe,{fontSize:"large"})})]})]})},Ht=`1\\. Install the SDK
|
|
8
|
+
|
|
9
|
+
\`\`\`gradle
|
|
10
|
+
implementation("io.getunleash:unleash-android:1")
|
|
11
|
+
\`\`\`
|
|
12
|
+
|
|
13
|
+
2\\. Enable required [permissions](https://developer.android.com/guide/topics/manifest/uses-permission-element)
|
|
14
|
+
|
|
15
|
+
\`\`\`xml
|
|
16
|
+
<uses-permission android:name="android.permission.INTERNET" />
|
|
17
|
+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
|
18
|
+
\`\`\`
|
|
19
|
+
|
|
20
|
+
2\\. Initialize Unleash in your application
|
|
21
|
+
|
|
22
|
+
\`\`\`kotlin
|
|
23
|
+
class MyApplication: Application() {
|
|
24
|
+
val unleash: Unleash by lazy {
|
|
25
|
+
val instance = DefaultUnleash(
|
|
26
|
+
androidContext = this,
|
|
27
|
+
unleashConfig = UnleashConfig.newBuilder(appName = "unleash-onboarding-android")
|
|
28
|
+
.proxyUrl("<YOUR_API_URL>")
|
|
29
|
+
.clientKey("<YOUR_API_TOKEN>")
|
|
30
|
+
.build()
|
|
31
|
+
)
|
|
32
|
+
instance.start()
|
|
33
|
+
instance
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
override fun onTerminate() {
|
|
37
|
+
super.onTerminate()
|
|
38
|
+
unleash.close()
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
\`\`\`
|
|
42
|
+
|
|
43
|
+
3\\. Check flag status
|
|
44
|
+
|
|
45
|
+
\`\`\`kotlin
|
|
46
|
+
class MainActivity : ComponentActivity() {
|
|
47
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
48
|
+
super.onCreate(savedInstanceState)
|
|
49
|
+
val unleashInstance = (application as MyApplication).unleash
|
|
50
|
+
|
|
51
|
+
setContent {
|
|
52
|
+
var flagStatus by remember { mutableStateOf("loading") }
|
|
53
|
+
LaunchedEffect(Unit) {
|
|
54
|
+
while (isActive) {
|
|
55
|
+
val isFlagEnabled = unleashInstance.isEnabled("<YOUR_FLAG>")
|
|
56
|
+
flagStatus = if (isFlagEnabled) "enabled" else "disabled"
|
|
57
|
+
delay(3000L)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Text(text = "Flag is $flagStatus!")
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
\`\`\`
|
|
67
|
+
ℹ️ **Info:** The Android SDK takes at least 60 seconds to post metrics to Unleash.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
---
|
|
71
|
+
- [SDK repository with documentation and example](https://github.com/Unleash/unleash-android)
|
|
72
|
+
- [Android SDK basic example](hhttps://github.com/Unleash/unleash-sdk-examples/tree/main/Android)
|
|
73
|
+
`,Gt=`1\\. Install the SDK
|
|
74
|
+
\`\`\`sh
|
|
75
|
+
go get github.com/Unleash/unleash-client-go/v4
|
|
76
|
+
\`\`\`
|
|
77
|
+
|
|
78
|
+
2\\. Run Unleash
|
|
79
|
+
\`\`\`go
|
|
80
|
+
package main
|
|
81
|
+
|
|
82
|
+
import (
|
|
83
|
+
"github.com/Unleash/unleash-client-go/v4"
|
|
84
|
+
"net/http"
|
|
85
|
+
"time"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
func init() {
|
|
89
|
+
unleash.Initialize(
|
|
90
|
+
unleash.WithListener(&unleash.DebugListener{}),
|
|
91
|
+
unleash.WithAppName("unleash-onboarding-golang"),
|
|
92
|
+
unleash.WithUrl("<YOUR_API_URL>"),
|
|
93
|
+
unleash.WithCustomHeaders(http.Header{"Authorization": {"<YOUR_API_TOKEN>"}}), // in production use environment variable
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
func main() {
|
|
98
|
+
for {
|
|
99
|
+
unleash.IsEnabled("<YOUR_FLAG>")
|
|
100
|
+
time.Sleep(time.Second)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
\`\`\`
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
\`\`\`go
|
|
107
|
+
func init() {
|
|
108
|
+
unleash.Initialize(
|
|
109
|
+
unleash.WithListener(&unleash.DebugListener{}),
|
|
110
|
+
unleash.WithAppName("unleash-onboarding-golang"),
|
|
111
|
+
unleash.WithUrl("<YOUR_API_URL>"),
|
|
112
|
+
unleash.WithCustomHeaders(http.Header{
|
|
113
|
+
"Authorization": {os.Getenv("UNLEASH_API_KEY")},
|
|
114
|
+
})
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
\`\`\`
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-go)
|
|
121
|
+
- [Go SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Go)
|
|
122
|
+
`,qt=`1\\. Install the SDK
|
|
123
|
+
\`\`\`sh
|
|
124
|
+
npm install unleash-proxy-client
|
|
125
|
+
\`\`\`
|
|
126
|
+
|
|
127
|
+
2\\. Run Unleash
|
|
128
|
+
\`\`\`js
|
|
129
|
+
const { UnleashClient } = require('unleash-proxy-client');
|
|
130
|
+
|
|
131
|
+
const unleash = new UnleashClient({
|
|
132
|
+
url: '<YOUR_API_URL>',
|
|
133
|
+
clientKey: '<YOUR_API_TOKEN>', // in production use environment variable
|
|
134
|
+
appName: 'unleash-onboarding-javascript',
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
unleash.start();
|
|
138
|
+
|
|
139
|
+
setInterval(() => {
|
|
140
|
+
console.log('Is enabled', unleash.isEnabled('<YOUR_FLAG>'));
|
|
141
|
+
}, 1000);
|
|
142
|
+
\`\`\`
|
|
143
|
+
---
|
|
144
|
+
\`\`\`js
|
|
145
|
+
const unleash = new UnleashClient({
|
|
146
|
+
url: '<YOUR_API_URL>',
|
|
147
|
+
clientKey: process.env.UNLEASH_API_TOKEN,
|
|
148
|
+
appName: 'unleash-onboarding-javascript',
|
|
149
|
+
});
|
|
150
|
+
unleash.start();
|
|
151
|
+
\`\`\`
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-proxy-client-js)
|
|
155
|
+
- [JavaScript SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/JavaScript)
|
|
156
|
+
`,Wt=`1\\. Install the SDK
|
|
157
|
+
\`\`\`sh
|
|
158
|
+
npm install unleash-client
|
|
159
|
+
\`\`\`
|
|
160
|
+
|
|
161
|
+
2\\. Run Unleash
|
|
162
|
+
\`\`\`js
|
|
163
|
+
const { initialize } = require('unleash-client');
|
|
164
|
+
|
|
165
|
+
const unleash = initialize({
|
|
166
|
+
url: '<YOUR_API_URL>',
|
|
167
|
+
appName: 'unleash-onboarding-node',
|
|
168
|
+
customHeaders: {
|
|
169
|
+
Authorization: '<YOUR_API_TOKEN>' // in production use environment variable
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
setInterval(() => {
|
|
174
|
+
console.log('Is enabled', unleash.isEnabled('<YOUR_FLAG>'));
|
|
175
|
+
}, 1000);
|
|
176
|
+
\`\`\`
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
\`\`\`js
|
|
180
|
+
const { initialize } = require('unleash-client');
|
|
181
|
+
|
|
182
|
+
const unleash = initialize({
|
|
183
|
+
url: '<YOUR_API_URL>',
|
|
184
|
+
appName: 'unleash-onboarding-node',
|
|
185
|
+
customHeaders: { Authorization: process.env.UNLEASH_API_KEY },
|
|
186
|
+
});
|
|
187
|
+
\`\`\`
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-node)
|
|
191
|
+
- [Node.js SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Node.js)
|
|
192
|
+
- [Node.js SDK tutorial](https://dev.to/reeshee/how-to-implement-feature-flags-in-nodejs-using-unleash-3907)
|
|
193
|
+
`,Mt=`1\\. Install the SDK
|
|
194
|
+
\`\`\`sh
|
|
195
|
+
pip install UnleashClient
|
|
196
|
+
\`\`\`
|
|
197
|
+
|
|
198
|
+
2\\. Run Unleash
|
|
199
|
+
\`\`\`python
|
|
200
|
+
from UnleashClient import UnleashClient
|
|
201
|
+
import asyncio
|
|
202
|
+
|
|
203
|
+
client = UnleashClient(
|
|
204
|
+
url="<YOUR_API_URL>",
|
|
205
|
+
app_name="unleash-onboarding-python",
|
|
206
|
+
custom_headers={'Authorization': '<YOUR_API_TOKEN>'}) # in production use environment variable
|
|
207
|
+
|
|
208
|
+
client.initialize_client()
|
|
209
|
+
|
|
210
|
+
while True:
|
|
211
|
+
print(client.is_enabled("<YOUR_FLAG>"))
|
|
212
|
+
asyncio.run(asyncio.sleep(1))
|
|
213
|
+
\`\`\`
|
|
214
|
+
---
|
|
215
|
+
\`\`\`python
|
|
216
|
+
from UnleashClient import UnleashClient
|
|
217
|
+
import asyncio
|
|
218
|
+
import os
|
|
219
|
+
|
|
220
|
+
client = UnleashClient(
|
|
221
|
+
url="<YOUR_API_URL>",
|
|
222
|
+
app_name="unleash-onboarding-python",
|
|
223
|
+
custom_headers={'Authorization': os.getenv('UNLEASH_API_TOKEN')}
|
|
224
|
+
\`\`\`
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-python)
|
|
228
|
+
- [Python SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Python)
|
|
229
|
+
- [How to Implement Feature Flags in Python](https://docs.getunleash.io/feature-flag-tutorials/python)
|
|
230
|
+
`,Vt=`1\\. Install the SDK
|
|
231
|
+
\`\`\`sh
|
|
232
|
+
gem install unleash
|
|
233
|
+
\`\`\`
|
|
234
|
+
|
|
235
|
+
2\\. Run Unleash
|
|
236
|
+
\`\`\`rb
|
|
237
|
+
require 'unleash'
|
|
238
|
+
|
|
239
|
+
@unleash = Unleash::Client.new(
|
|
240
|
+
url: "<YOUR_API_URL>",
|
|
241
|
+
custom_http_headers: { 'Authorization': "<YOUR_API_TOKEN>" }, # in production use environment variable
|
|
242
|
+
app_name: 'unleash-onboarding-ruby',
|
|
243
|
+
instance_id: 'unleash-onboarding-ruby',
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
while true
|
|
247
|
+
if @unleash.is_enabled?("<YOUR_FLAG>")
|
|
248
|
+
puts "Flag is enabled"
|
|
249
|
+
else
|
|
250
|
+
puts "Flag is not enabled"
|
|
251
|
+
end
|
|
252
|
+
sleep 3
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
\`\`\`
|
|
256
|
+
---
|
|
257
|
+
\`\`\`rb
|
|
258
|
+
@unleash = Unleash::Client.new(
|
|
259
|
+
url: "<YOUR_API_URL>",
|
|
260
|
+
custom_http_headers: { 'Authorization': ENV['UNLEASH_API_TOKEN'] },
|
|
261
|
+
app_name: 'unleash-onboarding-ruby',
|
|
262
|
+
instance_id: 'unleash-onboarding-ruby',
|
|
263
|
+
)
|
|
264
|
+
\`\`\`
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-ruby)
|
|
268
|
+
- [Ruby example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Ruby)
|
|
269
|
+
- [How to Implement Feature Flags in Ruby](https://docs.getunleash.io/feature-flag-tutorials/ruby)
|
|
270
|
+
`,Jt=`1\\. Install the SDK
|
|
271
|
+
\`\`\`sh
|
|
272
|
+
npm install @unleash/proxy-client-svelte
|
|
273
|
+
\`\`\`
|
|
274
|
+
|
|
275
|
+
2\\. Initialize Unleash
|
|
276
|
+
\`\`\`svelte
|
|
277
|
+
<script>
|
|
278
|
+
import { FlagProvider } from '@unleash/proxy-client-svelte';
|
|
279
|
+
|
|
280
|
+
const config = {
|
|
281
|
+
url: '<YOUR_API_URL>',
|
|
282
|
+
clientKey: '<YOUR_API_TOKEN>', // in production use environment variable
|
|
283
|
+
appName: 'unleash-onboarding-svelte',
|
|
284
|
+
};
|
|
285
|
+
<\/script>
|
|
286
|
+
|
|
287
|
+
<div class="app">
|
|
288
|
+
<FlagProvider {config}>
|
|
289
|
+
<main>
|
|
290
|
+
<slot />
|
|
291
|
+
</main>
|
|
292
|
+
</FlagProvider>
|
|
293
|
+
</div>
|
|
294
|
+
\`\`\`
|
|
295
|
+
|
|
296
|
+
3\\. Check feature flag status
|
|
297
|
+
\`\`\`svelte
|
|
298
|
+
<script lang="ts">
|
|
299
|
+
import { useFlag } from '@unleash/proxy-client-svelte';
|
|
300
|
+
const enabled = useFlag('<YOUR_FLAG>');
|
|
301
|
+
<\/script>
|
|
302
|
+
|
|
303
|
+
<section>
|
|
304
|
+
<p>
|
|
305
|
+
{$enabled ? 'Feature is enabled!' : 'Feature is disabled!'}
|
|
306
|
+
</p>
|
|
307
|
+
</section>
|
|
308
|
+
\`\`\`
|
|
309
|
+
---
|
|
310
|
+
\`\`\`svelte
|
|
311
|
+
const config = {
|
|
312
|
+
url: '<YOUR_API_URL>',
|
|
313
|
+
clientKey: import.meta.env.VITE_UNLEASH_API_TOKEN,
|
|
314
|
+
appName: 'unleash-onboarding-svelte',
|
|
315
|
+
};
|
|
316
|
+
\`\`\`
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
- [SDK repository with documentation](https://github.com/Unleash/proxy-client-svelte)
|
|
320
|
+
- [Svelte example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Svelte)
|
|
321
|
+
- [How to Implement Feature Flags in SvelteKit](https://docs.getunleash.io/feature-flag-tutorials/sveltekit)
|
|
322
|
+
`,Qt=`1\\. Install the SDK
|
|
323
|
+
\`\`\`sh
|
|
324
|
+
npm install @unleash/proxy-client-vue
|
|
325
|
+
\`\`\`
|
|
326
|
+
|
|
327
|
+
2\\. Initialize Unleash
|
|
328
|
+
\`\`\`vue
|
|
329
|
+
<script setup lang="ts">
|
|
330
|
+
import { FlagProvider } from '@unleash/proxy-client-vue'
|
|
331
|
+
|
|
332
|
+
const config = {
|
|
333
|
+
url: '<YOUR_API_URL>',
|
|
334
|
+
clientKey: '<YOUR_API_TOKEN>', // in production use environment variable
|
|
335
|
+
appName: 'unleash-onboarding-vue',
|
|
336
|
+
}
|
|
337
|
+
<\/script>
|
|
338
|
+
|
|
339
|
+
<template>
|
|
340
|
+
<FlagProvider :config="config">
|
|
341
|
+
<!-- <YourComponent /> -->
|
|
342
|
+
</FlagProvider>
|
|
343
|
+
</template>
|
|
344
|
+
\`\`\`
|
|
345
|
+
|
|
346
|
+
3\\. Check feature flag status
|
|
347
|
+
\`\`\`vue
|
|
348
|
+
<script setup lang="ts">
|
|
349
|
+
import { useFlag } from '@unleash/proxy-client-vue'
|
|
350
|
+
const enabled = useFlag('<YOUR_FLAG>')
|
|
351
|
+
<\/script>
|
|
352
|
+
|
|
353
|
+
<template>
|
|
354
|
+
<div>
|
|
355
|
+
{{ enabled ? 'Feature is enabled!' : 'Feature is disabled!' }}
|
|
356
|
+
</div>
|
|
357
|
+
</template>
|
|
358
|
+
\`\`\`
|
|
359
|
+
---
|
|
360
|
+
\`\`\`svelte
|
|
361
|
+
const config = {
|
|
362
|
+
url: '<YOUR_API_URL>',
|
|
363
|
+
clientKey: import.meta.env.VITE_UNLEASH_API_TOKEN,
|
|
364
|
+
appName: 'unleash-onboarding-vue',
|
|
365
|
+
}
|
|
366
|
+
\`\`\`
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
- [SDK repository with documentation](https://github.com/Unleash/proxy-client-vue)
|
|
370
|
+
- [Vue example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Vue)
|
|
371
|
+
`,Xt=`1\\. Install the SDK
|
|
372
|
+
\`\`\`sh
|
|
373
|
+
flutter pub add unleash_proxy_client_flutter
|
|
374
|
+
\`\`\`
|
|
375
|
+
|
|
376
|
+
2\\. Run Unleash
|
|
377
|
+
\`\`\`dart
|
|
378
|
+
import 'package:unleash_proxy_client_flutter/unleash_proxy_client_flutter.dart';
|
|
379
|
+
import 'dart:async';
|
|
380
|
+
|
|
381
|
+
final unleash = UnleashClient(
|
|
382
|
+
url: Uri.parse('<YOUR_API_URL>'),
|
|
383
|
+
clientKey: '<YOUR_API_TOKEN>', // in production use environment variable
|
|
384
|
+
appName: 'unleash-onboarding-flutter');
|
|
385
|
+
|
|
386
|
+
unleash.start();
|
|
387
|
+
|
|
388
|
+
Timer.periodic(Duration(seconds: 1), (Timer timer) {
|
|
389
|
+
final flagStatus = unleash.isEnabled('<YOUR_FLAG>');
|
|
390
|
+
print('Flag is \${unleash.isEnabled("<YOUR_FLAG>") ? "enabled" : "disabled"}');
|
|
391
|
+
});
|
|
392
|
+
\`\`\`
|
|
393
|
+
---
|
|
394
|
+
\`\`\`dart
|
|
395
|
+
import 'package:unleash_proxy_client_flutter/unleash_proxy_client_flutter.dart';
|
|
396
|
+
import 'dart:async';
|
|
397
|
+
import 'dart:io';
|
|
398
|
+
|
|
399
|
+
final unleash = UnleashClient(
|
|
400
|
+
url: Uri.parse('<YOUR_API_URL>'),
|
|
401
|
+
clientKey: Platform.environment['UNLEASH_CLIENT_KEY']!,
|
|
402
|
+
appName: 'unleash-onboarding-flutter');
|
|
403
|
+
|
|
404
|
+
unleash.start();
|
|
405
|
+
\`\`\`
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash_proxy_client_flutter)
|
|
409
|
+
- [Flutter example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Flutter)
|
|
410
|
+
- [A/B Testing in Flutter using Unleash and Mixpanel](https://docs.getunleash.io/feature-flag-tutorials/flutter/a-b-testing)
|
|
411
|
+
`,Zt=`1\\. Install the SDK
|
|
412
|
+
\`\`\`xml
|
|
413
|
+
<dependency>
|
|
414
|
+
<groupId>io.getunleash</groupId>
|
|
415
|
+
<artifactId>unleash-client-java</artifactId>
|
|
416
|
+
<version>LATEST</version>
|
|
417
|
+
</dependency>
|
|
418
|
+
\`\`\`
|
|
419
|
+
|
|
420
|
+
2\\. Run Unleash
|
|
421
|
+
\`\`\`java
|
|
422
|
+
UnleashConfig config = UnleashConfig.builder()
|
|
423
|
+
.appName("unleash-onboarding-java")
|
|
424
|
+
.instanceId("unleash-onboarding-instance")
|
|
425
|
+
.unleashAPI("<YOUR_API_URL>")
|
|
426
|
+
.apiKey("<YOUR_API_TOKEN>") // in production use environment variable
|
|
427
|
+
.build();
|
|
428
|
+
|
|
429
|
+
Unleash unleash = new DefaultUnleash(config);
|
|
430
|
+
|
|
431
|
+
while (true) {
|
|
432
|
+
boolean featureEnabled = unleash.isEnabled("<YOUR_FLAG>");
|
|
433
|
+
System.out.println("Feature enabled: " + featureEnabled);
|
|
434
|
+
Thread.sleep(1000);
|
|
435
|
+
}
|
|
436
|
+
\`\`\`
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
\`\`\`java
|
|
440
|
+
UnleashConfig config = UnleashConfig.builder()
|
|
441
|
+
.appName("unleash-onboarding-java")
|
|
442
|
+
.instanceId("unleash-onboarding-instance")
|
|
443
|
+
.unleashAPI("<YOUR_API_URL>")
|
|
444
|
+
.apiKey(System.getenv("UNLEASH_API_KEY"))
|
|
445
|
+
.build();
|
|
446
|
+
\`\`\`
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-java)
|
|
450
|
+
- [Java SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Java)
|
|
451
|
+
- [How to Implement Feature Flags in Java](https://docs.getunleash.io/feature-flag-tutorials/java)
|
|
452
|
+
`,ea=`1\\. Install the SDK
|
|
453
|
+
\`\`\`sh
|
|
454
|
+
dotnet add package unleash.client
|
|
455
|
+
// If you do not have a json library in your project:
|
|
456
|
+
dotnet add package Newtonsoft.Json
|
|
457
|
+
\`\`\`
|
|
458
|
+
|
|
459
|
+
2\\. Initialize Unleash
|
|
460
|
+
\`\`\`csharp
|
|
461
|
+
using Unleash;
|
|
462
|
+
using Unleash.ClientFactory;
|
|
463
|
+
|
|
464
|
+
public class Program
|
|
465
|
+
{
|
|
466
|
+
public static async Task Main()
|
|
467
|
+
{
|
|
468
|
+
var settings = new UnleashSettings()
|
|
469
|
+
{
|
|
470
|
+
AppName = "unleash-onboarding-dotnet",
|
|
471
|
+
UnleashApi = new Uri("<YOUR_API_URL>"),
|
|
472
|
+
CustomHttpHeaders = new Dictionary<string, string>()
|
|
473
|
+
{
|
|
474
|
+
{"Authorization","<YOUR_API_TOKEN>"} // in production use environment variable
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
var unleash = new DefaultUnleash(settings);
|
|
479
|
+
|
|
480
|
+
while (true) {
|
|
481
|
+
Console.WriteLine($"Flag is enabled: {unleash.IsEnabled("<YOUR_FLAG>")}");
|
|
482
|
+
await Task.Delay(1000);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
\`\`\`
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
\`\`\`csharp
|
|
491
|
+
var settings = new UnleashSettings()
|
|
492
|
+
{
|
|
493
|
+
AppName = "unleash-onboarding-dotnet",
|
|
494
|
+
UnleashApi = new Uri("<YOUR_API_URL>"),
|
|
495
|
+
CustomHttpHeaders = new Dictionary<string, string>()
|
|
496
|
+
{
|
|
497
|
+
{"Authorization",Environment.GetEnvironmentVariable("UNLEASH_API_KEY")}
|
|
498
|
+
}
|
|
499
|
+
};
|
|
500
|
+
\`\`\`
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-dotnet)
|
|
504
|
+
- [.NET/C# SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Csharp)
|
|
505
|
+
`,na=`1\\. Install the SDK
|
|
506
|
+
\`\`\`sh
|
|
507
|
+
composer require unleash/client
|
|
508
|
+
\`\`\`
|
|
509
|
+
|
|
510
|
+
2\\. Initialize Unleash
|
|
511
|
+
\`\`\`php
|
|
512
|
+
<?php
|
|
513
|
+
|
|
514
|
+
use Unleash\\\\Client\\\\UnleashBuilder;
|
|
515
|
+
|
|
516
|
+
require 'vendor/autoload.php';
|
|
517
|
+
|
|
518
|
+
$unleash = UnleashBuilder::create()
|
|
519
|
+
->withAppName('unleash-onboarding-php')
|
|
520
|
+
->withAppUrl('<YOUR_API_URL>')
|
|
521
|
+
->withHeader('Authorization', '<YOUR_API_TOKEN>') // in production use environment variable
|
|
522
|
+
->withInstanceId('unleash-onboarding-instance')
|
|
523
|
+
->build();
|
|
524
|
+
|
|
525
|
+
while (true) {
|
|
526
|
+
echo 'Feature flag is: ' . $unleash->isEnabled('<YOUR_FLAG>') . PHP_EOL;
|
|
527
|
+
sleep(1);
|
|
528
|
+
}
|
|
529
|
+
\`\`\`
|
|
530
|
+
---
|
|
531
|
+
\`\`\`php
|
|
532
|
+
$unleash = UnleashBuilder::create()
|
|
533
|
+
->withAppName('unleash-onboarding-php')
|
|
534
|
+
->withAppUrl('<YOUR_API_URL>')
|
|
535
|
+
->withHeader('Authorization', getenv('UNLEASH_API_TOKEN'))
|
|
536
|
+
->withInstanceId('unleash-onboarding-instance')
|
|
537
|
+
->build();
|
|
538
|
+
\`\`\`
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-php)
|
|
542
|
+
- [PHP SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/PHP)
|
|
543
|
+
`,ta=`1\\. Install the SDK
|
|
544
|
+
\`\`\`sh
|
|
545
|
+
npm install @unleash/proxy-client-react unleash-proxy-client
|
|
546
|
+
\`\`\`
|
|
547
|
+
|
|
548
|
+
2\\. Initialize Unleash
|
|
549
|
+
\`\`\`jsx
|
|
550
|
+
import { createRoot } from 'react-dom/client';
|
|
551
|
+
import { FlagProvider } from '@unleash/proxy-client-react';
|
|
552
|
+
|
|
553
|
+
const config = {
|
|
554
|
+
url: '<YOUR_API_URL>',
|
|
555
|
+
clientKey: '<YOUR_API_TOKEN>', // in production use environment variable
|
|
556
|
+
appName: 'unleash-onboarding-react',
|
|
557
|
+
};
|
|
558
|
+
|
|
559
|
+
const root = createRoot(document.getElementById('root'));
|
|
560
|
+
|
|
561
|
+
root.render(
|
|
562
|
+
<React.StrictMode>
|
|
563
|
+
<FlagProvider config={config}>
|
|
564
|
+
<App />
|
|
565
|
+
</FlagProvider>
|
|
566
|
+
</React.StrictMode>
|
|
567
|
+
);
|
|
568
|
+
\`\`\`
|
|
569
|
+
|
|
570
|
+
3\\. Check feature flag status
|
|
571
|
+
\`\`\`jsx
|
|
572
|
+
import { useFlag } from '@unleash/proxy-client-react';
|
|
573
|
+
|
|
574
|
+
const TestComponent = () => {
|
|
575
|
+
const enabled = useFlag('<YOUR_FLAG>');
|
|
576
|
+
|
|
577
|
+
return enabled ? 'Flag is enabled' : 'Flag is disabled'
|
|
578
|
+
};
|
|
579
|
+
\`\`\`
|
|
580
|
+
---
|
|
581
|
+
\`\`\`jsx
|
|
582
|
+
const config = {
|
|
583
|
+
url: '<YOUR_API_URL>',
|
|
584
|
+
clientKey: process.env.UNLEASH_API_TOKEN,
|
|
585
|
+
appName: 'unleash-onboarding-react',
|
|
586
|
+
};
|
|
587
|
+
\`\`\`
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
- [SDK repository with documentation](https://github.com/Unleash/proxy-client-react)
|
|
591
|
+
- [React SDK example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/React)
|
|
592
|
+
- [https://docs.getunleash.io/feature-flag-tutorials/react](https://docs.getunleash.io/feature-flag-tutorials/react)
|
|
593
|
+
|
|
594
|
+
`,aa=`1\\. Install the SDK
|
|
595
|
+
\`\`\`sh
|
|
596
|
+
cargo add unleash-api-client --features async-std,reqwest,surf
|
|
597
|
+
cargo add serde --features derive
|
|
598
|
+
cargo add serde reqwest --features json
|
|
599
|
+
cargo add serde tokio --features full
|
|
600
|
+
cargo add serde anyhow cfg cfg-if enum-map@~2.0.0 surf
|
|
601
|
+
\`\`\`
|
|
602
|
+
|
|
603
|
+
2\\. Run Unleash
|
|
604
|
+
\`\`\`rust
|
|
605
|
+
use enum_map::Enum;
|
|
606
|
+
use serde::{Deserialize, Serialize};
|
|
607
|
+
use std::error::Error;
|
|
608
|
+
use std::time::Duration;
|
|
609
|
+
use tokio::time::sleep;
|
|
610
|
+
use unleash_api_client::client::ClientBuilder;
|
|
611
|
+
use unleash_api_client::Client;
|
|
612
|
+
|
|
613
|
+
#[derive(Debug, Deserialize, Serialize, Enum, Clone)]
|
|
614
|
+
enum Flags {
|
|
615
|
+
#[serde(rename = "<YOUR_FLAG>")]
|
|
616
|
+
TestFlag,
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
#[tokio::main]
|
|
620
|
+
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
|
|
621
|
+
let client: Client<Flags, reqwest::Client> = ClientBuilder::default()
|
|
622
|
+
.into_client(
|
|
623
|
+
"<YOUR_API_URL>",
|
|
624
|
+
"unleash-onboarding-rust",
|
|
625
|
+
"unleash-onboarding-instance",
|
|
626
|
+
Some("<YOUR_API_TOKEN>".to_owned()), // in production use environment variable
|
|
627
|
+
)?;
|
|
628
|
+
client.register().await?;
|
|
629
|
+
|
|
630
|
+
let (_, _) = tokio::join!(client.poll_for_updates(), async {
|
|
631
|
+
sleep(Duration::from_millis(1000)).await;
|
|
632
|
+
|
|
633
|
+
let is_enabled = client.is_enabled(Flags::TestFlag, None, true);
|
|
634
|
+
println!("\\nIs flag enabled: {}\\n", is_enabled);
|
|
635
|
+
|
|
636
|
+
sleep(Duration::from_millis(5000)).await;
|
|
637
|
+
|
|
638
|
+
client.stop_poll().await;
|
|
639
|
+
Ok::<(), Box<dyn Error + Send + Sync>>(())
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
Ok(())
|
|
643
|
+
}
|
|
644
|
+
\`\`\`
|
|
645
|
+
---
|
|
646
|
+
\`\`\`rust
|
|
647
|
+
let api_token = env::var("UNLEASH_API_TOKEN").expect("UNLEASH_API_TOKEN environment variable not set");
|
|
648
|
+
|
|
649
|
+
let client: Client<Flags, reqwest::Client> = ClientBuilder::default()
|
|
650
|
+
.into_client(
|
|
651
|
+
"<YOUR_API_URL>",
|
|
652
|
+
"unleash-onboarding-rust",
|
|
653
|
+
"unleash-onboarding-instance",
|
|
654
|
+
Some(api_token.to_owned()),
|
|
655
|
+
)?;
|
|
656
|
+
client.register().await?;
|
|
657
|
+
\`\`\`
|
|
658
|
+
|
|
659
|
+
---
|
|
660
|
+
- [SDK repository with documentation](https://github.com/Unleash/unleash-client-rust)
|
|
661
|
+
- [Rust example with CodeSandbox](https://github.com/Unleash/unleash-sdk-examples/tree/main/Rust)
|
|
662
|
+
- [How to Implement Feature Flags in Rust](https://docs.getunleash.io/feature-flag-tutorials/rust)
|
|
663
|
+
`,sa=`1\\. Install the SDK
|
|
664
|
+
\`\`\`sh
|
|
665
|
+
// Instructions to add the Swift SDK can be found at the provided URL:
|
|
666
|
+
https://github.com/Unleash/unleash-proxy-client-swift.git
|
|
667
|
+
\`\`\`
|
|
668
|
+
|
|
669
|
+
2\\. Run Unleash
|
|
670
|
+
\`\`\`swift
|
|
671
|
+
import Foundation
|
|
672
|
+
import UnleashProxyClientSwift
|
|
673
|
+
|
|
674
|
+
var unleash = UnleashProxyClientSwift.UnleashClient(
|
|
675
|
+
unleashUrl: "<YOUR_API_URL>",
|
|
676
|
+
clientKey: "<YOUR_API_TOKEN>", // in production use environment variable
|
|
677
|
+
appName: "unleash-onboarding-swift",
|
|
678
|
+
context: [:])
|
|
679
|
+
|
|
680
|
+
unleash.start()
|
|
681
|
+
|
|
682
|
+
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
|
|
683
|
+
print("Is enabled", unleash.isEnabled(name: "<YOUR_FLAG>"))
|
|
684
|
+
}
|
|
685
|
+
\`\`\`
|
|
686
|
+
ℹ️ **Info:** The Swift SDK takes at least 60 seconds to post metrics to Unleash.
|
|
687
|
+
`,Ke={Android:Ht,Go:Gt,JavaScript:qt,"Node.js":Wt,Python:Mt,Ruby:Vt,Svelte:Jt,Vue:Qt,Flutter:Xt,Java:Zt,".NET":ea,PHP:na,React:ta,Rust:aa,Swift:sa},oa=h("pre")(({theme:e})=>({backgroundColor:e.palette.background.elevation1,padding:e.spacing(2),borderRadius:e.shape.borderRadius,overflow:"auto",fontSize:e.typography.body2.fontSize,wordBreak:"break-all",whiteSpace:"pre-wrap",position:"relative",maxHeight:e.spacing(34)})),ia=h(Kn)(({theme:e})=>({position:"absolute",top:e.spacing(1),right:e.spacing(1)})),ra=({title:e,code:t})=>{const a=o=>()=>{Fn(o),s({type:"success",text:"Copied to clipboard"})},{setToastData:s}=P();return n.jsxs(oa,{children:[t,n.jsx(ia,{title:e,arrow:!0,children:n.jsx(Dn,{onClick:a(t),size:"small",children:n.jsx(On,{})})})]})},X=({inline:e=!1,children:t})=>!e&&typeof(t==null?void 0:t[0])=="string"?n.jsx(ra,{code:t[0],title:"Copy code"}):n.jsx("code",{children:t}),la=h("div")(({theme:e})=>({padding:e.spacing(5,8,2,8),display:"flex",flexDirection:"column",gap:e.spacing(3)})),ca=h("div")(({theme:e})=>({display:"inline-flex",gap:e.spacing(3),padding:e.spacing(1,2),border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius,marginBottom:e.spacing(3)})),da=({sdk:e,apiKey:t,feature:a,onSdkChange:s})=>{var c;const{uiConfig:o}=se(),r=(c=kt.find(f=>f.name===e.name))==null?void 0:c.icon,l=`${o.unleashUrl}/api/`,i=`${o.unleashUrl}/api/frontend/`,d=e.type==="client"?l:i,m=(Ke[e.name]||"").replace("<YOUR_API_TOKEN>",t).replace("<YOUR_API_URL>",d).replaceAll("<YOUR_FLAG>",a),[b,u,g]=m.split(`---
|
|
688
|
+
`);return n.jsxs(la,{children:[n.jsx(y,{variant:"h2",children:"Connect an SDK to Unleash"}),n.jsxs(B,{children:[n.jsx(H,{active:2,steps:3}),n.jsx(Y,{color:"secondary",children:"3/3 - Test connection"})]}),n.jsxs(_,{sx:{mt:2},children:[n.jsxs(ca,{children:[r?n.jsx(z,{variant:"circular",src:V(r),alt:e.name}):null,n.jsx(J,{onClick:s,component:"button",children:"Change SDK"})]}),n.jsx(w,{children:"Setup the SDK"}),n.jsx(Q,{components:{code:X},children:b})]})]})},ua=h("div")(({theme:e})=>({padding:e.spacing(5,8,2,8),display:"flex",flexDirection:"column",gap:e.spacing(3),fontSize:e.typography.body2.fontSize})),pa=({sdk:e})=>{const{uiConfig:t}=se(),a=`${t.unleashUrl}/api/`,s=`${t.unleashUrl}/api/frontend/`,o=e.type==="client"?a:s,r=(Ke[e.name]||"").replaceAll("<YOUR_API_URL>",o),[l,i,d]=r.split(`---
|
|
689
|
+
`);return n.jsxs(ua,{children:[n.jsx(y,{variant:"h2",children:"Connect an SDK to Unleash"}),n.jsxs(B,{children:[n.jsx(H,{active:2,steps:3}),n.jsx(Y,{color:"secondary",children:"3/3 - Test connection"})]}),i!=null&&i.trim()?n.jsxs(_,{sx:{mt:2},children:[n.jsx(w,{children:"Production settings"}),n.jsx(y,{variant:"body2",children:"You have successfully connected your SDK. In the previous code example, the settings were optimized for development. We recommend the following setup for production."}),n.jsx(Q,{components:{code:X},children:i})]}):null,d!=null&&d.trim()?n.jsxs(_,{children:[n.jsx(w,{children:"Additional resources"}),n.jsx(y,{variant:"body2",children:"Now that we’ve validated the connection, you might want to look into more advanced use cases and examples:"}),n.jsx(Q,{components:{code:X},children:d})]}):null]})},ha=({sdk:e,apiKey:t,feature:a,onSdkChange:s})=>n.jsx(x.Suspense,{fallback:n.jsx(Nn,{}),children:a?n.jsx(da,{sdk:e,apiKey:t,feature:a,onSdkChange:s}):n.jsx(pa,{sdk:e})}),ga=h("main")(({theme:e})=>({backgroundColor:e.palette.background.paper,display:"flex",flexDirection:"column",flex:1})),ma=h(Ln)(({theme:e})=>({"& .MuiDialog-paper":{borderRadius:e.shape.borderRadiusLarge,maxWidth:e.spacing(170),width:"100%",backgroundColor:"transparent"},padding:0,"& .MuiPaper-root > section":{overflowX:"hidden"}})),xe=h("div")(({theme:e})=>({borderTop:`1px solid ${e.palette.divider}}`,display:"flex",justifyContent:"flex-end",gap:e.spacing(4),alignItems:"center",padding:e.spacing(3,8,3,8)})),ye=h("div")(({theme:e})=>({display:"flex",justifyContent:"flex-end",gap:e.spacing(4),alignItems:"center",padding:e.spacing(3,8,3,8)})),fa=({onClose:e,onFinish:t,environments:a,project:s,feature:o})=>{const r=L(),l=Re(r.breakpoints.up("lg")),[i,d]=x.useState(null),[m,b]=x.useState(null),[u,g]=x.useState(null),[c,f]=x.useState("select-sdk"),{project:j}=$(s,{refreshInterval:1e3}),v=c==="select-sdk",R=c==="generate-api-key"&&i&&m,k=c==="test-connection"&&i&&m&&u,C=j.onboardingStatus.status==="onboarded";return x.useEffect(()=>{a.length>0&&b(a[0])},[JSON.stringify(a)]),n.jsx(ma,{open:!0,onClose:e,children:n.jsxs(_,{sx:{display:"flex"},children:[n.jsxs(ga,{children:[v?n.jsx(Rt,{onSelect:p=>{d(p),f("generate-api-key")}}):null,R?n.jsx(At,{environments:a,environment:m,project:s,sdkType:i.type,onEnvSelect:b,onApiKey:g}):null,k?n.jsx(ha,{apiKey:u,sdk:i,feature:o,onSdkChange:()=>{f("select-sdk")}}):null,c==="generate-api-key"?n.jsx(xe,{children:n.jsxs(ye,{children:[n.jsx(E,{variant:"text",color:"inherit",onClick:()=>{f("select-sdk")},children:"Back"}),n.jsx(E,{variant:"contained",disabled:!u,onClick:()=>{f("test-connection")},children:"Next"})]})}):null,k?n.jsx(xe,{children:n.jsxs(ye,{children:[C?null:n.jsx(E,{variant:"text",color:"inherit",onClick:()=>{f("generate-api-key")},children:"Back"}),n.jsx(E,{variant:"contained",onClick:()=>{t(i.name)},children:"Complete"})]})}):null]}),l&&v?n.jsx(Pt,{}):null,l&&R?n.jsx(wt,{}):null,l&&k?n.jsx(Bt,{projectId:s,sdk:i.name,environment:m}):null]})})},wa=({open:e,...t})=>e?n.jsx(fa,{...t}):null,Pa=({isStale:e,isOpen:t,projectId:a,featureId:s,onClose:o})=>{const{setToastData:r,setToastApiError:l}=P(),{patchFeatureToggle:i}=ke(),d=n.jsx(y,{children:"Setting a flag to stale marks it for cleanup"}),m=n.jsx(y,{children:"Setting a flag to active marks it as in active use"}),b=e?"active":"stale",u=async g=>{g.stopPropagation();try{await i(a,s,[{op:"replace",path:"/stale",value:!e}]),o()}catch(c){l(T(c))}r(e?{type:"success",text:"The flag is no longer marked as stale"}:{type:"success",text:"The flag has been marked as stale"})};return n.jsx(Ae,{open:t,secondaryButtonText:"Cancel",primaryButtonText:`Flip to ${b}`,title:`Set feature state to ${b}`,onClick:u,onClose:o,children:n.jsx(ne,{condition:e,show:m,elseShow:d})})};export{wa as C,Aa as E,Ra as F,Ta as P,_a as T,Ca as a,ja as b,qn as c,ka as d,Ia as e,Ea as f,rt as g,Pa as h,kt as i,Oe as j,ft as k,gt as l,Ua as u};
|