mirror of
https://github.com/Unleash/unleash.git
synced 2025-09-28 17:55:15 +02:00
[](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev)
([source](https://togithub.com/biomejs/biome)) | [`1.3.3` ->
`1.4.0`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/1.3.3/1.4.0)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
<details>
<summary>biomejs/biome (@​biomejs/biome)</summary>
###
[`v1.4.0`](https://togithub.com/biomejs/biome/blob/HEAD/CHANGELOG.md#140-2023-11-27)
[Compare
Source](af24597c18...889593e3f9
)
##### CLI
- Remove the CLI options from the `lsp-proxy`, as they were never meant
to be passed to that command. Contributed by
[@​ematipico](https://togithub.com/ematipico)
- Add option `--config-path` to `lsp-proxy` and `start` commands. It's
now possible to tell the Daemon server to load `biome.json` from a
custom path. Contributed by
[@​ematipico](https://togithub.com/ematipico)
- Add new `--diagnostic-level` option to let users control the level of
diagnostics printed by the CLI. Possible values are: `"info"`, `"warn"`,
`"hint"`. Contributed by
[@​simonxabris](https://togithub.com/simonxabris)
- Add option `--line-feed` to the `format` command. Contributed by
[@​SuperchupuDev](https://togithub.com/SuperchupuDev)
- Add option `--bracket-same-line` to the `format` command. Contributed
by [@​faultyserve](https://togithub.com/faultyserve)
- Add option `--bracket-spacing` to the `format` command. Contributed by
[@​faultyserve](https://togithub.com/faultyserve)
##### Bug fixes
- Fix the command `format`, now it returns a non-zero exit code when if
there pending diffs. Contributed by
[@​ematipico](https://togithub.com/ematipico)
##### Configuration
- Add option `formatter.lineFeed`. Contributed by
[@​SuperchupuDev](https://togithub.com/SuperchupuDev)
- Add option `javascript.formatter.bracketSameLine`. Contributed by
[@​faultyserve](https://togithub.com/faultyserve)
- Add option `javascript.formatter.bracketSpacing`. Contributed by
[@​faultyserve](https://togithub.com/faultyserve)
##### Formatter
##### New features
- Add a new option
[`--line-ending`](https://biomejs.dev/reference/configuration/#formatterlineending).
This option allows changing the type of line endings. Contributed by
[@​SuperchupuDev](https://togithub.com/SuperchupuDev)
- Added a new option called `--bracket-spacing` to the formatter. This
option allows you to control whether spaces are inserted around the
brackets of object literals.
[#​627](https://togithub.com/biomejs/biome/issues/627).
Contributed by [@​faultyserver](https://togithub.com/faultyserver)
- Added a new option called `--bracket-same-line` to the formatter. This
option allows you to control whether spaces are inserted around the
brackets of object literals.
[#​627](https://togithub.com/biomejs/biome/issues/627).
Contributed by [@​faultyserver](https://togithub.com/faultyserver)
##### Bug fixes
- Fix [#​832](https://togithub.com/biomejs/biome/issues/832), the
formatter no longer keeps an unnecessary trailing comma in type
parameter lists. Contributed by
[@​Conaclos](https://togithub.com/Conaclos)
- Fix [#​301](https://togithub.com/biomejs/biome/issues/301), the
formatter should not break before the `in` keyword. Contributed by
[@​ematipico](https://togithub.com/ematipico)
##### Linter
##### Promoted rules
-
[a11y/noInteractiveElementToNoninteractiveRole](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role)
-
[complexity/noThisInStatic](https://biomejs.dev/linter/rules/no-this-in-static)
-
[complexity/useArrowFunction](https://biomejs.dev/linter/rules/use-arrow-function)
-
[correctness/noEmptyCharacterClassInRegex](https://biomejs.dev/linter/rules/no-empty-character-class-in-regex)
-
[correctness/noInvalidNewBuiltin](https://biomejs.dev/linter/rules/no-invalid-new-builtin)
-
[style/noUselessElse](https://biomejs.dev/linter/rules/no-useless-else)
-
[style/useAsConstAssertion](https://biomejs.dev/linter/rules/use-as-const-assertion)
-
[style/useShorthandAssign](https://biomejs.dev/linter/rules/use-shorthand-assign)
-
[suspicious/noApproximativeNumericConstant](https://biomejs.dev/linter/rules/no-approximative-numeric-constant)
-
[suspicious/noMisleadingInstantiator](https://biomejs.dev/linter/rules/no-misleading-instantiator)
-
[suspicious/noMisrefactoredShorthandAssign](https://biomejs.dev/linter/rules/no-misrefactored-shorthand-assign)
The following rules are now recommended:
- [a11y/noAccessKey](https://biomejs.dev/linter/rules/no-access-key)
-
[a11y/useHeadingContent](https://biomejs.dev/linter/rules/use-heading-content)
-
[complexity/useSimpleNumberKeys](https://biomejs.dev/linter/use-simple-number-keys)
The following rules are now deprecated:
-
[correctness/noNewSymbol](https://biomejs.dev/linter/rules/no-new-symbol)
The rule is replaced by
[correctness/noInvalidNewBuiltin](https://biomejs.dev/linter/rules/no-invalid-new-builtin)
##### New features
- Add
[noDefaultExport](https://biomejs.dev/linter/rules/no-default-export)
which disallows `export default`. Contributed by
[@​Conaclos](https://togithub.com/Conaclos)
- Add
[noAriaHiddenOnFocusable](https://biomejs.dev/linter/rules/no-aria-hidden-on-focusable)
which reports hidden and focusable elements. Contributed by
[@​vasucp1207](https://togithub.com/vasucp1207)
- Add
[noImplicitAnyLet](https://biomejs.dev/linter/rules/no-implicit-any-let)
that reports variables declared with `let` and without initialization
and type annotation. Contributed by
[@​TaKO8Ki](https://togithub.com/TaKO8Ki) and
[@​b4s36t4](https://togithub.com/b4s36t4)
- Add [useAwait](https://biomejs.dev/linter/rules/use-await) that
reports `async` functions that don't use an `await` expression.
- Add
[useValidAriaRole](https://biomejs.dev/linter/rules/use-valid-aria-role).
Contributed by [@​vasucp1207](https://togithub.com/vasucp1207)
- Add [useRegexLiterals](https://biomejs.dev/linter/use-regex-literals)
that suggests turning call to the regex constructor into regex literals.
COntributed by [@​Yuiki](https://togithub.com/Yuiki)
##### Enhancements
- Add an unsafe code fix for
[a11y/useAriaActivedescendantWithTabindex](https://biomejs.dev/linter/rules/use-aria-activedescendant-with-tabindex)
##### Bug fixes
- Fix [#​639](https://togithub.com/biomejs/biome/issues/639) by
ignoring unused TypeScript's mapped key. Contributed by
[@​Conaclos](https://togithub.com/Conaclos)
- Fix [#​565](https://togithub.com/biomejs/biome/issues/565) by
handling several `infer` with the same name in extends clauses of
TypeScript's conditional types. Contributed by
[@​Conaclos](https://togithub.com/Conaclos)
- Fix [#​653](https://togithub.com/biomejs/biome/issues/653).
[noUnusedImports](https://biomejs.dev/linter/rules/no-unused-imports)
now correctly removes the entire line where the unused `import` is.
Contributed by [@​Conaclos](https://togithub.com/Conaclos)
- Fix [#​607](https://togithub.com/biomejs/biome/issues/609)
`useExhaustiveDependencies`, ignore optional chaining, Contributed by
[@​msdlisper](https://togithub.com/msdlisper)
- Fix [#​676](https://togithub.com/biomejs/biome/issues/676), by
using the correct node for the `"noreferrer"` when applying the code
action. Contributed by
[@​ematipico](https://togithub.com/ematipico)
- Fix [#​455](https://togithub.com/biomejs/biome/issues/455). The
CLI can now print complex emojis to the console correctly.
- Fix [#​727](https://togithub.com/biomejs/biome/issues/727).
[noInferrableTypes](https://biomejs.dev/linter/rules/no-inferrable-types)
now correctly keeps type annotations when the initialization expression
is `null`. Contributed by
[@​Conaclos](https://togithub.com/Conaclos)
- Fix [#​784](https://togithub.com/biomejs/biome/issues/784),
[noSvgWithoutTitle](https://biomejs.dev/linter/rules/no-svg-without-title)
fixes false-positives to `aria-label` and reports svg's role attribute
is implicit. Contributed by
[@​unvalley](https://togithub.com/unvalley)
- Fix [#​834](https://togithub.com/biomejs/biome/issues/834) that
made
[noUselessLoneBlockStatements](https://biomejs.dev/linter/rules/no-useless-lone-block-statements)
reports block statements of switch clauses. Contributed by
[@​vasucp1207](https://togithub.com/vasucp1207)
- Fix [#​783](https://togithub.com/biomejs/biome/issues/834) that
made
[noUselessLoneBlockStatements](https://biomejs.dev/linter/rules/no-useless-lone-block-statements)
reports block statements of `try-catch` structures. Contributed by
[@​hougesen](https://togithub.com/hougesen)
- Fix [#​69](https://togithub.com/biomejs/biome/issues/69) that
made
[correctness/noUnnecessaryContinue](https://biomejs.dev/linter/rules/no-unnecessary-continue)
incorrectly reports a `continue` used to break a switch clause.
Contributed by [@​TaKO8Ki](https://togithub.com/TaKO8Ki)
- Fix [#​664](https://togithub.com/biomejs/biome/issues/664) by
improving the diagnostic of
[style/useNamingConvention](https://biomejs.dev/linter/use-naming-convention)
when double capital are detected in strict camel case mode. Contributed
by [@​vasucp1207](https://togithub.com/vasucp1207)
- Fix [#​643](https://togithub.com/biomejs/biome/issues/643) that
erroneously parsed the option of
[complexity/useExhaustiveDependencies](https://biomejs.dev/linter/use-naming-convention).
Contributed by [@​arendjr](https://togithub.com/arendjr)
##### Parser
##### Bug fixes
- Fix [#​846](https://togithub.com/biomejs/biome/issues/846) that
erroneously parsed `<const T,>() => {}` as a JSX tag instead of an arrow
function when both TypeScript and JSX are enabled.
##### VSCode
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/Unleash/unleash).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40Ni4wIiwidXBkYXRlZEluVmVyIjoiMzcuNTkuOCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Christopher Kolstad <chriswk@getunleash.io>
278 lines
9.3 KiB
TypeScript
278 lines
9.3 KiB
TypeScript
import Input from 'component/common/Input/Input';
|
|
import {
|
|
TextField,
|
|
Button,
|
|
Switch,
|
|
Typography,
|
|
styled,
|
|
Theme,
|
|
Link,
|
|
} from '@mui/material';
|
|
import React, { useState, useEffect } from 'react';
|
|
import { Add } from '@mui/icons-material';
|
|
import { ILegalValue } from 'interfaces/context';
|
|
import { ContextFormChip } from 'component/context/ContectFormChip/ContextFormChip';
|
|
import { ContextFormChipList } from 'component/context/ContectFormChip/ContextFormChipList';
|
|
import { ContextFieldUsage } from '../ContextFieldUsage/ContextFieldUsage';
|
|
|
|
interface IContextForm {
|
|
contextName: string;
|
|
contextDesc: string;
|
|
legalValues: ILegalValue[];
|
|
stickiness: boolean;
|
|
setContextName: React.Dispatch<React.SetStateAction<string>>;
|
|
setContextDesc: React.Dispatch<React.SetStateAction<string>>;
|
|
setStickiness: React.Dispatch<React.SetStateAction<boolean>>;
|
|
setLegalValues: React.Dispatch<React.SetStateAction<ILegalValue[]>>;
|
|
handleSubmit: (e: any) => void;
|
|
onCancel: () => void;
|
|
errors: { [key: string]: string };
|
|
mode: 'Create' | 'Edit';
|
|
clearErrors: (key?: string) => void;
|
|
validateContext?: () => void;
|
|
setErrors: React.Dispatch<React.SetStateAction<Object>>;
|
|
}
|
|
|
|
const ENTER = 'Enter';
|
|
|
|
const StyledForm = styled('form')({
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
height: '100%',
|
|
});
|
|
|
|
const StyledContainer = styled('div')({
|
|
maxWidth: '470px',
|
|
});
|
|
|
|
const StyledInputDescription = styled('p')(({ theme }) => ({
|
|
marginBottom: theme.spacing(1),
|
|
}));
|
|
|
|
const styledInput = (theme: Theme) => ({
|
|
width: '100%',
|
|
marginBottom: theme.spacing(2),
|
|
});
|
|
|
|
const StyledTagContainer = styled('div')(({ theme }) => ({
|
|
display: 'grid',
|
|
gridTemplateColumns: '1fr auto',
|
|
gap: theme.spacing(1),
|
|
marginBottom: theme.spacing(2),
|
|
}));
|
|
|
|
const StyledInputHeader = styled('p')(({ theme }) => ({
|
|
marginBottom: theme.spacing(0.5),
|
|
}));
|
|
|
|
const StyledSwitchContainer = styled('div')({
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
marginLeft: '-9px',
|
|
});
|
|
|
|
const StyledButtonContainer = styled('div')({
|
|
marginTop: 'auto',
|
|
display: 'flex',
|
|
justifyContent: 'flex-end',
|
|
});
|
|
|
|
const StyledCancelButton = styled(Button)(({ theme }) => ({
|
|
marginLeft: theme.spacing(3),
|
|
}));
|
|
|
|
export const ContextForm: React.FC<IContextForm> = ({
|
|
children,
|
|
handleSubmit,
|
|
onCancel,
|
|
contextName,
|
|
contextDesc,
|
|
legalValues,
|
|
stickiness,
|
|
setContextName,
|
|
setContextDesc,
|
|
setLegalValues,
|
|
setStickiness,
|
|
errors,
|
|
mode,
|
|
validateContext,
|
|
setErrors,
|
|
clearErrors,
|
|
}) => {
|
|
const [value, setValue] = useState('');
|
|
const [valueDesc, setValueDesc] = useState('');
|
|
const [valueFocused, setValueFocused] = useState(false);
|
|
|
|
const isMissingValue = valueDesc.trim() && !value.trim();
|
|
|
|
const isDuplicateValue = legalValues.some((legalValue) => {
|
|
return legalValue.value.trim() === value.trim();
|
|
});
|
|
|
|
useEffect(() => {
|
|
setErrors((prev) => ({
|
|
...prev,
|
|
tag: isMissingValue
|
|
? 'Value cannot be empty'
|
|
: isDuplicateValue
|
|
? 'Duplicate value'
|
|
: undefined,
|
|
}));
|
|
}, [setErrors, isMissingValue, isDuplicateValue]);
|
|
|
|
const onSubmit = (event: React.SyntheticEvent) => {
|
|
event.preventDefault();
|
|
handleSubmit(event);
|
|
};
|
|
|
|
const onKeyDown = (event: React.KeyboardEvent) => {
|
|
if (event.key === ENTER) {
|
|
event.preventDefault();
|
|
if (valueFocused) {
|
|
addLegalValue();
|
|
} else {
|
|
handleSubmit(event);
|
|
}
|
|
}
|
|
};
|
|
|
|
const sortLegalValues = (a: ILegalValue, b: ILegalValue) => {
|
|
return a.value.toLowerCase().localeCompare(b.value.toLowerCase());
|
|
};
|
|
|
|
const addLegalValue = () => {
|
|
const next: ILegalValue = {
|
|
value: value.trim(),
|
|
description: valueDesc.trim(),
|
|
};
|
|
if (next.value && !isDuplicateValue) {
|
|
setValue('');
|
|
setValueDesc('');
|
|
setLegalValues((prev) => [...prev, next].sort(sortLegalValues));
|
|
}
|
|
};
|
|
|
|
const removeLegalValue = (value: ILegalValue) => {
|
|
setLegalValues((prev) => prev.filter((p) => p.value !== value.value));
|
|
};
|
|
|
|
return (
|
|
<StyledForm onSubmit={onSubmit}>
|
|
<StyledContainer>
|
|
<StyledInputDescription>
|
|
What is your context name?
|
|
</StyledInputDescription>
|
|
<Input
|
|
sx={styledInput}
|
|
label='Context name'
|
|
value={contextName}
|
|
disabled={mode === 'Edit'}
|
|
onChange={(e) => setContextName(e.target.value.trim())}
|
|
error={Boolean(errors.name)}
|
|
errorText={errors.name}
|
|
onFocus={() => clearErrors('name')}
|
|
onBlur={validateContext}
|
|
autoFocus
|
|
/>
|
|
<StyledInputDescription>
|
|
What is this context for?
|
|
</StyledInputDescription>
|
|
<TextField
|
|
sx={styledInput}
|
|
label='Context description (optional)'
|
|
variant='outlined'
|
|
multiline
|
|
maxRows={4}
|
|
value={contextDesc}
|
|
size='small'
|
|
onChange={(e) => setContextDesc(e.target.value)}
|
|
/>
|
|
<StyledInputDescription>
|
|
Which values do you want to allow?
|
|
</StyledInputDescription>
|
|
<StyledTagContainer>
|
|
<TextField
|
|
label='Legal value (optional)'
|
|
name='value'
|
|
sx={{ gridColumn: 1 }}
|
|
value={value}
|
|
error={Boolean(errors.tag)}
|
|
helperText={errors.tag}
|
|
variant='outlined'
|
|
size='small'
|
|
onChange={(e) => setValue(e.target.value)}
|
|
onKeyPress={(e) => onKeyDown(e)}
|
|
onBlur={() => setValueFocused(false)}
|
|
onFocus={() => setValueFocused(true)}
|
|
inputProps={{ maxLength: 100 }}
|
|
/>
|
|
<TextField
|
|
label='Value description (optional)'
|
|
sx={{ gridColumn: 1 }}
|
|
value={valueDesc}
|
|
variant='outlined'
|
|
size='small'
|
|
onChange={(e) => setValueDesc(e.target.value)}
|
|
onKeyPress={(e) => onKeyDown(e)}
|
|
onBlur={() => setValueFocused(false)}
|
|
onFocus={() => setValueFocused(true)}
|
|
inputProps={{ maxLength: 100 }}
|
|
/>
|
|
<Button
|
|
sx={{ gridColumn: 2 }}
|
|
startIcon={<Add />}
|
|
onClick={addLegalValue}
|
|
variant='outlined'
|
|
color='primary'
|
|
disabled={!value.trim() || isDuplicateValue}
|
|
>
|
|
Add
|
|
</Button>
|
|
</StyledTagContainer>
|
|
<ContextFormChipList>
|
|
{legalValues.map((legalValue) => {
|
|
return (
|
|
<ContextFormChip
|
|
key={legalValue.value}
|
|
label={legalValue.value}
|
|
description={legalValue.description}
|
|
onRemove={() => removeLegalValue(legalValue)}
|
|
/>
|
|
);
|
|
})}
|
|
</ContextFormChipList>
|
|
<StyledInputHeader>Custom stickiness</StyledInputHeader>
|
|
<p>
|
|
By enabling stickiness on this context field you can use it
|
|
together with the flexible-rollout strategy. This will
|
|
guarantee a consistent behavior for specific values of this
|
|
context field. PS! Not all client SDK's support this feature
|
|
yet!{' '}
|
|
<Link
|
|
href='https://docs.getunleash.io/reference/stickiness'
|
|
target='_blank'
|
|
rel='noreferrer'
|
|
>
|
|
Read more
|
|
</Link>
|
|
</p>
|
|
<StyledSwitchContainer>
|
|
<Switch
|
|
checked={stickiness}
|
|
value={stickiness}
|
|
onChange={() => setStickiness(!stickiness)}
|
|
/>
|
|
<Typography>{stickiness ? 'On' : 'Off'}</Typography>
|
|
</StyledSwitchContainer>
|
|
<ContextFieldUsage contextName={contextName} />
|
|
</StyledContainer>
|
|
<StyledButtonContainer>
|
|
{children}
|
|
<StyledCancelButton onClick={onCancel}>
|
|
Cancel
|
|
</StyledCancelButton>
|
|
</StyledButtonContainer>
|
|
</StyledForm>
|
|
);
|
|
};
|