1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-24 01:18:01 +02:00

task: upgraded semver dependency (and biome) (#7272)

Sorry for the extra noise here, but this seems to be the biome upgrade
altering formatting slightly.
This commit is contained in:
Christopher Kolstad 2024-06-04 15:01:43 +02:00 committed by GitHub
parent 9cb015a7db
commit 0db5bc193f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 872 additions and 897 deletions

View File

@ -1,5 +1,5 @@
{ {
"$schema": "https://biomejs.dev/schemas/1.6.1/schema.json", "$schema": "https://biomejs.dev/schemas/1.8.0/schema.json",
"linter": { "linter": {
"enabled": true, "enabled": true,
"rules": { "rules": {
@ -7,7 +7,8 @@
"correctness": { "correctness": {
"noUnsafeOptionalChaining": "off", "noUnsafeOptionalChaining": "off",
"useExhaustiveDependencies": "off", "useExhaustiveDependencies": "off",
"noUnusedImports": "warn" "noUnusedImports": "warn",
"useJsxKeyInIterable": "off"
}, },
"complexity": { "complexity": {
"noBannedTypes": "off", "noBannedTypes": "off",
@ -31,7 +32,8 @@
"noPrototypeBuiltins": "off", "noPrototypeBuiltins": "off",
"noConfusingVoidType": "off", "noConfusingVoidType": "off",
"noArrayIndexKey": "off", "noArrayIndexKey": "off",
"noThenProperty": "off" "noThenProperty": "off",
"noExportsInTest": "off"
}, },
"performance": { "performance": {
"noAccumulatingSpread": "off", "noAccumulatingSpread": "off",

View File

@ -3131,7 +3131,7 @@ saxes@^6.0.0:
dependencies: dependencies:
xmlchars "^2.2.0" xmlchars "^2.2.0"
semver@^5.3.0, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: semver@^5.3.0, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2:
version "7.6.0" version "7.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
@ -3695,7 +3695,7 @@ unleash-client@5.5.3:
semver "^7.5.3" semver "^7.5.3"
"unleash-server@file:../build": "unleash-server@file:../build":
version "5.12.5" version "5.12.7"
dependencies: dependencies:
"@slack/web-api" "^6.10.0" "@slack/web-api" "^6.10.0"
"@wesleytodd/openapi" "^0.3.0" "@wesleytodd/openapi" "^0.3.0"
@ -3750,7 +3750,7 @@ unleash-client@5.5.3:
prom-client "^14.0.0" prom-client "^14.0.0"
response-time "^2.3.2" response-time "^2.3.2"
sanitize-filename "^1.6.3" sanitize-filename "^1.6.3"
semver "^7.5.4" semver "^7.6.2"
serve-favicon "^2.5.0" serve-favicon "^2.5.0"
slug "^9.0.0" slug "^9.0.0"
stoppable "^1.1.0" stoppable "^1.1.0"

View File

@ -34,7 +34,7 @@
"gen:api:clean": "yarn gen:api && rm -rf src/openapi/apis && sed -i.bak '1q' src/openapi/index.ts && rm src/openapi/index.ts.bak" "gen:api:clean": "yarn gen:api && rm -rf src/openapi/apis && sed -i.bak '1q' src/openapi/index.ts && rm src/openapi/index.ts.bak"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "1.6.4", "@biomejs/biome": "1.8.0",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@emotion/react": "11.11.4", "@emotion/react": "11.11.4",
"@emotion/styled": "11.11.5", "@emotion/styled": "11.11.5",

View File

@ -15,30 +15,31 @@ interface IServiceAccountsActionsCellProps {
onDelete: (event: React.SyntheticEvent) => void; onDelete: (event: React.SyntheticEvent) => void;
} }
export const ServiceAccountsActionsCell: VFC<IServiceAccountsActionsCellProps> = export const ServiceAccountsActionsCell: VFC<
({ onEdit, onDelete }) => { IServiceAccountsActionsCellProps
return ( > = ({ onEdit, onDelete }) => {
<StyledBox> return (
<PermissionIconButton <StyledBox>
data-loading <PermissionIconButton
onClick={onEdit} data-loading
permission={ADMIN} onClick={onEdit}
tooltipProps={{ permission={ADMIN}
title: 'Edit service account', tooltipProps={{
}} title: 'Edit service account',
> }}
<Edit /> >
</PermissionIconButton> <Edit />
<PermissionIconButton </PermissionIconButton>
data-loading <PermissionIconButton
onClick={onDelete} data-loading
permission={ADMIN} onClick={onDelete}
tooltipProps={{ permission={ADMIN}
title: 'Remove service account', tooltipProps={{
}} title: 'Remove service account',
> }}
<Delete /> >
</PermissionIconButton> <Delete />
</StyledBox> </PermissionIconButton>
); </StyledBox>
}; );
};

View File

@ -73,37 +73,38 @@ const resolveIconColors = (state: ChangeRequestState, theme: Theme) => {
}; };
}; };
export const ChangeRequestReviewStatus: FC<ISuggestChangeReviewsStatusProps> = export const ChangeRequestReviewStatus: FC<
({ changeRequest, onEditClick }) => { ISuggestChangeReviewsStatusProps
const theme = useTheme(); > = ({ changeRequest, onEditClick }) => {
return ( const theme = useTheme();
<StyledOuterContainer> return (
<StyledButtonContainer <StyledOuterContainer>
{...resolveIconColors(changeRequest.state, theme)} <StyledButtonContainer
> {...resolveIconColors(changeRequest.state, theme)}
<ChangesAppliedIcon >
style={{ <ChangesAppliedIcon
transform: `scale(1.5)`, style={{
}} transform: `scale(1.5)`,
/>
</StyledButtonContainer>
<StyledReviewStatusContainer
sx={{
backgroundColor:
changeRequest.state === 'In review'
? theme.palette.warning.light
: 'initial',
}} }}
border={resolveBorder(changeRequest.state, theme)} />
> </StyledButtonContainer>
<ResolveComponent <StyledReviewStatusContainer
changeRequest={changeRequest} sx={{
onEditClick={onEditClick} backgroundColor:
/> changeRequest.state === 'In review'
</StyledReviewStatusContainer> ? theme.palette.warning.light
</StyledOuterContainer> : 'initial',
); }}
}; border={resolveBorder(changeRequest.state, theme)}
>
<ResolveComponent
changeRequest={changeRequest}
onEditClick={onEditClick}
/>
</StyledReviewStatusContainer>
</StyledOuterContainer>
);
};
interface IResolveComponentProps { interface IResolveComponentProps {
changeRequest: ChangeRequestType; changeRequest: ChangeRequestType;

View File

@ -25,84 +25,82 @@ const StyledContainer = styled(Box)(({ theme }) => ({
gap: theme.spacing(2), gap: theme.spacing(2),
})); }));
export const ScheduleChangeRequestDialog: FC<ScheduleChangeRequestDialogProps> = export const ScheduleChangeRequestDialog: FC<
({ ScheduleChangeRequestDialogProps
open, > = ({
onConfirm, open,
onClose, onConfirm,
title, onClose,
primaryButtonText, title,
projectId, primaryButtonText,
environment, projectId,
disabled, environment,
scheduledAt, disabled,
}) => { scheduledAt,
const [selectedDate, setSelectedDate] = useState( }) => {
scheduledAt ? new Date(scheduledAt) : new Date(), const [selectedDate, setSelectedDate] = useState(
); scheduledAt ? new Date(scheduledAt) : new Date(),
const [error, setError] = useState<string | undefined>(undefined); );
const [error, setError] = useState<string | undefined>(undefined);
const timezone = getBrowserTimezone(); const timezone = getBrowserTimezone();
return ( return (
<Dialogue <Dialogue
title={title} title={title}
primaryButtonText={primaryButtonText} primaryButtonText={primaryButtonText}
disabledPrimaryButton={disabled} disabledPrimaryButton={disabled}
secondaryButtonText='Cancel' secondaryButtonText='Cancel'
open={open} open={open}
onClose={() => onClose()} onClose={() => onClose()}
onClick={() => onConfirm(selectedDate)} onClick={() => onConfirm(selectedDate)}
permissionButton={ permissionButton={
<PermissionButton <PermissionButton
variant='contained' variant='contained'
onClick={() => onConfirm(selectedDate)} onClick={() => onConfirm(selectedDate)}
projectId={projectId} projectId={projectId}
permission={APPLY_CHANGE_REQUEST} permission={APPLY_CHANGE_REQUEST}
environmentId={environment} environmentId={environment}
disabled={disabled} disabled={disabled}
> >
{primaryButtonText} {primaryButtonText}
</PermissionButton> </PermissionButton>
} }
fullWidth fullWidth
>
<Alert severity={'info'} sx={{ mb: (theme) => theme.spacing(2) }}>
The time shown below is based on your browser's time zone.
</Alert>
<Typography
variant={'body1'}
sx={{ mb: (theme) => theme.spacing(4) }}
> >
<Alert Select the date and time when these changes should be applied.
severity={'info'} If you change your mind later, you can reschedule the changes or
sx={{ mb: (theme) => theme.spacing(2) }} apply them immediately.
> </Typography>
The time shown below is based on your browser's time zone. <StyledContainer>
</Alert> <DateTimePicker
<Typography label='Date'
variant={'body1'} value={selectedDate}
sx={{ mb: (theme) => theme.spacing(4) }} onChange={(date) => {
> setError(undefined);
Select the date and time when these changes should be if (date < new Date()) {
applied. If you change your mind later, you can reschedule setError(
the changes or apply them immediately. `The time you provided (${date.toLocaleString()}) is not valid because it's in the past. Please select a time in the future.`,
);
}
setSelectedDate(date);
}}
min={new Date()}
error={Boolean(error)}
errorText={error}
required
/>
<Typography variant={'body2'}>
Your browser's time zone is {timezone}
</Typography> </Typography>
<StyledContainer> </StyledContainer>
<DateTimePicker </Dialogue>
label='Date' );
value={selectedDate} };
onChange={(date) => {
setError(undefined);
if (date < new Date()) {
setError(
`The time you provided (${date.toLocaleString()}) is not valid because it's in the past. Please select a time in the future.`,
);
}
setSelectedDate(date);
}}
min={new Date()}
error={Boolean(error)}
errorText={error}
required
/>
<Typography variant={'body2'}>
Your browser's time zone is {timezone}
</Typography>
</StyledContainer>
</Dialogue>
);
};

View File

@ -44,41 +44,39 @@ const StyledRightButton = styled(Button)(({ theme }) => ({
minWidth: '125px', minWidth: '125px',
})); }));
export const ConstraintAccordionEditBody: React.FC<IConstraintAccordionBody> = export const ConstraintAccordionEditBody: React.FC<
({ localConstraint, children, triggerTransition, setAction, onSubmit }) => { IConstraintAccordionBody
return ( > = ({ localConstraint, children, triggerTransition, setAction, onSubmit }) => {
<> return (
<StyledInputContainer> <>
<ConditionallyRender <StyledInputContainer>
condition={oneOf( <ConditionallyRender
newOperators, condition={oneOf(newOperators, localConstraint.operator)}
localConstraint.operator, show={<OperatorUpgradeAlert />}
)} />
show={<OperatorUpgradeAlert />} {children}
/> </StyledInputContainer>
{children} <StyledButtonContainer>
</StyledInputContainer> <StyledInputButtonContainer>
<StyledButtonContainer> <StyledLeftButton
<StyledInputButtonContainer> type='button'
<StyledLeftButton onClick={onSubmit}
type='button' variant='outlined'
onClick={onSubmit} color='primary'
variant='outlined' data-testid='CONSTRAINT_SAVE_BUTTON'
color='primary' >
data-testid='CONSTRAINT_SAVE_BUTTON' Done
> </StyledLeftButton>
Done <StyledRightButton
</StyledLeftButton> onClick={() => {
<StyledRightButton setAction(CANCEL);
onClick={() => { triggerTransition();
setAction(CANCEL); }}
triggerTransition(); >
}} Cancel
> </StyledRightButton>
Cancel </StyledInputButtonContainer>
</StyledRightButton> </StyledButtonContainer>
</StyledInputButtonContainer> </>
</StyledButtonContainer> );
</> };
);
};

View File

@ -43,33 +43,31 @@ const StyledRightButton = styled(Button)(({ theme }) => ({
minWidth: '125px', minWidth: '125px',
})); }));
export const ConstraintAccordionEditBody: React.FC<IConstraintAccordionBody> = export const ConstraintAccordionEditBody: React.FC<
({ localConstraint, children, triggerTransition, setAction, onSubmit }) => { IConstraintAccordionBody
return ( > = ({ localConstraint, children, triggerTransition, setAction, onSubmit }) => {
<> return (
<StyledInputContainer> <>
<ConditionallyRender <StyledInputContainer>
condition={oneOf( <ConditionallyRender
newOperators, condition={oneOf(newOperators, localConstraint.operator)}
localConstraint.operator, show={<OperatorUpgradeAlert />}
)} />
show={<OperatorUpgradeAlert />} {children}
/> </StyledInputContainer>
{children} <StyledButtonContainer>
</StyledInputContainer> <StyledInputButtonContainer>
<StyledButtonContainer> <StyledLeftButton
<StyledInputButtonContainer> type='button'
<StyledLeftButton onClick={onSubmit}
type='button' variant='outlined'
onClick={onSubmit} color='primary'
variant='outlined' data-testid='CONSTRAINT_SAVE_BUTTON'
color='primary' >
data-testid='CONSTRAINT_SAVE_BUTTON' Done
> </StyledLeftButton>
Done </StyledInputButtonContainer>
</StyledLeftButton> </StyledButtonContainer>
</StyledInputButtonContainer> </>
</StyledButtonContainer> );
</> };
);
};

View File

@ -10,18 +10,19 @@ interface PermissionCheckboxMenuItemProps {
onClick: () => void; onClick: () => void;
} }
export const PermissionCheckboxMenuItem: FC<PermissionCheckboxMenuItemProps> = export const PermissionCheckboxMenuItem: FC<
({ permission, projectId, environment, checked, onClick, ...props }) => { PermissionCheckboxMenuItemProps
const hasPermissions = useHasProjectEnvironmentAccess( > = ({ permission, projectId, environment, checked, onClick, ...props }) => {
permission, const hasPermissions = useHasProjectEnvironmentAccess(
projectId, permission,
environment, projectId,
); environment,
);
return ( return (
<MenuItem disabled={!hasPermissions} onClick={onClick} {...props}> <MenuItem disabled={!hasPermissions} onClick={onClick} {...props}>
<Checkbox checked={checked} /> <Checkbox checked={checked} />
{environment} {environment}
</MenuItem> </MenuItem>
); );
}; };

View File

@ -26,9 +26,7 @@ export const FlagsProjectChart: VFC<IFlagsProjectChartProps> = ({
const data = useProjectChartData(projectFlagTrends); const data = useProjectChartData(projectFlagTrends);
const notEnoughData = useMemo( const notEnoughData = useMemo(
() => () => !isLoading && !data.datasets.some((d) => d.data.length > 1),
!isLoading &&
(data.datasets.some((d) => d.data.length > 1) ? false : true),
[data, isLoading], [data, isLoading],
); );

View File

@ -112,23 +112,17 @@ export const MetricsSummaryTooltip: VFC<{ tooltip: TooltipState | null }> = ({
/> />
<InfoLine <InfoLine
iconChar={'▣ '} iconChar={'▣ '}
title={`Total requests: ${( title={`Total requests: ${(point.value.totalRequests ?? 0).toLocaleString()}`}
point.value.totalRequests ?? 0
).toLocaleString()}`}
color={'info'} color={'info'}
/> />
<InfoLine <InfoLine
iconChar={'▲ '} iconChar={'▲ '}
title={`Exposed: ${( title={`Exposed: ${(point.value.totalYes ?? 0).toLocaleString()}`}
point.value.totalYes ?? 0
).toLocaleString()}`}
color={'success'} color={'success'}
/> />
<InfoLine <InfoLine
iconChar={'▼ '} iconChar={'▼ '}
title={`Not exposed: ${( title={`Not exposed: ${(point.value.totalNo ?? 0).toLocaleString()}`}
point.value.totalNo ?? 0
).toLocaleString()}`}
color={'error'} color={'error'}
/> />
<ConditionallyRender <ConditionallyRender

View File

@ -94,10 +94,7 @@ export const ProjectHealthChart: VFC<IProjectHealthChartProps> = ({
: projectsData; : projectsData;
const notEnoughData = useMemo( const notEnoughData = useMemo(
() => () =>
!isLoading && !isLoading && !projectsData.datasets.some((d) => d.data.length > 1),
(projectsData.datasets.some((d) => d.data.length > 1)
? false
: true),
[projectsData, isLoading], [projectsData, isLoading],
); );
const data = const data =

View File

@ -26,9 +26,7 @@ export const UsersPerProjectChart: VFC<IUsersPerProjectChartProps> = ({
const data = useProjectChartData(projectFlagTrends); const data = useProjectChartData(projectFlagTrends);
const notEnoughData = useMemo( const notEnoughData = useMemo(
() => () => !isLoading && !data.datasets.some((d) => d.data.length > 1),
!isLoading &&
(data.datasets.some((d) => d.data.length > 1) ? false : true),
[data, isLoading], [data, isLoading],
); );

View File

@ -46,13 +46,13 @@ export const usePlaceholderData = (
data: data:
type === 'rising' type === 'rising'
? [ ? [
3, 5, 15, 17, 25, 40, 47, 48, 55, 3, 5, 15, 17, 25, 40, 47, 48, 55,
65, 62, 72, 75, 73, 80, 65, 62, 72, 75, 73, 80,
] ]
: [ : [
54, 52, 53, 49, 54, 50, 47, 46, 54, 52, 53, 49, 54, 50, 47, 46, 51,
51, 51, 50, 51, 49, 49, 51, 51, 50, 51, 49, 49, 51,
], ],
borderColor: theme.palette.primary.light, borderColor: theme.palette.primary.light,
backgroundColor: fill backgroundColor: fill
? fillGradientPrimary ? fillGradientPrimary

View File

@ -18,29 +18,30 @@ interface ILoginHistorySuccessfulCellProps {
value: boolean; value: boolean;
} }
export const LoginHistorySuccessfulCell: VFC<ILoginHistorySuccessfulCellProps> = export const LoginHistorySuccessfulCell: VFC<
({ row, value }) => { ILoginHistorySuccessfulCellProps
const { searchQuery } = useSearchHighlightContext(); > = ({ row, value }) => {
const { searchQuery } = useSearchHighlightContext();
if (value)
return (
<StyledBox>
<Badge color='success'>True</Badge>
</StyledBox>
);
if (value)
return ( return (
<StyledBox> <StyledBox>
<HtmlTooltip <Badge color='success'>True</Badge>
arrow
title={
<Highlighter search={searchQuery}>
{row.original.failure_reason}
</Highlighter>
}
>
<Badge color='error'>False</Badge>
</HtmlTooltip>
</StyledBox> </StyledBox>
); );
};
return (
<StyledBox>
<HtmlTooltip
arrow
title={
<Highlighter search={searchQuery}>
{row.original.failure_reason}
</Highlighter>
}
>
<Badge color='error'>False</Badge>
</HtmlTooltip>
</StyledBox>
);
};

View File

@ -9,37 +9,36 @@ interface IPlaygroundGuidanceSectionProps {
sectionNumber: string; sectionNumber: string;
} }
export const PlaygroundGuidanceSection: VFC<IPlaygroundGuidanceSectionProps> = export const PlaygroundGuidanceSection: VFC<
({ headerText, bodyText, sectionNumber }) => { IPlaygroundGuidanceSectionProps
return ( > = ({ headerText, bodyText, sectionNumber }) => {
<Box return (
sx={{ <Box
display: 'flex', sx={{
alignItems: 'flex-start', display: 'flex',
mt: 2, alignItems: 'flex-start',
flexDirection: 'column', mt: 2,
}} flexDirection: 'column',
> }}
<Box sx={{ display: 'flex' }}> >
<Box> <Box sx={{ display: 'flex' }}>
<GuidanceIndicator>{sectionNumber}</GuidanceIndicator> <Box>
</Box> <GuidanceIndicator>{sectionNumber}</GuidanceIndicator>
<Box </Box>
sx={{ ml: 2, display: 'flex', flexDirection: 'column' }} <Box sx={{ ml: 2, display: 'flex', flexDirection: 'column' }}>
> <Typography variant='body1' sx={{ fontWeight: 'bold' }}>
<Typography variant='body1' sx={{ fontWeight: 'bold' }}> {headerText}
{headerText} </Typography>
</Typography> <ConditionallyRender
<ConditionallyRender condition={Boolean(bodyText)}
condition={Boolean(bodyText)} show={
show={ <Typography variant='body1' sx={{ mt: 1 }}>
<Typography variant='body1' sx={{ mt: 1 }}> {bodyText}
{bodyText} </Typography>
</Typography> }
} />
/>
</Box>
</Box> </Box>
</Box> </Box>
); </Box>
}; );
};

View File

@ -24,73 +24,69 @@ const StyledStrategyExecutionWrapper = styled('div')(({ theme }) => ({
padding: theme.spacing(0), padding: theme.spacing(0),
})); }));
export const DisabledStrategyExecution: VFC<IDisabledStrategyExecutionProps> = export const DisabledStrategyExecution: VFC<
({ strategyResult, input, percentageFill }) => { IDisabledStrategyExecutionProps
const { name, constraints, segments, parameters } = strategyResult; > = ({ strategyResult, input, percentageFill }) => {
const { name, constraints, segments, parameters } = strategyResult;
const hasSegments = Boolean(segments && segments.length > 0); const hasSegments = Boolean(segments && segments.length > 0);
const hasConstraints = Boolean(constraints && constraints?.length > 0); const hasConstraints = Boolean(constraints && constraints?.length > 0);
const hasExecutionParameters = const hasExecutionParameters =
name !== 'default' && name !== 'default' &&
Object.keys(formattedStrategyNames).includes(name); Object.keys(formattedStrategyNames).includes(name);
const hasCustomStrategyParameters = const hasCustomStrategyParameters =
Object.keys(parameters).length > 0 && Object.keys(parameters).length > 0 &&
strategyResult.result.evaluationStatus === 'incomplete'; // Use of custom strategy can be more explicit from the API strategyResult.result.evaluationStatus === 'incomplete'; // Use of custom strategy can be more explicit from the API
if (!parameters) { if (!parameters) {
return null; return null;
} }
const items = [ const items = [
hasSegments && ( hasSegments && <SegmentExecutionWithoutResult segments={segments} />,
<SegmentExecutionWithoutResult segments={segments} /> hasConstraints && (
), <ConstraintExecutionWithoutResults constraints={constraints} />
hasConstraints && ( ),
<ConstraintExecutionWithoutResults constraints={constraints} /> hasExecutionParameters && (
), <PlaygroundResultStrategyExecutionParameters
hasExecutionParameters && ( parameters={parameters}
<PlaygroundResultStrategyExecutionParameters constraints={constraints}
parameters={parameters} input={input}
constraints={constraints} disabled
input={input} />
disabled ),
/> hasCustomStrategyParameters && (
), <CustomStrategyParams strategyName={name} parameters={parameters} />
hasCustomStrategyParameters && ( ),
<CustomStrategyParams name === 'default' && (
strategyName={name} <StyledBoxSummary
parameters={parameters} sx={(theme) => ({
/> width: '100%',
), color: theme.palette.text.secondary,
name === 'default' && ( })}
<StyledBoxSummary >
sx={(theme) => ({ The standard strategy is <Badge color={'disabled'}>ON</Badge>{' '}
width: '100%', for all users.
color: theme.palette.text.secondary, </StyledBoxSummary>
})} ),
> ].filter(Boolean);
The standard strategy is{' '}
<Badge color={'disabled'}>ON</Badge> for all users.
</StyledBoxSummary>
),
].filter(Boolean);
return ( return (
<StyledStrategyExecutionWrapper> <StyledStrategyExecutionWrapper>
{items.map((item, index) => ( {items.map((item, index) => (
<Fragment key={index}> <Fragment key={index}>
<ConditionallyRender <ConditionallyRender
condition={ condition={
index > 0 && index > 0 &&
(strategyResult.name === 'flexibleRollout' (strategyResult.name === 'flexibleRollout'
? index < items.length ? index < items.length
: index < items.length - 1) : index < items.length - 1)
} }
show={<StrategySeparator text='AND' />} show={<StrategySeparator text='AND' />}
/> />
{item} {item}
</Fragment> </Fragment>
))} ))}
</StyledStrategyExecutionWrapper> </StyledStrategyExecutionWrapper>
); );
}; };

View File

@ -18,7 +18,7 @@ export const SingleSelectConfigButton: FC<SingleSelectConfigButtonProps> = ({
const handleChange = (value: any) => { const handleChange = (value: any) => {
onChange(value); onChange(value);
setAnchorEl(null); setAnchorEl(null);
props.onClose && props.onClose(); props.onClose?.();
setRecentlyClosed(true); setRecentlyClosed(true);
// this is a hack to prevent the button from being // this is a hack to prevent the button from being

View File

@ -117,232 +117,231 @@ const useFeatureNamePatternTracking = () => {
return { trackPattern, setPreviousPattern }; return { trackPattern, setPreviousPattern };
}; };
const ProjectEnterpriseSettingsForm: React.FC<IProjectEnterpriseSettingsForm> = const ProjectEnterpriseSettingsForm: React.FC<
({ IProjectEnterpriseSettingsForm
children, > = ({
handleSubmit, children,
projectId, handleSubmit,
projectMode, projectId,
featureNamingExample, projectMode,
featureNamingPattern, featureNamingExample,
featureNamingDescription, featureNamingPattern,
setFeatureNamingExample, featureNamingDescription,
setFeatureNamingPattern, setFeatureNamingExample,
setFeatureNamingDescription, setFeatureNamingPattern,
setProjectMode, setFeatureNamingDescription,
errors, setProjectMode,
errors,
}) => {
const { setPreviousPattern, trackPattern } =
useFeatureNamePatternTracking();
const projectModeOptions = [
{ key: 'open', label: 'open' },
{ key: 'protected', label: 'protected' },
{ key: 'private', label: 'private' },
];
useEffect(() => {
setPreviousPattern(featureNamingPattern || '');
}, [projectId]);
const updateNamingExampleError = ({
example,
pattern,
}: {
example: string;
pattern: string;
}) => { }) => {
const { setPreviousPattern, trackPattern } = const validationResult = validateFeatureNamingExample({
useFeatureNamePatternTracking();
const projectModeOptions = [
{ key: 'open', label: 'open' },
{ key: 'protected', label: 'protected' },
{ key: 'private', label: 'private' },
];
useEffect(() => {
setPreviousPattern(featureNamingPattern || '');
}, [projectId]);
const updateNamingExampleError = ({
example,
pattern, pattern,
}: { example,
example: string; featureNamingPatternError: errors.featureNamingPattern,
pattern: string; });
}) => {
const validationResult = validateFeatureNamingExample({
pattern,
example,
featureNamingPatternError: errors.featureNamingPattern,
});
switch (validationResult.state) { switch (validationResult.state) {
case 'invalid': case 'invalid':
errors.namingExample = validationResult.reason; errors.namingExample = validationResult.reason;
break; break;
case 'valid': case 'valid':
delete errors.namingExample; delete errors.namingExample;
break; break;
} }
};
const onSetFeatureNamingPattern = (regex: string) => {
const disallowedStrings = [
' ',
'\\t',
'\\s',
'\\n',
'\\r',
'\\f',
'\\v',
];
if (
disallowedStrings.some((blockedString) =>
regex.includes(blockedString),
)
) {
errors.featureNamingPattern =
'Whitespace is not allowed in the expression';
} else {
try {
new RegExp(regex);
delete errors.featureNamingPattern;
} catch (e) {
errors.featureNamingPattern = 'Invalid regular expression';
}
}
setFeatureNamingPattern?.(regex);
updateNamingExampleError({
pattern: regex,
example: featureNamingExample || '',
});
};
const onSetFeatureNamingExample = (example: string) => {
setFeatureNamingExample?.(example);
updateNamingExampleError({
pattern: featureNamingPattern || '',
example,
});
};
const onSetFeatureNamingDescription = (description: string) => {
setFeatureNamingDescription?.(description);
};
return (
<StyledForm
onSubmit={(submitEvent) => {
handleSubmit(submitEvent);
trackPattern(featureNamingPattern);
}}
>
<>
<Box
sx={{
display: 'flex',
alignItems: 'center',
marginBottom: 1,
gap: 1,
}}
>
<p>What is your project collaboration mode?</p>
<CollaborationModeTooltip />
</Box>
<StyledSelect
id='project-mode'
value={projectMode}
label='Project collaboration mode'
name='Project collaboration mode'
onChange={(e) => {
setProjectMode?.(e.target.value as ProjectMode);
}}
options={projectModeOptions}
/>
</>
<StyledFieldset>
<Box
sx={{
display: 'flex',
alignItems: 'center',
marginBottom: 1,
gap: 1,
}}
>
<legend>Feature flag naming pattern?</legend>
<FeatureFlagNamingTooltip />
</Box>
<StyledSubtitle>
<StyledPatternNamingExplanation id='pattern-naming-description'>
<p>
Define a{' '}
<a
href={`https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Cheatsheet`}
target='_blank'
rel='noreferrer'
>
JavaScript RegEx
</a>{' '}
used to enforce feature flag names within this
project. The regex will be surrounded by a
leading <code>^</code> and a trailing{' '}
<code>$</code>.
</p>
<p>
Leave it empty if you dont want to add a naming
pattern.
</p>
</StyledPatternNamingExplanation>
</StyledSubtitle>
<StyledFlagNamingContainer>
<StyledInput
label={'Naming Pattern'}
name='feature flag naming pattern'
aria-describedby='pattern-naming-description'
placeholder='[A-Za-z]+.[A-Za-z]+.[A-Za-z0-9-]+'
InputProps={{
startAdornment: (
<InputAdornment position='start'>
^
</InputAdornment>
),
endAdornment: (
<InputAdornment position='end'>
$
</InputAdornment>
),
}}
type={'text'}
value={featureNamingPattern || ''}
error={Boolean(errors.featureNamingPattern)}
errorText={errors.featureNamingPattern}
onChange={(e) =>
onSetFeatureNamingPattern(e.target.value)
}
/>
<StyledSubtitle>
<p id='pattern-additional-description'>
The example and description will be shown to
users when they create a new feature flag in
this project.
</p>
</StyledSubtitle>
<StyledInput
label={'Naming Example'}
name='feature flag naming example'
type={'text'}
aria-describedby='pattern-additional-description'
value={featureNamingExample || ''}
placeholder='dx.feature1.1-135'
error={Boolean(errors.namingExample)}
errorText={errors.namingExample}
onChange={(e) =>
onSetFeatureNamingExample(e.target.value)
}
/>
<StyledTextField
label={'Naming pattern description'}
name='feature flag naming description'
type={'text'}
aria-describedby='pattern-additional-description'
placeholder={`<project>.<featureName>.<ticket>
The flag name should contain the project name, the feature name, and the ticket number, each separated by a dot.`}
multiline
minRows={5}
value={featureNamingDescription || ''}
onChange={(e) =>
onSetFeatureNamingDescription(e.target.value)
}
/>
</StyledFlagNamingContainer>
</StyledFieldset>
<StyledButtonContainer>{children}</StyledButtonContainer>
</StyledForm>
);
}; };
const onSetFeatureNamingPattern = (regex: string) => {
const disallowedStrings = [
' ',
'\\t',
'\\s',
'\\n',
'\\r',
'\\f',
'\\v',
];
if (
disallowedStrings.some((blockedString) =>
regex.includes(blockedString),
)
) {
errors.featureNamingPattern =
'Whitespace is not allowed in the expression';
} else {
try {
new RegExp(regex);
delete errors.featureNamingPattern;
} catch (e) {
errors.featureNamingPattern = 'Invalid regular expression';
}
}
setFeatureNamingPattern?.(regex);
updateNamingExampleError({
pattern: regex,
example: featureNamingExample || '',
});
};
const onSetFeatureNamingExample = (example: string) => {
setFeatureNamingExample?.(example);
updateNamingExampleError({
pattern: featureNamingPattern || '',
example,
});
};
const onSetFeatureNamingDescription = (description: string) => {
setFeatureNamingDescription?.(description);
};
return (
<StyledForm
onSubmit={(submitEvent) => {
handleSubmit(submitEvent);
trackPattern(featureNamingPattern);
}}
>
<>
<Box
sx={{
display: 'flex',
alignItems: 'center',
marginBottom: 1,
gap: 1,
}}
>
<p>What is your project collaboration mode?</p>
<CollaborationModeTooltip />
</Box>
<StyledSelect
id='project-mode'
value={projectMode}
label='Project collaboration mode'
name='Project collaboration mode'
onChange={(e) => {
setProjectMode?.(e.target.value as ProjectMode);
}}
options={projectModeOptions}
/>
</>
<StyledFieldset>
<Box
sx={{
display: 'flex',
alignItems: 'center',
marginBottom: 1,
gap: 1,
}}
>
<legend>Feature flag naming pattern?</legend>
<FeatureFlagNamingTooltip />
</Box>
<StyledSubtitle>
<StyledPatternNamingExplanation id='pattern-naming-description'>
<p>
Define a{' '}
<a
href={`https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Cheatsheet`}
target='_blank'
rel='noreferrer'
>
JavaScript RegEx
</a>{' '}
used to enforce feature flag names within this
project. The regex will be surrounded by a leading{' '}
<code>^</code> and a trailing <code>$</code>.
</p>
<p>
Leave it empty if you dont want to add a naming
pattern.
</p>
</StyledPatternNamingExplanation>
</StyledSubtitle>
<StyledFlagNamingContainer>
<StyledInput
label={'Naming Pattern'}
name='feature flag naming pattern'
aria-describedby='pattern-naming-description'
placeholder='[A-Za-z]+.[A-Za-z]+.[A-Za-z0-9-]+'
InputProps={{
startAdornment: (
<InputAdornment position='start'>
^
</InputAdornment>
),
endAdornment: (
<InputAdornment position='end'>
$
</InputAdornment>
),
}}
type={'text'}
value={featureNamingPattern || ''}
error={Boolean(errors.featureNamingPattern)}
errorText={errors.featureNamingPattern}
onChange={(e) =>
onSetFeatureNamingPattern(e.target.value)
}
/>
<StyledSubtitle>
<p id='pattern-additional-description'>
The example and description will be shown to users
when they create a new feature flag in this project.
</p>
</StyledSubtitle>
<StyledInput
label={'Naming Example'}
name='feature flag naming example'
type={'text'}
aria-describedby='pattern-additional-description'
value={featureNamingExample || ''}
placeholder='dx.feature1.1-135'
error={Boolean(errors.namingExample)}
errorText={errors.namingExample}
onChange={(e) =>
onSetFeatureNamingExample(e.target.value)
}
/>
<StyledTextField
label={'Naming pattern description'}
name='feature flag naming description'
type={'text'}
aria-describedby='pattern-additional-description'
placeholder={`<project>.<featureName>.<ticket>
The flag name should contain the project name, the feature name, and the ticket number, each separated by a dot.`}
multiline
minRows={5}
value={featureNamingDescription || ''}
onChange={(e) =>
onSetFeatureNamingDescription(e.target.value)
}
/>
</StyledFlagNamingContainer>
</StyledFieldset>
<StyledButtonContainer>{children}</StyledButtonContainer>
</StyledForm>
);
};
export default ProjectEnterpriseSettingsForm; export default ProjectEnterpriseSettingsForm;

View File

@ -13,159 +13,156 @@ import { ReactComponent as ChangeRequestProcessWithScheduleImage } from 'assets/
type IChangeRequestProcessHelpProps = {}; type IChangeRequestProcessHelpProps = {};
export const ChangeRequestProcessHelp: VFC<IChangeRequestProcessHelpProps> = export const ChangeRequestProcessHelp: VFC<
() => { IChangeRequestProcessHelpProps
const ref = useRef<HTMLButtonElement>(null); > = () => {
const theme = useTheme(); const ref = useRef<HTMLButtonElement>(null);
const isSmallScreen = useMediaQuery(theme.breakpoints.down('md')); const theme = useTheme();
const [isOpen, setIsOpen] = useState(false); const isSmallScreen = useMediaQuery(theme.breakpoints.down('md'));
const [isOpen, setIsOpen] = useState(false);
const descriptionId = 'change-request-process-description'; const descriptionId = 'change-request-process-description';
return ( return (
<> <>
<ConditionallyRender <ConditionallyRender
condition={!isSmallScreen} condition={!isSmallScreen}
show={ show={
<Typography variant='body2'> <Typography variant='body2'>
Show change request process{' '} Show change request process{' '}
</Typography> </Typography>
} }
/> />
<IconButton <IconButton
title='Change request process' title='Change request process'
ref={ref} ref={ref}
onClick={() => setIsOpen(true)} onClick={() => setIsOpen(true)}
>
<HelpOutline />
</IconButton>
<Popover
open={isOpen}
anchorEl={ref.current}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'right',
}}
transformOrigin={{
vertical: 'top',
horizontal: 'right',
}}
onClose={() => setIsOpen(false)}
>
<Box
sx={{ p: { xs: 2, md: 4 }, maxWidth: 920 }}
id={descriptionId}
> >
<HelpOutline /> <Typography variant='h3'>
</IconButton> Change request process:
<Popover </Typography>
open={isOpen} <Typography variant='body2'>
anchorEl={ref.current} <ol>
anchorOrigin={{ <li>
vertical: 'bottom', When changes are detected they are added to a
horizontal: 'right', draft.
}} </li>
transformOrigin={{ <li>
vertical: 'top', The user can submit the changes for review or
horizontal: 'right', discard them.
}} <ul>
onClose={() => setIsOpen(false)} <li>
> Once submitted, the changes are visible
<Box to everyone.
sx={{ p: { xs: 2, md: 4 }, maxWidth: 920 }} </li>
id={descriptionId} </ul>
> </li>
<Typography variant='h3'> <li>
Change request process: A user with the{' '}
</Typography> <strong>Review change request</strong>{' '}
<Typography variant='body2'> permission can approve or reject the changes.
<ol> <ul>
<li>
The user who created the change request
can cancel it at this stage.
</li>
<li>
Rejecting or canceling the changes will
close the change request.
</li>
</ul>
</li>
<>
<li> <li>
When changes are detected they are added to Once approved, a user with the{' '}
a draft. <strong>
</li> Apply/Reject change request
<li> </strong>{' '}
The user can submit the changes for review permission can apply, schedule, or reject
or discard them. the changes.
<ul> <ul>
<li> <li>
Once submitted, the changes are If applied, the changes will take
visible to everyone. effect and the change request will
be closed.
</li>
<li>
If scheduled, Unleash will attempt
to apply the changes at the
scheduled date and time.
</li>
<li>
The user who created the change
request can cancel the changes up
until they are applied or scheduled.
</li> </li>
</ul> </ul>
</li> </li>
<li> <li>
A user with the{' '} A user with the{' '}
<strong>Review change request</strong>{' '} <strong>
permission can approve or reject the Apply/Reject change request
changes. </strong>{' '}
permission can reschedule, reject, or
immediately apply a scheduled change
request.
<ul> <ul>
<li> <li>
The user who created the change If any of the flags or strategies in
request can cancel it at this stage. the change request are archived or
deleted (outside of the change
request), thus creating a conflict,
Unleash will send an email out to
the change request author and to the
user who (last) scheduled the change
request.
</li> </li>
<li> <li>
Rejecting or canceling the changes If the scheduled changes contain any
will close the change request. conflicts, Unleash will refuse to
apply them.
</li>
<li>
If the user who scheduled the
changes is removed from this Unleash
instance, the scheduled changes will
also not be applied.
</li> </li>
</ul> </ul>
</li> </li>
<> </>
<li> </ol>
Once approved, a user with the{' '} </Typography>
<strong> <Box sx={{ mt: 3 }}>
Apply/Reject change request <ChangeRequestProcessWithScheduleImage
</strong>{' '} aria-details={descriptionId}
permission can apply, schedule, or style={{
reject the changes. maxWidth: '100%',
<ul> height: 'auto',
<li> }}
If applied, the changes will />
take effect and the change
request will be closed.
</li>
<li>
If scheduled, Unleash will
attempt to apply the changes at
the scheduled date and time.
</li>
<li>
The user who created the change
request can cancel the changes
up until they are applied or
scheduled.
</li>
</ul>
</li>
<li>
A user with the{' '}
<strong>
Apply/Reject change request
</strong>{' '}
permission can reschedule, reject, or
immediately apply a scheduled change
request.
<ul>
<li>
If any of the flags or
strategies in the change request
are archived or deleted (outside
of the change request), thus
creating a conflict, Unleash
will send an email out to the
change request author and to the
user who (last) scheduled the
change request.
</li>
<li>
If the scheduled changes contain
any conflicts, Unleash will
refuse to apply them.
</li>
<li>
If the user who scheduled the
changes is removed from this
Unleash instance, the scheduled
changes will also not be
applied.
</li>
</ul>
</li>
</>
</ol>
</Typography>
<Box sx={{ mt: 3 }}>
<ChangeRequestProcessWithScheduleImage
aria-details={descriptionId}
style={{
maxWidth: '100%',
height: 'auto',
}}
/>
</Box>
</Box> </Box>
</Popover> </Box>
</> </Popover>
); </>
}; );
};

View File

@ -35,11 +35,10 @@ const useResetPassword = (options: SWRConfiguration = {}) => {
setLoading(!error && !data); setLoading(!error && !data);
}, [data, error]); }, [data, error]);
const isValidToken = const isValidToken = !(
(!loading && data?.name === INVALID_TOKEN_ERROR) || (!loading && data?.name === INVALID_TOKEN_ERROR) ||
data?.name === USED_TOKEN_ERROR data?.name === USED_TOKEN_ERROR
? false );
: true;
return { return {
token, token,

View File

@ -139,8 +139,8 @@ export const getColumnValues = (column: any, row: any) => {
? column.accessor(row) ? column.accessor(row)
: column.accessor.includes('.') : column.accessor.includes('.')
? column.accessor ? column.accessor
.split('.') .split('.')
.reduce((object: any, key: string) => object?.[key], row) .reduce((object: any, key: string) => object?.[key], row)
: row[column.accessor]; : row[column.accessor];
if (column.filterParsing) { if (column.filterParsing) {

View File

@ -615,59 +615,59 @@
"@babel/helper-validator-identifier" "^7.24.6" "@babel/helper-validator-identifier" "^7.24.6"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@biomejs/biome@1.6.4": "@biomejs/biome@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.6.4.tgz#d09ab44c1df2a0cbbbb15901779a164beacd356d" resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.8.0.tgz#393f4c530582509938d58c3856b5a50179254df8"
integrity sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA== integrity sha512-34xcE2z8GWrIz1sCFEmlHT/+4d+SN7YOqqvzlAKXKvaWPRJ2/NUwxPbRsP01P9QODkQ5bvGvc9rpBihmP+7RJQ==
optionalDependencies: optionalDependencies:
"@biomejs/cli-darwin-arm64" "1.6.4" "@biomejs/cli-darwin-arm64" "1.8.0"
"@biomejs/cli-darwin-x64" "1.6.4" "@biomejs/cli-darwin-x64" "1.8.0"
"@biomejs/cli-linux-arm64" "1.6.4" "@biomejs/cli-linux-arm64" "1.8.0"
"@biomejs/cli-linux-arm64-musl" "1.6.4" "@biomejs/cli-linux-arm64-musl" "1.8.0"
"@biomejs/cli-linux-x64" "1.6.4" "@biomejs/cli-linux-x64" "1.8.0"
"@biomejs/cli-linux-x64-musl" "1.6.4" "@biomejs/cli-linux-x64-musl" "1.8.0"
"@biomejs/cli-win32-arm64" "1.6.4" "@biomejs/cli-win32-arm64" "1.8.0"
"@biomejs/cli-win32-x64" "1.6.4" "@biomejs/cli-win32-x64" "1.8.0"
"@biomejs/cli-darwin-arm64@1.6.4": "@biomejs/cli-darwin-arm64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.6.4.tgz#a2b07cacb0d2769ae5545b6a3cf40907fbfd4ab0" resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.0.tgz#b3eb9644b5bbb393e993ac5acc9570ef21907380"
integrity sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ== integrity sha512-dBAYzfIJ1JmWigKlWourT3sJ3I60LZPjqNwwlsyFjiv5AV7vPeWlHVVIImV2BpINwNjZQhpXnwDfVnGS4vr7AA==
"@biomejs/cli-darwin-x64@1.6.4": "@biomejs/cli-darwin-x64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.6.4.tgz#476720d731864508312b12fbef62a35609ef5f96" resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.0.tgz#a31eada9b57cf33cb9655593b1df2b5ff2d4f092"
integrity sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg== integrity sha512-ZTTSD0bP0nn9UpRDGQrQNTILcYSj+IkxTYr3CAV64DWBDtQBomlk2oVKWzDaA1LOhpAsTh0giLCbPJaVk2jfMQ==
"@biomejs/cli-linux-arm64-musl@1.6.4": "@biomejs/cli-linux-arm64-musl@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.4.tgz#403f5889a4ec290e35a0b910c1c26723373cf5fc" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.0.tgz#ca66b8635f8f55f320e247a5febed8bb56dc3b91"
integrity sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg== integrity sha512-+ee/pZWsvhDv6eRI00krRNSgAg8DKSxzOv3LUsCjto6N1VzqatTASeQv2HRfG1nitf79rRKM75LkMJbqEfiKww==
"@biomejs/cli-linux-arm64@1.6.4": "@biomejs/cli-linux-arm64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.6.4.tgz#7eff2af0fc5d9af9affc963bb594ec2ebf89668f" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.0.tgz#147ab4d9bcfb4cc1baee90a367acf0fef5c42649"
integrity sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w== integrity sha512-cx725jTlJS6dskvJJwwCQaaMRBKE2Qss7ukzmx27Rn/DXRxz6tnnBix4FUGPf1uZfwrERkiJlbWM05JWzpvvXg==
"@biomejs/cli-linux-x64-musl@1.6.4": "@biomejs/cli-linux-x64-musl@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.4.tgz#aeca8dd886b19b7779dfb43898ec896c71da279f" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.0.tgz#4c80358c178327fccee660f0cebcc7a78c20bcb0"
integrity sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg== integrity sha512-VPA4ocrAOak50VYl8gOAVnjuFFDpIUolShntc/aWM0pZfSIMbRucxnrfUfp44EVwayxjK6ruJTR5xEWj93WvDA==
"@biomejs/cli-linux-x64@1.6.4": "@biomejs/cli-linux-x64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.6.4.tgz#545b205dea20195b1fa64f5a0e60331a70133518" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.0.tgz#de1ab7649324c72b74e16c5234ef6191a8bc34fd"
integrity sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw== integrity sha512-cmgmhlD4QUxMhL1VdaNqnB81xBHb3R7huVNyYnPYzP+AykZ7XqJbPd1KcWAszNjUk2AHdx0aLKEBwCOWemxb2g==
"@biomejs/cli-win32-arm64@1.6.4": "@biomejs/cli-win32-arm64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.6.4.tgz#2c377c0965749d01280baac6cb273bcbe11cd652" resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.0.tgz#1527e7bbcf9abd27302225591ef150da1656393a"
integrity sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA== integrity sha512-J31spvlh39FfRHQacYXxJX9PvTCH/a8+2Jx9D1lxw+LSF0JybqZcw/4JrlFUWUl4kF3yv8AuYUK0sENScc3g9w==
"@biomejs/cli-win32-x64@1.6.4": "@biomejs/cli-win32-x64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.6.4.tgz#317fed21b863d43778665d42a41cbd0f94351051" resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.0.tgz#d566d6d27ba262691eaac7c54b7a41560d390130"
integrity sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg== integrity sha512-uPHHvu76JC1zYe9zZDcOU9PAg+1MZmPuNgWkb5jljaDeATvzLFPB+0nuJTilf603LXL+E8IdPQAO61Wy2VuEJA==
"@bundled-es-modules/cookie@^2.0.0": "@bundled-es-modules/cookie@^2.0.0":
version "2.0.0" version "2.0.0"

View File

@ -46,7 +46,7 @@
"start:dev": "TZ=UTC NODE_ENV=development tsc-watch --strictNullChecks false --onSuccess \"node dist/server-dev.js\"", "start:dev": "TZ=UTC NODE_ENV=development tsc-watch --strictNullChecks false --onSuccess \"node dist/server-dev.js\"",
"db-migrate": "db-migrate --migrations-dir ./src/migrations", "db-migrate": "db-migrate --migrations-dir ./src/migrations",
"lint": "biome check .", "lint": "biome check .",
"lint:fix": "biome check . --apply", "lint:fix": "biome check . --write",
"local:package": "del-cli --force build && mkdir build && cp -r dist docs CHANGELOG.md LICENSE README.md package.json build", "local:package": "del-cli --force build && mkdir build && cp -r dist docs CHANGELOG.md LICENSE README.md package.json build",
"prebuild:watch": "yarn run clean", "prebuild:watch": "yarn run clean",
"build:watch": "tsc -w --strictNullChecks false", "build:watch": "tsc -w --strictNullChecks false",
@ -153,7 +153,7 @@
"prom-client": "^14.0.0", "prom-client": "^14.0.0",
"response-time": "^2.3.2", "response-time": "^2.3.2",
"sanitize-filename": "^1.6.3", "sanitize-filename": "^1.6.3",
"semver": "^7.5.4", "semver": "^7.6.2",
"serve-favicon": "^2.5.0", "serve-favicon": "^2.5.0",
"slug": "^9.0.0", "slug": "^9.0.0",
"stoppable": "^1.1.0", "stoppable": "^1.1.0",
@ -165,8 +165,8 @@
"devDependencies": { "devDependencies": {
"@apidevtools/swagger-parser": "10.1.0", "@apidevtools/swagger-parser": "10.1.0",
"@babel/core": "7.24.6", "@babel/core": "7.24.6",
"@biomejs/biome": "1.6.4", "@biomejs/biome": "1.8.0",
"@swc/core": "1.5.7", "@swc/core": "1.5.24",
"@swc/jest": "0.2.36", "@swc/jest": "0.2.36",
"@types/bcryptjs": "2.4.6", "@types/bcryptjs": "2.4.6",
"@types/cors": "2.8.17", "@types/cors": "2.8.17",
@ -228,12 +228,12 @@
"ip": "^2.0.1", "ip": "^2.0.1",
"tar": "6.2.1", "tar": "6.2.1",
"minimatch": "^5.0.0", "minimatch": "^5.0.0",
"semver": "^7.5.3", "semver": "^7.6.2",
"tough-cookie": "4.1.4" "tough-cookie": "4.1.4"
}, },
"lint-staged": { "lint-staged": {
"*.{js,ts}": ["biome check --apply --no-errors-on-unmatched"], "*.{js,ts}": ["biome check --write --no-errors-on-unmatched"],
"*.{jsx,tsx}": ["biome check --apply --no-errors-on-unmatched"], "*.{jsx,tsx}": ["biome check --write --no-errors-on-unmatched"],
"*.json": ["biome format --write --no-errors-on-unmatched"] "*.json": ["biome format --write --no-errors-on-unmatched"]
} }
} }

View File

@ -446,11 +446,11 @@ export class FeatureEventFormatterMd implements FeatureEventFormatter {
? '' ? ''
: !preData : !preData
? ` ${propertyName} to ${userIdText( ? ` ${propertyName} to ${userIdText(
data?.parameters[propertyName], data?.parameters[propertyName],
)}` )}`
: ` ${propertyName} from ${userIdText( : ` ${propertyName} from ${userIdText(
preData.parameters[propertyName], preData.parameters[propertyName],
)} to ${userIdText(data?.parameters[propertyName])}`; )} to ${userIdText(data?.parameters[propertyName])}`;
const constraintText = this.constraintChangeText( const constraintText = this.constraintChangeText(
preData?.constraints, preData?.constraints,
data?.constraints, data?.constraints,

View File

@ -188,7 +188,7 @@ class FeatureSearchStore implements IFeatureSearchStore {
envName, envName,
).andWhere( ).andWhere(
'feature_environments.enabled', 'feature_environments.enabled',
envStatus === 'enabled' ? true : false, envStatus === 'enabled',
); );
}); });
} }

214
yarn.lock
View File

@ -657,59 +657,59 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@biomejs/biome@1.6.4": "@biomejs/biome@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.6.4.tgz#d09ab44c1df2a0cbbbb15901779a164beacd356d" resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.8.0.tgz#393f4c530582509938d58c3856b5a50179254df8"
integrity sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA== integrity sha512-34xcE2z8GWrIz1sCFEmlHT/+4d+SN7YOqqvzlAKXKvaWPRJ2/NUwxPbRsP01P9QODkQ5bvGvc9rpBihmP+7RJQ==
optionalDependencies: optionalDependencies:
"@biomejs/cli-darwin-arm64" "1.6.4" "@biomejs/cli-darwin-arm64" "1.8.0"
"@biomejs/cli-darwin-x64" "1.6.4" "@biomejs/cli-darwin-x64" "1.8.0"
"@biomejs/cli-linux-arm64" "1.6.4" "@biomejs/cli-linux-arm64" "1.8.0"
"@biomejs/cli-linux-arm64-musl" "1.6.4" "@biomejs/cli-linux-arm64-musl" "1.8.0"
"@biomejs/cli-linux-x64" "1.6.4" "@biomejs/cli-linux-x64" "1.8.0"
"@biomejs/cli-linux-x64-musl" "1.6.4" "@biomejs/cli-linux-x64-musl" "1.8.0"
"@biomejs/cli-win32-arm64" "1.6.4" "@biomejs/cli-win32-arm64" "1.8.0"
"@biomejs/cli-win32-x64" "1.6.4" "@biomejs/cli-win32-x64" "1.8.0"
"@biomejs/cli-darwin-arm64@1.6.4": "@biomejs/cli-darwin-arm64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.6.4.tgz#a2b07cacb0d2769ae5545b6a3cf40907fbfd4ab0" resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.0.tgz#b3eb9644b5bbb393e993ac5acc9570ef21907380"
integrity sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ== integrity sha512-dBAYzfIJ1JmWigKlWourT3sJ3I60LZPjqNwwlsyFjiv5AV7vPeWlHVVIImV2BpINwNjZQhpXnwDfVnGS4vr7AA==
"@biomejs/cli-darwin-x64@1.6.4": "@biomejs/cli-darwin-x64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.6.4.tgz#476720d731864508312b12fbef62a35609ef5f96" resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.0.tgz#a31eada9b57cf33cb9655593b1df2b5ff2d4f092"
integrity sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg== integrity sha512-ZTTSD0bP0nn9UpRDGQrQNTILcYSj+IkxTYr3CAV64DWBDtQBomlk2oVKWzDaA1LOhpAsTh0giLCbPJaVk2jfMQ==
"@biomejs/cli-linux-arm64-musl@1.6.4": "@biomejs/cli-linux-arm64-musl@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.4.tgz#403f5889a4ec290e35a0b910c1c26723373cf5fc" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.0.tgz#ca66b8635f8f55f320e247a5febed8bb56dc3b91"
integrity sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg== integrity sha512-+ee/pZWsvhDv6eRI00krRNSgAg8DKSxzOv3LUsCjto6N1VzqatTASeQv2HRfG1nitf79rRKM75LkMJbqEfiKww==
"@biomejs/cli-linux-arm64@1.6.4": "@biomejs/cli-linux-arm64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.6.4.tgz#7eff2af0fc5d9af9affc963bb594ec2ebf89668f" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.0.tgz#147ab4d9bcfb4cc1baee90a367acf0fef5c42649"
integrity sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w== integrity sha512-cx725jTlJS6dskvJJwwCQaaMRBKE2Qss7ukzmx27Rn/DXRxz6tnnBix4FUGPf1uZfwrERkiJlbWM05JWzpvvXg==
"@biomejs/cli-linux-x64-musl@1.6.4": "@biomejs/cli-linux-x64-musl@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.4.tgz#aeca8dd886b19b7779dfb43898ec896c71da279f" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.0.tgz#4c80358c178327fccee660f0cebcc7a78c20bcb0"
integrity sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg== integrity sha512-VPA4ocrAOak50VYl8gOAVnjuFFDpIUolShntc/aWM0pZfSIMbRucxnrfUfp44EVwayxjK6ruJTR5xEWj93WvDA==
"@biomejs/cli-linux-x64@1.6.4": "@biomejs/cli-linux-x64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.6.4.tgz#545b205dea20195b1fa64f5a0e60331a70133518" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.0.tgz#de1ab7649324c72b74e16c5234ef6191a8bc34fd"
integrity sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw== integrity sha512-cmgmhlD4QUxMhL1VdaNqnB81xBHb3R7huVNyYnPYzP+AykZ7XqJbPd1KcWAszNjUk2AHdx0aLKEBwCOWemxb2g==
"@biomejs/cli-win32-arm64@1.6.4": "@biomejs/cli-win32-arm64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.6.4.tgz#2c377c0965749d01280baac6cb273bcbe11cd652" resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.0.tgz#1527e7bbcf9abd27302225591ef150da1656393a"
integrity sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA== integrity sha512-J31spvlh39FfRHQacYXxJX9PvTCH/a8+2Jx9D1lxw+LSF0JybqZcw/4JrlFUWUl4kF3yv8AuYUK0sENScc3g9w==
"@biomejs/cli-win32-x64@1.6.4": "@biomejs/cli-win32-x64@1.8.0":
version "1.6.4" version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.6.4.tgz#317fed21b863d43778665d42a41cbd0f94351051" resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.0.tgz#d566d6d27ba262691eaac7c54b7a41560d390130"
integrity sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg== integrity sha512-uPHHvu76JC1zYe9zZDcOU9PAg+1MZmPuNgWkb5jljaDeATvzLFPB+0nuJTilf603LXL+E8IdPQAO61Wy2VuEJA==
"@colors/colors@1.5.0": "@colors/colors@1.5.0":
version "1.5.0" version "1.5.0"
@ -1241,76 +1241,76 @@
p-queue "^6.6.1" p-queue "^6.6.1"
p-retry "^4.0.0" p-retry "^4.0.0"
"@swc/core-darwin-arm64@1.5.7": "@swc/core-darwin-arm64@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz#2b5cdbd34e4162e50de6147dd1a5cb12d23b08e8" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.24.tgz#71875695bc617e57c2d93352f48317b4c41e0240"
integrity sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ== integrity sha512-M7oLOcC0sw+UTyAuL/9uyB9GeO4ZpaBbH76JSH6g1m0/yg7LYJZGRmplhDmwVSDAR5Fq4Sjoi1CksmmGkgihGA==
"@swc/core-darwin-x64@1.5.7": "@swc/core-darwin-x64@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz#6aa7e3c01ab8e5e41597f8a24ff24c4e50936a46" resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.24.tgz#6b4c3eb9b21ab50b7324a82c9497ffeb2e8e0a57"
integrity sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw== integrity sha512-MfcFjGGYognpSBSos2pYUNYJSmqEhuw5ceGr6qAdME7ddbjGXliza4W6FggsM+JnWwpqa31+e7/R+GetW4WkaQ==
"@swc/core-linux-arm-gnueabihf@1.5.7": "@swc/core-linux-arm-gnueabihf@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz#160108633b9e1d1ad05f815bedc7e9eb5d59fc2a" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.24.tgz#5730ed6ad86afe4ee8df04ee6f21430daead186c"
integrity sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ== integrity sha512-amI2pwtcWV3E/m/nf+AQtn1LWDzKLZyjCmWd3ms7QjEueWYrY8cU1Y4Wp7wNNsxIoPOi8zek1Uj2wwFD/pttNQ==
"@swc/core-linux-arm64-gnu@1.5.7": "@swc/core-linux-arm64-gnu@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz#cbfa512683c73227ad25552f3b3e722b0e7fbd1d" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.24.tgz#0a2478e8601391aa88f82bfece1dbc60d27cbcfd"
integrity sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g== integrity sha512-sTSvmqMmgT1ynH/nP75Pc51s+iT4crZagHBiDOf5cq+kudUYjda9lWMs7xkXB/TUKFHPCRK0HGunl8bkwiIbuw==
"@swc/core-linux-arm64-musl@1.5.7": "@swc/core-linux-arm64-musl@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz#80239cb58fe57f3c86b44617fe784530ec55ee2b" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.24.tgz#e0199092dc611ca75f8a92dcea17de44e38f3fbf"
integrity sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ== integrity sha512-vd2/hfOBGbrX21FxsFdXCUaffjkHvlZkeE2UMRajdXifwv79jqOHIJg3jXG1F3ZrhCghCzirFts4tAZgcG8XWg==
"@swc/core-linux-x64-gnu@1.5.7": "@swc/core-linux-x64-gnu@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz#a699c1632de60b6a63b7fdb7abcb4fef317e57ca" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.24.tgz#1fe347c9f28457c593f2fda5b0d4904a2b105ecd"
integrity sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg== integrity sha512-Zrdzi7NqzQxm2BvAG5KyOSBEggQ7ayrxh599AqqevJmsUXJ8o2nMiWQOBvgCGp7ye+Biz3pvZn1EnRzAp+TpUg==
"@swc/core-linux-x64-musl@1.5.7": "@swc/core-linux-x64-musl@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz#8e4c203d6bc41e7f85d7d34d0fdf4ef751fa626c" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.24.tgz#bf6ac583fac211d704d2d78cfd0b7bf751268f5e"
integrity sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg== integrity sha512-1F8z9NRi52jdZQCGc5sflwYSctL6omxiVmIFVp8TC9nngjQKc00TtX/JC2Eo2HwvgupkFVl5YQJidAck9YtmJw==
"@swc/core-win32-arm64-msvc@1.5.7": "@swc/core-win32-arm64-msvc@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz#31e3d42b8c0aa79f0ea1a980c0dd1a999d378ed7" resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.24.tgz#41b9faf4db69cc08a43c3a176df2a7b94d765637"
integrity sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA== integrity sha512-cKpP7KvS6Xr0jFSTBXY53HZX/YfomK5EMQYpCVDOvfsZeYHN20sQSKXfpVLvA/q2igVt1zzy1XJcOhpJcgiKLg==
"@swc/core-win32-ia32-msvc@1.5.7": "@swc/core-win32-ia32-msvc@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz#a235285f9f62850aefcf9abb03420f2c54f63638" resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.24.tgz#e123ad00e3b28d567d3851a86697fb3c54ed817a"
integrity sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ== integrity sha512-IoPWfi0iwqjZuf7gE223+B97/ZwkKbu7qL5KzGP7g3hJrGSKAvv7eC5Y9r2iKKtLKyv5R/T6Ho0kFR/usi7rHw==
"@swc/core-win32-x64-msvc@1.5.7": "@swc/core-win32-x64-msvc@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz#f84641393b5223450d00d97bfff877b8b69d7c9b" resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.24.tgz#21fb87b1981253039e6d45255e31a875f446e397"
integrity sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg== integrity sha512-zHgF2k1uVJL8KIW+PnVz1To4a3Cz9THbh2z2lbehaF/gKHugH4c3djBozU4das1v35KOqf5jWIEviBLql2wDLQ==
"@swc/core@1.5.7": "@swc/core@1.5.24":
version "1.5.7" version "1.5.24"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.5.7.tgz#e1db7b9887d5f34eb4a3256a738d0c5f1b018c33" resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.5.24.tgz#9ecb4601cb6a4fb19f227ec5fb59d07e23347dca"
integrity sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ== integrity sha512-Eph9zvO4xvqWZGVzTdtdEJ0Vqf0VIML/o/e4Qd2RLOqtfgnlRi7avmMu5C0oqciJ0tk+hqdUKVUZ4JPoPaiGvQ==
dependencies: dependencies:
"@swc/counter" "^0.1.2" "@swc/counter" "^0.1.3"
"@swc/types" "0.1.7" "@swc/types" "^0.1.7"
optionalDependencies: optionalDependencies:
"@swc/core-darwin-arm64" "1.5.7" "@swc/core-darwin-arm64" "1.5.24"
"@swc/core-darwin-x64" "1.5.7" "@swc/core-darwin-x64" "1.5.24"
"@swc/core-linux-arm-gnueabihf" "1.5.7" "@swc/core-linux-arm-gnueabihf" "1.5.24"
"@swc/core-linux-arm64-gnu" "1.5.7" "@swc/core-linux-arm64-gnu" "1.5.24"
"@swc/core-linux-arm64-musl" "1.5.7" "@swc/core-linux-arm64-musl" "1.5.24"
"@swc/core-linux-x64-gnu" "1.5.7" "@swc/core-linux-x64-gnu" "1.5.24"
"@swc/core-linux-x64-musl" "1.5.7" "@swc/core-linux-x64-musl" "1.5.24"
"@swc/core-win32-arm64-msvc" "1.5.7" "@swc/core-win32-arm64-msvc" "1.5.24"
"@swc/core-win32-ia32-msvc" "1.5.7" "@swc/core-win32-ia32-msvc" "1.5.24"
"@swc/core-win32-x64-msvc" "1.5.7" "@swc/core-win32-x64-msvc" "1.5.24"
"@swc/counter@^0.1.2", "@swc/counter@^0.1.3": "@swc/counter@^0.1.3":
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
@ -1324,7 +1324,7 @@
"@swc/counter" "^0.1.3" "@swc/counter" "^0.1.3"
jsonc-parser "^3.2.0" jsonc-parser "^3.2.0"
"@swc/types@0.1.7": "@swc/types@^0.1.7":
version "0.1.7" version "0.1.7"
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.7.tgz#ea5d658cf460abff51507ca8d26e2d391bafb15e" resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.7.tgz#ea5d658cf460abff51507ca8d26e2d391bafb15e"
integrity sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ== integrity sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==
@ -6434,12 +6434,10 @@ sanitize-filename@^1.6.3:
dependencies: dependencies:
truncate-utf8-bytes "^1.0.0" truncate-utf8-bytes "^1.0.0"
semver@^5.3.0, semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: semver@^5.3.0, semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2:
version "7.5.4" version "7.6.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
dependencies:
lru-cache "^6.0.0"
send@0.18.0: send@0.18.0:
version "0.18.0" version "0.18.0"