1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-15 01:16:22 +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": {
"enabled": true,
"rules": {
@ -7,7 +7,8 @@
"correctness": {
"noUnsafeOptionalChaining": "off",
"useExhaustiveDependencies": "off",
"noUnusedImports": "warn"
"noUnusedImports": "warn",
"useJsxKeyInIterable": "off"
},
"complexity": {
"noBannedTypes": "off",
@ -31,7 +32,8 @@
"noPrototypeBuiltins": "off",
"noConfusingVoidType": "off",
"noArrayIndexKey": "off",
"noThenProperty": "off"
"noThenProperty": "off",
"noExportsInTest": "off"
},
"performance": {
"noAccumulatingSpread": "off",

View File

@ -3131,7 +3131,7 @@ saxes@^6.0.0:
dependencies:
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"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
@ -3695,7 +3695,7 @@ unleash-client@5.5.3:
semver "^7.5.3"
"unleash-server@file:../build":
version "5.12.5"
version "5.12.7"
dependencies:
"@slack/web-api" "^6.10.0"
"@wesleytodd/openapi" "^0.3.0"
@ -3750,7 +3750,7 @@ unleash-client@5.5.3:
prom-client "^14.0.0"
response-time "^2.3.2"
sanitize-filename "^1.6.3"
semver "^7.5.4"
semver "^7.6.2"
serve-favicon "^2.5.0"
slug "^9.0.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"
},
"devDependencies": {
"@biomejs/biome": "1.6.4",
"@biomejs/biome": "1.8.0",
"@codemirror/lang-json": "6.0.1",
"@emotion/react": "11.11.4",
"@emotion/styled": "11.11.5",

View File

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

View File

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

View File

@ -25,84 +25,82 @@ const StyledContainer = styled(Box)(({ theme }) => ({
gap: theme.spacing(2),
}));
export const ScheduleChangeRequestDialog: FC<ScheduleChangeRequestDialogProps> =
({
open,
onConfirm,
onClose,
title,
primaryButtonText,
projectId,
environment,
disabled,
scheduledAt,
}) => {
const [selectedDate, setSelectedDate] = useState(
scheduledAt ? new Date(scheduledAt) : new Date(),
);
const [error, setError] = useState<string | undefined>(undefined);
export const ScheduleChangeRequestDialog: FC<
ScheduleChangeRequestDialogProps
> = ({
open,
onConfirm,
onClose,
title,
primaryButtonText,
projectId,
environment,
disabled,
scheduledAt,
}) => {
const [selectedDate, setSelectedDate] = useState(
scheduledAt ? new Date(scheduledAt) : new Date(),
);
const [error, setError] = useState<string | undefined>(undefined);
const timezone = getBrowserTimezone();
const timezone = getBrowserTimezone();
return (
<Dialogue
title={title}
primaryButtonText={primaryButtonText}
disabledPrimaryButton={disabled}
secondaryButtonText='Cancel'
open={open}
onClose={() => onClose()}
onClick={() => onConfirm(selectedDate)}
permissionButton={
<PermissionButton
variant='contained'
onClick={() => onConfirm(selectedDate)}
projectId={projectId}
permission={APPLY_CHANGE_REQUEST}
environmentId={environment}
disabled={disabled}
>
{primaryButtonText}
</PermissionButton>
}
fullWidth
return (
<Dialogue
title={title}
primaryButtonText={primaryButtonText}
disabledPrimaryButton={disabled}
secondaryButtonText='Cancel'
open={open}
onClose={() => onClose()}
onClick={() => onConfirm(selectedDate)}
permissionButton={
<PermissionButton
variant='contained'
onClick={() => onConfirm(selectedDate)}
projectId={projectId}
permission={APPLY_CHANGE_REQUEST}
environmentId={environment}
disabled={disabled}
>
{primaryButtonText}
</PermissionButton>
}
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
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) }}
>
Select the date and time when these changes should be
applied. If you change your mind later, you can reschedule
the changes or apply them immediately.
Select the date and time when these changes should be applied.
If you change your mind later, you can reschedule the changes or
apply them immediately.
</Typography>
<StyledContainer>
<DateTimePicker
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>
<DateTimePicker
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>
);
};
</StyledContainer>
</Dialogue>
);
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -18,29 +18,30 @@ interface ILoginHistorySuccessfulCellProps {
value: boolean;
}
export const LoginHistorySuccessfulCell: VFC<ILoginHistorySuccessfulCellProps> =
({ row, value }) => {
const { searchQuery } = useSearchHighlightContext();
if (value)
return (
<StyledBox>
<Badge color='success'>True</Badge>
</StyledBox>
);
export const LoginHistorySuccessfulCell: VFC<
ILoginHistorySuccessfulCellProps
> = ({ row, value }) => {
const { searchQuery } = useSearchHighlightContext();
if (value)
return (
<StyledBox>
<HtmlTooltip
arrow
title={
<Highlighter search={searchQuery}>
{row.original.failure_reason}
</Highlighter>
}
>
<Badge color='error'>False</Badge>
</HtmlTooltip>
<Badge color='success'>True</Badge>
</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;
}
export const PlaygroundGuidanceSection: VFC<IPlaygroundGuidanceSectionProps> =
({ headerText, bodyText, sectionNumber }) => {
return (
<Box
sx={{
display: 'flex',
alignItems: 'flex-start',
mt: 2,
flexDirection: 'column',
}}
>
<Box sx={{ display: 'flex' }}>
<Box>
<GuidanceIndicator>{sectionNumber}</GuidanceIndicator>
</Box>
<Box
sx={{ ml: 2, display: 'flex', flexDirection: 'column' }}
>
<Typography variant='body1' sx={{ fontWeight: 'bold' }}>
{headerText}
</Typography>
<ConditionallyRender
condition={Boolean(bodyText)}
show={
<Typography variant='body1' sx={{ mt: 1 }}>
{bodyText}
</Typography>
}
/>
</Box>
export const PlaygroundGuidanceSection: VFC<
IPlaygroundGuidanceSectionProps
> = ({ headerText, bodyText, sectionNumber }) => {
return (
<Box
sx={{
display: 'flex',
alignItems: 'flex-start',
mt: 2,
flexDirection: 'column',
}}
>
<Box sx={{ display: 'flex' }}>
<Box>
<GuidanceIndicator>{sectionNumber}</GuidanceIndicator>
</Box>
<Box sx={{ ml: 2, display: 'flex', flexDirection: 'column' }}>
<Typography variant='body1' sx={{ fontWeight: 'bold' }}>
{headerText}
</Typography>
<ConditionallyRender
condition={Boolean(bodyText)}
show={
<Typography variant='body1' sx={{ mt: 1 }}>
{bodyText}
</Typography>
}
/>
</Box>
</Box>
);
};
</Box>
);
};

View File

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

View File

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

View File

@ -117,232 +117,231 @@ const useFeatureNamePatternTracking = () => {
return { trackPattern, setPreviousPattern };
};
const ProjectEnterpriseSettingsForm: React.FC<IProjectEnterpriseSettingsForm> =
({
children,
handleSubmit,
projectId,
projectMode,
featureNamingExample,
featureNamingPattern,
featureNamingDescription,
setFeatureNamingExample,
setFeatureNamingPattern,
setFeatureNamingDescription,
setProjectMode,
errors,
const ProjectEnterpriseSettingsForm: React.FC<
IProjectEnterpriseSettingsForm
> = ({
children,
handleSubmit,
projectId,
projectMode,
featureNamingExample,
featureNamingPattern,
featureNamingDescription,
setFeatureNamingExample,
setFeatureNamingPattern,
setFeatureNamingDescription,
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 } =
useFeatureNamePatternTracking();
const projectModeOptions = [
{ key: 'open', label: 'open' },
{ key: 'protected', label: 'protected' },
{ key: 'private', label: 'private' },
];
useEffect(() => {
setPreviousPattern(featureNamingPattern || '');
}, [projectId]);
const updateNamingExampleError = ({
example,
const validationResult = validateFeatureNamingExample({
pattern,
}: {
example: string;
pattern: string;
}) => {
const validationResult = validateFeatureNamingExample({
pattern,
example,
featureNamingPatternError: errors.featureNamingPattern,
});
example,
featureNamingPatternError: errors.featureNamingPattern,
});
switch (validationResult.state) {
case 'invalid':
errors.namingExample = validationResult.reason;
break;
case 'valid':
delete errors.namingExample;
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>
);
switch (validationResult.state) {
case 'invalid':
errors.namingExample = validationResult.reason;
break;
case 'valid':
delete errors.namingExample;
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>
);
};
export default ProjectEnterpriseSettingsForm;

View File

@ -13,159 +13,156 @@ import { ReactComponent as ChangeRequestProcessWithScheduleImage } from 'assets/
type IChangeRequestProcessHelpProps = {};
export const ChangeRequestProcessHelp: VFC<IChangeRequestProcessHelpProps> =
() => {
const ref = useRef<HTMLButtonElement>(null);
const theme = useTheme();
const isSmallScreen = useMediaQuery(theme.breakpoints.down('md'));
const [isOpen, setIsOpen] = useState(false);
export const ChangeRequestProcessHelp: VFC<
IChangeRequestProcessHelpProps
> = () => {
const ref = useRef<HTMLButtonElement>(null);
const theme = useTheme();
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 (
<>
<ConditionallyRender
condition={!isSmallScreen}
show={
<Typography variant='body2'>
Show change request process{' '}
</Typography>
}
/>
<IconButton
title='Change request process'
ref={ref}
onClick={() => setIsOpen(true)}
return (
<>
<ConditionallyRender
condition={!isSmallScreen}
show={
<Typography variant='body2'>
Show change request process{' '}
</Typography>
}
/>
<IconButton
title='Change request process'
ref={ref}
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 />
</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}
>
<Typography variant='h3'>
Change request process:
</Typography>
<Typography variant='body2'>
<ol>
<Typography variant='h3'>
Change request process:
</Typography>
<Typography variant='body2'>
<ol>
<li>
When changes are detected they are added to a
draft.
</li>
<li>
The user can submit the changes for review or
discard them.
<ul>
<li>
Once submitted, the changes are visible
to everyone.
</li>
</ul>
</li>
<li>
A user with the{' '}
<strong>Review change request</strong>{' '}
permission can approve or reject the changes.
<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>
When changes are detected they are added to
a draft.
</li>
<li>
The user can submit the changes for review
or discard them.
Once approved, a user with the{' '}
<strong>
Apply/Reject change request
</strong>{' '}
permission can apply, schedule, or reject
the changes.
<ul>
<li>
Once submitted, the changes are
visible to everyone.
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>Review change request</strong>{' '}
permission can approve or reject the
changes.
<strong>
Apply/Reject change request
</strong>{' '}
permission can reschedule, reject, or
immediately apply a scheduled change
request.
<ul>
<li>
The user who created the change
request can cancel it at this stage.
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>
Rejecting or canceling the changes
will close the change request.
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>
<>
<li>
Once approved, a user with the{' '}
<strong>
Apply/Reject change request
</strong>{' '}
permission can apply, schedule, or
reject the changes.
<ul>
<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>
</>
</ol>
</Typography>
<Box sx={{ mt: 3 }}>
<ChangeRequestProcessWithScheduleImage
aria-details={descriptionId}
style={{
maxWidth: '100%',
height: 'auto',
}}
/>
</Box>
</Popover>
</>
);
};
</Box>
</Popover>
</>
);
};

View File

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

View File

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

View File

@ -615,59 +615,59 @@
"@babel/helper-validator-identifier" "^7.24.6"
to-fast-properties "^2.0.0"
"@biomejs/biome@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.6.4.tgz#d09ab44c1df2a0cbbbb15901779a164beacd356d"
integrity sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==
"@biomejs/biome@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.8.0.tgz#393f4c530582509938d58c3856b5a50179254df8"
integrity sha512-34xcE2z8GWrIz1sCFEmlHT/+4d+SN7YOqqvzlAKXKvaWPRJ2/NUwxPbRsP01P9QODkQ5bvGvc9rpBihmP+7RJQ==
optionalDependencies:
"@biomejs/cli-darwin-arm64" "1.6.4"
"@biomejs/cli-darwin-x64" "1.6.4"
"@biomejs/cli-linux-arm64" "1.6.4"
"@biomejs/cli-linux-arm64-musl" "1.6.4"
"@biomejs/cli-linux-x64" "1.6.4"
"@biomejs/cli-linux-x64-musl" "1.6.4"
"@biomejs/cli-win32-arm64" "1.6.4"
"@biomejs/cli-win32-x64" "1.6.4"
"@biomejs/cli-darwin-arm64" "1.8.0"
"@biomejs/cli-darwin-x64" "1.8.0"
"@biomejs/cli-linux-arm64" "1.8.0"
"@biomejs/cli-linux-arm64-musl" "1.8.0"
"@biomejs/cli-linux-x64" "1.8.0"
"@biomejs/cli-linux-x64-musl" "1.8.0"
"@biomejs/cli-win32-arm64" "1.8.0"
"@biomejs/cli-win32-x64" "1.8.0"
"@biomejs/cli-darwin-arm64@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.6.4.tgz#a2b07cacb0d2769ae5545b6a3cf40907fbfd4ab0"
integrity sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==
"@biomejs/cli-darwin-arm64@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.0.tgz#b3eb9644b5bbb393e993ac5acc9570ef21907380"
integrity sha512-dBAYzfIJ1JmWigKlWourT3sJ3I60LZPjqNwwlsyFjiv5AV7vPeWlHVVIImV2BpINwNjZQhpXnwDfVnGS4vr7AA==
"@biomejs/cli-darwin-x64@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.6.4.tgz#476720d731864508312b12fbef62a35609ef5f96"
integrity sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==
"@biomejs/cli-darwin-x64@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.0.tgz#a31eada9b57cf33cb9655593b1df2b5ff2d4f092"
integrity sha512-ZTTSD0bP0nn9UpRDGQrQNTILcYSj+IkxTYr3CAV64DWBDtQBomlk2oVKWzDaA1LOhpAsTh0giLCbPJaVk2jfMQ==
"@biomejs/cli-linux-arm64-musl@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.4.tgz#403f5889a4ec290e35a0b910c1c26723373cf5fc"
integrity sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==
"@biomejs/cli-linux-arm64-musl@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.0.tgz#ca66b8635f8f55f320e247a5febed8bb56dc3b91"
integrity sha512-+ee/pZWsvhDv6eRI00krRNSgAg8DKSxzOv3LUsCjto6N1VzqatTASeQv2HRfG1nitf79rRKM75LkMJbqEfiKww==
"@biomejs/cli-linux-arm64@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.6.4.tgz#7eff2af0fc5d9af9affc963bb594ec2ebf89668f"
integrity sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==
"@biomejs/cli-linux-arm64@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.0.tgz#147ab4d9bcfb4cc1baee90a367acf0fef5c42649"
integrity sha512-cx725jTlJS6dskvJJwwCQaaMRBKE2Qss7ukzmx27Rn/DXRxz6tnnBix4FUGPf1uZfwrERkiJlbWM05JWzpvvXg==
"@biomejs/cli-linux-x64-musl@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.4.tgz#aeca8dd886b19b7779dfb43898ec896c71da279f"
integrity sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==
"@biomejs/cli-linux-x64-musl@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.0.tgz#4c80358c178327fccee660f0cebcc7a78c20bcb0"
integrity sha512-VPA4ocrAOak50VYl8gOAVnjuFFDpIUolShntc/aWM0pZfSIMbRucxnrfUfp44EVwayxjK6ruJTR5xEWj93WvDA==
"@biomejs/cli-linux-x64@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.6.4.tgz#545b205dea20195b1fa64f5a0e60331a70133518"
integrity sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==
"@biomejs/cli-linux-x64@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.0.tgz#de1ab7649324c72b74e16c5234ef6191a8bc34fd"
integrity sha512-cmgmhlD4QUxMhL1VdaNqnB81xBHb3R7huVNyYnPYzP+AykZ7XqJbPd1KcWAszNjUk2AHdx0aLKEBwCOWemxb2g==
"@biomejs/cli-win32-arm64@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.6.4.tgz#2c377c0965749d01280baac6cb273bcbe11cd652"
integrity sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==
"@biomejs/cli-win32-arm64@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.0.tgz#1527e7bbcf9abd27302225591ef150da1656393a"
integrity sha512-J31spvlh39FfRHQacYXxJX9PvTCH/a8+2Jx9D1lxw+LSF0JybqZcw/4JrlFUWUl4kF3yv8AuYUK0sENScc3g9w==
"@biomejs/cli-win32-x64@1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.6.4.tgz#317fed21b863d43778665d42a41cbd0f94351051"
integrity sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==
"@biomejs/cli-win32-x64@1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.0.tgz#d566d6d27ba262691eaac7c54b7a41560d390130"
integrity sha512-uPHHvu76JC1zYe9zZDcOU9PAg+1MZmPuNgWkb5jljaDeATvzLFPB+0nuJTilf603LXL+E8IdPQAO61Wy2VuEJA==
"@bundled-es-modules/cookie@^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\"",
"db-migrate": "db-migrate --migrations-dir ./src/migrations",
"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",
"prebuild:watch": "yarn run clean",
"build:watch": "tsc -w --strictNullChecks false",
@ -153,7 +153,7 @@
"prom-client": "^14.0.0",
"response-time": "^2.3.2",
"sanitize-filename": "^1.6.3",
"semver": "^7.5.4",
"semver": "^7.6.2",
"serve-favicon": "^2.5.0",
"slug": "^9.0.0",
"stoppable": "^1.1.0",
@ -165,8 +165,8 @@
"devDependencies": {
"@apidevtools/swagger-parser": "10.1.0",
"@babel/core": "7.24.6",
"@biomejs/biome": "1.6.4",
"@swc/core": "1.5.7",
"@biomejs/biome": "1.8.0",
"@swc/core": "1.5.24",
"@swc/jest": "0.2.36",
"@types/bcryptjs": "2.4.6",
"@types/cors": "2.8.17",
@ -228,12 +228,12 @@
"ip": "^2.0.1",
"tar": "6.2.1",
"minimatch": "^5.0.0",
"semver": "^7.5.3",
"semver": "^7.6.2",
"tough-cookie": "4.1.4"
},
"lint-staged": {
"*.{js,ts}": ["biome check --apply --no-errors-on-unmatched"],
"*.{jsx,tsx}": ["biome check --apply --no-errors-on-unmatched"],
"*.{js,ts}": ["biome check --write --no-errors-on-unmatched"],
"*.{jsx,tsx}": ["biome check --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
? ` ${propertyName} to ${userIdText(
data?.parameters[propertyName],
)}`
data?.parameters[propertyName],
)}`
: ` ${propertyName} from ${userIdText(
preData.parameters[propertyName],
)} to ${userIdText(data?.parameters[propertyName])}`;
preData.parameters[propertyName],
)} to ${userIdText(data?.parameters[propertyName])}`;
const constraintText = this.constraintChangeText(
preData?.constraints,
data?.constraints,

View File

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