unleash-server 5.3.0 → 5.3.1
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/services/client-metrics/metrics-service-v2.d.ts +2 -0
- package/dist/lib/services/client-metrics/metrics-service-v2.js +27 -17
- package/dist/lib/services/client-metrics/metrics-service-v2.js.map +1 -1
- package/dist/lib/services/client-metrics/metrics-service-v2.test.d.ts +1 -0
- package/dist/lib/services/client-metrics/metrics-service-v2.test.js +96 -0
- package/dist/lib/services/client-metrics/metrics-service-v2.test.js.map +1 -0
- package/dist/lib/types/experimental.d.ts +1 -1
- package/dist/lib/types/experimental.js +1 -0
- package/dist/lib/types/experimental.js.map +1 -1
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/{AdvancedPlayground-4c9d02ea.js → AdvancedPlayground-48dddbf4.js} +1 -1
- package/frontend/build/static/{CreateProject-16b35d57.js → CreateProject-c1b0f704.js} +1 -1
- package/frontend/build/static/{Error-50364f10.js → Error-e6f7c2ee.js} +1 -1
- package/frontend/build/static/FeatureArchiveDialog-9ad60db1.js +10 -0
- package/frontend/build/static/{FeatureMetricsChart-839cdf1e.js → FeatureMetricsChart-81da0ce4.js} +1 -1
- package/frontend/build/static/{FeatureViewLazyExport-47bb7f13.js → FeatureViewLazyExport-58a3e977.js} +2 -2
- package/frontend/build/static/{LazyAdminExport-8ef0ca21.js → LazyAdminExport-c98b11d7.js} +2 -2
- package/frontend/build/static/{LazyProjectExport-49541c75.js → LazyProjectExport-14db2e37.js} +1 -1
- package/frontend/build/static/{NetworkOverview-711050f3.js → NetworkOverview-cd06e59f.js} +2 -2
- package/frontend/build/static/{NetworkTraffic-e587c2c7.js → NetworkTraffic-ba933617.js} +1 -1
- package/frontend/build/static/{RoleCell-9a62b4ed.js → RoleCell-c534790e.js} +1 -1
- package/frontend/build/static/{StrategyItemContainer-4098c8ef.js → StrategyItemContainer-88c18285.js} +1 -1
- package/frontend/build/static/{chartjs-adapter-date-fns.esm-d57aaddd.js → chartjs-adapter-date-fns.esm-799be047.js} +1 -1
- package/frontend/build/static/{flowchart-elk-definition-170a3958-4dece62b.js → flowchart-elk-definition-170a3958-543f0844.js} +1 -1
- package/frontend/build/static/{index-9c528324.js → index-1c4c68c3.js} +2 -2
- package/frontend/build/static/{index-9bb67f88.js → index-88f1c682.js} +1 -1
- package/frontend/build/static/{index-1c8194e0.js → index-aa638b65.js} +1 -1
- package/frontend/build/static/{is_dark-ba77f0b9.js → is_dark-735e3a95.js} +1 -1
- package/frontend/build/static/{mindmap-definition-44684416-a4071c9f.js → mindmap-definition-44684416-ac92f950.js} +1 -1
- package/frontend/build/static/{timeline-definition-8e5a9bc6-c996bf40.js → timeline-definition-8e5a9bc6-6c09f608.js} +1 -1
- package/frontend/build/static/{unknownify-db48ebae.js → unknownify-0b176a78.js} +1 -1
- package/package.json +1 -1
- package/frontend/build/static/FeatureArchiveDialog-fda1aa0c.js +0 -10
|
@@ -12,8 +12,10 @@ export default class ClientMetricsServiceV2 {
|
|
|
12
12
|
private unsavedMetrics;
|
|
13
13
|
private clientMetricsStoreV2;
|
|
14
14
|
private lastSeenService;
|
|
15
|
+
private flagResolver;
|
|
15
16
|
private logger;
|
|
16
17
|
constructor({ clientMetricsStoreV2 }: Pick<IUnleashStores, 'clientMetricsStoreV2'>, config: IUnleashConfig, lastSeenService: LastSeenService, bulkInterval?: number);
|
|
18
|
+
filterValidToggleNames(toggleNames: string[]): Promise<string[]>;
|
|
17
19
|
registerBulkMetrics(metrics: IClientMetricsEnv[]): Promise<void>;
|
|
18
20
|
registerClientMetrics(data: ClientMetricsSchema, clientIp: string): Promise<void>;
|
|
19
21
|
bulkAdd(): Promise<void>;
|
|
@@ -11,7 +11,6 @@ const api_token_1 = require("../../types/models/api-token");
|
|
|
11
11
|
const collapseHourlyMetrics_1 = require("../../util/collapseHourlyMetrics");
|
|
12
12
|
const time_utils_1 = require("../../util/time-utils");
|
|
13
13
|
const feature_schema_1 = require("../../schema/feature-schema");
|
|
14
|
-
const error_1 = require("../../error");
|
|
15
14
|
class ClientMetricsServiceV2 {
|
|
16
15
|
constructor({ clientMetricsStoreV2 }, config, lastSeenService, bulkInterval = (0, date_fns_1.secondsToMilliseconds)(5)) {
|
|
17
16
|
this.timers = [];
|
|
@@ -20,6 +19,7 @@ class ClientMetricsServiceV2 {
|
|
|
20
19
|
this.lastSeenService = lastSeenService;
|
|
21
20
|
this.config = config;
|
|
22
21
|
this.logger = config.getLogger('/services/client-metrics/client-metrics-service-v2.ts');
|
|
22
|
+
this.flagResolver = config.flagResolver;
|
|
23
23
|
this.timers.push(setInterval(() => {
|
|
24
24
|
this.bulkAdd().catch(console.error);
|
|
25
25
|
}, bulkInterval).unref());
|
|
@@ -27,6 +27,18 @@ class ClientMetricsServiceV2 {
|
|
|
27
27
|
this.clientMetricsStoreV2.clearMetrics(48).catch(console.error);
|
|
28
28
|
}, (0, date_fns_1.hoursToMilliseconds)(12)).unref());
|
|
29
29
|
}
|
|
30
|
+
async filterValidToggleNames(toggleNames) {
|
|
31
|
+
const nameValidations = toggleNames.map((toggleName) => feature_schema_1.nameSchema.validateAsync({ name: toggleName }));
|
|
32
|
+
const badNames = (await Promise.allSettled(nameValidations)).filter((r) => r.status === 'rejected');
|
|
33
|
+
if (badNames.length > 0) {
|
|
34
|
+
this.logger.warn(`Got a few toggles with invalid names: ${JSON.stringify(badNames)}`);
|
|
35
|
+
if (this.flagResolver.isEnabled('filterInvalidClientMetrics')) {
|
|
36
|
+
const justNames = badNames.map((r) => r.reason._original.name);
|
|
37
|
+
return toggleNames.filter((name) => !justNames.includes(name));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return toggleNames;
|
|
41
|
+
}
|
|
30
42
|
async registerBulkMetrics(metrics) {
|
|
31
43
|
this.unsavedMetrics = (0, collapseHourlyMetrics_1.collapseHourlyMetrics)([
|
|
32
44
|
...this.unsavedMetrics,
|
|
@@ -38,23 +50,21 @@ class ClientMetricsServiceV2 {
|
|
|
38
50
|
const value = await schema_1.clientMetricsSchema.validateAsync(data);
|
|
39
51
|
const toggleNames = Object.keys(value.bucket.toggles).filter((name) => !(value.bucket.toggles[name].yes === 0 &&
|
|
40
52
|
value.bucket.toggles[name].no === 0));
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
53
|
+
const validatedToggleNames = await this.filterValidToggleNames(toggleNames);
|
|
54
|
+
this.logger.debug(`Got ${toggleNames.length} (${validatedToggleNames.length} valid) metrics from ${clientIp}`);
|
|
55
|
+
if (validatedToggleNames.length > 0) {
|
|
56
|
+
const clientMetrics = validatedToggleNames.map((name) => ({
|
|
57
|
+
featureName: name,
|
|
58
|
+
appName: value.appName,
|
|
59
|
+
environment: value.environment ?? 'default',
|
|
60
|
+
timestamp: value.bucket.start,
|
|
61
|
+
yes: value.bucket.toggles[name].yes ?? 0,
|
|
62
|
+
no: value.bucket.toggles[name].no ?? 0,
|
|
63
|
+
variants: value.bucket.toggles[name].variants,
|
|
64
|
+
}));
|
|
65
|
+
await this.registerBulkMetrics(clientMetrics);
|
|
66
|
+
this.config.eventBus.emit(events_1.CLIENT_METRICS, value);
|
|
45
67
|
}
|
|
46
|
-
this.logger.debug(`got metrics from ${clientIp}`);
|
|
47
|
-
const clientMetrics = toggleNames.map((name) => ({
|
|
48
|
-
featureName: name,
|
|
49
|
-
appName: value.appName,
|
|
50
|
-
environment: value.environment,
|
|
51
|
-
timestamp: value.bucket.start,
|
|
52
|
-
yes: value.bucket.toggles[name].yes,
|
|
53
|
-
no: value.bucket.toggles[name].no,
|
|
54
|
-
variants: value.bucket.toggles[name].variants,
|
|
55
|
-
}));
|
|
56
|
-
await this.registerBulkMetrics(clientMetrics);
|
|
57
|
-
this.config.eventBus.emit(events_1.CLIENT_METRICS, value);
|
|
58
68
|
}
|
|
59
69
|
async bulkAdd() {
|
|
60
70
|
if (this.unsavedMetrics.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-service-v2.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/metrics-service-v2.ts"],"names":[],"mappings":";;;;;AAQA,qCAA+C;AAC/C,uCAIkB;AAClB,+CAAoD;AACpD,oEAA2C;AAC3C,4DAAmD;AAEnD,4EAAyE;AAEzE,sDAA4D;AAE5D,gEAAyD;
|
|
1
|
+
{"version":3,"file":"metrics-service-v2.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/metrics-service-v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const metrics_service_v2_1 = __importDefault(require("./metrics-service-v2"));
|
|
7
|
+
const no_logger_1 = __importDefault(require("../../../test/fixtures/no-logger"));
|
|
8
|
+
const store_1 = __importDefault(require("../../../test/fixtures/store"));
|
|
9
|
+
const events_1 = __importDefault(require("events"));
|
|
10
|
+
const last_seen_service_1 = require("./last-seen-service");
|
|
11
|
+
function initClientMetrics(flagEnabled = true) {
|
|
12
|
+
const stores = (0, store_1.default)();
|
|
13
|
+
const eventBus = new events_1.default();
|
|
14
|
+
eventBus.emit = jest.fn();
|
|
15
|
+
const config = {
|
|
16
|
+
eventBus,
|
|
17
|
+
getLogger: no_logger_1.default,
|
|
18
|
+
flagResolver: {
|
|
19
|
+
isEnabled: () => {
|
|
20
|
+
return flagEnabled;
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
const lastSeenService = new last_seen_service_1.LastSeenService(stores, config);
|
|
25
|
+
lastSeenService.updateLastSeen = jest.fn();
|
|
26
|
+
const service = new metrics_service_v2_1.default(stores, config, lastSeenService);
|
|
27
|
+
return { clientMetricsService: service, eventBus, lastSeenService };
|
|
28
|
+
}
|
|
29
|
+
test('process metrics properly', async () => {
|
|
30
|
+
const { clientMetricsService, eventBus, lastSeenService } = initClientMetrics();
|
|
31
|
+
await clientMetricsService.registerClientMetrics({
|
|
32
|
+
appName: 'test',
|
|
33
|
+
bucket: {
|
|
34
|
+
start: '1982-07-25T12:00:00.000Z',
|
|
35
|
+
stop: '2023-07-25T12:00:00.000Z',
|
|
36
|
+
toggles: {
|
|
37
|
+
myCoolToggle: {
|
|
38
|
+
yes: 25,
|
|
39
|
+
no: 42,
|
|
40
|
+
variants: {
|
|
41
|
+
blue: 6,
|
|
42
|
+
green: 15,
|
|
43
|
+
red: 46,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
myOtherToggle: {
|
|
47
|
+
yes: 0,
|
|
48
|
+
no: 100,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
environment: 'test',
|
|
53
|
+
}, '127.0.0.1');
|
|
54
|
+
expect(eventBus.emit).toHaveBeenCalledTimes(1);
|
|
55
|
+
expect(lastSeenService.updateLastSeen).toHaveBeenCalledTimes(1);
|
|
56
|
+
});
|
|
57
|
+
test('process metrics properly even when some names are not url friendly, filtering out invalid names when flag is on', async () => {
|
|
58
|
+
const { clientMetricsService, eventBus, lastSeenService } = initClientMetrics();
|
|
59
|
+
await clientMetricsService.registerClientMetrics({
|
|
60
|
+
appName: 'test',
|
|
61
|
+
bucket: {
|
|
62
|
+
start: '1982-07-25T12:00:00.000Z',
|
|
63
|
+
stop: '2023-07-25T12:00:00.000Z',
|
|
64
|
+
toggles: {
|
|
65
|
+
'not url friendly ☹': {
|
|
66
|
+
yes: 0,
|
|
67
|
+
no: 100,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
environment: 'test',
|
|
72
|
+
}, '127.0.0.1');
|
|
73
|
+
// only toggle with a bad name gets filtered out
|
|
74
|
+
expect(eventBus.emit).not.toHaveBeenCalled();
|
|
75
|
+
expect(lastSeenService.updateLastSeen).not.toHaveBeenCalled();
|
|
76
|
+
});
|
|
77
|
+
test('process metrics properly even when some names are not url friendly, with default behavior when flag is off', async () => {
|
|
78
|
+
const { clientMetricsService, eventBus, lastSeenService } = initClientMetrics(false);
|
|
79
|
+
await clientMetricsService.registerClientMetrics({
|
|
80
|
+
appName: 'test',
|
|
81
|
+
bucket: {
|
|
82
|
+
start: '1982-07-25T12:00:00.000Z',
|
|
83
|
+
stop: '2023-07-25T12:00:00.000Z',
|
|
84
|
+
toggles: {
|
|
85
|
+
'not url friendly ☹': {
|
|
86
|
+
yes: 0,
|
|
87
|
+
no: 100,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
environment: 'test',
|
|
92
|
+
}, '127.0.0.1');
|
|
93
|
+
expect(eventBus.emit).toHaveBeenCalledTimes(1);
|
|
94
|
+
expect(lastSeenService.updateLastSeen).toHaveBeenCalledTimes(1);
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=metrics-service-v2.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-service-v2.test.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/metrics-service-v2.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Variant } from 'unleash-client';
|
|
2
|
-
export declare type IFlagKey = 'anonymiseEventLog' | 'embedProxy' | 'embedProxyFrontend' | 'responseTimeWithAppNameKillSwitch' | 'maintenanceMode' | 'messageBanner' | 'featuresExportImport' | 'caseInsensitiveInOperators' | 'strictSchemaValidation' | 'proPlanAutoCharge' | 'personalAccessTokensKillSwitch' | 'cleanClientApi' | 'migrationLock' | 'demo' | 'googleAuthEnabled' | 'disableBulkToggle' | 'disableNotifications' | 'advancedPlayground' | 'customRootRoles' | 'strategyVariant' | 'newProjectLayout' | 'slackAppAddon' | 'emitPotentiallyStaleEvents' | 'configurableFeatureTypeLifetimes';
|
|
2
|
+
export declare type IFlagKey = 'anonymiseEventLog' | 'embedProxy' | 'embedProxyFrontend' | 'responseTimeWithAppNameKillSwitch' | 'maintenanceMode' | 'messageBanner' | 'featuresExportImport' | 'caseInsensitiveInOperators' | 'strictSchemaValidation' | 'proPlanAutoCharge' | 'personalAccessTokensKillSwitch' | 'cleanClientApi' | 'migrationLock' | 'demo' | 'googleAuthEnabled' | 'disableBulkToggle' | 'disableNotifications' | 'advancedPlayground' | 'customRootRoles' | 'strategyVariant' | 'newProjectLayout' | 'slackAppAddon' | 'emitPotentiallyStaleEvents' | 'configurableFeatureTypeLifetimes' | 'filterInvalidClientMetrics';
|
|
3
3
|
export declare type IFlags = Partial<{
|
|
4
4
|
[key in IFlagKey]: boolean | Variant;
|
|
5
5
|
}>;
|
|
@@ -35,6 +35,7 @@ const flags = {
|
|
|
35
35
|
slackAppAddon: (0, util_1.parseEnvVarBoolean)(process.env.UNLEASH_SLACK_APP_ADDON, false),
|
|
36
36
|
emitPotentiallyStaleEvents: (0, util_1.parseEnvVarBoolean)(process.env.UNLEASH_EXPERIMENTAL_EMIT_POTENTIALLY_STALE_EVENTS, false),
|
|
37
37
|
configurableFeatureTypeLifetimes: (0, util_1.parseEnvVarBoolean)(process.env.UNLEASH_EXPERIMENTAL_CONFIGURABLE_FEATURE_TYPE_LIFETIMES, false),
|
|
38
|
+
filterInvalidClientMetrics: (0, util_1.parseEnvVarBoolean)(process.env.FILTER_INVALID_CLIENT_METRICS, false),
|
|
38
39
|
};
|
|
39
40
|
exports.defaultExperimentalOptions = {
|
|
40
41
|
flags,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experimental.js","sourceRoot":"","sources":["../../../src/lib/types/experimental.ts"],"names":[],"mappings":";;;AAAA,mDAAsD;AACtD,kCAA6C;AAC7C,wDAA+D;
|
|
1
|
+
{"version":3,"file":"experimental.js","sourceRoot":"","sources":["../../../src/lib/types/experimental.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
href="https://fonts.googleapis.com/css2?family=Sen:wght@400;700;800&display=swap"
|
|
17
17
|
rel="stylesheet"
|
|
18
18
|
/>
|
|
19
|
-
<script type="module" crossorigin src="/static/index-
|
|
19
|
+
<script type="module" crossorigin src="/static/index-1c4c68c3.js"></script>
|
|
20
20
|
<link rel="stylesheet" href="/static/index-770afaee.css">
|
|
21
21
|
</head>
|
|
22
22
|
<body>
|
package/frontend/build/static/{AdvancedPlayground-4c9d02ea.js → AdvancedPlayground-48dddbf4.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as qi,j as m,u as Xu,r as E,_ as Zu,a as Yr,s as V,U as ef,b as me,d as D,B as q,C as j,e as tf,f as za,g as nf,h as Si,T as te,F as sf,I as rf,S as of,M as lf,i as Xr,p as No,k as Fo,l as Ci,A as ir,m as af,n as hf,o as cf,q as uf,D as ff,t as ti,P as df,v as $a,w as pf,x as Ai,y as Be,z as mf,E as Pi,G as Ui,H as gf,J as ja,K as yf,L as bf,N as nr,O as wn,Q as sr,R as xf,V as wf,W as vf,X as kf,Y as Sf,Z as Zr,$ as as,a0 as Cf,a1 as Me,a2 as hs,a3 as Af,a4 as Mf,a5 as Of,a6 as Tf,a7 as Df,a8 as Pf,a9 as Wo,aa as qa,ab as eo,ac as Ua,ad as to,ae as Ga,af as Ka,ag as Rf,ah as Qa,ai as Bf,aj as Vo,ak as Ef,al as Lf,am as Ms,an as If,ao as Nf,ap as Ff,aq as Wf,ar as Vf,as as Hf}from"./index-
|
|
1
|
+
import{c as qi,j as m,u as Xu,r as E,_ as Zu,a as Yr,s as V,U as ef,b as me,d as D,B as q,C as j,e as tf,f as za,g as nf,h as Si,T as te,F as sf,I as rf,S as of,M as lf,i as Xr,p as No,k as Fo,l as Ci,A as ir,m as af,n as hf,o as cf,q as uf,D as ff,t as ti,P as df,v as $a,w as pf,x as Ai,y as Be,z as mf,E as Pi,G as Ui,H as gf,J as ja,K as yf,L as bf,N as nr,O as wn,Q as sr,R as xf,V as wf,W as vf,X as kf,Y as Sf,Z as Zr,$ as as,a0 as Cf,a1 as Me,a2 as hs,a3 as Af,a4 as Mf,a5 as Of,a6 as Tf,a7 as Df,a8 as Pf,a9 as Wo,aa as qa,ab as eo,ac as Ua,ad as to,ae as Ga,af as Ka,ag as Rf,ah as Qa,ai as Bf,aj as Vo,ak as Ef,al as Lf,am as Ms,an as If,ao as Nf,ap as Ff,aq as Wf,ar as Vf,as as Hf}from"./index-1c4c68c3.js";import{E as zf}from"./Error-e6f7c2ee.js";import{S as $f}from"./StrategyItemContainer-88c18285.js";const cs=qi(m("path",{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41z"}),"CancelOutlined"),jf=qi(m("path",{d:"M16.59 7.58 10 14.17l-3.59-3.58L5 12l5 5 8-8zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"CheckCircleOutline"),qf=qi(m("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm4.59-12.42L10 14.17l-2.59-2.58L6 13l4 4 8-8z"}),"CheckCircleOutlined"),Uf=qi(m("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"}),"Help"),Gf=qi(m("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"}),"WarningOutlined"),Kf=()=>{const{makeRequest:n,createRequest:e,errors:t,loading:i}=Xu({propagateErrors:!0}),s="api/admin/playground";return{evaluateAdvancedPlayground:async o=>{const l=`${s}/advanced`,a=e(l,{method:"POST",body:JSON.stringify(o)});try{return(await n(a.caller,a.id)).json()}catch(h){throw h}},errors:t,loading:i}};function rr(n,e,t){var i,s,r,o,l;e==null&&(e=100);function a(){var c=Date.now()-o;c<e&&c>=0?i=setTimeout(a,e-c):(i=null,t||(l=n.apply(r,s),r=s=null))}var h=function(){r=this,s=arguments,o=Date.now();var c=t&&!i;return i||(i=setTimeout(a,e)),c&&(l=n.apply(r,s),r=s=null),l};return h.clear=function(){i&&(clearTimeout(i),i=null)},h.flush=function(){i&&(l=n.apply(r,s),r=s=null,clearTimeout(i),i=null)},h}rr.debounce=rr;var Qf=rr;class U{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){let s=[];return this.decompose(0,e,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(t,this.length,s,1),tt.from(s,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){let i=[];return this.decompose(e,t,i,0),tt.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),s=new Mi(this),r=new Mi(e);for(let o=t,l=t;;){if(s.next(o),r.next(o),o=0,s.lineBreak!=r.lineBreak||s.done!=r.done||s.value!=r.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(e=1){return new Mi(this,e)}iterRange(e,t=this.length){return new Ja(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let s=this.line(e).from;i=this.iterRange(s,Math.max(s,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new _a(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?U.empty:e.length<=32?new ae(e):tt.from(ae.split(e,[]))}}class ae extends U{constructor(e,t=Jf(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,s){for(let r=0;;r++){let o=this.text[r],l=s+o.length;if((t?i:l)>=e)return new _f(s,l,i,o);s=l+1,i++}}decompose(e,t,i,s){let r=e<=0&&t>=this.length?this:new ae(Ho(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(s&1){let o=i.pop(),l=vn(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new ae(l,o.length+r.length));else{let a=l.length>>1;i.push(new ae(l.slice(0,a)),new ae(l.slice(a)))}}else i.push(r)}replace(e,t,i){if(!(i instanceof ae))return super.replace(e,t,i);let s=vn(this.text,vn(i.text,Ho(this.text,0,e)),t),r=this.length+i.length-(t-e);return s.length<=32?new ae(s,r):tt.from(ae.split(s,[]),r)}sliceString(e,t=this.length,i=`
|
|
2
2
|
`){let s="";for(let r=0,o=0;r<=t&&o<this.text.length;o++){let l=this.text[o],a=r+l.length;r>e&&o&&(s+=i),e<a&&t>r&&(s+=l.slice(Math.max(0,e-r),t-r)),r=a+1}return s}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],s=-1;for(let r of e)i.push(r),s+=r.length+1,i.length==32&&(t.push(new ae(i,s)),i=[],s=-1);return s>-1&&t.push(new ae(i,s)),t}}class tt extends U{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,t,i,s){for(let r=0;;r++){let o=this.children[r],l=s+o.length,a=i+o.lines-1;if((t?a:l)>=e)return o.lineInner(e,t,i,s);s=l+1,i=a+1}}decompose(e,t,i,s){for(let r=0,o=0;o<=t&&r<this.children.length;r++){let l=this.children[r],a=o+l.length;if(e<=a&&t>=o){let h=s&((o<=e?1:0)|(a>=t?2:0));o>=e&&a<=t&&!h?i.push(l):l.decompose(e-o,t-o,i,h)}o=a+1}}replace(e,t,i){if(i.lines<this.lines)for(let s=0,r=0;s<this.children.length;s++){let o=this.children[s],l=r+o.length;if(e>=r&&t<=l){let a=o.replace(e-r,t-r,i),h=this.lines-o.lines+a.lines;if(a.lines<h>>5-1&&a.lines>h>>5+1){let c=this.children.slice();return c[s]=a,new tt(c,this.length-(t-e)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i=`
|
|
3
3
|
`){let s="";for(let r=0,o=0;r<this.children.length&&o<=t;r++){let l=this.children[r],a=o+l.length;o>e&&r&&(s+=i),e<a&&t>o&&(s+=l.sliceString(e-o,t-o,i)),o=a+1}return s}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof tt))return 0;let i=0,[s,r,o,l]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;s+=t,r+=t){if(s==o||r==l)return i;let a=this.children[s],h=e.children[r];if(a!=h)return i+a.scanIdentical(h,t);i+=a.length+1}}static from(e,t=e.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let d of e)i+=d.lines;if(i<32){let d=[];for(let p of e)p.flatten(d);return new ae(d,t)}let s=Math.max(32,i>>5),r=s<<1,o=s>>1,l=[],a=0,h=-1,c=[];function u(d){let p;if(d.lines>r&&d instanceof tt)for(let b of d.children)u(b);else d.lines>o&&(a>o||!a)?(f(),l.push(d)):d instanceof ae&&a&&(p=c[c.length-1])instanceof ae&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,c[c.length-1]=new ae(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>s&&f(),a+=d.lines,h+=d.length+1,c.push(d))}function f(){a!=0&&(l.push(c.length==1?c[0]:tt.from(c,h)),h=-1,a=c.length=0)}for(let d of e)u(d);return f(),l.length==1?l[0]:new tt(l,t)}}U.empty=new ae([""],0);function Jf(n){let e=-1;for(let t of n)e+=t.length+1;return e}function vn(n,e,t=0,i=1e9){for(let s=0,r=0,o=!0;r<n.length&&s<=i;r++){let l=n[r],a=s+l.length;a>=t&&(a>i&&(l=l.slice(0,i-s)),s<t&&(l=l.slice(t-s)),o?(e[e.length-1]+=l,o=!1):e.push(l)),s=a+1}return e}function Ho(n,e,t){return vn(n,[""],e,t)}class Mi{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[e],this.offsets=[t>0?1:(e instanceof ae?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],r=this.offsets[i],o=r>>1,l=s instanceof ae?s.text.length:s.children.length;if(o==(t>0?l:0)){if(i==0)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(t>0?0:1)){if(this.offsets[i]+=t,e==0)return this.lineBreak=!0,this.value=`
|
|
4
4
|
`,this;e--}else if(s instanceof ae){let a=s.text[o+(t<0?-1:0)];if(this.offsets[i]+=t,a.length>Math.max(0,e))return this.value=e==0?a:t>0?a.slice(e):a.slice(0,a.length-e),this;e-=a.length}else{let a=s.children[o+(t<0?-1:0)];e>a.length?(e-=a.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(t>0?1:(a instanceof ae?a.text.length:a.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class Ja{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new Mi(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:s}=this.cursor.next(e);return this.pos+=(s.length+e)*t,this.value=s.length<=i?s:t<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}}class _a{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:s}=this.inner.next(e);return t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}}typeof Symbol<"u"&&(U.prototype[Symbol.iterator]=function(){return this.iter()},Mi.prototype[Symbol.iterator]=Ja.prototype[Symbol.iterator]=_a.prototype[Symbol.iterator]=function(){return this});class _f{constructor(e,t,i,s){this.from=e,this.to=t,this.number=i,this.text=s}get length(){return this.to-this.from}}let Jt="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(n=>n?parseInt(n,36):1);for(let n=1;n<Jt.length;n++)Jt[n]+=Jt[n-1];function Yf(n){for(let e=1;e<Jt.length;e+=2)if(Jt[e]>n)return Jt[e-1]<=n;return!1}function zo(n){return n>=127462&&n<=127487}const $o=8205;function Oe(n,e,t=!0,i=!0){return(t?Ya:Xf)(n,e,i)}function Ya(n,e,t){if(e==n.length)return e;e&&Xa(n.charCodeAt(e))&&Za(n.charCodeAt(e-1))&&e--;let i=ye(n,e);for(e+=Ne(i);e<n.length;){let s=ye(n,e);if(i==$o||s==$o||t&&Yf(s))e+=Ne(s),i=s;else if(zo(s)){let r=0,o=e-2;for(;o>=0&&zo(ye(n,o));)r++,o-=2;if(r%2==0)break;e+=2}else break}return e}function Xf(n,e,t){for(;e>0;){let i=Ya(n,e-2,t);if(i<e)return i;e--}return 0}function Xa(n){return n>=56320&&n<57344}function Za(n){return n>=55296&&n<56320}function ye(n,e){let t=n.charCodeAt(e);if(!Za(t)||e+1==n.length)return t;let i=n.charCodeAt(e+1);return Xa(i)?(t-55296<<10)+(i-56320)+65536:t}function io(n){return n<=65535?String.fromCharCode(n):(n-=65536,String.fromCharCode((n>>10)+55296,(n&1023)+56320))}function Ne(n){return n<65536?1:2}const or=/\r\n?|\n/;var Ae=function(n){return n[n.Simple=0]="Simple",n[n.TrackDel=1]="TrackDel",n[n.TrackBefore=2]="TrackBefore",n[n.TrackAfter=3]="TrackAfter",n}(Ae||(Ae={}));class st{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let i=this.sections[t+1];e+=i<0?this.sections[t]:i}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,i=0,s=0;t<this.sections.length;){let r=this.sections[t++],o=this.sections[t++];o<0?(e(i,s,r),s+=r):s+=o,i+=r}}iterChangedRanges(e,t=!1){lr(this,e,t)}get invertedDesc(){let e=[];for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];s<0?e.push(i,s):e.push(s,i)}return new st(e)}composeDesc(e){return this.empty?e:e.empty?this:eh(this,e)}mapDesc(e,t=!1){return e.empty?this:ar(this,e,t)}mapPos(e,t=-1,i=Ae.Simple){let s=0,r=0;for(let o=0;o<this.sections.length;){let l=this.sections[o++],a=this.sections[o++],h=s+l;if(a<0){if(h>e)return r+(e-s);r+=l}else{if(i!=Ae.Simple&&h>=e&&(i==Ae.TrackDel&&s<e&&h>e||i==Ae.TrackBefore&&s<e||i==Ae.TrackAfter&&h>e))return null;if(h>e||h==e&&t<0&&!l)return e==s||t<0?r:r+a;r+=a}s=h}if(e>s)throw new RangeError(`Position ${e} is out of range for changeset of length ${s}`);return r}touchesRange(e,t=e){for(let i=0,s=0;i<this.sections.length&&s<=t;){let r=this.sections[i++],o=this.sections[i++],l=s+r;if(o>=0&&s<=t&&l>=e)return s<e&&l>t?"cover":!0;s=l}return!1}toString(){let e="";for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];e+=(e?" ":"")+i+(s>=0?":"+s:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new st(e)}static create(e){return new st(e)}}class fe extends st{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return lr(this,(t,i,s,r,o)=>e=e.replace(s,s+(i-t),o),!1),e}mapDesc(e,t=!1){return ar(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let s=0,r=0;s<t.length;s+=2){let o=t[s],l=t[s+1];if(l>=0){t[s]=l,t[s+1]=o;let a=s>>1;for(;i.length<a;)i.push(U.empty);i.push(o?e.slice(r,r+o):U.empty)}r+=o}return new fe(t,i)}compose(e){return this.empty?e:e.empty?this:eh(this,e,!0)}map(e,t=!1){return e.empty?this:ar(this,e,t,!0)}iterChanges(e,t=!1){lr(this,e,t)}get desc(){return st.create(this.sections)}filter(e){let t=[],i=[],s=[],r=new Ri(this);e:for(let o=0,l=0;;){let a=o==e.length?1e9:e[o++];for(;l<a||l==a&&r.len==0;){if(r.done)break e;let c=Math.min(r.len,a-l);ve(s,c,-1);let u=r.ins==-1?-1:r.off==0?r.ins:0;ve(t,c,u),u>0&&xt(i,t,r.text),r.forward(c),l+=c}let h=e[o++];for(;l<h;){if(r.done)break e;let c=Math.min(r.len,h-l);ve(t,c,-1),ve(s,c,r.ins==-1?-1:r.off==0?r.ins:0),r.forward(c),l+=c}}return{changes:new fe(t,i),filtered:st.create(s)}}toJSON(){let e=[];for(let t=0;t<this.sections.length;t+=2){let i=this.sections[t],s=this.sections[t+1];s<0?e.push(i):s==0?e.push([i]):e.push([i].concat(this.inserted[t>>1].toJSON()))}return e}static of(e,t,i){let s=[],r=[],o=0,l=null;function a(c=!1){if(!c&&!s.length)return;o<t&&ve(s,t-o,-1);let u=new fe(s,r);l=l?l.compose(u.map(l)):u,s=[],r=[],o=0}function h(c){if(Array.isArray(c))for(let u of c)h(u);else if(c instanceof fe){if(c.length!=t)throw new RangeError(`Mismatched change set length (got ${c.length}, expected ${t})`);a(),l=l?l.compose(c.map(l)):c}else{let{from:u,to:f=u,insert:d}=c;if(u>f||u<0||f>t)throw new RangeError(`Invalid change range ${u} to ${f} (in doc of length ${t})`);let p=d?typeof d=="string"?U.of(d.split(i||or)):d:U.empty,b=p.length;if(u==f&&b==0)return;u<o&&a(),u>o&&ve(s,u-o,-1),ve(s,f-u,b),xt(r,s,p),o=f}}return h(e),a(!l),l}static empty(e){return new fe(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],i=[];for(let s=0;s<e.length;s++){let r=e[s];if(typeof r=="number")t.push(r,-1);else{if(!Array.isArray(r)||typeof r[0]!="number"||r.some((o,l)=>l&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)t.push(r[0],0);else{for(;i.length<s;)i.push(U.empty);i[s]=U.of(r.slice(1)),t.push(r[0],i[s].length)}}}return new fe(t,i)}static createSet(e,t){return new fe(e,t)}}function ve(n,e,t,i=!1){if(e==0&&t<=0)return;let s=n.length-2;s>=0&&t<=0&&t==n[s+1]?n[s]+=e:e==0&&n[s]==0?n[s+1]+=t:i?(n[s]+=e,n[s+1]+=t):n.push(e,t)}function xt(n,e,t){if(t.length==0)return;let i=e.length-2>>1;if(i<n.length)n[n.length-1]=n[n.length-1].append(t);else{for(;n.length<i;)n.push(U.empty);n.push(t)}}function lr(n,e,t){let i=n.inserted;for(let s=0,r=0,o=0;o<n.sections.length;){let l=n.sections[o++],a=n.sections[o++];if(a<0)s+=l,r+=l;else{let h=s,c=r,u=U.empty;for(;h+=l,c+=a,a&&i&&(u=u.append(i[o-2>>1])),!(t||o==n.sections.length||n.sections[o+1]<0);)l=n.sections[o++],a=n.sections[o++];e(s,h,r,c,u),s=h,r=c}}}function ar(n,e,t,i=!1){let s=[],r=i?[]:null,o=new Ri(n),l=new Ri(e);for(let a=-1;;)if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);ve(s,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len<o.len||l.len==o.len&&!t))){let h=l.len;for(ve(s,l.ins,-1);h;){let c=Math.min(o.len,h);o.ins>=0&&a<o.i&&o.len<=c&&(ve(s,0,o.ins),r&&xt(r,s,o.text),a=o.i),o.forward(c),h-=c}l.next()}else if(o.ins>=0){let h=0,c=o.len;for(;c;)if(l.ins==-1){let u=Math.min(c,l.len);h+=u,c-=u,l.forward(u)}else if(l.ins==0&&l.len<c)c-=l.len,l.next();else break;ve(s,h,a<o.i?o.ins:0),r&&a<o.i&&xt(r,s,o.text),a=o.i,o.forward(o.len-c)}else{if(o.done&&l.done)return r?fe.createSet(s,r):st.create(s);throw new Error("Mismatched change set lengths")}}function eh(n,e,t=!1){let i=[],s=t?[]:null,r=new Ri(n),o=new Ri(e);for(let l=!1;;){if(r.done&&o.done)return s?fe.createSet(i,s):st.create(i);if(r.ins==0)ve(i,r.len,0,l),r.next();else if(o.len==0&&!o.done)ve(i,0,o.ins,l),s&&xt(s,i,o.text),o.next();else{if(r.done||o.done)throw new Error("Mismatched change set lengths");{let a=Math.min(r.len2,o.len),h=i.length;if(r.ins==-1){let c=o.ins==-1?-1:o.off?0:o.ins;ve(i,a,c,l),s&&c&&xt(s,i,o.text)}else o.ins==-1?(ve(i,r.off?0:r.len,a,l),s&&xt(s,i,r.textBit(a))):(ve(i,r.off?0:r.len,o.off?0:o.ins,l),s&&!o.off&&xt(s,i,o.text));l=(r.ins>a||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}class Ri{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i<e.length?(this.len=e[this.i++],this.ins=e[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:e}=this.set,t=this.i-2>>1;return t>=e.length?U.empty:e[t]}textBit(e){let{inserted:t}=this.set,i=this.i-2>>1;return i>=t.length&&!e?U.empty:t[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class It{constructor(e,t,i){this.from=e,this.to=t,this.flags=i}get anchor(){return this.flags&16?this.to:this.from}get head(){return this.flags&16?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&4?-1:this.flags&8?1:0}get bidiLevel(){let e=this.flags&3;return e==3?null:e}get goalColumn(){let e=this.flags>>5;return e==33554431?void 0:e}map(e,t=-1){let i,s;return this.empty?i=s=e.mapPos(this.from,t):(i=e.mapPos(this.from,1),s=e.mapPos(this.to,-1)),i==this.from&&s==this.to?this:new It(i,s,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return w.range(e,t);let i=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return w.range(this.anchor,i)}eq(e){return this.anchor==e.anchor&&this.head==e.head}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return w.range(e.anchor,e.head)}static create(e,t,i){return new It(e,t,i)}}class w{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:w.create(this.ranges.map(i=>i.map(e,t)),this.mainIndex)}eq(e){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let t=0;t<this.ranges.length;t++)if(!this.ranges[t].eq(e.ranges[t]))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new w([this.main],0)}addRange(e,t=!0){return w.create([e].concat(this.ranges),t?0:this.mainIndex+1)}replaceRange(e,t=this.mainIndex){let i=this.ranges.slice();return i[t]=e,w.create(i,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(e=>e.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new w(e.ranges.map(t=>It.fromJSON(t)),e.main)}static single(e,t=e){return new w([w.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,s=0;s<e.length;s++){let r=e[s];if(r.empty?r.from<=i:r.from<i)return w.normalized(e.slice(),t);i=r.to}return new w(e,t)}static cursor(e,t=0,i,s){return It.create(e,e,(t==0?0:t<0?4:8)|(i==null?3:Math.min(2,i))|(s??33554431)<<5)}static range(e,t,i,s){let r=(i??33554431)<<5|(s==null?3:Math.min(2,s));return t<e?It.create(t,e,24|r):It.create(e,t,(t>e?4:0)|r)}static normalized(e,t=0){let i=e[t];e.sort((s,r)=>s.from-r.from),t=e.indexOf(i);for(let s=1;s<e.length;s++){let r=e[s],o=e[s-1];if(r.empty?r.from<=o.to:r.from<o.to){let l=o.from,a=Math.max(r.to,o.to);s<=t&&t--,e.splice(--s,2,r.anchor>r.head?w.range(a,l):w.range(l,a))}}return new w(e,t)}}function th(n,e){for(let t of n.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}let no=0;class B{constructor(e,t,i,s,r){this.combine=e,this.compareInput=t,this.compare=i,this.isStatic=s,this.id=no++,this.default=e([]),this.extensions=typeof r=="function"?r(this):r}static define(e={}){return new B(e.combine||(t=>t),e.compareInput||((t,i)=>t===i),e.compare||(e.combine?(t,i)=>t===i:so),!!e.static,e.enables)}of(e){return new kn([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new kn(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new kn(e,this,2,t)}from(e,t){return t||(t=i=>i),this.compute([e],i=>t(i.field(e)))}}function so(n,e){return n==e||n.length==e.length&&n.every((t,i)=>t===e[i])}class kn{constructor(e,t,i,s){this.dependencies=e,this.facet=t,this.type=i,this.value=s,this.id=no++}dynamicSlot(e){var t;let i=this.value,s=this.facet.compareInput,r=this.id,o=e[r]>>1,l=this.type==2,a=!1,h=!1,c=[];for(let u of this.dependencies)u=="doc"?a=!0:u=="selection"?h=!0:((t=e[u.id])!==null&&t!==void 0?t:1)&1||c.push(e[u.id]);return{create(u){return u.values[o]=i(u),1},update(u,f){if(a&&f.docChanged||h&&(f.docChanged||f.selection)||hr(u,c)){let d=i(u);if(l?!jo(d,u.values[o],s):!s(d,u.values[o]))return u.values[o]=d,1}return 0},reconfigure:(u,f)=>{let d,p=f.config.address[r];if(p!=null){let b=Bn(f,p);if(this.dependencies.every(g=>g instanceof B?f.facet(g)===u.facet(g):g instanceof we?f.field(g,!1)==u.field(g,!1):!0)||(l?jo(d=i(u),b,s):s(d=i(u),b)))return u.values[o]=b,0}else d=i(u);return u.values[o]=d,1}}}}function jo(n,e,t){if(n.length!=e.length)return!1;for(let i=0;i<n.length;i++)if(!t(n[i],e[i]))return!1;return!0}function hr(n,e){let t=!1;for(let i of e)Oi(n,i)&1&&(t=!0);return t}function Zf(n,e,t){let i=t.map(a=>n[a.id]),s=t.map(a=>a.type),r=i.filter(a=>!(a&1)),o=n[e.id]>>1;function l(a){let h=[];for(let c=0;c<i.length;c++){let u=Bn(a,i[c]);if(s[c]==2)for(let f of u)h.push(f);else h.push(u)}return e.combine(h)}return{create(a){for(let h of i)Oi(a,h);return a.values[o]=l(a),1},update(a,h){if(!hr(a,r))return 0;let c=l(a);return e.compare(c,a.values[o])?0:(a.values[o]=c,1)},reconfigure(a,h){let c=hr(a,i),u=h.config.facets[e.id],f=h.facet(e);if(u&&!c&&so(t,u))return a.values[o]=f,0;let d=l(a);return e.compare(d,f)?(a.values[o]=f,0):(a.values[o]=d,1)}}}const qo=B.define({static:!0});class we{constructor(e,t,i,s,r){this.id=e,this.createF=t,this.updateF=i,this.compareF=s,this.spec=r,this.provides=void 0}static define(e){let t=new we(no++,e.create,e.update,e.compare||((i,s)=>i===s),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(qo).find(i=>i.field==this);return((t==null?void 0:t.create)||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:i=>(i.values[t]=this.create(i),1),update:(i,s)=>{let r=i.values[t],o=this.updateF(r,s);return this.compareF(r,o)?0:(i.values[t]=o,1)},reconfigure:(i,s)=>s.config.address[this.id]!=null?(i.values[t]=s.field(this),0):(i.values[t]=this.create(i),1)}}init(e){return[this,qo.of({field:this,create:e})]}get extension(){return this}}const Et={lowest:4,low:3,default:2,high:1,highest:0};function di(n){return e=>new ih(e,n)}const ci={highest:di(Et.highest),high:di(Et.high),default:di(Et.default),low:di(Et.low),lowest:di(Et.lowest)};class ih{constructor(e,t){this.inner=e,this.prec=t}}class us{of(e){return new cr(this,e)}reconfigure(e){return us.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class cr{constructor(e,t){this.compartment=e,this.inner=t}}class Rn{constructor(e,t,i,s,r,o){for(this.base=e,this.compartments=t,this.dynamicSlots=i,this.address=s,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length<i.length;)this.statusTemplate.push(0)}staticFacet(e){let t=this.address[e.id];return t==null?e.default:this.staticValues[t>>1]}static resolve(e,t,i){let s=[],r=Object.create(null),o=new Map;for(let f of ed(e,t,o))f instanceof we?s.push(f):(r[f.facet.id]||(r[f.facet.id]=[])).push(f);let l=Object.create(null),a=[],h=[];for(let f of s)l[f.id]=h.length<<1,h.push(d=>f.slot(d));let c=i==null?void 0:i.config.facets;for(let f in r){let d=r[f],p=d[0].facet,b=c&&c[f]||[];if(d.every(g=>g.type==0))if(l[p.id]=a.length<<1|1,so(b,d))a.push(i.facet(p));else{let g=p.combine(d.map(x=>x.value));a.push(i&&p.compare(g,i.facet(p))?i.facet(p):g)}else{for(let g of d)g.type==0?(l[g.id]=a.length<<1|1,a.push(g.value)):(l[g.id]=h.length<<1,h.push(x=>g.dynamicSlot(x)));l[p.id]=h.length<<1,h.push(g=>Zf(g,p,d))}}let u=h.map(f=>f(l));return new Rn(e,o,u,l,a,r)}}function ed(n,e,t){let i=[[],[],[],[],[]],s=new Map;function r(o,l){let a=s.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof cr&&t.delete(o.compartment)}if(s.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof cr){if(t.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=e.get(o.compartment)||o.inner;t.set(o.compartment,h),r(h,l)}else if(o instanceof ih)r(o.inner,o.prec);else if(o instanceof we)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof kn)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Et.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(n,Et.default),i.reduce((o,l)=>o.concat(l))}function Oi(n,e){if(e&1)return 2;let t=e>>1,i=n.status[t];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;n.status[t]=4;let s=n.computeSlot(n,n.config.dynamicSlots[t]);return n.status[t]=2|s}function Bn(n,e){return e&1?n.config.staticValues[e>>1]:n.values[e>>1]}const nh=B.define(),sh=B.define({combine:n=>n.some(e=>e),static:!0}),rh=B.define({combine:n=>n.length?n[0]:void 0,static:!0}),oh=B.define(),lh=B.define(),ah=B.define(),hh=B.define({combine:n=>n.length?n[0]:!1});class ft{constructor(e,t){this.type=e,this.value=t}static define(){return new td}}class td{of(e){return new ft(this,e)}}class id{constructor(e){this.map=e}of(e){return new W(this,e)}}class W{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new W(this.type,t)}is(e){return this.type==e}static define(e={}){return new id(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let i=[];for(let s of e){let r=s.map(t);r&&i.push(r)}return i}}W.reconfigure=W.define();W.appendConfig=W.define();class de{constructor(e,t,i,s,r,o){this.startState=e,this.changes=t,this.selection=i,this.effects=s,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&th(i,t.newLength),r.some(l=>l.type==de.time)||(this.annotations=r.concat(de.time.of(Date.now())))}static create(e,t,i,s,r,o){return new de(e,t,i,s,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(de.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}}de.time=ft.define();de.userEvent=ft.define();de.addToHistory=ft.define();de.remote=ft.define();function nd(n,e){let t=[];for(let i=0,s=0;;){let r,o;if(i<n.length&&(s==e.length||e[s]>=n[i]))r=n[i++],o=n[i++];else if(s<e.length)r=e[s++],o=e[s++];else return t;!t.length||t[t.length-1]<r?t.push(r,o):t[t.length-1]<o&&(t[t.length-1]=o)}}function ch(n,e,t){var i;let s,r,o;return t?(s=e.changes,r=fe.empty(e.changes.length),o=n.changes.compose(e.changes)):(s=e.changes.map(n.changes),r=n.changes.mapDesc(e.changes,!0),o=n.changes.compose(s)),{changes:o,selection:e.selection?e.selection.map(r):(i=n.selection)===null||i===void 0?void 0:i.map(s),effects:W.mapEffects(n.effects,s).concat(W.mapEffects(e.effects,r)),annotations:n.annotations.length?n.annotations.concat(e.annotations):e.annotations,scrollIntoView:n.scrollIntoView||e.scrollIntoView}}function ur(n,e,t){let i=e.selection,s=_t(e.annotations);return e.userEvent&&(s=s.concat(de.userEvent.of(e.userEvent))),{changes:e.changes instanceof fe?e.changes:fe.of(e.changes||[],t,n.facet(rh)),selection:i&&(i instanceof w?i:w.single(i.anchor,i.head)),effects:_t(e.effects),annotations:s,scrollIntoView:!!e.scrollIntoView}}function uh(n,e,t){let i=ur(n,e.length?e[0]:{},n.doc.length);e.length&&e[0].filter===!1&&(t=!1);for(let r=1;r<e.length;r++){e[r].filter===!1&&(t=!1);let o=!!e[r].sequential;i=ch(i,ur(n,e[r],o?i.changes.newLength:n.doc.length),o)}let s=de.create(n,i.changes,i.selection,i.effects,i.annotations,i.scrollIntoView);return rd(t?sd(s):s)}function sd(n){let e=n.startState,t=!0;for(let s of e.facet(oh)){let r=s(n);if(r===!1){t=!1;break}Array.isArray(r)&&(t=t===!0?r:nd(t,r))}if(t!==!0){let s,r;if(t===!1)r=n.changes.invertedDesc,s=fe.empty(e.doc.length);else{let o=n.changes.filter(t);s=o.changes,r=o.filtered.mapDesc(o.changes).invertedDesc}n=de.create(e,s,n.selection&&n.selection.map(r),W.mapEffects(n.effects,r),n.annotations,n.scrollIntoView)}let i=e.facet(lh);for(let s=i.length-1;s>=0;s--){let r=i[s](n);r instanceof de?n=r:Array.isArray(r)&&r.length==1&&r[0]instanceof de?n=r[0]:n=uh(e,_t(r),!1)}return n}function rd(n){let e=n.startState,t=e.facet(ah),i=n;for(let s=t.length-1;s>=0;s--){let r=t[s](n);r&&Object.keys(r).length&&(i=ch(i,ur(e,r,n.changes.newLength),!0))}return i==n?n:de.create(e,n.changes,n.selection,i.effects,i.annotations,i.scrollIntoView)}const od=[];function _t(n){return n==null?od:Array.isArray(n)?n:[n]}var ie=function(n){return n[n.Word=0]="Word",n[n.Space=1]="Space",n[n.Other=2]="Other",n}(ie||(ie={}));const ld=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let fr;try{fr=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function ad(n){if(fr)return fr.test(n);for(let e=0;e<n.length;e++){let t=n[e];if(/\w/.test(t)||t>""&&(t.toUpperCase()!=t.toLowerCase()||ld.test(t)))return!0}return!1}function hd(n){return e=>{if(!/\S/.test(e))return ie.Space;if(ad(e))return ie.Word;for(let t=0;t<n.length;t++)if(e.indexOf(n[t])>-1)return ie.Word;return ie.Other}}class ${constructor(e,t,i,s,r,o){this.config=e,this.doc=t,this.selection=i,this.values=s,this.status=e.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;l<this.config.dynamicSlots.length;l++)Oi(this,l<<1);this.computeSlot=null}field(e,t=!0){let i=this.config.address[e.id];if(i==null){if(t)throw new RangeError("Field is not present in this state");return}return Oi(this,i),Bn(this,i)}update(...e){return uh(this,e,!0)}applyTransaction(e){let t=this.config,{base:i,compartments:s}=t;for(let o of e.effects)o.is(us.reconfigure)?(t&&(s=new Map,t.compartments.forEach((l,a)=>s.set(a,l)),t=null),s.set(o.value.compartment,o.value.extension)):o.is(W.reconfigure)?(t=null,i=o.value):o.is(W.appendConfig)&&(t=null,i=_t(i).concat(o.value));let r;t?r=e.startState.values.slice():(t=Rn.resolve(i,s,this),r=new $(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(l,a)=>a.reconfigure(l,this),null).values),new $(t,e.newDoc,e.newSelection,r,(o,l)=>l.update(o,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:w.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,i=e(t.ranges[0]),s=this.changes(i.changes),r=[i.range],o=_t(i.effects);for(let l=1;l<t.ranges.length;l++){let a=e(t.ranges[l]),h=this.changes(a.changes),c=h.map(s);for(let f=0;f<l;f++)r[f]=r[f].map(c);let u=s.mapDesc(h,!0);r.push(a.range.map(u)),s=s.compose(c),o=W.mapEffects(o,c).concat(W.mapEffects(_t(a.effects),u))}return{changes:s,selection:w.create(r,t.mainIndex),effects:o}}changes(e=[]){return e instanceof fe?e:fe.of(e,this.doc.length,this.facet($.lineSeparator))}toText(e){return U.of(e.split(this.facet($.lineSeparator)||or))}sliceDoc(e=0,t=this.doc.length){return this.doc.sliceString(e,t,this.lineBreak)}facet(e){let t=this.config.address[e.id];return t==null?e.default:(Oi(this,t),Bn(this,t))}toJSON(e){let t={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(e)for(let i in e){let s=e[i];s instanceof we&&this.config.address[s.id]!=null&&(t[i]=s.spec.toJSON(this.field(e[i]),this))}return t}static fromJSON(e,t={},i){if(!e||typeof e.doc!="string")throw new RangeError("Invalid JSON representation for EditorState");let s=[];if(i){for(let r in i)if(Object.prototype.hasOwnProperty.call(e,r)){let o=i[r],l=e[r];s.push(o.init(a=>o.spec.fromJSON(l,a)))}}return $.create({doc:e.doc,selection:w.fromJSON(e.selection),extensions:t.extensions?s.concat([t.extensions]):s})}static create(e={}){let t=Rn.resolve(e.extensions||[],new Map),i=e.doc instanceof U?e.doc:U.of((e.doc||"").split(t.staticFacet($.lineSeparator)||or)),s=e.selection?e.selection instanceof w?e.selection:w.single(e.selection.anchor,e.selection.head):w.single(0);return th(s,i.length),t.staticFacet(sh)||(s=s.asSingle()),new $(t,i,s,t.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet($.tabSize)}get lineBreak(){return this.facet($.lineSeparator)||`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as w,i as B,f as L,at as O,X as U,au as x,ag as D,av as F,aw as J,j as t,ax as b,d as K,ay as $,az as z,aA as M,aB as q,h as G,aC as X}from"./index-
|
|
1
|
+
import{s as w,i as B,f as L,at as O,X as U,au as x,ag as D,av as F,aw as J,j as t,ax as b,d as K,ay as $,az as z,aA as M,aB as q,h as G,aC as X}from"./index-1c4c68c3.js";const Y="CREATE_PROJECT_BTN",H=w(B)(({theme:e})=>({marginLeft:e.spacing(3)})),ee=()=>{const{setToastData:e,setToastApiError:i}=L(),{refetchUser:d}=O(),{uiConfig:l}=U(),a=x(),{trackEvent:u}=D(),{projectId:o,projectName:j,projectMode:p,projectDesc:m,featureLimit:C,setProjectId:P,setProjectName:h,setProjectDesc:T,getProjectPayload:s,clearErrors:r,validateProjectId:c,validateName:f,setProjectStickiness:g,setFeatureLimit:E,setProjectMode:A,projectStickiness:n,errors:y}=F(),{createProject:_,loading:N}=J();return t(b,{loading:N,title:"Create project",description:"Projects allows you to group feature toggles together in the management UI.",documentationLink:"https://docs.getunleash.io/reference/projects",documentationLinkLabel:"Projects documentation",formatApiCode:()=>`curl --location --request POST '${l.unleashUrl}/api/admin/projects' \\
|
|
2
2
|
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
3
|
--header 'Content-Type: application/json' \\
|
|
4
4
|
--data-raw '${JSON.stringify(s(),void 0,2)}'`,children:K($,{errors:y,handleSubmit:async S=>{S.preventDefault(),r();const v=f(),k=await c();if(v&&k){const I=s();try{await _(I),d(),a(`/projects/${o}`),e({title:"Project created",text:"Now you can add toggles to this project",confetti:!0,type:"success"}),n!==q&&u("project_stickiness_set")}catch(R){i(G(R))}}},projectId:o,setProjectId:P,projectName:j,projectMode:p,projectStickiness:n,featureLimit:C,setProjectStickiness:g,setFeatureLimit:E,setProjectMode:A,setProjectName:h,projectDesc:m,setProjectDesc:T,mode:"Create",clearErrors:r,validateProjectId:c,children:[t(z,{name:"project",permission:M,"data-testid":Y}),t(H,{onClick:()=>{a(X)},children:"Cancel"})]})})};export{ee as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as r,j as o}from"./index-
|
|
1
|
+
import{c as r,j as o}from"./index-1c4c68c3.js";const a=r(o("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"}),"Error");export{a as E};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{c as oe,j as r,b as ie,aD as z,aV as X,d as T,b6 as W,C as _,E as Ce,T as O,c3 as Ee,s as V,fy as we,bc as Ae,fz as Z,au as J,X as ee,fA as xe,fB as ke,fC as Re,fD as Fe,bs as G,fE as De,i as Pe,fF as Oe,cd as $e,fG as N,r as E,aw as ce,f as I,fH as le,ag as ue,fI as de,ax as ge,aW as he,bm as Be,fJ as qe,h as $,dg as Le,aX as _e,aU as fe,aE as Q,aZ as pe,fK as Ve,fL as Ue,fM as je,fN as Ie,fO as ze,fP as We,a_ as ye,b7 as Ye,fQ as He,y as K,aI as se,B as Me,ae as Ge,bN as te,fR as Je,ef as Ke,fS as Ne,fT as Qe,fU as Xe,b9 as Ze,ba as et,bb as tt,A as me,l as be,bQ as at,m as st,o as nt,L as rt,fV as ot,n as it,u as ct,bL as lt,aP as ut,aN as dt,aO as gt}from"./index-1c4c68c3.js";const ht=oe(r("path",{d:"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"}),"Cloud"),It=oe(r("path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z"}),"WatchLater"),zt=({enabled:e,className:a})=>{const t=ie(),o=e?"Environment enabled":"Environment disabled",s={backgroundColor:e?t.palette.primary.light:t.palette.neutral.border,borderRadius:"50%",width:"28px",height:"28px",minWidth:"28px",display:"flex",alignItems:"center",justifyContent:"center",marginRight:t.spacing(1)},n={fill:t.palette.common.white,width:"16px",height:"16px"};return r("div",{style:s,className:a,children:r(ht,{style:n,titleAccess:o})})},ft=({isOpen:e,onConfirm:a,onClose:t,showBanner:o,environment:s,messageComponent:n})=>{const i=z("projectId"),{data:u}=X(i),{changeRequestInReviewOrApproved:f,alert:g}=Ee(u),l=f(s||"");return T(W,{open:e,primaryButtonText:l?"Add to existing change request":"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:a,onClose:t,title:"Request changes",fullWidth:!0,children:[r(_,{condition:l,show:g}),r(_,{condition:!!o,show:T(Ce,{severity:"info",sx:{mb:2},children:["Change requests feature is enabled for ",s,". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})}),r(O,{variant:"body2",color:"text.secondary",children:"Your suggestion:"}),n]})},pt=(e,a)=>{const t={};return a.parameters.forEach(o=>{t[o.name]=yt(e,o)}),{name:a.name,constraints:[],parameters:t}},yt=(e,a)=>a.name==="rollout"||a.name==="percentage"||a.type==="percentage"?"50":a.name==="stickiness"?"":a.name==="groupId"?e:a.type==="boolean"?"false":"",mt=V("form")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),ne=V("hr")(({theme:e})=>({width:"100%",height:"1px",margin:e.spacing(2,0),border:"none",background:e.palette.background.elevation2})),bt=V("div")(({theme:e})=>({display:"flex",justifyContent:"end",gap:e.spacing(2),paddingBottom:e.spacing(10)})),St=({projectId:e,environmentId:a,permission:t,onSubmit:o,onCancel:s,loading:n,strategy:i,setStrategy:u,segments:f,setSegments:g,errors:l})=>{const S=we(i.constraints),c=Ae(t,e,a),{strategyDefinition:d}=Z(i==null?void 0:i.name),y=J(),{uiConfig:h,error:v,loading:x}=ee();if(v)throw v;if(x||!d)return null;const D=p=>d.parameters.find(C=>C.name===p),w=(p,C)=>{const A=D(p);if(p!=="groupId"){const k=Oe(A,C);return k?(l.setFormError(p,k),!1):(l.removeFormError(p),!0)}return!0},m=()=>d.parameters.map(p=>p.name).map(p=>{var C;return w(p,(C=i.parameters)==null?void 0:C[p])}).every(Boolean),B=()=>{y(`/projects/${e}/settings/default-strategy`)};return T(mt,{onSubmit:async p=>{if(p.preventDefault(),m())o();else return},children:[r(xe,{title:i.title||"",setTitle:p=>{u(C=>({...C,title:p}))}}),r(_,{condition:!!h.flags.SE,show:r(ke,{segments:f,setSegments:g,projectId:e})}),r(Re,{projectId:e,environmentId:a,strategy:i,setStrategy:u}),r(ne,{}),r(Fe,{strategy:i,strategyDefinition:d,setStrategy:u,validateParameter:w,errors:l,hasAccess:c}),r(ne,{}),T(bt,{children:[r(G,{permission:t,projectId:e,environmentId:a,variant:"contained",color:"primary",type:"submit",disabled:n||!S||l.hasFormErrors(),"data-testid":De,children:"Save strategy"}),r(Pe,{type:"button",color:"primary",onClick:s||B,disabled:n,children:"Cancel"})]})]})},Se=(e,a)=>{var i;const{project:t,refetch:o}=$e(e),s={name:"flexibleRollout",constraints:[],parameters:{rollout:"100",stickiness:t.defaultStickiness,groupId:""}},n=(i=t.environments.find(u=>u.environment===a))==null?void 0:i.defaultStrategy;return{defaultStrategyFallback:s,strategy:n,refetch:o}},Wt=()=>{const e=z("projectId"),a=N("environmentId"),{defaultStrategyFallback:t,strategy:o,refetch:s}=Se(e,a),[n,i]=E.useState(o||t),[u,f]=E.useState([]),{updateDefaultStrategy:g,loading:l}=ce(),{strategyDefinition:S}=Z(n==null?void 0:n.name),{setToastData:c,setToastApiError:d}=I(),y=le(),{uiConfig:h}=ee(),{unleashUrl:v}=h,x=J(),{trackEvent:D}=ue(),{segments:w,refetchSegments:m}=de();E.useEffect(()=>{if(w&&(o!=null&&o.segments)){const A=[];for(const k of o==null?void 0:o.segments)A.push(...w.filter(U=>U.id===k));f(A)}},[JSON.stringify(w),JSON.stringify(o==null?void 0:o.segments)]);const B=h!=null&&h.flags.SE?u:[],F=vt(n,B),p=async A=>{await g(e,a,A),D("default_strategy",{props:{action:"edit",hasTitle:!!A.title}}),await m(),c({title:"Default Strategy updated",type:"success",confetti:!0})},C=async()=>{const A=`/projects/${e}/settings/default-strategy`;try{await p(F),await s(),x(A)}catch(k){d($(k))}};return!S||!n?null:r(ge,{modal:!0,title:he((n==null?void 0:n.name)??""),description:Ct,documentationLink:Et,documentationLinkLabel:wt,formatApiCode:()=>Tt(e,a,F,S,v),children:r(St,{projectId:e,strategy:n,setStrategy:i,segments:u,setSegments:f,environmentId:a,onSubmit:C,loading:l,permission:Be,errors:y,isChangeRequest:!1})})},vt=(e,a)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},segments:a.map(t=>t.id),disabled:e.disabled??!1}),Tt=(e,a,t,o,s)=>{if(!s)return"";const n={...t,parameters:qe(t.parameters??{},o)},i=`${s}/api/admin/projects/${e}/environments/${a}/default-strategy}`,u=JSON.stringify(n,void 0,2);return`curl --location --request PUT '${i}' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${u}'`},Ct=`
|
|
5
|
+
An activation strategy will only run when a feature toggle is enabled and provides a way to control who will get access to the feature.
|
|
6
|
+
If any of a feature toggle's activation strategies returns true, the user will get access.
|
|
7
|
+
`,Et="https://docs.getunleash.io/reference/activation-strategies",wt="Default strategy documentation",Yt=()=>{const e=z("projectId"),a=z("featureId"),t=N("environmentId"),o=N("strategyName"),{strategy:s,defaultStrategyFallback:n}=Se(e,t),i=JSON.parse(Le().get("defaultStrategy")||"false"),{segments:u}=de(),f=(u||[]).filter(R=>{var L;return(L=s==null?void 0:s.segments)==null?void 0:L.includes(R.id)}),[g,l]=E.useState({}),[S,c]=E.useState(i?f:[]),{strategyDefinition:d}=Z(o),y=le(),{addStrategyToFeature:h,loading:v}=_e(),{addChange:x}=fe(),{setToastData:D,setToastApiError:w}=I(),{uiConfig:m}=ee(),{unleashUrl:B}=m,F=J(),{feature:p,refetchFeature:C}=Q(e,a),A=E.useRef(p),{isChangeRequestConfigured:k}=pe(e),{refetch:U}=X(e),{trackEvent:Y}=ue(),{data:j,staleDataNotification:b,forceRefreshCache:P}=Ve({unleashGetter:Q,params:[e,a],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},p,{afterSubmitAction:C},He);E.useEffect(()=>{A.current.name===""&&p.name&&(P(p),A.current=p)},[p.name]),E.useEffect(()=>{var R;if(i){const L=s||n;((R=L.parameters)==null?void 0:R.groupId)===""&&a?l({...L,parameters:{...L.parameters,groupId:a}}):l(L)}else d&&l(pt(a,d))},[a,JSON.stringify(d),i]);const H=async R=>{await h(e,a,t,R),D({title:"Strategy created",type:"success",confetti:!0})},M=async R=>{await x(e,t,{action:"addStrategy",feature:a,payload:R}),D({title:"Strategy added to draft",type:"success",confetti:!0}),U()},q=Ue(g,S),Te=async()=>{Y("strategyTitle",{props:{hasTitle:!!g.title,on:"create"}});try{k(t)?await M(q):await H(q),C(),F(Ye(e,a))}catch(R){w($(R))}};return!j||!j.project?null:T(ge,{modal:!0,title:he(o),description:je,documentationLink:Ie,documentationLinkLabel:ze,formatApiCode:()=>xt(e,a,t,q,B),children:[r(We,{projectId:e,feature:j,strategy:g,setStrategy:l,segments:S,setSegments:c,environmentId:t,onSubmit:Te,loading:v,permission:ye,errors:y,isChangeRequest:k(t)}),b]})},At=(e,a,t,o,s=!1)=>{const n=new URLSearchParams({environmentId:t,strategyName:o,defaultStrategy:String(s)});return`/projects/${e}/features/${a}/strategies/create?${n}`},xt=(e,a,t,o,s)=>{if(!s)return"";const n=`${s}/api/admin/projects/${e}/features/${a}/environments/${t}/strategies`,i=JSON.stringify(o,void 0,2);return`curl --location --request POST '${n}' \\
|
|
8
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
9
|
+
--header 'Content-Type: application/json' \\
|
|
10
|
+
--data-raw '${i}'`},re=V("p")(({theme:e})=>({marginBottom:e.spacing(.5),fontSize:e.fontSizes.bodySize})),Ht=({open:e,environmentName:a,featureId:t,projectId:o,onClose:s})=>{const n=J(),i=At(o,t,a,"default");return T(W,{open:e,maxWidth:"sm",onClose:()=>s(),title:"You need to add a strategy to your toggle",primaryButtonText:"Take me directly to add strategy",permissionButton:r(G,{type:"button",permission:ye,projectId:o,environmentId:a,onClick:()=>{s(),n(i)},children:"Take me directly to add strategy"}),secondaryButtonText:"Cancel",children:[r(re,{children:"Before you can enable the toggle in the environment, you need to add an activation strategy."}),r(re,{children:"You can add the activation strategy by selecting the toggle, open the environment accordion and add the activation strategy."})]})},kt="You can not enable the environment before it has strategies",Rt=e=>{const{setToastData:a,setToastApiError:t}=I(),{addChange:o}=fe(),{refetch:s}=X(e),[n,i]=E.useState({isOpen:!1}),u=E.useCallback((l,S,c,d)=>{i({featureName:l,environment:S,enabled:c,shouldActivateDisabledStrategies:d,isOpen:!0})},[]),f=E.useCallback(()=>{i(l=>({...l,isOpen:!1}))},[]),g=E.useCallback(async()=>{try{await o(e,n.environment,{feature:n.featureName,action:"updateEnabled",payload:{enabled:!!n.enabled,shouldActivateDisabledStrategies:!!n.shouldActivateDisabledStrategies}}),s(),i(l=>({...l,isOpen:!1})),a({type:"success",title:"Changes added to the draft!"})}catch(l){t($(l)),i(S=>({...S,isOpen:!1}))}},[o]);return{onChangeRequestToggle:u,onChangeRequestToggleClose:f,onChangeRequestToggleConfirm:g,changeRequestDialogDetails:n}},Ft=({isOpen:e,onAddDefaultStrategy:a,onActivateDisabledStrategies:t,onClose:o,environment:s,disabledStrategiesCount:n=0})=>{const i=z("projectId");return T(W,{open:e,secondaryButtonText:"Cancel",permissionButton:T(K,{children:[r(G,{type:"button",permission:se,projectId:i,environmentId:s,onClick:a,children:"Add default strategy"}),r(G,{type:"button",variant:"text",permission:se,projectId:i,environmentId:s,onClick:t,children:"Enable all strategies"})]}),onClose:o,title:"Enable feature toggle",fullWidth:!0,children:[T(O,{variant:"body1",color:"text.primary",sx:{mb:u=>u.spacing(2)},children:["The feature toggle has ",n," disabled",n===1?" strategy":" strategies","."]}),r(O,{variant:"body1",color:"text.primary",children:"You can choose to enable all the disabled strategies or you can add the default strategy to enable this feature toggle."})]})},Dt=({enabled:e,featureName:a,environment:t})=>T(O,{"data-testid":"update-enabled-message",children:[r("strong",{children:e?"Enable":"Disable"})," feature toggle"," ",r("strong",{children:a})," in ",r("strong",{children:t})]}),Pt=V(Me)(()=>({mx:"auto",...Ge})),Mt=({projectId:e,featureId:a,environmentName:t,value:o,onToggle:s,onError:n})=>{var j;const{toggleFeatureEnvironmentOn:i,toggleFeatureEnvironmentOff:u}=te(),{setToastData:f,setToastApiError:g}=I(),{isChangeRequestConfigured:l}=pe(e),{onChangeRequestToggle:S,onChangeRequestToggleClose:c,onChangeRequestToggleConfirm:d,changeRequestDialogDetails:y}=Rt(e),[h,v,x]=Je(o),[D,w]=E.useState(!1),{feature:m}=Q(e,a),B=((j=m==null?void 0:m.environments.find(b=>b.name===t))==null?void 0:j.strategies.filter(b=>b.disabled).length)??0,F=async(b=!1)=>{try{v(!h),await i(e,m.name,t,b),f({type:"success",title:`Available in ${t}`,text:`${m.name} is now available in ${t} based on its defined strategies.`}),s==null||s(e,m.name,t,!h)}catch(P){P instanceof Error&&P.message===kt?n==null||n():g($(P)),x()}},p=async()=>{try{v(!h),await u(e,m.name,t),f({type:"success",title:`Unavailable in ${t}`,text:`${m.name} is unavailable in ${t} and its strategies will no longer have any effect.`}),s==null||s(e,m.name,t,!h)}catch(b){g($(b)),x()}},C=async b=>{if(l(t)){b.preventDefault(),U()?w(!0):S(m.name,t,!h,!1);return}if(h){await p();return}U()?w(!0):await F()},A=async()=>{l(t)?S(m.name,t,!h,!0):await F(!0),w(!1)},k=async()=>{l(t)?S(m.name,t,!h,!1):await F(),w(!1)},U=()=>{var P,H,M;const b=(P=m==null?void 0:m.environments)==null?void 0:P.find(q=>q.name===t);return(b==null?void 0:b.strategies)&&((H=b==null?void 0:b.strategies)==null?void 0:H.length)>0&&((M=b==null?void 0:b.strategies)==null?void 0:M.every(q=>q.disabled))},Y=`${m.name}-${t}`;return T(K,{children:[r(Pt,{"data-testid":`TOGGLE-${Y}`,children:r(Ke,{tooltip:h?`Disable feature in ${t}`:`Enable feature in ${t}`,checked:h,environmentId:t,projectId:e,permission:Ne,inputProps:{"aria-label":t},onClick:C})},Y),r(Ft,{isOpen:D,onClose:()=>w(!1),environment:t,disabledStrategiesCount:B,onActivateDisabledStrategies:A,onAddDefaultStrategy:k}),r(ft,{isOpen:y.isOpen,onClose:c,environment:y==null?void 0:y.environment,onConfirm:d,messageComponent:r(Dt,{enabled:y==null?void 0:y.enabled,featureName:y==null?void 0:y.featureName,environment:y.environment})})]})},Ot=V(Qe)(({theme:e})=>({color:e.palette.warning.main,fontSize:e.fontSizes.bodySize})),Gt=()=>r(Xe,{arrow:!0,title:T(K,{children:["This environment has no variants enabled. If you check this feature's variants in this environment, you will get the"," ",r("a",{href:"https://docs.getunleash.io/reference/feature-toggle-variants#the-disabled-variant",target:"_blank",rel:"noreferrer",children:"disabled variant"}),"."]}),children:r(Ot,{})});var ae={},$t=et;Object.defineProperty(ae,"__esModule",{value:!0});var ve=ae.default=void 0,Bt=$t(Ze()),qt=tt,Lt=(0,Bt.default)((0,qt.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");ve=ae.default=Lt;const _t=ot(),Jt=({options:e,selectedOptions:a,indeterminateOptions:t,tagType:o,existingTags:s,disabled:n=!1,onChange:i})=>{const u=r(it,{fontSize:"small"});return r(me,{multiple:!0,id:"checkboxes-tag",sx:{marginTop:c=>c.spacing(2),width:500},disableCloseOnSelect:!0,placeholder:"Select Values",options:e,value:a,renderTags:(c,d)=>c.map((y,h)=>s.some(x=>x.value===y.title&&x.type===o.name)&&t===void 0?null:r(rt,{...d({index:h}),label:y.title})),isOptionEqualToValue:(c,d)=>d.inputValue&&d.inputValue!==""?c.title===d.inputValue:c.title===d.title,getOptionLabel:c=>c.inputValue?c.inputValue:c.title,renderOption:(c,d,{selected:y})=>{const h=(t==null?void 0:t.some(v=>v.title===d.title))??!1;return T("li",{...c,children:[r(_,{condition:!!d.inputValue,show:r(at,{sx:{mr:v=>v.spacing(.5)}}),elseShow:r(st,{icon:u,checkedIcon:r(nt,{fontSize:"small"}),indeterminateIcon:r(ve,{fontSize:"small"}),sx:{mr:v=>v.spacing(.5)},checked:y&&!h,indeterminate:h})}),d.title]})},filterOptions:(c,d)=>{const y=_t(c,d),{inputValue:h}=d,v=c.some(x=>h===x.title);return h!==""&&!v&&y.push({inputValue:h,title:`Create new value "${h}"`}),y},ListboxProps:{style:{maxHeight:200,overflow:"auto"}},onChange:i,renderInput:c=>r(be,{...c,label:"Select values",placeholder:"Select values"}),disabled:n})},Vt=V("li")({flexDirection:"column"}),Kt=({options:e,value:a,disabled:t=!1,onChange:o})=>{const s=ie();return r(me,{disablePortal:!0,disabled:t,id:"tag-type-select",sx:{marginTop:n=>n.spacing(2),width:500},options:e,disableClearable:!0,value:a,getOptionLabel:n=>n.name,renderOption:(n,i)=>T(Vt,{...n,style:{alignItems:"flex-start",gap:s.spacing(.5)},children:[r(O,{variant:"body1",children:i.name}),r(O,{variant:"caption",children:i.description})]}),renderInput:n=>r(be,{...n,label:"Tag type",value:a}),onChange:o,ListboxProps:{style:{maxHeight:200,overflow:"auto"}}})},Nt=()=>{const{makeRequest:e,createRequest:a,errors:t,loading:o}=ct({propagateErrors:!0});return{createTag:async i=>{const f=a("api/admin/tags",{method:"POST",body:JSON.stringify(i)});try{return await e(f.caller,f.id)}catch(g){throw g}},bulkUpdateTags:async(i,u)=>{const f=`api/admin/projects/${u}/tags`,g=a(f,{method:"PUT",body:JSON.stringify(i)});try{return await e(g.caller,g.id)}catch(l){throw l}},errors:t,loading:o}},Qt=(e,a={})=>{const t=async()=>{const g=dt(`api/admin/tags/${e}`);return(await fetch(g,{method:"GET"}).then(gt("Tags"))).json()},o=`api/admin/tags/${e}`,{data:s,error:n}=lt(!!e,{tags:[]},o,t,a),[i,u]=E.useState(!n&&!s),f=()=>{ut(o)};return E.useEffect(()=>{u(!n&&!s)},[s,n]),{tags:(s==null?void 0:s.tags)||[],error:n,loading:i,refetch:f}},Xt=({isStale:e,isOpen:a,projectId:t,featureId:o,onClose:s})=>{const{setToastData:n,setToastApiError:i}=I(),{patchFeatureToggle:u}=te(),f=r(O,{children:"Setting a toggle to stale marks it for cleanup"}),g=r(O,{children:"Setting a toggle to active marks it as in active use"}),l=e?"active":"stale",S=async c=>{c.stopPropagation();try{await u(t,o,[{op:"replace",path:"/stale",value:!e}]),s()}catch(d){i($(d))}n(e?{type:"success",title:"And we're back!",text:"The toggle is no longer marked as stale."}:{type:"success",title:"A job well done.",text:"The toggle has been marked as stale."})};return r(W,{open:a,secondaryButtonText:"Cancel",primaryButtonText:`Flip to ${l}`,title:`Set feature state to ${l}`,onClick:S,onClose:s,children:r(_,{condition:e,show:g,elseShow:f})})},Zt=({isOpen:e,onClose:a,onConfirm:t,projectId:o,featureIds:s})=>{const{archiveFeatureToggle:n}=te(),{archiveFeatures:i}=ce(),{setToastData:u,setToastApiError:f}=I(),g=(s==null?void 0:s.length)>1;return r(W,{onClick:g?async()=>{try{await i(o,s),u({text:"Selected feature toggles have been archived",type:"success",title:"Feature toggles archived"}),t(),a()}catch(c){f($(c)),a()}}:async()=>{try{await n(o,s[0]),u({text:"Your feature toggle has been archived",type:"success",title:"Feature archived"}),t(),a()}catch(c){f($(c)),a()}},open:e,onClose:a,primaryButtonText:g?"Archive toggles":"Archive toggle",secondaryButtonText:"Cancel",title:g?"Archive feature toggles":"Archive feature toggle",children:r(_,{condition:g,show:T(K,{children:[T("p",{children:["Are you sure you want to archive"," ",r("strong",{children:s==null?void 0:s.length})," feature toggles?"]}),r(_,{condition:(s==null?void 0:s.length)<=5,show:r("ul",{children:s==null?void 0:s.map(c=>r("li",{children:c},c))})})]}),elseShow:r("p",{children:"Are you sure you want to archive these feature toggles?"})})})};export{ft as C,zt as E,Mt as F,Kt as T,Dt as U,Gt as V,It as W,Ht as a,Qt as b,Jt as c,Yt as d,Zt as e,At as f,Xt as g,Rt as h,Wt as i,Nt as u};
|
package/frontend/build/static/{FeatureMetricsChart-839cdf1e.js → FeatureMetricsChart-81da0ce4.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{f$ as c,b as m,bF as g,r as d,j as u}from"./index-
|
|
1
|
+
import{f$ as c,b as m,bF as g,r as d,j as u}from"./index-1c4c68c3.js";import{d as b,L as x,C as f,a as C,b as v,P as S,c as h,T as q,p as k,e as M,f as $}from"./chartjs-adapter-date-fns.esm-799be047.js";import"./index-88f1c682.js";import"./index-aa638b65.js";const L=(e,s,n)=>{const a={label:"Total requests",borderColor:e.palette.primary.main,backgroundColor:e.palette.primary.main,data:p(s,n,o=>o.yes+o.no),elements:{point:{radius:6,pointStyle:"circle"},line:{borderDash:[8,4]}}},t={label:"Exposed",borderColor:e.palette.success.main,backgroundColor:e.palette.success.main,data:p(s,n,o=>o.yes),elements:{point:{radius:6,pointStyle:"triangle"}}},r={label:"Not exposed",borderColor:e.palette.error.main,backgroundColor:e.palette.error.main,data:p(s,n,o=>o.no),elements:{point:{radius:6,pointStyle:"triangle",pointRotation:180}}};return{datasets:[t,r,a]}},p=(e,s,n)=>e.map(a=>({x:a.timestamp,y:n(a),variants:a.variants})),E=(e,s)=>{if(s===0)return"";const[n,a]=e,t=Math.floor(Number(a)/s*100);return`${a} (${t}%) - ${n}`},P=(e,s,n,a)=>({locale:a.locale,responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},color:e.palette.text.secondary,plugins:{tooltip:{backgroundColor:e.palette.background.paper,bodyColor:e.palette.text.primary,titleColor:e.palette.text.secondary,borderColor:e.palette.primary.main,borderWidth:1,padding:10,boxPadding:5,usePointStyle:!0,itemSort:(t,r)=>{const o=["Total requests","Exposed","Not exposed"],l=o.indexOf(t.dataset.label),i=o.indexOf(r.dataset.label);return l-i},callbacks:{label:t=>`${t.formattedValue} - ${t.dataset.label}`,afterLabel:t=>{const r=t.dataset.data[t.dataIndex];if(t.dataset.label!=="Exposed"||r.variants===void 0)return"";const{disabled:o,...l}=r.variants;return Object.entries(l).map(i=>E(i,r.y)).join(`
|
|
2
2
|
`)},title:t=>`Time: ${c(t[0].parsed.x,a.locale)}`}},legend:{position:"top",align:"end",labels:{boxWidth:10,boxHeight:10,usePointStyle:!0}},title:{text:T(n),position:"top",align:"start",display:!0,font:{size:16,weight:"400"},color:e.palette.text.primary}},scales:{y:{type:"linear",title:{display:!0,text:"Number of requests",color:e.palette.text.secondary},suggestedMin:0,ticks:{precision:0,color:e.palette.text.secondary},grid:{color:e.palette.divider,borderColor:e.palette.divider}},x:{type:"time",time:{unit:"hour"},grid:{display:!1},ticks:{callback:(t,r,o)=>c(o[r].value,a.locale),color:e.palette.text.secondary}}}}),T=e=>e===1?"Requests in the last hour":`Requests in the last ${e} hours`;b.font={...b.font,family:"Sen",size:13,weight:"400"};const _=({metrics:e,hoursBack:s,statsSectionId:n})=>{const a=m(),{locationSettings:t}=g(),r=d.useMemo(()=>[...e].sort((i,y)=>i.timestamp.localeCompare(y.timestamp)),[e]),o=d.useMemo(()=>P(a,r,s,t),[a,r,s,t]),l=d.useMemo(()=>L(a,r,t),[a,r,t]);return u("div",{style:{height:400},children:u(x,{options:o,data:l,"aria-label":"A feature metrics line chart, with three lines: all requests, positive requests, and negative requests.","aria-describedby":n})})};f.register(C,v,S,h,q,k,M,$);export{_ as FeatureMetricsChart,_ as default};
|