mirror of
https://github.com/Unleash/unleash.git
synced 2025-04-24 01:18:01 +02:00
task: upgraded semver dependency (and biome) (#7272)
Sorry for the extra noise here, but this seems to be the biome upgrade altering formatting slightly.
This commit is contained in:
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": {
|
"linter": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"rules": {
|
"rules": {
|
||||||
@ -7,7 +7,8 @@
|
|||||||
"correctness": {
|
"correctness": {
|
||||||
"noUnsafeOptionalChaining": "off",
|
"noUnsafeOptionalChaining": "off",
|
||||||
"useExhaustiveDependencies": "off",
|
"useExhaustiveDependencies": "off",
|
||||||
"noUnusedImports": "warn"
|
"noUnusedImports": "warn",
|
||||||
|
"useJsxKeyInIterable": "off"
|
||||||
},
|
},
|
||||||
"complexity": {
|
"complexity": {
|
||||||
"noBannedTypes": "off",
|
"noBannedTypes": "off",
|
||||||
@ -31,7 +32,8 @@
|
|||||||
"noPrototypeBuiltins": "off",
|
"noPrototypeBuiltins": "off",
|
||||||
"noConfusingVoidType": "off",
|
"noConfusingVoidType": "off",
|
||||||
"noArrayIndexKey": "off",
|
"noArrayIndexKey": "off",
|
||||||
"noThenProperty": "off"
|
"noThenProperty": "off",
|
||||||
|
"noExportsInTest": "off"
|
||||||
},
|
},
|
||||||
"performance": {
|
"performance": {
|
||||||
"noAccumulatingSpread": "off",
|
"noAccumulatingSpread": "off",
|
||||||
|
@ -3131,7 +3131,7 @@ saxes@^6.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
xmlchars "^2.2.0"
|
xmlchars "^2.2.0"
|
||||||
|
|
||||||
semver@^5.3.0, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4:
|
semver@^5.3.0, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2:
|
||||||
version "7.6.0"
|
version "7.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
|
||||||
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
|
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
|
||||||
@ -3695,7 +3695,7 @@ unleash-client@5.5.3:
|
|||||||
semver "^7.5.3"
|
semver "^7.5.3"
|
||||||
|
|
||||||
"unleash-server@file:../build":
|
"unleash-server@file:../build":
|
||||||
version "5.12.5"
|
version "5.12.7"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@slack/web-api" "^6.10.0"
|
"@slack/web-api" "^6.10.0"
|
||||||
"@wesleytodd/openapi" "^0.3.0"
|
"@wesleytodd/openapi" "^0.3.0"
|
||||||
@ -3750,7 +3750,7 @@ unleash-client@5.5.3:
|
|||||||
prom-client "^14.0.0"
|
prom-client "^14.0.0"
|
||||||
response-time "^2.3.2"
|
response-time "^2.3.2"
|
||||||
sanitize-filename "^1.6.3"
|
sanitize-filename "^1.6.3"
|
||||||
semver "^7.5.4"
|
semver "^7.6.2"
|
||||||
serve-favicon "^2.5.0"
|
serve-favicon "^2.5.0"
|
||||||
slug "^9.0.0"
|
slug "^9.0.0"
|
||||||
stoppable "^1.1.0"
|
stoppable "^1.1.0"
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
"gen:api:clean": "yarn gen:api && rm -rf src/openapi/apis && sed -i.bak '1q' src/openapi/index.ts && rm src/openapi/index.ts.bak"
|
"gen:api:clean": "yarn gen:api && rm -rf src/openapi/apis && sed -i.bak '1q' src/openapi/index.ts && rm src/openapi/index.ts.bak"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "1.6.4",
|
"@biomejs/biome": "1.8.0",
|
||||||
"@codemirror/lang-json": "6.0.1",
|
"@codemirror/lang-json": "6.0.1",
|
||||||
"@emotion/react": "11.11.4",
|
"@emotion/react": "11.11.4",
|
||||||
"@emotion/styled": "11.11.5",
|
"@emotion/styled": "11.11.5",
|
||||||
|
@ -15,30 +15,31 @@ interface IServiceAccountsActionsCellProps {
|
|||||||
onDelete: (event: React.SyntheticEvent) => void;
|
onDelete: (event: React.SyntheticEvent) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ServiceAccountsActionsCell: VFC<IServiceAccountsActionsCellProps> =
|
export const ServiceAccountsActionsCell: VFC<
|
||||||
({ onEdit, onDelete }) => {
|
IServiceAccountsActionsCellProps
|
||||||
return (
|
> = ({ onEdit, onDelete }) => {
|
||||||
<StyledBox>
|
return (
|
||||||
<PermissionIconButton
|
<StyledBox>
|
||||||
data-loading
|
<PermissionIconButton
|
||||||
onClick={onEdit}
|
data-loading
|
||||||
permission={ADMIN}
|
onClick={onEdit}
|
||||||
tooltipProps={{
|
permission={ADMIN}
|
||||||
title: 'Edit service account',
|
tooltipProps={{
|
||||||
}}
|
title: 'Edit service account',
|
||||||
>
|
}}
|
||||||
<Edit />
|
>
|
||||||
</PermissionIconButton>
|
<Edit />
|
||||||
<PermissionIconButton
|
</PermissionIconButton>
|
||||||
data-loading
|
<PermissionIconButton
|
||||||
onClick={onDelete}
|
data-loading
|
||||||
permission={ADMIN}
|
onClick={onDelete}
|
||||||
tooltipProps={{
|
permission={ADMIN}
|
||||||
title: 'Remove service account',
|
tooltipProps={{
|
||||||
}}
|
title: 'Remove service account',
|
||||||
>
|
}}
|
||||||
<Delete />
|
>
|
||||||
</PermissionIconButton>
|
<Delete />
|
||||||
</StyledBox>
|
</PermissionIconButton>
|
||||||
);
|
</StyledBox>
|
||||||
};
|
);
|
||||||
|
};
|
||||||
|
@ -73,37 +73,38 @@ const resolveIconColors = (state: ChangeRequestState, theme: Theme) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ChangeRequestReviewStatus: FC<ISuggestChangeReviewsStatusProps> =
|
export const ChangeRequestReviewStatus: FC<
|
||||||
({ changeRequest, onEditClick }) => {
|
ISuggestChangeReviewsStatusProps
|
||||||
const theme = useTheme();
|
> = ({ changeRequest, onEditClick }) => {
|
||||||
return (
|
const theme = useTheme();
|
||||||
<StyledOuterContainer>
|
return (
|
||||||
<StyledButtonContainer
|
<StyledOuterContainer>
|
||||||
{...resolveIconColors(changeRequest.state, theme)}
|
<StyledButtonContainer
|
||||||
>
|
{...resolveIconColors(changeRequest.state, theme)}
|
||||||
<ChangesAppliedIcon
|
>
|
||||||
style={{
|
<ChangesAppliedIcon
|
||||||
transform: `scale(1.5)`,
|
style={{
|
||||||
}}
|
transform: `scale(1.5)`,
|
||||||
/>
|
|
||||||
</StyledButtonContainer>
|
|
||||||
<StyledReviewStatusContainer
|
|
||||||
sx={{
|
|
||||||
backgroundColor:
|
|
||||||
changeRequest.state === 'In review'
|
|
||||||
? theme.palette.warning.light
|
|
||||||
: 'initial',
|
|
||||||
}}
|
}}
|
||||||
border={resolveBorder(changeRequest.state, theme)}
|
/>
|
||||||
>
|
</StyledButtonContainer>
|
||||||
<ResolveComponent
|
<StyledReviewStatusContainer
|
||||||
changeRequest={changeRequest}
|
sx={{
|
||||||
onEditClick={onEditClick}
|
backgroundColor:
|
||||||
/>
|
changeRequest.state === 'In review'
|
||||||
</StyledReviewStatusContainer>
|
? theme.palette.warning.light
|
||||||
</StyledOuterContainer>
|
: 'initial',
|
||||||
);
|
}}
|
||||||
};
|
border={resolveBorder(changeRequest.state, theme)}
|
||||||
|
>
|
||||||
|
<ResolveComponent
|
||||||
|
changeRequest={changeRequest}
|
||||||
|
onEditClick={onEditClick}
|
||||||
|
/>
|
||||||
|
</StyledReviewStatusContainer>
|
||||||
|
</StyledOuterContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
interface IResolveComponentProps {
|
interface IResolveComponentProps {
|
||||||
changeRequest: ChangeRequestType;
|
changeRequest: ChangeRequestType;
|
||||||
|
@ -25,84 +25,82 @@ const StyledContainer = styled(Box)(({ theme }) => ({
|
|||||||
gap: theme.spacing(2),
|
gap: theme.spacing(2),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export const ScheduleChangeRequestDialog: FC<ScheduleChangeRequestDialogProps> =
|
export const ScheduleChangeRequestDialog: FC<
|
||||||
({
|
ScheduleChangeRequestDialogProps
|
||||||
open,
|
> = ({
|
||||||
onConfirm,
|
open,
|
||||||
onClose,
|
onConfirm,
|
||||||
title,
|
onClose,
|
||||||
primaryButtonText,
|
title,
|
||||||
projectId,
|
primaryButtonText,
|
||||||
environment,
|
projectId,
|
||||||
disabled,
|
environment,
|
||||||
scheduledAt,
|
disabled,
|
||||||
}) => {
|
scheduledAt,
|
||||||
const [selectedDate, setSelectedDate] = useState(
|
}) => {
|
||||||
scheduledAt ? new Date(scheduledAt) : new Date(),
|
const [selectedDate, setSelectedDate] = useState(
|
||||||
);
|
scheduledAt ? new Date(scheduledAt) : new Date(),
|
||||||
const [error, setError] = useState<string | undefined>(undefined);
|
);
|
||||||
|
const [error, setError] = useState<string | undefined>(undefined);
|
||||||
|
|
||||||
const timezone = getBrowserTimezone();
|
const timezone = getBrowserTimezone();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialogue
|
<Dialogue
|
||||||
title={title}
|
title={title}
|
||||||
primaryButtonText={primaryButtonText}
|
primaryButtonText={primaryButtonText}
|
||||||
disabledPrimaryButton={disabled}
|
disabledPrimaryButton={disabled}
|
||||||
secondaryButtonText='Cancel'
|
secondaryButtonText='Cancel'
|
||||||
open={open}
|
open={open}
|
||||||
onClose={() => onClose()}
|
onClose={() => onClose()}
|
||||||
onClick={() => onConfirm(selectedDate)}
|
onClick={() => onConfirm(selectedDate)}
|
||||||
permissionButton={
|
permissionButton={
|
||||||
<PermissionButton
|
<PermissionButton
|
||||||
variant='contained'
|
variant='contained'
|
||||||
onClick={() => onConfirm(selectedDate)}
|
onClick={() => onConfirm(selectedDate)}
|
||||||
projectId={projectId}
|
projectId={projectId}
|
||||||
permission={APPLY_CHANGE_REQUEST}
|
permission={APPLY_CHANGE_REQUEST}
|
||||||
environmentId={environment}
|
environmentId={environment}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
>
|
>
|
||||||
{primaryButtonText}
|
{primaryButtonText}
|
||||||
</PermissionButton>
|
</PermissionButton>
|
||||||
}
|
}
|
||||||
fullWidth
|
fullWidth
|
||||||
|
>
|
||||||
|
<Alert severity={'info'} sx={{ mb: (theme) => theme.spacing(2) }}>
|
||||||
|
The time shown below is based on your browser's time zone.
|
||||||
|
</Alert>
|
||||||
|
<Typography
|
||||||
|
variant={'body1'}
|
||||||
|
sx={{ mb: (theme) => theme.spacing(4) }}
|
||||||
>
|
>
|
||||||
<Alert
|
Select the date and time when these changes should be applied.
|
||||||
severity={'info'}
|
If you change your mind later, you can reschedule the changes or
|
||||||
sx={{ mb: (theme) => theme.spacing(2) }}
|
apply them immediately.
|
||||||
>
|
</Typography>
|
||||||
The time shown below is based on your browser's time zone.
|
<StyledContainer>
|
||||||
</Alert>
|
<DateTimePicker
|
||||||
<Typography
|
label='Date'
|
||||||
variant={'body1'}
|
value={selectedDate}
|
||||||
sx={{ mb: (theme) => theme.spacing(4) }}
|
onChange={(date) => {
|
||||||
>
|
setError(undefined);
|
||||||
Select the date and time when these changes should be
|
if (date < new Date()) {
|
||||||
applied. If you change your mind later, you can reschedule
|
setError(
|
||||||
the changes or apply them immediately.
|
`The time you provided (${date.toLocaleString()}) is not valid because it's in the past. Please select a time in the future.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
setSelectedDate(date);
|
||||||
|
}}
|
||||||
|
min={new Date()}
|
||||||
|
error={Boolean(error)}
|
||||||
|
errorText={error}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
<Typography variant={'body2'}>
|
||||||
|
Your browser's time zone is {timezone}
|
||||||
</Typography>
|
</Typography>
|
||||||
<StyledContainer>
|
</StyledContainer>
|
||||||
<DateTimePicker
|
</Dialogue>
|
||||||
label='Date'
|
);
|
||||||
value={selectedDate}
|
};
|
||||||
onChange={(date) => {
|
|
||||||
setError(undefined);
|
|
||||||
if (date < new Date()) {
|
|
||||||
setError(
|
|
||||||
`The time you provided (${date.toLocaleString()}) is not valid because it's in the past. Please select a time in the future.`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
setSelectedDate(date);
|
|
||||||
}}
|
|
||||||
min={new Date()}
|
|
||||||
error={Boolean(error)}
|
|
||||||
errorText={error}
|
|
||||||
required
|
|
||||||
/>
|
|
||||||
<Typography variant={'body2'}>
|
|
||||||
Your browser's time zone is {timezone}
|
|
||||||
</Typography>
|
|
||||||
</StyledContainer>
|
|
||||||
</Dialogue>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
@ -44,41 +44,39 @@ const StyledRightButton = styled(Button)(({ theme }) => ({
|
|||||||
minWidth: '125px',
|
minWidth: '125px',
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export const ConstraintAccordionEditBody: React.FC<IConstraintAccordionBody> =
|
export const ConstraintAccordionEditBody: React.FC<
|
||||||
({ localConstraint, children, triggerTransition, setAction, onSubmit }) => {
|
IConstraintAccordionBody
|
||||||
return (
|
> = ({ localConstraint, children, triggerTransition, setAction, onSubmit }) => {
|
||||||
<>
|
return (
|
||||||
<StyledInputContainer>
|
<>
|
||||||
<ConditionallyRender
|
<StyledInputContainer>
|
||||||
condition={oneOf(
|
<ConditionallyRender
|
||||||
newOperators,
|
condition={oneOf(newOperators, localConstraint.operator)}
|
||||||
localConstraint.operator,
|
show={<OperatorUpgradeAlert />}
|
||||||
)}
|
/>
|
||||||
show={<OperatorUpgradeAlert />}
|
{children}
|
||||||
/>
|
</StyledInputContainer>
|
||||||
{children}
|
<StyledButtonContainer>
|
||||||
</StyledInputContainer>
|
<StyledInputButtonContainer>
|
||||||
<StyledButtonContainer>
|
<StyledLeftButton
|
||||||
<StyledInputButtonContainer>
|
type='button'
|
||||||
<StyledLeftButton
|
onClick={onSubmit}
|
||||||
type='button'
|
variant='outlined'
|
||||||
onClick={onSubmit}
|
color='primary'
|
||||||
variant='outlined'
|
data-testid='CONSTRAINT_SAVE_BUTTON'
|
||||||
color='primary'
|
>
|
||||||
data-testid='CONSTRAINT_SAVE_BUTTON'
|
Done
|
||||||
>
|
</StyledLeftButton>
|
||||||
Done
|
<StyledRightButton
|
||||||
</StyledLeftButton>
|
onClick={() => {
|
||||||
<StyledRightButton
|
setAction(CANCEL);
|
||||||
onClick={() => {
|
triggerTransition();
|
||||||
setAction(CANCEL);
|
}}
|
||||||
triggerTransition();
|
>
|
||||||
}}
|
Cancel
|
||||||
>
|
</StyledRightButton>
|
||||||
Cancel
|
</StyledInputButtonContainer>
|
||||||
</StyledRightButton>
|
</StyledButtonContainer>
|
||||||
</StyledInputButtonContainer>
|
</>
|
||||||
</StyledButtonContainer>
|
);
|
||||||
</>
|
};
|
||||||
);
|
|
||||||
};
|
|
||||||
|
@ -43,33 +43,31 @@ const StyledRightButton = styled(Button)(({ theme }) => ({
|
|||||||
minWidth: '125px',
|
minWidth: '125px',
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export const ConstraintAccordionEditBody: React.FC<IConstraintAccordionBody> =
|
export const ConstraintAccordionEditBody: React.FC<
|
||||||
({ localConstraint, children, triggerTransition, setAction, onSubmit }) => {
|
IConstraintAccordionBody
|
||||||
return (
|
> = ({ localConstraint, children, triggerTransition, setAction, onSubmit }) => {
|
||||||
<>
|
return (
|
||||||
<StyledInputContainer>
|
<>
|
||||||
<ConditionallyRender
|
<StyledInputContainer>
|
||||||
condition={oneOf(
|
<ConditionallyRender
|
||||||
newOperators,
|
condition={oneOf(newOperators, localConstraint.operator)}
|
||||||
localConstraint.operator,
|
show={<OperatorUpgradeAlert />}
|
||||||
)}
|
/>
|
||||||
show={<OperatorUpgradeAlert />}
|
{children}
|
||||||
/>
|
</StyledInputContainer>
|
||||||
{children}
|
<StyledButtonContainer>
|
||||||
</StyledInputContainer>
|
<StyledInputButtonContainer>
|
||||||
<StyledButtonContainer>
|
<StyledLeftButton
|
||||||
<StyledInputButtonContainer>
|
type='button'
|
||||||
<StyledLeftButton
|
onClick={onSubmit}
|
||||||
type='button'
|
variant='outlined'
|
||||||
onClick={onSubmit}
|
color='primary'
|
||||||
variant='outlined'
|
data-testid='CONSTRAINT_SAVE_BUTTON'
|
||||||
color='primary'
|
>
|
||||||
data-testid='CONSTRAINT_SAVE_BUTTON'
|
Done
|
||||||
>
|
</StyledLeftButton>
|
||||||
Done
|
</StyledInputButtonContainer>
|
||||||
</StyledLeftButton>
|
</StyledButtonContainer>
|
||||||
</StyledInputButtonContainer>
|
</>
|
||||||
</StyledButtonContainer>
|
);
|
||||||
</>
|
};
|
||||||
);
|
|
||||||
};
|
|
||||||
|
@ -10,18 +10,19 @@ interface PermissionCheckboxMenuItemProps {
|
|||||||
onClick: () => void;
|
onClick: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PermissionCheckboxMenuItem: FC<PermissionCheckboxMenuItemProps> =
|
export const PermissionCheckboxMenuItem: FC<
|
||||||
({ permission, projectId, environment, checked, onClick, ...props }) => {
|
PermissionCheckboxMenuItemProps
|
||||||
const hasPermissions = useHasProjectEnvironmentAccess(
|
> = ({ permission, projectId, environment, checked, onClick, ...props }) => {
|
||||||
permission,
|
const hasPermissions = useHasProjectEnvironmentAccess(
|
||||||
projectId,
|
permission,
|
||||||
environment,
|
projectId,
|
||||||
);
|
environment,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MenuItem disabled={!hasPermissions} onClick={onClick} {...props}>
|
<MenuItem disabled={!hasPermissions} onClick={onClick} {...props}>
|
||||||
<Checkbox checked={checked} />
|
<Checkbox checked={checked} />
|
||||||
{environment}
|
{environment}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -26,9 +26,7 @@ export const FlagsProjectChart: VFC<IFlagsProjectChartProps> = ({
|
|||||||
|
|
||||||
const data = useProjectChartData(projectFlagTrends);
|
const data = useProjectChartData(projectFlagTrends);
|
||||||
const notEnoughData = useMemo(
|
const notEnoughData = useMemo(
|
||||||
() =>
|
() => !isLoading && !data.datasets.some((d) => d.data.length > 1),
|
||||||
!isLoading &&
|
|
||||||
(data.datasets.some((d) => d.data.length > 1) ? false : true),
|
|
||||||
[data, isLoading],
|
[data, isLoading],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -112,23 +112,17 @@ export const MetricsSummaryTooltip: VFC<{ tooltip: TooltipState | null }> = ({
|
|||||||
/>
|
/>
|
||||||
<InfoLine
|
<InfoLine
|
||||||
iconChar={'▣ '}
|
iconChar={'▣ '}
|
||||||
title={`Total requests: ${(
|
title={`Total requests: ${(point.value.totalRequests ?? 0).toLocaleString()}`}
|
||||||
point.value.totalRequests ?? 0
|
|
||||||
).toLocaleString()}`}
|
|
||||||
color={'info'}
|
color={'info'}
|
||||||
/>
|
/>
|
||||||
<InfoLine
|
<InfoLine
|
||||||
iconChar={'▲ '}
|
iconChar={'▲ '}
|
||||||
title={`Exposed: ${(
|
title={`Exposed: ${(point.value.totalYes ?? 0).toLocaleString()}`}
|
||||||
point.value.totalYes ?? 0
|
|
||||||
).toLocaleString()}`}
|
|
||||||
color={'success'}
|
color={'success'}
|
||||||
/>
|
/>
|
||||||
<InfoLine
|
<InfoLine
|
||||||
iconChar={'▼ '}
|
iconChar={'▼ '}
|
||||||
title={`Not exposed: ${(
|
title={`Not exposed: ${(point.value.totalNo ?? 0).toLocaleString()}`}
|
||||||
point.value.totalNo ?? 0
|
|
||||||
).toLocaleString()}`}
|
|
||||||
color={'error'}
|
color={'error'}
|
||||||
/>
|
/>
|
||||||
<ConditionallyRender
|
<ConditionallyRender
|
||||||
|
@ -94,10 +94,7 @@ export const ProjectHealthChart: VFC<IProjectHealthChartProps> = ({
|
|||||||
: projectsData;
|
: projectsData;
|
||||||
const notEnoughData = useMemo(
|
const notEnoughData = useMemo(
|
||||||
() =>
|
() =>
|
||||||
!isLoading &&
|
!isLoading && !projectsData.datasets.some((d) => d.data.length > 1),
|
||||||
(projectsData.datasets.some((d) => d.data.length > 1)
|
|
||||||
? false
|
|
||||||
: true),
|
|
||||||
[projectsData, isLoading],
|
[projectsData, isLoading],
|
||||||
);
|
);
|
||||||
const data =
|
const data =
|
||||||
|
@ -26,9 +26,7 @@ export const UsersPerProjectChart: VFC<IUsersPerProjectChartProps> = ({
|
|||||||
|
|
||||||
const data = useProjectChartData(projectFlagTrends);
|
const data = useProjectChartData(projectFlagTrends);
|
||||||
const notEnoughData = useMemo(
|
const notEnoughData = useMemo(
|
||||||
() =>
|
() => !isLoading && !data.datasets.some((d) => d.data.length > 1),
|
||||||
!isLoading &&
|
|
||||||
(data.datasets.some((d) => d.data.length > 1) ? false : true),
|
|
||||||
[data, isLoading],
|
[data, isLoading],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -46,13 +46,13 @@ export const usePlaceholderData = (
|
|||||||
data:
|
data:
|
||||||
type === 'rising'
|
type === 'rising'
|
||||||
? [
|
? [
|
||||||
3, 5, 15, 17, 25, 40, 47, 48, 55,
|
3, 5, 15, 17, 25, 40, 47, 48, 55,
|
||||||
65, 62, 72, 75, 73, 80,
|
65, 62, 72, 75, 73, 80,
|
||||||
]
|
]
|
||||||
: [
|
: [
|
||||||
54, 52, 53, 49, 54, 50, 47, 46,
|
54, 52, 53, 49, 54, 50, 47, 46, 51,
|
||||||
51, 51, 50, 51, 49, 49, 51,
|
51, 50, 51, 49, 49, 51,
|
||||||
],
|
],
|
||||||
borderColor: theme.palette.primary.light,
|
borderColor: theme.palette.primary.light,
|
||||||
backgroundColor: fill
|
backgroundColor: fill
|
||||||
? fillGradientPrimary
|
? fillGradientPrimary
|
||||||
|
@ -18,29 +18,30 @@ interface ILoginHistorySuccessfulCellProps {
|
|||||||
value: boolean;
|
value: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const LoginHistorySuccessfulCell: VFC<ILoginHistorySuccessfulCellProps> =
|
export const LoginHistorySuccessfulCell: VFC<
|
||||||
({ row, value }) => {
|
ILoginHistorySuccessfulCellProps
|
||||||
const { searchQuery } = useSearchHighlightContext();
|
> = ({ row, value }) => {
|
||||||
|
const { searchQuery } = useSearchHighlightContext();
|
||||||
if (value)
|
|
||||||
return (
|
|
||||||
<StyledBox>
|
|
||||||
<Badge color='success'>True</Badge>
|
|
||||||
</StyledBox>
|
|
||||||
);
|
|
||||||
|
|
||||||
|
if (value)
|
||||||
return (
|
return (
|
||||||
<StyledBox>
|
<StyledBox>
|
||||||
<HtmlTooltip
|
<Badge color='success'>True</Badge>
|
||||||
arrow
|
|
||||||
title={
|
|
||||||
<Highlighter search={searchQuery}>
|
|
||||||
{row.original.failure_reason}
|
|
||||||
</Highlighter>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Badge color='error'>False</Badge>
|
|
||||||
</HtmlTooltip>
|
|
||||||
</StyledBox>
|
</StyledBox>
|
||||||
);
|
);
|
||||||
};
|
|
||||||
|
return (
|
||||||
|
<StyledBox>
|
||||||
|
<HtmlTooltip
|
||||||
|
arrow
|
||||||
|
title={
|
||||||
|
<Highlighter search={searchQuery}>
|
||||||
|
{row.original.failure_reason}
|
||||||
|
</Highlighter>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<Badge color='error'>False</Badge>
|
||||||
|
</HtmlTooltip>
|
||||||
|
</StyledBox>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
@ -9,37 +9,36 @@ interface IPlaygroundGuidanceSectionProps {
|
|||||||
sectionNumber: string;
|
sectionNumber: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PlaygroundGuidanceSection: VFC<IPlaygroundGuidanceSectionProps> =
|
export const PlaygroundGuidanceSection: VFC<
|
||||||
({ headerText, bodyText, sectionNumber }) => {
|
IPlaygroundGuidanceSectionProps
|
||||||
return (
|
> = ({ headerText, bodyText, sectionNumber }) => {
|
||||||
<Box
|
return (
|
||||||
sx={{
|
<Box
|
||||||
display: 'flex',
|
sx={{
|
||||||
alignItems: 'flex-start',
|
display: 'flex',
|
||||||
mt: 2,
|
alignItems: 'flex-start',
|
||||||
flexDirection: 'column',
|
mt: 2,
|
||||||
}}
|
flexDirection: 'column',
|
||||||
>
|
}}
|
||||||
<Box sx={{ display: 'flex' }}>
|
>
|
||||||
<Box>
|
<Box sx={{ display: 'flex' }}>
|
||||||
<GuidanceIndicator>{sectionNumber}</GuidanceIndicator>
|
<Box>
|
||||||
</Box>
|
<GuidanceIndicator>{sectionNumber}</GuidanceIndicator>
|
||||||
<Box
|
</Box>
|
||||||
sx={{ ml: 2, display: 'flex', flexDirection: 'column' }}
|
<Box sx={{ ml: 2, display: 'flex', flexDirection: 'column' }}>
|
||||||
>
|
<Typography variant='body1' sx={{ fontWeight: 'bold' }}>
|
||||||
<Typography variant='body1' sx={{ fontWeight: 'bold' }}>
|
{headerText}
|
||||||
{headerText}
|
</Typography>
|
||||||
</Typography>
|
<ConditionallyRender
|
||||||
<ConditionallyRender
|
condition={Boolean(bodyText)}
|
||||||
condition={Boolean(bodyText)}
|
show={
|
||||||
show={
|
<Typography variant='body1' sx={{ mt: 1 }}>
|
||||||
<Typography variant='body1' sx={{ mt: 1 }}>
|
{bodyText}
|
||||||
{bodyText}
|
</Typography>
|
||||||
</Typography>
|
}
|
||||||
}
|
/>
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
</Box>
|
||||||
};
|
);
|
||||||
|
};
|
||||||
|
@ -24,73 +24,69 @@ const StyledStrategyExecutionWrapper = styled('div')(({ theme }) => ({
|
|||||||
padding: theme.spacing(0),
|
padding: theme.spacing(0),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export const DisabledStrategyExecution: VFC<IDisabledStrategyExecutionProps> =
|
export const DisabledStrategyExecution: VFC<
|
||||||
({ strategyResult, input, percentageFill }) => {
|
IDisabledStrategyExecutionProps
|
||||||
const { name, constraints, segments, parameters } = strategyResult;
|
> = ({ strategyResult, input, percentageFill }) => {
|
||||||
|
const { name, constraints, segments, parameters } = strategyResult;
|
||||||
|
|
||||||
const hasSegments = Boolean(segments && segments.length > 0);
|
const hasSegments = Boolean(segments && segments.length > 0);
|
||||||
const hasConstraints = Boolean(constraints && constraints?.length > 0);
|
const hasConstraints = Boolean(constraints && constraints?.length > 0);
|
||||||
const hasExecutionParameters =
|
const hasExecutionParameters =
|
||||||
name !== 'default' &&
|
name !== 'default' &&
|
||||||
Object.keys(formattedStrategyNames).includes(name);
|
Object.keys(formattedStrategyNames).includes(name);
|
||||||
const hasCustomStrategyParameters =
|
const hasCustomStrategyParameters =
|
||||||
Object.keys(parameters).length > 0 &&
|
Object.keys(parameters).length > 0 &&
|
||||||
strategyResult.result.evaluationStatus === 'incomplete'; // Use of custom strategy can be more explicit from the API
|
strategyResult.result.evaluationStatus === 'incomplete'; // Use of custom strategy can be more explicit from the API
|
||||||
|
|
||||||
if (!parameters) {
|
if (!parameters) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const items = [
|
const items = [
|
||||||
hasSegments && (
|
hasSegments && <SegmentExecutionWithoutResult segments={segments} />,
|
||||||
<SegmentExecutionWithoutResult segments={segments} />
|
hasConstraints && (
|
||||||
),
|
<ConstraintExecutionWithoutResults constraints={constraints} />
|
||||||
hasConstraints && (
|
),
|
||||||
<ConstraintExecutionWithoutResults constraints={constraints} />
|
hasExecutionParameters && (
|
||||||
),
|
<PlaygroundResultStrategyExecutionParameters
|
||||||
hasExecutionParameters && (
|
parameters={parameters}
|
||||||
<PlaygroundResultStrategyExecutionParameters
|
constraints={constraints}
|
||||||
parameters={parameters}
|
input={input}
|
||||||
constraints={constraints}
|
disabled
|
||||||
input={input}
|
/>
|
||||||
disabled
|
),
|
||||||
/>
|
hasCustomStrategyParameters && (
|
||||||
),
|
<CustomStrategyParams strategyName={name} parameters={parameters} />
|
||||||
hasCustomStrategyParameters && (
|
),
|
||||||
<CustomStrategyParams
|
name === 'default' && (
|
||||||
strategyName={name}
|
<StyledBoxSummary
|
||||||
parameters={parameters}
|
sx={(theme) => ({
|
||||||
/>
|
width: '100%',
|
||||||
),
|
color: theme.palette.text.secondary,
|
||||||
name === 'default' && (
|
})}
|
||||||
<StyledBoxSummary
|
>
|
||||||
sx={(theme) => ({
|
The standard strategy is <Badge color={'disabled'}>ON</Badge>{' '}
|
||||||
width: '100%',
|
for all users.
|
||||||
color: theme.palette.text.secondary,
|
</StyledBoxSummary>
|
||||||
})}
|
),
|
||||||
>
|
].filter(Boolean);
|
||||||
The standard strategy is{' '}
|
|
||||||
<Badge color={'disabled'}>ON</Badge> for all users.
|
|
||||||
</StyledBoxSummary>
|
|
||||||
),
|
|
||||||
].filter(Boolean);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledStrategyExecutionWrapper>
|
<StyledStrategyExecutionWrapper>
|
||||||
{items.map((item, index) => (
|
{items.map((item, index) => (
|
||||||
<Fragment key={index}>
|
<Fragment key={index}>
|
||||||
<ConditionallyRender
|
<ConditionallyRender
|
||||||
condition={
|
condition={
|
||||||
index > 0 &&
|
index > 0 &&
|
||||||
(strategyResult.name === 'flexibleRollout'
|
(strategyResult.name === 'flexibleRollout'
|
||||||
? index < items.length
|
? index < items.length
|
||||||
: index < items.length - 1)
|
: index < items.length - 1)
|
||||||
}
|
}
|
||||||
show={<StrategySeparator text='AND' />}
|
show={<StrategySeparator text='AND' />}
|
||||||
/>
|
/>
|
||||||
{item}
|
{item}
|
||||||
</Fragment>
|
</Fragment>
|
||||||
))}
|
))}
|
||||||
</StyledStrategyExecutionWrapper>
|
</StyledStrategyExecutionWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -18,7 +18,7 @@ export const SingleSelectConfigButton: FC<SingleSelectConfigButtonProps> = ({
|
|||||||
const handleChange = (value: any) => {
|
const handleChange = (value: any) => {
|
||||||
onChange(value);
|
onChange(value);
|
||||||
setAnchorEl(null);
|
setAnchorEl(null);
|
||||||
props.onClose && props.onClose();
|
props.onClose?.();
|
||||||
|
|
||||||
setRecentlyClosed(true);
|
setRecentlyClosed(true);
|
||||||
// this is a hack to prevent the button from being
|
// this is a hack to prevent the button from being
|
||||||
|
@ -117,232 +117,231 @@ const useFeatureNamePatternTracking = () => {
|
|||||||
return { trackPattern, setPreviousPattern };
|
return { trackPattern, setPreviousPattern };
|
||||||
};
|
};
|
||||||
|
|
||||||
const ProjectEnterpriseSettingsForm: React.FC<IProjectEnterpriseSettingsForm> =
|
const ProjectEnterpriseSettingsForm: React.FC<
|
||||||
({
|
IProjectEnterpriseSettingsForm
|
||||||
children,
|
> = ({
|
||||||
handleSubmit,
|
children,
|
||||||
projectId,
|
handleSubmit,
|
||||||
projectMode,
|
projectId,
|
||||||
featureNamingExample,
|
projectMode,
|
||||||
featureNamingPattern,
|
featureNamingExample,
|
||||||
featureNamingDescription,
|
featureNamingPattern,
|
||||||
setFeatureNamingExample,
|
featureNamingDescription,
|
||||||
setFeatureNamingPattern,
|
setFeatureNamingExample,
|
||||||
setFeatureNamingDescription,
|
setFeatureNamingPattern,
|
||||||
setProjectMode,
|
setFeatureNamingDescription,
|
||||||
errors,
|
setProjectMode,
|
||||||
|
errors,
|
||||||
|
}) => {
|
||||||
|
const { setPreviousPattern, trackPattern } =
|
||||||
|
useFeatureNamePatternTracking();
|
||||||
|
|
||||||
|
const projectModeOptions = [
|
||||||
|
{ key: 'open', label: 'open' },
|
||||||
|
{ key: 'protected', label: 'protected' },
|
||||||
|
{ key: 'private', label: 'private' },
|
||||||
|
];
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setPreviousPattern(featureNamingPattern || '');
|
||||||
|
}, [projectId]);
|
||||||
|
|
||||||
|
const updateNamingExampleError = ({
|
||||||
|
example,
|
||||||
|
pattern,
|
||||||
|
}: {
|
||||||
|
example: string;
|
||||||
|
pattern: string;
|
||||||
}) => {
|
}) => {
|
||||||
const { setPreviousPattern, trackPattern } =
|
const validationResult = validateFeatureNamingExample({
|
||||||
useFeatureNamePatternTracking();
|
|
||||||
|
|
||||||
const projectModeOptions = [
|
|
||||||
{ key: 'open', label: 'open' },
|
|
||||||
{ key: 'protected', label: 'protected' },
|
|
||||||
{ key: 'private', label: 'private' },
|
|
||||||
];
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setPreviousPattern(featureNamingPattern || '');
|
|
||||||
}, [projectId]);
|
|
||||||
|
|
||||||
const updateNamingExampleError = ({
|
|
||||||
example,
|
|
||||||
pattern,
|
pattern,
|
||||||
}: {
|
example,
|
||||||
example: string;
|
featureNamingPatternError: errors.featureNamingPattern,
|
||||||
pattern: string;
|
});
|
||||||
}) => {
|
|
||||||
const validationResult = validateFeatureNamingExample({
|
|
||||||
pattern,
|
|
||||||
example,
|
|
||||||
featureNamingPatternError: errors.featureNamingPattern,
|
|
||||||
});
|
|
||||||
|
|
||||||
switch (validationResult.state) {
|
switch (validationResult.state) {
|
||||||
case 'invalid':
|
case 'invalid':
|
||||||
errors.namingExample = validationResult.reason;
|
errors.namingExample = validationResult.reason;
|
||||||
break;
|
break;
|
||||||
case 'valid':
|
case 'valid':
|
||||||
delete errors.namingExample;
|
delete errors.namingExample;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
const onSetFeatureNamingPattern = (regex: string) => {
|
|
||||||
const disallowedStrings = [
|
|
||||||
' ',
|
|
||||||
'\\t',
|
|
||||||
'\\s',
|
|
||||||
'\\n',
|
|
||||||
'\\r',
|
|
||||||
'\\f',
|
|
||||||
'\\v',
|
|
||||||
];
|
|
||||||
if (
|
|
||||||
disallowedStrings.some((blockedString) =>
|
|
||||||
regex.includes(blockedString),
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
errors.featureNamingPattern =
|
|
||||||
'Whitespace is not allowed in the expression';
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
new RegExp(regex);
|
|
||||||
delete errors.featureNamingPattern;
|
|
||||||
} catch (e) {
|
|
||||||
errors.featureNamingPattern = 'Invalid regular expression';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setFeatureNamingPattern?.(regex);
|
|
||||||
updateNamingExampleError({
|
|
||||||
pattern: regex,
|
|
||||||
example: featureNamingExample || '',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSetFeatureNamingExample = (example: string) => {
|
|
||||||
setFeatureNamingExample?.(example);
|
|
||||||
updateNamingExampleError({
|
|
||||||
pattern: featureNamingPattern || '',
|
|
||||||
example,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSetFeatureNamingDescription = (description: string) => {
|
|
||||||
setFeatureNamingDescription?.(description);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<StyledForm
|
|
||||||
onSubmit={(submitEvent) => {
|
|
||||||
handleSubmit(submitEvent);
|
|
||||||
trackPattern(featureNamingPattern);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<>
|
|
||||||
<Box
|
|
||||||
sx={{
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
marginBottom: 1,
|
|
||||||
gap: 1,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<p>What is your project collaboration mode?</p>
|
|
||||||
<CollaborationModeTooltip />
|
|
||||||
</Box>
|
|
||||||
<StyledSelect
|
|
||||||
id='project-mode'
|
|
||||||
value={projectMode}
|
|
||||||
label='Project collaboration mode'
|
|
||||||
name='Project collaboration mode'
|
|
||||||
onChange={(e) => {
|
|
||||||
setProjectMode?.(e.target.value as ProjectMode);
|
|
||||||
}}
|
|
||||||
options={projectModeOptions}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
<StyledFieldset>
|
|
||||||
<Box
|
|
||||||
sx={{
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
marginBottom: 1,
|
|
||||||
gap: 1,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<legend>Feature flag naming pattern?</legend>
|
|
||||||
<FeatureFlagNamingTooltip />
|
|
||||||
</Box>
|
|
||||||
<StyledSubtitle>
|
|
||||||
<StyledPatternNamingExplanation id='pattern-naming-description'>
|
|
||||||
<p>
|
|
||||||
Define a{' '}
|
|
||||||
<a
|
|
||||||
href={`https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Cheatsheet`}
|
|
||||||
target='_blank'
|
|
||||||
rel='noreferrer'
|
|
||||||
>
|
|
||||||
JavaScript RegEx
|
|
||||||
</a>{' '}
|
|
||||||
used to enforce feature flag names within this
|
|
||||||
project. The regex will be surrounded by a
|
|
||||||
leading <code>^</code> and a trailing{' '}
|
|
||||||
<code>$</code>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Leave it empty if you 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>
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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;
|
export default ProjectEnterpriseSettingsForm;
|
||||||
|
@ -13,159 +13,156 @@ import { ReactComponent as ChangeRequestProcessWithScheduleImage } from 'assets/
|
|||||||
|
|
||||||
type IChangeRequestProcessHelpProps = {};
|
type IChangeRequestProcessHelpProps = {};
|
||||||
|
|
||||||
export const ChangeRequestProcessHelp: VFC<IChangeRequestProcessHelpProps> =
|
export const ChangeRequestProcessHelp: VFC<
|
||||||
() => {
|
IChangeRequestProcessHelpProps
|
||||||
const ref = useRef<HTMLButtonElement>(null);
|
> = () => {
|
||||||
const theme = useTheme();
|
const ref = useRef<HTMLButtonElement>(null);
|
||||||
const isSmallScreen = useMediaQuery(theme.breakpoints.down('md'));
|
const theme = useTheme();
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const isSmallScreen = useMediaQuery(theme.breakpoints.down('md'));
|
||||||
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
|
|
||||||
const descriptionId = 'change-request-process-description';
|
const descriptionId = 'change-request-process-description';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ConditionallyRender
|
<ConditionallyRender
|
||||||
condition={!isSmallScreen}
|
condition={!isSmallScreen}
|
||||||
show={
|
show={
|
||||||
<Typography variant='body2'>
|
<Typography variant='body2'>
|
||||||
Show change request process{' '}
|
Show change request process{' '}
|
||||||
</Typography>
|
</Typography>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<IconButton
|
<IconButton
|
||||||
title='Change request process'
|
title='Change request process'
|
||||||
ref={ref}
|
ref={ref}
|
||||||
onClick={() => setIsOpen(true)}
|
onClick={() => setIsOpen(true)}
|
||||||
|
>
|
||||||
|
<HelpOutline />
|
||||||
|
</IconButton>
|
||||||
|
<Popover
|
||||||
|
open={isOpen}
|
||||||
|
anchorEl={ref.current}
|
||||||
|
anchorOrigin={{
|
||||||
|
vertical: 'bottom',
|
||||||
|
horizontal: 'right',
|
||||||
|
}}
|
||||||
|
transformOrigin={{
|
||||||
|
vertical: 'top',
|
||||||
|
horizontal: 'right',
|
||||||
|
}}
|
||||||
|
onClose={() => setIsOpen(false)}
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
sx={{ p: { xs: 2, md: 4 }, maxWidth: 920 }}
|
||||||
|
id={descriptionId}
|
||||||
>
|
>
|
||||||
<HelpOutline />
|
<Typography variant='h3'>
|
||||||
</IconButton>
|
Change request process:
|
||||||
<Popover
|
</Typography>
|
||||||
open={isOpen}
|
<Typography variant='body2'>
|
||||||
anchorEl={ref.current}
|
<ol>
|
||||||
anchorOrigin={{
|
<li>
|
||||||
vertical: 'bottom',
|
When changes are detected they are added to a
|
||||||
horizontal: 'right',
|
draft.
|
||||||
}}
|
</li>
|
||||||
transformOrigin={{
|
<li>
|
||||||
vertical: 'top',
|
The user can submit the changes for review or
|
||||||
horizontal: 'right',
|
discard them.
|
||||||
}}
|
<ul>
|
||||||
onClose={() => setIsOpen(false)}
|
<li>
|
||||||
>
|
Once submitted, the changes are visible
|
||||||
<Box
|
to everyone.
|
||||||
sx={{ p: { xs: 2, md: 4 }, maxWidth: 920 }}
|
</li>
|
||||||
id={descriptionId}
|
</ul>
|
||||||
>
|
</li>
|
||||||
<Typography variant='h3'>
|
<li>
|
||||||
Change request process:
|
A user with the{' '}
|
||||||
</Typography>
|
<strong>“Review change request”</strong>{' '}
|
||||||
<Typography variant='body2'>
|
permission can approve or reject the changes.
|
||||||
<ol>
|
<ul>
|
||||||
|
<li>
|
||||||
|
The user who created the change request
|
||||||
|
can cancel it at this stage.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Rejecting or canceling the changes will
|
||||||
|
close the change request.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<>
|
||||||
<li>
|
<li>
|
||||||
When changes are detected they are added to
|
Once approved, a user with the{' '}
|
||||||
a draft.
|
<strong>
|
||||||
</li>
|
“Apply/Reject change request”
|
||||||
<li>
|
</strong>{' '}
|
||||||
The user can submit the changes for review
|
permission can apply, schedule, or reject
|
||||||
or discard them.
|
the changes.
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
Once submitted, the changes are
|
If applied, the changes will take
|
||||||
visible to everyone.
|
effect and the change request will
|
||||||
|
be closed.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
If scheduled, Unleash will attempt
|
||||||
|
to apply the changes at the
|
||||||
|
scheduled date and time.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The user who created the change
|
||||||
|
request can cancel the changes up
|
||||||
|
until they are applied or scheduled.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
A user with the{' '}
|
A user with the{' '}
|
||||||
<strong>“Review change request”</strong>{' '}
|
<strong>
|
||||||
permission can approve or reject the
|
“Apply/Reject change request”
|
||||||
changes.
|
</strong>{' '}
|
||||||
|
permission can reschedule, reject, or
|
||||||
|
immediately apply a scheduled change
|
||||||
|
request.
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
The user who created the change
|
If any of the flags or strategies in
|
||||||
request can cancel it at this stage.
|
the change request are archived or
|
||||||
|
deleted (outside of the change
|
||||||
|
request), thus creating a conflict,
|
||||||
|
Unleash will send an email out to
|
||||||
|
the change request author and to the
|
||||||
|
user who (last) scheduled the change
|
||||||
|
request.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Rejecting or canceling the changes
|
If the scheduled changes contain any
|
||||||
will close the change request.
|
conflicts, Unleash will refuse to
|
||||||
|
apply them.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
If the user who scheduled the
|
||||||
|
changes is removed from this Unleash
|
||||||
|
instance, the scheduled changes will
|
||||||
|
also not be applied.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<>
|
</>
|
||||||
<li>
|
</ol>
|
||||||
Once approved, a user with the{' '}
|
</Typography>
|
||||||
<strong>
|
<Box sx={{ mt: 3 }}>
|
||||||
“Apply/Reject change request”
|
<ChangeRequestProcessWithScheduleImage
|
||||||
</strong>{' '}
|
aria-details={descriptionId}
|
||||||
permission can apply, schedule, or
|
style={{
|
||||||
reject the changes.
|
maxWidth: '100%',
|
||||||
<ul>
|
height: 'auto',
|
||||||
<li>
|
}}
|
||||||
If applied, the changes will
|
/>
|
||||||
take effect and the change
|
|
||||||
request will be closed.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
If scheduled, Unleash will
|
|
||||||
attempt to apply the changes at
|
|
||||||
the scheduled date and time.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
The user who created the change
|
|
||||||
request can cancel the changes
|
|
||||||
up until they are applied or
|
|
||||||
scheduled.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
A user with the{' '}
|
|
||||||
<strong>
|
|
||||||
“Apply/Reject change request”
|
|
||||||
</strong>{' '}
|
|
||||||
permission can reschedule, reject, or
|
|
||||||
immediately apply a scheduled change
|
|
||||||
request.
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
If any of the flags or
|
|
||||||
strategies in the change request
|
|
||||||
are archived or deleted (outside
|
|
||||||
of the change request), thus
|
|
||||||
creating a conflict, Unleash
|
|
||||||
will send an email out to the
|
|
||||||
change request author and to the
|
|
||||||
user who (last) scheduled the
|
|
||||||
change request.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
If the scheduled changes contain
|
|
||||||
any conflicts, Unleash will
|
|
||||||
refuse to apply them.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
If the user who scheduled the
|
|
||||||
changes is removed from this
|
|
||||||
Unleash instance, the scheduled
|
|
||||||
changes will also not be
|
|
||||||
applied.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</>
|
|
||||||
</ol>
|
|
||||||
</Typography>
|
|
||||||
<Box sx={{ mt: 3 }}>
|
|
||||||
<ChangeRequestProcessWithScheduleImage
|
|
||||||
aria-details={descriptionId}
|
|
||||||
style={{
|
|
||||||
maxWidth: '100%',
|
|
||||||
height: 'auto',
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
</Box>
|
</Box>
|
||||||
</Popover>
|
</Box>
|
||||||
</>
|
</Popover>
|
||||||
);
|
</>
|
||||||
};
|
);
|
||||||
|
};
|
||||||
|
@ -35,11 +35,10 @@ const useResetPassword = (options: SWRConfiguration = {}) => {
|
|||||||
setLoading(!error && !data);
|
setLoading(!error && !data);
|
||||||
}, [data, error]);
|
}, [data, error]);
|
||||||
|
|
||||||
const isValidToken =
|
const isValidToken = !(
|
||||||
(!loading && data?.name === INVALID_TOKEN_ERROR) ||
|
(!loading && data?.name === INVALID_TOKEN_ERROR) ||
|
||||||
data?.name === USED_TOKEN_ERROR
|
data?.name === USED_TOKEN_ERROR
|
||||||
? false
|
);
|
||||||
: true;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
token,
|
token,
|
||||||
|
@ -139,8 +139,8 @@ export const getColumnValues = (column: any, row: any) => {
|
|||||||
? column.accessor(row)
|
? column.accessor(row)
|
||||||
: column.accessor.includes('.')
|
: column.accessor.includes('.')
|
||||||
? column.accessor
|
? column.accessor
|
||||||
.split('.')
|
.split('.')
|
||||||
.reduce((object: any, key: string) => object?.[key], row)
|
.reduce((object: any, key: string) => object?.[key], row)
|
||||||
: row[column.accessor];
|
: row[column.accessor];
|
||||||
|
|
||||||
if (column.filterParsing) {
|
if (column.filterParsing) {
|
||||||
|
@ -615,59 +615,59 @@
|
|||||||
"@babel/helper-validator-identifier" "^7.24.6"
|
"@babel/helper-validator-identifier" "^7.24.6"
|
||||||
to-fast-properties "^2.0.0"
|
to-fast-properties "^2.0.0"
|
||||||
|
|
||||||
"@biomejs/biome@1.6.4":
|
"@biomejs/biome@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.6.4.tgz#d09ab44c1df2a0cbbbb15901779a164beacd356d"
|
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.8.0.tgz#393f4c530582509938d58c3856b5a50179254df8"
|
||||||
integrity sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==
|
integrity sha512-34xcE2z8GWrIz1sCFEmlHT/+4d+SN7YOqqvzlAKXKvaWPRJ2/NUwxPbRsP01P9QODkQ5bvGvc9rpBihmP+7RJQ==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@biomejs/cli-darwin-arm64" "1.6.4"
|
"@biomejs/cli-darwin-arm64" "1.8.0"
|
||||||
"@biomejs/cli-darwin-x64" "1.6.4"
|
"@biomejs/cli-darwin-x64" "1.8.0"
|
||||||
"@biomejs/cli-linux-arm64" "1.6.4"
|
"@biomejs/cli-linux-arm64" "1.8.0"
|
||||||
"@biomejs/cli-linux-arm64-musl" "1.6.4"
|
"@biomejs/cli-linux-arm64-musl" "1.8.0"
|
||||||
"@biomejs/cli-linux-x64" "1.6.4"
|
"@biomejs/cli-linux-x64" "1.8.0"
|
||||||
"@biomejs/cli-linux-x64-musl" "1.6.4"
|
"@biomejs/cli-linux-x64-musl" "1.8.0"
|
||||||
"@biomejs/cli-win32-arm64" "1.6.4"
|
"@biomejs/cli-win32-arm64" "1.8.0"
|
||||||
"@biomejs/cli-win32-x64" "1.6.4"
|
"@biomejs/cli-win32-x64" "1.8.0"
|
||||||
|
|
||||||
"@biomejs/cli-darwin-arm64@1.6.4":
|
"@biomejs/cli-darwin-arm64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.6.4.tgz#a2b07cacb0d2769ae5545b6a3cf40907fbfd4ab0"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.0.tgz#b3eb9644b5bbb393e993ac5acc9570ef21907380"
|
||||||
integrity sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==
|
integrity sha512-dBAYzfIJ1JmWigKlWourT3sJ3I60LZPjqNwwlsyFjiv5AV7vPeWlHVVIImV2BpINwNjZQhpXnwDfVnGS4vr7AA==
|
||||||
|
|
||||||
"@biomejs/cli-darwin-x64@1.6.4":
|
"@biomejs/cli-darwin-x64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.6.4.tgz#476720d731864508312b12fbef62a35609ef5f96"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.0.tgz#a31eada9b57cf33cb9655593b1df2b5ff2d4f092"
|
||||||
integrity sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==
|
integrity sha512-ZTTSD0bP0nn9UpRDGQrQNTILcYSj+IkxTYr3CAV64DWBDtQBomlk2oVKWzDaA1LOhpAsTh0giLCbPJaVk2jfMQ==
|
||||||
|
|
||||||
"@biomejs/cli-linux-arm64-musl@1.6.4":
|
"@biomejs/cli-linux-arm64-musl@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.4.tgz#403f5889a4ec290e35a0b910c1c26723373cf5fc"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.0.tgz#ca66b8635f8f55f320e247a5febed8bb56dc3b91"
|
||||||
integrity sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==
|
integrity sha512-+ee/pZWsvhDv6eRI00krRNSgAg8DKSxzOv3LUsCjto6N1VzqatTASeQv2HRfG1nitf79rRKM75LkMJbqEfiKww==
|
||||||
|
|
||||||
"@biomejs/cli-linux-arm64@1.6.4":
|
"@biomejs/cli-linux-arm64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.6.4.tgz#7eff2af0fc5d9af9affc963bb594ec2ebf89668f"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.0.tgz#147ab4d9bcfb4cc1baee90a367acf0fef5c42649"
|
||||||
integrity sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==
|
integrity sha512-cx725jTlJS6dskvJJwwCQaaMRBKE2Qss7ukzmx27Rn/DXRxz6tnnBix4FUGPf1uZfwrERkiJlbWM05JWzpvvXg==
|
||||||
|
|
||||||
"@biomejs/cli-linux-x64-musl@1.6.4":
|
"@biomejs/cli-linux-x64-musl@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.4.tgz#aeca8dd886b19b7779dfb43898ec896c71da279f"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.0.tgz#4c80358c178327fccee660f0cebcc7a78c20bcb0"
|
||||||
integrity sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==
|
integrity sha512-VPA4ocrAOak50VYl8gOAVnjuFFDpIUolShntc/aWM0pZfSIMbRucxnrfUfp44EVwayxjK6ruJTR5xEWj93WvDA==
|
||||||
|
|
||||||
"@biomejs/cli-linux-x64@1.6.4":
|
"@biomejs/cli-linux-x64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.6.4.tgz#545b205dea20195b1fa64f5a0e60331a70133518"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.0.tgz#de1ab7649324c72b74e16c5234ef6191a8bc34fd"
|
||||||
integrity sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==
|
integrity sha512-cmgmhlD4QUxMhL1VdaNqnB81xBHb3R7huVNyYnPYzP+AykZ7XqJbPd1KcWAszNjUk2AHdx0aLKEBwCOWemxb2g==
|
||||||
|
|
||||||
"@biomejs/cli-win32-arm64@1.6.4":
|
"@biomejs/cli-win32-arm64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.6.4.tgz#2c377c0965749d01280baac6cb273bcbe11cd652"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.0.tgz#1527e7bbcf9abd27302225591ef150da1656393a"
|
||||||
integrity sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==
|
integrity sha512-J31spvlh39FfRHQacYXxJX9PvTCH/a8+2Jx9D1lxw+LSF0JybqZcw/4JrlFUWUl4kF3yv8AuYUK0sENScc3g9w==
|
||||||
|
|
||||||
"@biomejs/cli-win32-x64@1.6.4":
|
"@biomejs/cli-win32-x64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.6.4.tgz#317fed21b863d43778665d42a41cbd0f94351051"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.0.tgz#d566d6d27ba262691eaac7c54b7a41560d390130"
|
||||||
integrity sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==
|
integrity sha512-uPHHvu76JC1zYe9zZDcOU9PAg+1MZmPuNgWkb5jljaDeATvzLFPB+0nuJTilf603LXL+E8IdPQAO61Wy2VuEJA==
|
||||||
|
|
||||||
"@bundled-es-modules/cookie@^2.0.0":
|
"@bundled-es-modules/cookie@^2.0.0":
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
|
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\"",
|
"start:dev": "TZ=UTC NODE_ENV=development tsc-watch --strictNullChecks false --onSuccess \"node dist/server-dev.js\"",
|
||||||
"db-migrate": "db-migrate --migrations-dir ./src/migrations",
|
"db-migrate": "db-migrate --migrations-dir ./src/migrations",
|
||||||
"lint": "biome check .",
|
"lint": "biome check .",
|
||||||
"lint:fix": "biome check . --apply",
|
"lint:fix": "biome check . --write",
|
||||||
"local:package": "del-cli --force build && mkdir build && cp -r dist docs CHANGELOG.md LICENSE README.md package.json build",
|
"local:package": "del-cli --force build && mkdir build && cp -r dist docs CHANGELOG.md LICENSE README.md package.json build",
|
||||||
"prebuild:watch": "yarn run clean",
|
"prebuild:watch": "yarn run clean",
|
||||||
"build:watch": "tsc -w --strictNullChecks false",
|
"build:watch": "tsc -w --strictNullChecks false",
|
||||||
@ -153,7 +153,7 @@
|
|||||||
"prom-client": "^14.0.0",
|
"prom-client": "^14.0.0",
|
||||||
"response-time": "^2.3.2",
|
"response-time": "^2.3.2",
|
||||||
"sanitize-filename": "^1.6.3",
|
"sanitize-filename": "^1.6.3",
|
||||||
"semver": "^7.5.4",
|
"semver": "^7.6.2",
|
||||||
"serve-favicon": "^2.5.0",
|
"serve-favicon": "^2.5.0",
|
||||||
"slug": "^9.0.0",
|
"slug": "^9.0.0",
|
||||||
"stoppable": "^1.1.0",
|
"stoppable": "^1.1.0",
|
||||||
@ -165,8 +165,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@apidevtools/swagger-parser": "10.1.0",
|
"@apidevtools/swagger-parser": "10.1.0",
|
||||||
"@babel/core": "7.24.6",
|
"@babel/core": "7.24.6",
|
||||||
"@biomejs/biome": "1.6.4",
|
"@biomejs/biome": "1.8.0",
|
||||||
"@swc/core": "1.5.7",
|
"@swc/core": "1.5.24",
|
||||||
"@swc/jest": "0.2.36",
|
"@swc/jest": "0.2.36",
|
||||||
"@types/bcryptjs": "2.4.6",
|
"@types/bcryptjs": "2.4.6",
|
||||||
"@types/cors": "2.8.17",
|
"@types/cors": "2.8.17",
|
||||||
@ -228,12 +228,12 @@
|
|||||||
"ip": "^2.0.1",
|
"ip": "^2.0.1",
|
||||||
"tar": "6.2.1",
|
"tar": "6.2.1",
|
||||||
"minimatch": "^5.0.0",
|
"minimatch": "^5.0.0",
|
||||||
"semver": "^7.5.3",
|
"semver": "^7.6.2",
|
||||||
"tough-cookie": "4.1.4"
|
"tough-cookie": "4.1.4"
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"*.{js,ts}": ["biome check --apply --no-errors-on-unmatched"],
|
"*.{js,ts}": ["biome check --write --no-errors-on-unmatched"],
|
||||||
"*.{jsx,tsx}": ["biome check --apply --no-errors-on-unmatched"],
|
"*.{jsx,tsx}": ["biome check --write --no-errors-on-unmatched"],
|
||||||
"*.json": ["biome format --write --no-errors-on-unmatched"]
|
"*.json": ["biome format --write --no-errors-on-unmatched"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -446,11 +446,11 @@ export class FeatureEventFormatterMd implements FeatureEventFormatter {
|
|||||||
? ''
|
? ''
|
||||||
: !preData
|
: !preData
|
||||||
? ` ${propertyName} to ${userIdText(
|
? ` ${propertyName} to ${userIdText(
|
||||||
data?.parameters[propertyName],
|
data?.parameters[propertyName],
|
||||||
)}`
|
)}`
|
||||||
: ` ${propertyName} from ${userIdText(
|
: ` ${propertyName} from ${userIdText(
|
||||||
preData.parameters[propertyName],
|
preData.parameters[propertyName],
|
||||||
)} to ${userIdText(data?.parameters[propertyName])}`;
|
)} to ${userIdText(data?.parameters[propertyName])}`;
|
||||||
const constraintText = this.constraintChangeText(
|
const constraintText = this.constraintChangeText(
|
||||||
preData?.constraints,
|
preData?.constraints,
|
||||||
data?.constraints,
|
data?.constraints,
|
||||||
|
@ -188,7 +188,7 @@ class FeatureSearchStore implements IFeatureSearchStore {
|
|||||||
envName,
|
envName,
|
||||||
).andWhere(
|
).andWhere(
|
||||||
'feature_environments.enabled',
|
'feature_environments.enabled',
|
||||||
envStatus === 'enabled' ? true : false,
|
envStatus === 'enabled',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
214
yarn.lock
214
yarn.lock
@ -657,59 +657,59 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
||||||
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
|
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
|
||||||
|
|
||||||
"@biomejs/biome@1.6.4":
|
"@biomejs/biome@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.6.4.tgz#d09ab44c1df2a0cbbbb15901779a164beacd356d"
|
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.8.0.tgz#393f4c530582509938d58c3856b5a50179254df8"
|
||||||
integrity sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==
|
integrity sha512-34xcE2z8GWrIz1sCFEmlHT/+4d+SN7YOqqvzlAKXKvaWPRJ2/NUwxPbRsP01P9QODkQ5bvGvc9rpBihmP+7RJQ==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@biomejs/cli-darwin-arm64" "1.6.4"
|
"@biomejs/cli-darwin-arm64" "1.8.0"
|
||||||
"@biomejs/cli-darwin-x64" "1.6.4"
|
"@biomejs/cli-darwin-x64" "1.8.0"
|
||||||
"@biomejs/cli-linux-arm64" "1.6.4"
|
"@biomejs/cli-linux-arm64" "1.8.0"
|
||||||
"@biomejs/cli-linux-arm64-musl" "1.6.4"
|
"@biomejs/cli-linux-arm64-musl" "1.8.0"
|
||||||
"@biomejs/cli-linux-x64" "1.6.4"
|
"@biomejs/cli-linux-x64" "1.8.0"
|
||||||
"@biomejs/cli-linux-x64-musl" "1.6.4"
|
"@biomejs/cli-linux-x64-musl" "1.8.0"
|
||||||
"@biomejs/cli-win32-arm64" "1.6.4"
|
"@biomejs/cli-win32-arm64" "1.8.0"
|
||||||
"@biomejs/cli-win32-x64" "1.6.4"
|
"@biomejs/cli-win32-x64" "1.8.0"
|
||||||
|
|
||||||
"@biomejs/cli-darwin-arm64@1.6.4":
|
"@biomejs/cli-darwin-arm64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.6.4.tgz#a2b07cacb0d2769ae5545b6a3cf40907fbfd4ab0"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.0.tgz#b3eb9644b5bbb393e993ac5acc9570ef21907380"
|
||||||
integrity sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==
|
integrity sha512-dBAYzfIJ1JmWigKlWourT3sJ3I60LZPjqNwwlsyFjiv5AV7vPeWlHVVIImV2BpINwNjZQhpXnwDfVnGS4vr7AA==
|
||||||
|
|
||||||
"@biomejs/cli-darwin-x64@1.6.4":
|
"@biomejs/cli-darwin-x64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.6.4.tgz#476720d731864508312b12fbef62a35609ef5f96"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.0.tgz#a31eada9b57cf33cb9655593b1df2b5ff2d4f092"
|
||||||
integrity sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==
|
integrity sha512-ZTTSD0bP0nn9UpRDGQrQNTILcYSj+IkxTYr3CAV64DWBDtQBomlk2oVKWzDaA1LOhpAsTh0giLCbPJaVk2jfMQ==
|
||||||
|
|
||||||
"@biomejs/cli-linux-arm64-musl@1.6.4":
|
"@biomejs/cli-linux-arm64-musl@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.4.tgz#403f5889a4ec290e35a0b910c1c26723373cf5fc"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.0.tgz#ca66b8635f8f55f320e247a5febed8bb56dc3b91"
|
||||||
integrity sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==
|
integrity sha512-+ee/pZWsvhDv6eRI00krRNSgAg8DKSxzOv3LUsCjto6N1VzqatTASeQv2HRfG1nitf79rRKM75LkMJbqEfiKww==
|
||||||
|
|
||||||
"@biomejs/cli-linux-arm64@1.6.4":
|
"@biomejs/cli-linux-arm64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.6.4.tgz#7eff2af0fc5d9af9affc963bb594ec2ebf89668f"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.0.tgz#147ab4d9bcfb4cc1baee90a367acf0fef5c42649"
|
||||||
integrity sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==
|
integrity sha512-cx725jTlJS6dskvJJwwCQaaMRBKE2Qss7ukzmx27Rn/DXRxz6tnnBix4FUGPf1uZfwrERkiJlbWM05JWzpvvXg==
|
||||||
|
|
||||||
"@biomejs/cli-linux-x64-musl@1.6.4":
|
"@biomejs/cli-linux-x64-musl@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.4.tgz#aeca8dd886b19b7779dfb43898ec896c71da279f"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.0.tgz#4c80358c178327fccee660f0cebcc7a78c20bcb0"
|
||||||
integrity sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==
|
integrity sha512-VPA4ocrAOak50VYl8gOAVnjuFFDpIUolShntc/aWM0pZfSIMbRucxnrfUfp44EVwayxjK6ruJTR5xEWj93WvDA==
|
||||||
|
|
||||||
"@biomejs/cli-linux-x64@1.6.4":
|
"@biomejs/cli-linux-x64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.6.4.tgz#545b205dea20195b1fa64f5a0e60331a70133518"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.0.tgz#de1ab7649324c72b74e16c5234ef6191a8bc34fd"
|
||||||
integrity sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==
|
integrity sha512-cmgmhlD4QUxMhL1VdaNqnB81xBHb3R7huVNyYnPYzP+AykZ7XqJbPd1KcWAszNjUk2AHdx0aLKEBwCOWemxb2g==
|
||||||
|
|
||||||
"@biomejs/cli-win32-arm64@1.6.4":
|
"@biomejs/cli-win32-arm64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.6.4.tgz#2c377c0965749d01280baac6cb273bcbe11cd652"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.0.tgz#1527e7bbcf9abd27302225591ef150da1656393a"
|
||||||
integrity sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==
|
integrity sha512-J31spvlh39FfRHQacYXxJX9PvTCH/a8+2Jx9D1lxw+LSF0JybqZcw/4JrlFUWUl4kF3yv8AuYUK0sENScc3g9w==
|
||||||
|
|
||||||
"@biomejs/cli-win32-x64@1.6.4":
|
"@biomejs/cli-win32-x64@1.8.0":
|
||||||
version "1.6.4"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.6.4.tgz#317fed21b863d43778665d42a41cbd0f94351051"
|
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.0.tgz#d566d6d27ba262691eaac7c54b7a41560d390130"
|
||||||
integrity sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==
|
integrity sha512-uPHHvu76JC1zYe9zZDcOU9PAg+1MZmPuNgWkb5jljaDeATvzLFPB+0nuJTilf603LXL+E8IdPQAO61Wy2VuEJA==
|
||||||
|
|
||||||
"@colors/colors@1.5.0":
|
"@colors/colors@1.5.0":
|
||||||
version "1.5.0"
|
version "1.5.0"
|
||||||
@ -1241,76 +1241,76 @@
|
|||||||
p-queue "^6.6.1"
|
p-queue "^6.6.1"
|
||||||
p-retry "^4.0.0"
|
p-retry "^4.0.0"
|
||||||
|
|
||||||
"@swc/core-darwin-arm64@1.5.7":
|
"@swc/core-darwin-arm64@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz#2b5cdbd34e4162e50de6147dd1a5cb12d23b08e8"
|
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.24.tgz#71875695bc617e57c2d93352f48317b4c41e0240"
|
||||||
integrity sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ==
|
integrity sha512-M7oLOcC0sw+UTyAuL/9uyB9GeO4ZpaBbH76JSH6g1m0/yg7LYJZGRmplhDmwVSDAR5Fq4Sjoi1CksmmGkgihGA==
|
||||||
|
|
||||||
"@swc/core-darwin-x64@1.5.7":
|
"@swc/core-darwin-x64@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz#6aa7e3c01ab8e5e41597f8a24ff24c4e50936a46"
|
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.24.tgz#6b4c3eb9b21ab50b7324a82c9497ffeb2e8e0a57"
|
||||||
integrity sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw==
|
integrity sha512-MfcFjGGYognpSBSos2pYUNYJSmqEhuw5ceGr6qAdME7ddbjGXliza4W6FggsM+JnWwpqa31+e7/R+GetW4WkaQ==
|
||||||
|
|
||||||
"@swc/core-linux-arm-gnueabihf@1.5.7":
|
"@swc/core-linux-arm-gnueabihf@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz#160108633b9e1d1ad05f815bedc7e9eb5d59fc2a"
|
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.24.tgz#5730ed6ad86afe4ee8df04ee6f21430daead186c"
|
||||||
integrity sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ==
|
integrity sha512-amI2pwtcWV3E/m/nf+AQtn1LWDzKLZyjCmWd3ms7QjEueWYrY8cU1Y4Wp7wNNsxIoPOi8zek1Uj2wwFD/pttNQ==
|
||||||
|
|
||||||
"@swc/core-linux-arm64-gnu@1.5.7":
|
"@swc/core-linux-arm64-gnu@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz#cbfa512683c73227ad25552f3b3e722b0e7fbd1d"
|
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.24.tgz#0a2478e8601391aa88f82bfece1dbc60d27cbcfd"
|
||||||
integrity sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g==
|
integrity sha512-sTSvmqMmgT1ynH/nP75Pc51s+iT4crZagHBiDOf5cq+kudUYjda9lWMs7xkXB/TUKFHPCRK0HGunl8bkwiIbuw==
|
||||||
|
|
||||||
"@swc/core-linux-arm64-musl@1.5.7":
|
"@swc/core-linux-arm64-musl@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz#80239cb58fe57f3c86b44617fe784530ec55ee2b"
|
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.24.tgz#e0199092dc611ca75f8a92dcea17de44e38f3fbf"
|
||||||
integrity sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ==
|
integrity sha512-vd2/hfOBGbrX21FxsFdXCUaffjkHvlZkeE2UMRajdXifwv79jqOHIJg3jXG1F3ZrhCghCzirFts4tAZgcG8XWg==
|
||||||
|
|
||||||
"@swc/core-linux-x64-gnu@1.5.7":
|
"@swc/core-linux-x64-gnu@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz#a699c1632de60b6a63b7fdb7abcb4fef317e57ca"
|
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.24.tgz#1fe347c9f28457c593f2fda5b0d4904a2b105ecd"
|
||||||
integrity sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg==
|
integrity sha512-Zrdzi7NqzQxm2BvAG5KyOSBEggQ7ayrxh599AqqevJmsUXJ8o2nMiWQOBvgCGp7ye+Biz3pvZn1EnRzAp+TpUg==
|
||||||
|
|
||||||
"@swc/core-linux-x64-musl@1.5.7":
|
"@swc/core-linux-x64-musl@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz#8e4c203d6bc41e7f85d7d34d0fdf4ef751fa626c"
|
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.24.tgz#bf6ac583fac211d704d2d78cfd0b7bf751268f5e"
|
||||||
integrity sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg==
|
integrity sha512-1F8z9NRi52jdZQCGc5sflwYSctL6omxiVmIFVp8TC9nngjQKc00TtX/JC2Eo2HwvgupkFVl5YQJidAck9YtmJw==
|
||||||
|
|
||||||
"@swc/core-win32-arm64-msvc@1.5.7":
|
"@swc/core-win32-arm64-msvc@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz#31e3d42b8c0aa79f0ea1a980c0dd1a999d378ed7"
|
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.24.tgz#41b9faf4db69cc08a43c3a176df2a7b94d765637"
|
||||||
integrity sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA==
|
integrity sha512-cKpP7KvS6Xr0jFSTBXY53HZX/YfomK5EMQYpCVDOvfsZeYHN20sQSKXfpVLvA/q2igVt1zzy1XJcOhpJcgiKLg==
|
||||||
|
|
||||||
"@swc/core-win32-ia32-msvc@1.5.7":
|
"@swc/core-win32-ia32-msvc@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz#a235285f9f62850aefcf9abb03420f2c54f63638"
|
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.24.tgz#e123ad00e3b28d567d3851a86697fb3c54ed817a"
|
||||||
integrity sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ==
|
integrity sha512-IoPWfi0iwqjZuf7gE223+B97/ZwkKbu7qL5KzGP7g3hJrGSKAvv7eC5Y9r2iKKtLKyv5R/T6Ho0kFR/usi7rHw==
|
||||||
|
|
||||||
"@swc/core-win32-x64-msvc@1.5.7":
|
"@swc/core-win32-x64-msvc@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz#f84641393b5223450d00d97bfff877b8b69d7c9b"
|
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.24.tgz#21fb87b1981253039e6d45255e31a875f446e397"
|
||||||
integrity sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==
|
integrity sha512-zHgF2k1uVJL8KIW+PnVz1To4a3Cz9THbh2z2lbehaF/gKHugH4c3djBozU4das1v35KOqf5jWIEviBLql2wDLQ==
|
||||||
|
|
||||||
"@swc/core@1.5.7":
|
"@swc/core@1.5.24":
|
||||||
version "1.5.7"
|
version "1.5.24"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.5.7.tgz#e1db7b9887d5f34eb4a3256a738d0c5f1b018c33"
|
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.5.24.tgz#9ecb4601cb6a4fb19f227ec5fb59d07e23347dca"
|
||||||
integrity sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==
|
integrity sha512-Eph9zvO4xvqWZGVzTdtdEJ0Vqf0VIML/o/e4Qd2RLOqtfgnlRi7avmMu5C0oqciJ0tk+hqdUKVUZ4JPoPaiGvQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@swc/counter" "^0.1.2"
|
"@swc/counter" "^0.1.3"
|
||||||
"@swc/types" "0.1.7"
|
"@swc/types" "^0.1.7"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@swc/core-darwin-arm64" "1.5.7"
|
"@swc/core-darwin-arm64" "1.5.24"
|
||||||
"@swc/core-darwin-x64" "1.5.7"
|
"@swc/core-darwin-x64" "1.5.24"
|
||||||
"@swc/core-linux-arm-gnueabihf" "1.5.7"
|
"@swc/core-linux-arm-gnueabihf" "1.5.24"
|
||||||
"@swc/core-linux-arm64-gnu" "1.5.7"
|
"@swc/core-linux-arm64-gnu" "1.5.24"
|
||||||
"@swc/core-linux-arm64-musl" "1.5.7"
|
"@swc/core-linux-arm64-musl" "1.5.24"
|
||||||
"@swc/core-linux-x64-gnu" "1.5.7"
|
"@swc/core-linux-x64-gnu" "1.5.24"
|
||||||
"@swc/core-linux-x64-musl" "1.5.7"
|
"@swc/core-linux-x64-musl" "1.5.24"
|
||||||
"@swc/core-win32-arm64-msvc" "1.5.7"
|
"@swc/core-win32-arm64-msvc" "1.5.24"
|
||||||
"@swc/core-win32-ia32-msvc" "1.5.7"
|
"@swc/core-win32-ia32-msvc" "1.5.24"
|
||||||
"@swc/core-win32-x64-msvc" "1.5.7"
|
"@swc/core-win32-x64-msvc" "1.5.24"
|
||||||
|
|
||||||
"@swc/counter@^0.1.2", "@swc/counter@^0.1.3":
|
"@swc/counter@^0.1.3":
|
||||||
version "0.1.3"
|
version "0.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
|
resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
|
||||||
integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
|
integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
|
||||||
@ -1324,7 +1324,7 @@
|
|||||||
"@swc/counter" "^0.1.3"
|
"@swc/counter" "^0.1.3"
|
||||||
jsonc-parser "^3.2.0"
|
jsonc-parser "^3.2.0"
|
||||||
|
|
||||||
"@swc/types@0.1.7":
|
"@swc/types@^0.1.7":
|
||||||
version "0.1.7"
|
version "0.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.7.tgz#ea5d658cf460abff51507ca8d26e2d391bafb15e"
|
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.7.tgz#ea5d658cf460abff51507ca8d26e2d391bafb15e"
|
||||||
integrity sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==
|
integrity sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==
|
||||||
@ -6434,12 +6434,10 @@ sanitize-filename@^1.6.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
truncate-utf8-bytes "^1.0.0"
|
truncate-utf8-bytes "^1.0.0"
|
||||||
|
|
||||||
semver@^5.3.0, semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4:
|
semver@^5.3.0, semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2:
|
||||||
version "7.5.4"
|
version "7.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
|
||||||
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
|
integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
|
||||||
dependencies:
|
|
||||||
lru-cache "^6.0.0"
|
|
||||||
|
|
||||||
send@0.18.0:
|
send@0.18.0:
|
||||||
version "0.18.0"
|
version "0.18.0"
|
||||||
|
Loading…
Reference in New Issue
Block a user