mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-28 00:06:53 +01:00
c7498dcac6
[![Mend Renovate logo
banner](https://app.renovatebot.com/images/banner.svg)](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)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@biomejs%2fbiome/1.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@biomejs%2fbiome/1.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@biomejs%2fbiome/1.3.3/1.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@biomejs%2fbiome/1.3.3/1.4.0?slim=true)](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>
287 lines
9.8 KiB
TypeScript
287 lines
9.8 KiB
TypeScript
import fc, { Arbitrary } from 'fast-check';
|
|
|
|
import { ALL_OPERATORS } from '../lib/util/constants';
|
|
import { ClientFeatureSchema } from '../lib/openapi/spec/client-feature-schema';
|
|
import { IVariant, WeightType } from '../lib/types/model';
|
|
import { FeatureStrategySchema } from '../lib/openapi/spec/feature-strategy-schema';
|
|
import { ConstraintSchema } from 'lib/openapi/spec/constraint-schema';
|
|
import { SegmentSchema } from 'lib/openapi/spec/segment-schema';
|
|
|
|
export const urlFriendlyString = (): Arbitrary<string> =>
|
|
fc
|
|
.array(
|
|
fc.oneof(
|
|
fc
|
|
.integer({ min: 0x30, max: 0x39 })
|
|
.map(String.fromCharCode), // numbers
|
|
fc
|
|
.integer({ min: 0x41, max: 0x5a })
|
|
.map(String.fromCharCode), // UPPERCASE LETTERS
|
|
fc
|
|
.integer({ min: 0x61, max: 0x7a })
|
|
.map(String.fromCharCode), // lowercase letters
|
|
fc.constantFrom('-', '_', '~', '.'), // rest
|
|
fc.lorem({ maxCount: 1 }), // random words for more 'realistic' names
|
|
),
|
|
{ minLength: 1 },
|
|
)
|
|
.map((arr) => arr.join(''))
|
|
// filter out strings that are only dots because they mess with url parsing
|
|
.filter((string) => ![...string].every((char) => char === '.'));
|
|
|
|
export const commonISOTimestamp = (): Arbitrary<string> =>
|
|
fc
|
|
.date({
|
|
min: new Date('1900-01-01T00:00:00.000Z'),
|
|
max: new Date('9999-12-31T23:59:59.999Z'),
|
|
})
|
|
.map((timestamp) => timestamp.toISOString());
|
|
|
|
export const strategyConstraint = (): Arbitrary<ConstraintSchema> =>
|
|
fc.record({
|
|
contextName: urlFriendlyString(),
|
|
operator: fc.constantFrom(...ALL_OPERATORS),
|
|
caseInsensitive: fc.boolean(),
|
|
inverted: fc.boolean(),
|
|
values: fc.array(fc.string(), { minLength: 1 }),
|
|
value: fc.string(),
|
|
});
|
|
|
|
const strategyConstraints = (): Arbitrary<ConstraintSchema[]> =>
|
|
fc.array(strategyConstraint());
|
|
|
|
export const strategy = (
|
|
name: string,
|
|
parameters?: Arbitrary<Record<string, string>>,
|
|
): Arbitrary<FeatureStrategySchema> =>
|
|
parameters
|
|
? fc.record(
|
|
{
|
|
name: fc.constant(name),
|
|
id: fc.uuid(),
|
|
parameters,
|
|
segments: fc.uniqueArray(fc.integer({ min: 1 })),
|
|
constraints: strategyConstraints(),
|
|
},
|
|
{ requiredKeys: ['name', 'parameters', 'id'] },
|
|
)
|
|
: fc.record(
|
|
{
|
|
id: fc.uuid(),
|
|
name: fc.constant(name),
|
|
segments: fc.uniqueArray(fc.integer({ min: 1 })),
|
|
constraints: strategyConstraints(),
|
|
},
|
|
{ requiredKeys: ['name', 'id'] },
|
|
);
|
|
|
|
export const segment = (): Arbitrary<SegmentSchema> =>
|
|
fc.record({
|
|
id: fc.integer({ min: 1 }),
|
|
name: urlFriendlyString(),
|
|
constraints: strategyConstraints(),
|
|
});
|
|
|
|
export const strategies = (): Arbitrary<FeatureStrategySchema[]> =>
|
|
fc.uniqueArray(
|
|
fc.oneof(
|
|
strategy('default'),
|
|
strategy(
|
|
'flexibleRollout',
|
|
fc.record({
|
|
groupId: fc.lorem({ maxCount: 1 }),
|
|
rollout: fc.nat({ max: 100 }).map(String),
|
|
stickiness: fc.constantFrom(
|
|
'default',
|
|
'userId',
|
|
'sessionId',
|
|
),
|
|
}),
|
|
),
|
|
strategy(
|
|
'applicationHostname',
|
|
fc.record({
|
|
hostNames: fc
|
|
.uniqueArray(fc.domain())
|
|
.map((domains) => domains.join(',')),
|
|
}),
|
|
),
|
|
|
|
strategy(
|
|
'userWithId',
|
|
fc.record({
|
|
userIds: fc
|
|
.uniqueArray(fc.emailAddress())
|
|
.map((ids) => ids.join(',')),
|
|
}),
|
|
),
|
|
strategy(
|
|
'remoteAddress',
|
|
fc.record({
|
|
IPs: fc.uniqueArray(fc.ipV4()).map((ips) => ips.join(',')),
|
|
}),
|
|
),
|
|
strategy(
|
|
'custom-strategy',
|
|
fc.record({
|
|
customParam: fc
|
|
.uniqueArray(fc.lorem())
|
|
.map((words) => words.join(',')),
|
|
}),
|
|
),
|
|
),
|
|
{ selector: (generatedStrategy) => generatedStrategy.id },
|
|
);
|
|
|
|
export const variant = (): Arbitrary<IVariant> =>
|
|
fc.record(
|
|
{
|
|
name: urlFriendlyString(),
|
|
weight: fc.nat({ max: 1000 }),
|
|
weightType: fc.constant(WeightType.VARIABLE),
|
|
stickiness: fc.constant('default'),
|
|
payload: fc.option(
|
|
fc.oneof(
|
|
fc.record({
|
|
type: fc.constant('json' as const),
|
|
value: fc.json(),
|
|
}),
|
|
fc.record({
|
|
type: fc.constant('csv' as const),
|
|
value: fc
|
|
.array(fc.lorem())
|
|
.map((words) => words.join(',')),
|
|
}),
|
|
fc.record({
|
|
type: fc.constant('string' as const),
|
|
value: fc.string(),
|
|
}),
|
|
),
|
|
{ nil: undefined },
|
|
),
|
|
},
|
|
{ requiredKeys: ['name', 'weight', 'weightType', 'stickiness'] },
|
|
);
|
|
|
|
export const variants = (): Arbitrary<IVariant[]> =>
|
|
fc
|
|
.uniqueArray(variant(), {
|
|
maxLength: 1000,
|
|
selector: (variantInstance) => variantInstance.name,
|
|
})
|
|
.map((allVariants) =>
|
|
allVariants.map((variantInstance) => ({
|
|
...variantInstance,
|
|
weight: Math.round(1000 / allVariants.length),
|
|
})),
|
|
);
|
|
|
|
export const clientFeature = (name?: string): Arbitrary<ClientFeatureSchema> =>
|
|
fc.record(
|
|
{
|
|
name: name ? fc.constant(name) : urlFriendlyString(),
|
|
type: fc.constantFrom(
|
|
'release',
|
|
'kill-switch',
|
|
'experiment',
|
|
'operational',
|
|
'permission',
|
|
),
|
|
description: fc.lorem(),
|
|
project: urlFriendlyString(),
|
|
enabled: fc.boolean(),
|
|
createdAt: commonISOTimestamp(),
|
|
lastSeenAt: commonISOTimestamp(),
|
|
stale: fc.boolean(),
|
|
impressionData: fc.option(fc.boolean()),
|
|
strategies: strategies(),
|
|
variants: variants(),
|
|
},
|
|
{ requiredKeys: ['name', 'enabled', 'project', 'strategies'] },
|
|
);
|
|
|
|
export const clientFeatures = (constraints?: {
|
|
minLength?: number;
|
|
}): Arbitrary<ClientFeatureSchema[]> =>
|
|
fc.uniqueArray(clientFeature(), {
|
|
...constraints,
|
|
selector: (v) => v.name,
|
|
});
|
|
|
|
export const clientFeaturesAndSegments = (featureConstraints?: {
|
|
minLength?: number;
|
|
}): Arbitrary<{
|
|
features: ClientFeatureSchema[];
|
|
segments: SegmentSchema[];
|
|
}> => {
|
|
const segments = () =>
|
|
fc.uniqueArray(segment(), {
|
|
selector: (generatedSegment) => generatedSegment.id,
|
|
});
|
|
|
|
// create segments and make sure that all strategies reference segments that
|
|
// exist
|
|
return fc
|
|
.tuple(segments(), clientFeatures(featureConstraints))
|
|
.map(([generatedSegments, generatedFeatures]) => {
|
|
const renumberedSegments = generatedSegments.map(
|
|
(generatedSegment, index) => ({
|
|
...generatedSegment,
|
|
id: index + 1,
|
|
}),
|
|
);
|
|
|
|
const features: ClientFeatureSchema[] = generatedFeatures.map(
|
|
(feature) => ({
|
|
...feature,
|
|
...(feature.strategies && {
|
|
strategies: feature.strategies.map(
|
|
(generatedStrategy) => ({
|
|
...generatedStrategy,
|
|
...(generatedStrategy.segments && {
|
|
segments:
|
|
renumberedSegments.length > 0
|
|
? [
|
|
...new Set(
|
|
generatedStrategy.segments.map(
|
|
(generatedSegment) =>
|
|
(generatedSegment %
|
|
renumberedSegments.length) +
|
|
1,
|
|
),
|
|
),
|
|
]
|
|
: [],
|
|
}),
|
|
}),
|
|
),
|
|
}),
|
|
}),
|
|
);
|
|
|
|
return {
|
|
features,
|
|
segments: renumberedSegments,
|
|
};
|
|
});
|
|
};
|
|
|
|
// TEST ARBITRARIES
|
|
|
|
test('url-friendly strings are URL-friendly', () =>
|
|
fc.assert(
|
|
fc.property(urlFriendlyString(), (input: string) =>
|
|
/^[\w~.-]+$/.test(input),
|
|
),
|
|
));
|
|
|
|
test('variant payloads are either present or undefined; never null', () =>
|
|
fc.assert(
|
|
fc.property(
|
|
variant(),
|
|
(generatedVariant) =>
|
|
!!generatedVariant.payload ||
|
|
generatedVariant.payload === undefined,
|
|
),
|
|
));
|