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:
parent
9cb015a7db
commit
0db5bc193f
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
@ -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>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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],
|
||||
);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 =
|
||||
|
@ -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],
|
||||
);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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 don’t 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 don’t 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;
|
||||
|
@ -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>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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"
|
||||
|
14
package.json
14
package.json
@ -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"]
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -188,7 +188,7 @@ class FeatureSearchStore implements IFeatureSearchStore {
|
||||
envName,
|
||||
).andWhere(
|
||||
'feature_environments.enabled',
|
||||
envStatus === 'enabled' ? true : false,
|
||||
envStatus === 'enabled',
|
||||
);
|
||||
});
|
||||
}
|
||||
|
214
yarn.lock
214
yarn.lock
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user