mirror of
https://github.com/Unleash/unleash.git
synced 2025-06-18 01:18:23 +02:00
Biome1.5.1 (#5867)
Lots of work here, mostly because I didn't want to turn off the `noImplicitAnyLet` lint. This PR tries its best to type all the untyped lets biome complained about (Don't ask me how many hours that took or how many lints that was >200...), which in the future will force test authors to actually type their global variables setup in `beforeAll`. --------- Co-authored-by: Gastón Fournier <gaston@getunleash.io>
This commit is contained in:
parent
e27a578fab
commit
5a3bb1ffc3
@ -1,5 +1,5 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/1.4.0/schema.json",
|
||||
"$schema": "https://biomejs.dev/schemas/1.5.1/schema.json",
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
|
@ -32,7 +32,7 @@
|
||||
"gen:api:sandbox": "NODE_OPTIONS=\"${NODE_OPTIONS} --no-experimental-fetch\" UNLEASH_OPENAPI_URL=https://sandbox.getunleash.io/demo2/docs/openapi.json yarn run gen:api"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.4.1",
|
||||
"@biomejs/biome": "1.5.1",
|
||||
"@codemirror/lang-json": "6.0.1",
|
||||
"@emotion/react": "11.11.3",
|
||||
"@emotion/styled": "11.11.0",
|
||||
|
@ -17,8 +17,8 @@ import { PageHeader } from '../../../common/PageHeader/PageHeader';
|
||||
export const InstanceStats: VFC = () => {
|
||||
const { stats } = useInstanceStats();
|
||||
|
||||
let versionTitle;
|
||||
let version;
|
||||
let versionTitle: string;
|
||||
let version: string | undefined;
|
||||
|
||||
if (stats?.versionEnterprise) {
|
||||
versionTitle = 'Unleash Enterprise version';
|
||||
|
@ -56,7 +56,11 @@ export const ApplicationList = () => {
|
||||
() => [
|
||||
{
|
||||
id: 'Icon',
|
||||
Cell: ({ row: { original: { icon } } }: any) => (
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { icon },
|
||||
},
|
||||
}: any) => (
|
||||
<IconCell
|
||||
icon={
|
||||
<Avatar>
|
||||
@ -72,7 +76,9 @@ export const ApplicationList = () => {
|
||||
accessor: 'appName',
|
||||
width: '50%',
|
||||
Cell: ({
|
||||
row: { original: { appName, description } },
|
||||
row: {
|
||||
original: { appName, description },
|
||||
},
|
||||
}: any) => (
|
||||
<LinkCell
|
||||
title={appName}
|
||||
|
@ -93,7 +93,7 @@ export const ChangeRequestTimeline: FC<ISuggestChangeTimelineProps> = ({
|
||||
scheduledAt,
|
||||
failureReason,
|
||||
}) => {
|
||||
let data;
|
||||
let data: ChangeRequestState[];
|
||||
switch (state) {
|
||||
case 'Rejected':
|
||||
data = rejectedSteps;
|
||||
|
@ -80,7 +80,6 @@ export const MultiActionButton: FC<{
|
||||
}}
|
||||
open={open}
|
||||
anchorEl={anchorRef.current}
|
||||
role={undefined}
|
||||
transition
|
||||
disablePortal
|
||||
>
|
||||
|
@ -137,7 +137,12 @@ export const ChangeRequestsTabs = ({
|
||||
.includes(feature.name.toLowerCase()),
|
||||
);
|
||||
},
|
||||
Cell: ({ value, row: { original: { title } } }: any) => (
|
||||
Cell: ({
|
||||
value,
|
||||
row: {
|
||||
original: { title },
|
||||
},
|
||||
}: any) => (
|
||||
<FeaturesCell
|
||||
project={projectId}
|
||||
value={value}
|
||||
|
@ -24,7 +24,7 @@ export const PermissionHOC: FC<IPermissionHOCProps> = ({
|
||||
tooltipProps,
|
||||
}) => {
|
||||
const { hasAccess } = useContext(AccessContext);
|
||||
let access;
|
||||
let access: boolean;
|
||||
|
||||
if (projectId && environmentId) {
|
||||
access = hasAccess(permission, projectId, environmentId);
|
||||
|
@ -44,7 +44,7 @@ export const UserAvatar: FC<IUserAvatarProps> = ({
|
||||
src = user?.imageUrl;
|
||||
}
|
||||
|
||||
let fallback;
|
||||
let fallback: string | undefined;
|
||||
if (!children && user) {
|
||||
fallback = user?.name || user?.email || user?.username;
|
||||
if (fallback?.includes(' ')) {
|
||||
|
@ -71,7 +71,11 @@ const ContextList: VFC = () => {
|
||||
Header: 'Name',
|
||||
accessor: 'name',
|
||||
width: '70%',
|
||||
Cell: ({ row: { original: { name, description } } }: any) => (
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name, description },
|
||||
},
|
||||
}: any) => (
|
||||
<LinkCell
|
||||
title={name}
|
||||
to={`/context/edit/${name}`}
|
||||
@ -91,7 +95,11 @@ const ContextList: VFC = () => {
|
||||
Header: 'Actions',
|
||||
id: 'Actions',
|
||||
align: 'center',
|
||||
Cell: ({ row: { original: { name } } }: any) => (
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name },
|
||||
},
|
||||
}: any) => (
|
||||
<ContextActionsCell
|
||||
name={name}
|
||||
onDelete={() => {
|
||||
|
@ -211,18 +211,15 @@ export const DemoSteps = ({
|
||||
const currentStep = currentTopic.steps[step];
|
||||
if (!currentStep) return;
|
||||
|
||||
setTimeout(
|
||||
() => {
|
||||
if (
|
||||
currentStep.href &&
|
||||
!location.pathname.endsWith(currentStep.href.split('?')[0])
|
||||
) {
|
||||
navigate(currentStep.href);
|
||||
}
|
||||
waitForLoad(currentStep);
|
||||
},
|
||||
currentStep.delay ?? 0,
|
||||
);
|
||||
setTimeout(() => {
|
||||
if (
|
||||
currentStep.href &&
|
||||
!location.pathname.endsWith(currentStep.href.split('?')[0])
|
||||
) {
|
||||
navigate(currentStep.href);
|
||||
}
|
||||
waitForLoad(currentStep);
|
||||
}, currentStep.delay ?? 0);
|
||||
}, [topic, step]);
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { diff } from 'deep-diff';
|
||||
import { IEvent } from 'interfaces/event';
|
||||
import { useTheme } from '@mui/system';
|
||||
import { CSSProperties } from 'react';
|
||||
import { JSX, CSSProperties } from 'react';
|
||||
|
||||
const DIFF_PREFIXES: Record<string, string> = {
|
||||
A: ' ',
|
||||
@ -40,7 +40,7 @@ const EventDiff = ({
|
||||
: undefined;
|
||||
|
||||
const buildItemDiff = (diff: any, key: string) => {
|
||||
let change;
|
||||
let change: JSX.Element | undefined;
|
||||
if (diff.lhs !== undefined) {
|
||||
change = (
|
||||
<div style={styles.D}>
|
||||
@ -59,7 +59,7 @@ const EventDiff = ({
|
||||
};
|
||||
|
||||
const buildDiff = (diff: any, index: number): IEventDiffResult => {
|
||||
let change;
|
||||
let change: JSX.Element | undefined;
|
||||
const key = diff.path?.join('.') ?? diff.index;
|
||||
|
||||
if (diff.item) {
|
||||
|
@ -70,7 +70,11 @@ export const EnvironmentVariantsTable = ({
|
||||
{
|
||||
Header: 'Weight',
|
||||
accessor: 'weight',
|
||||
Cell: ({ row: { original: { name, weight } } }: any) => {
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name, weight },
|
||||
},
|
||||
}: any) => {
|
||||
return (
|
||||
<TextCell data-testid={`VARIANT_WEIGHT_${name}`}>
|
||||
{calculateVariantWeight(weight)} %
|
||||
|
@ -54,7 +54,11 @@ export const FeatureTypesList = () => {
|
||||
Header: 'Name',
|
||||
accessor: 'name',
|
||||
width: '90%',
|
||||
Cell: ({ row: { original: { name, description } } }: any) => {
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name, description },
|
||||
},
|
||||
}: any) => {
|
||||
return (
|
||||
<LinkCell
|
||||
data-loading
|
||||
|
@ -5,12 +5,10 @@ import { Typography, styled } from '@mui/material';
|
||||
import { IntegrationIcon } from '../IntegrationList/IntegrationIcon/IntegrationIcon';
|
||||
import { Markdown } from 'component/common/Markdown/Markdown';
|
||||
|
||||
const StyledHowDoesItWorkSection = styled(StyledRaisedSection)(
|
||||
({ theme }) => ({
|
||||
fontSize: theme.fontSizes.smallBody,
|
||||
gap: theme.spacing(1.5),
|
||||
}),
|
||||
);
|
||||
const StyledHowDoesItWorkSection = styled(StyledRaisedSection)(({ theme }) => ({
|
||||
fontSize: theme.fontSizes.smallBody,
|
||||
gap: theme.spacing(1.5),
|
||||
}));
|
||||
|
||||
interface IIntegrationHowToSectionProps {
|
||||
provider?: Pick<AddonTypeSchema, 'howTo' | 'name'>;
|
||||
|
@ -117,7 +117,11 @@ export const VariantInformation: VFC<IVariantInformationProps> = ({
|
||||
const COLUMNS = [
|
||||
{
|
||||
id: 'Icon',
|
||||
Cell: ({ row: { original: { selected } } }: any) => (
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { selected },
|
||||
},
|
||||
}: any) => (
|
||||
<>
|
||||
<ConditionallyRender
|
||||
condition={selected}
|
||||
@ -132,9 +136,11 @@ const COLUMNS = [
|
||||
Header: 'Name',
|
||||
accessor: 'name',
|
||||
searchable: true,
|
||||
Cell: ({ row: { original: { name } } }: any) => (
|
||||
<TextCell>{name}</TextCell>
|
||||
),
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name },
|
||||
},
|
||||
}: any) => <TextCell>{name}</TextCell>,
|
||||
maxWidth: 175,
|
||||
width: 175,
|
||||
},
|
||||
@ -144,8 +150,10 @@ const COLUMNS = [
|
||||
sortType: 'alphanumeric',
|
||||
searchable: true,
|
||||
maxWidth: 75,
|
||||
Cell: ({ row: { original: { weight } } }: any) => (
|
||||
<TextCell>{weight}</TextCell>
|
||||
),
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { weight },
|
||||
},
|
||||
}: any) => <TextCell>{weight}</TextCell>,
|
||||
},
|
||||
];
|
||||
|
@ -57,7 +57,11 @@ export const ProjectDoraMetrics = () => {
|
||||
Header: 'Name',
|
||||
accessor: 'name',
|
||||
width: '40%',
|
||||
Cell: ({ row: { original: { name } } }: any) => {
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name },
|
||||
},
|
||||
}: any) => {
|
||||
return (
|
||||
<Box
|
||||
data-loading
|
||||
|
@ -268,8 +268,7 @@ export const ProjectAccessAssign = ({
|
||||
option: IAccessOption,
|
||||
selected: boolean,
|
||||
) => {
|
||||
let optionGroup;
|
||||
let optionUser;
|
||||
let optionGroup: IGroup | undefined, optionUser: IUser | undefined;
|
||||
if (option.type === ENTITY_TYPE.GROUP) {
|
||||
optionGroup = option.entity as IGroup;
|
||||
} else {
|
||||
|
@ -102,7 +102,6 @@ const strategyListItem = (
|
||||
{`${formatStrategyNameParens(
|
||||
strategy,
|
||||
)} — in change request `}
|
||||
|
||||
<StyledLink
|
||||
to={formatChangeRequestPath(strategy.projectId, id)}
|
||||
target='_blank'
|
||||
|
@ -134,7 +134,6 @@ const strategyListItem = (
|
||||
{`${formatStrategyNameParens(
|
||||
strategy,
|
||||
)} — in change request `}
|
||||
|
||||
<Link
|
||||
to={formatChangeRequestPath(strategy.projectId, id)}
|
||||
target='_blank'
|
||||
|
@ -184,7 +184,11 @@ const getColumns = () => [
|
||||
Header: 'Name',
|
||||
accessor: 'name',
|
||||
width: '60%',
|
||||
Cell: ({ row: { original: { name, description, id } } }: any) => (
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name, description, id },
|
||||
},
|
||||
}: any) => (
|
||||
<LinkCell
|
||||
title={name}
|
||||
to={`/segments/edit/${id}`}
|
||||
|
@ -256,7 +256,9 @@ export const StrategiesList = () => {
|
||||
accessor: (row: any) => formatStrategyName(row.name),
|
||||
width: '90%',
|
||||
Cell: ({
|
||||
row: { original: { name, description, deprecated } },
|
||||
row: {
|
||||
original: { name, description, deprecated },
|
||||
},
|
||||
}: any) => {
|
||||
return (
|
||||
<LinkCell
|
||||
|
@ -77,7 +77,11 @@ export const TagTypeList = () => {
|
||||
Header: 'Name',
|
||||
accessor: 'name',
|
||||
width: '90%',
|
||||
Cell: ({ row: { original: { name, description } } }: any) => {
|
||||
Cell: ({
|
||||
row: {
|
||||
original: { name, description },
|
||||
},
|
||||
}: any) => {
|
||||
return (
|
||||
<LinkCell
|
||||
data-loading
|
||||
|
@ -15,7 +15,7 @@ import { ConditionallyRender } from 'component/common/ConditionallyRender/Condit
|
||||
import { Alert } from '@mui/material';
|
||||
import { useAuthDetails } from 'hooks/api/getters/useAuth/useAuthDetails';
|
||||
import { AUTH_PAGE_ID } from 'utils/testIds';
|
||||
import { useEffect } from 'react';
|
||||
import { ReactElement, useEffect } from 'react';
|
||||
import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
|
||||
|
||||
interface IAuthenticationProps {
|
||||
@ -46,7 +46,7 @@ const Authentication = ({
|
||||
return null;
|
||||
}
|
||||
|
||||
let content;
|
||||
let content: ReactElement;
|
||||
if (authDetails.type === PASSWORD_TYPE) {
|
||||
content = (
|
||||
<>
|
||||
|
@ -122,17 +122,12 @@ declare module '@mui/material/styles' {
|
||||
variants: string[];
|
||||
}
|
||||
|
||||
// biome-ignore lint/suspicious/noEmptyInterface: <explanation>
|
||||
interface Theme extends CustomTheme {}
|
||||
// biome-ignore lint/suspicious/noEmptyInterface: <explanation>
|
||||
interface ThemeOptions extends CustomTheme {}
|
||||
|
||||
// biome-ignore lint/suspicious/noEmptyInterface: <explanation>
|
||||
interface Palette extends CustomPalette {}
|
||||
// biome-ignore lint/suspicious/noEmptyInterface: <explanation>
|
||||
interface PaletteOptions extends CustomPalette {}
|
||||
|
||||
// biome-ignore lint/suspicious/noEmptyInterface: <explanation>
|
||||
interface TypeBackground extends CustomTypeBackground {}
|
||||
|
||||
/* Extend the background object from MUI */
|
||||
|
@ -8,7 +8,7 @@ export const getCreateTogglePath = (
|
||||
) => {
|
||||
const path = `/projects/${projectId}/create-toggle`;
|
||||
|
||||
let queryString;
|
||||
let queryString: string | undefined;
|
||||
if (query) {
|
||||
queryString = Object.keys(query).reduce((acc, curr) => {
|
||||
return `${acc}${curr}=${query[curr]}`;
|
||||
|
@ -510,47 +510,59 @@
|
||||
"@babel/helper-validator-identifier" "^7.22.20"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@biomejs/biome@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.4.1.tgz#b698c67ea8cd8141c8e27f857c8e6e794320a251"
|
||||
integrity sha512-JccVAwPbhi37pdxbAGmaOBjUTKEwEjWAhl7rKkVVuXHo4MLASXJ5HR8BTgrImi4/7rTBsGz1tgVD1Kwv1CHGRg==
|
||||
"@biomejs/biome@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.5.1.tgz#ed665a8693e3014bf8fa641ad58703c85dd575cc"
|
||||
integrity sha512-rdMA/N1Zc1nxUtbXMVr+50Sg/Pezz+9qGQa2uyRWFtrCoyr3dv0pVz+0ifGGue18ip50ZH8x2r5CV7zo8Q/0mA==
|
||||
optionalDependencies:
|
||||
"@biomejs/cli-darwin-arm64" "1.4.1"
|
||||
"@biomejs/cli-darwin-x64" "1.4.1"
|
||||
"@biomejs/cli-linux-arm64" "1.4.1"
|
||||
"@biomejs/cli-linux-x64" "1.4.1"
|
||||
"@biomejs/cli-win32-arm64" "1.4.1"
|
||||
"@biomejs/cli-win32-x64" "1.4.1"
|
||||
"@biomejs/cli-darwin-arm64" "1.5.1"
|
||||
"@biomejs/cli-darwin-x64" "1.5.1"
|
||||
"@biomejs/cli-linux-arm64" "1.5.1"
|
||||
"@biomejs/cli-linux-arm64-musl" "1.5.1"
|
||||
"@biomejs/cli-linux-x64" "1.5.1"
|
||||
"@biomejs/cli-linux-x64-musl" "1.5.1"
|
||||
"@biomejs/cli-win32-arm64" "1.5.1"
|
||||
"@biomejs/cli-win32-x64" "1.5.1"
|
||||
|
||||
"@biomejs/cli-darwin-arm64@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.4.1.tgz#75f9c3c9b1abed8836c8f7bc8cd23ba153fb93d1"
|
||||
integrity sha512-PZWy2Idndqux38p6AXSDQM2ldRAWi32bvb7bMbTN0ALzpWYMYnxd71ornatumSSJYoNhKmxzDLq+jct7nZJ79w==
|
||||
"@biomejs/cli-darwin-arm64@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.1.tgz#ea33f009aaa4bca3ce281e010a6cb108249cb973"
|
||||
integrity sha512-E9pLakmSVHP6UH2uqAghqEkr/IHAIDfDyCedqJVnyFc+uufNTHwB8id4XTiWy/eKIdgxHZsTSE+R+W0IqrTNVQ==
|
||||
|
||||
"@biomejs/cli-darwin-x64@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.4.1.tgz#672fcce2d339de3bb7a7bd2997e94f03121a28a3"
|
||||
integrity sha512-soj3BWhnsM1M2JlzR09cibUzG1owJqetwj/Oo7yg0foijo9lNH9XWXZfJBYDKgW/6Fomn+CC2EcUS+hisQzt9g==
|
||||
"@biomejs/cli-darwin-x64@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.1.tgz#c719a8615b380b25cd9a4bbdfc81d90dbec0996b"
|
||||
integrity sha512-8O1F+FcoCi02JlocyilB6R3y3kT9sRkBCRwYddaBIScQe2hCme/mA2rVzrhCCHhskrclJ51GEKjkEORj4/8c2A==
|
||||
|
||||
"@biomejs/cli-linux-arm64@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.4.1.tgz#c816206089ad29ce866c58a6e00e9d3d64a3529d"
|
||||
integrity sha512-YIZqfJUg4F+fPsBTXxgD7EU2E5OAYbmYSl/snf4PevwfQCWE/omOFZv+NnIQmjYj9I7ParDgcJvanoA3/kO0JQ==
|
||||
"@biomejs/cli-linux-arm64-musl@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.1.tgz#c5364e08faca4826654b191e696425d5449a6fe3"
|
||||
integrity sha512-Lw9G3LUdhRMp8L8RMeVevnfQCa7luT6ubQ8GRjLju32glxWKefpDrzgfHixGyvTQPlhnYjQ+V8/QQ/I7WPzOoA==
|
||||
|
||||
"@biomejs/cli-linux-x64@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.4.1.tgz#2639daeab1be205cfe444a8d5a3f76aa3a59b956"
|
||||
integrity sha512-9YOZw3qBd/KUj63A6Hn2zZgzGb2nbESM0qNmeMXgmqinVKM//uc4OgY5TuKITuGjMSvcVxxd4dX1IzYjV9qvNQ==
|
||||
"@biomejs/cli-linux-arm64@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.1.tgz#1d9fe74cbc27aa784d8a3743ad1f77da883e2aef"
|
||||
integrity sha512-25gwY4FMzmi1Rl6N835raLq7nzTk+PyEQd88k9Em6dqtI4qpljqmZlMmVjOiwXKe3Ee80J/Vlh7BM36lsHUTEg==
|
||||
|
||||
"@biomejs/cli-win32-arm64@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.4.1.tgz#ed5e749b2e0987cf16b545beaa01be6980ae8ce1"
|
||||
integrity sha512-nWQbvkNKxYn/kCQ0yVF8kCaS3VzaGvtFSmItXiMknU4521LDjJ7tNWH12Gol+pIslrCbd4E1LhJa0a3ThRsBVg==
|
||||
"@biomejs/cli-linux-x64-musl@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.1.tgz#7e6ef6c1308907f30909374f91c380e2c85bf393"
|
||||
integrity sha512-5gapxc/VlwTgGRbTc9h8PMTpf8eNahIBauFUGSXncHgayi3VpezKSicgaQ1bb8FahVXf/5eNEVxVARq/or71Ag==
|
||||
|
||||
"@biomejs/cli-win32-x64@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.4.1.tgz#dd8ee6e14a5d74cbeb2eb9824a43c61bb5c460e4"
|
||||
integrity sha512-88fR2CQxQ4YLs2BUDuywWYQpUKgU3A3sTezANFc/4LGKQFFLV2yX+F7QAdZVkMHfA+RD9Xg178HomM/6mnTNPA==
|
||||
"@biomejs/cli-linux-x64@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.1.tgz#0f6afaf035c6a07fe757d58a315f3a75e49f8987"
|
||||
integrity sha512-YDM0gZP4UbAuaBI3DVbUuj5X+Omm6uxzD1Qpc6hcduH1kzXzs9L0ee7cn/kJtNndoXR8MlmUS0O0/wWvZf2YaA==
|
||||
|
||||
"@biomejs/cli-win32-arm64@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.1.tgz#196bdc1afd0945a0fad76719b601bf7f7a4aaf72"
|
||||
integrity sha512-TVpLBOLUMLQmH2VRFBKFr3rgEkr7XvG4QZxHOxWB9Ivc/sQPvg4aHMd8qpgPKXABGUnultyc9t0+WvfIDxuALg==
|
||||
|
||||
"@biomejs/cli-win32-x64@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.1.tgz#b1996fa2dc6580f39fb2e1b6d126e93baf8da58d"
|
||||
integrity sha512-qx8EKwScZmVYZjMPZ6GF3ZUmgg/N6zqh+d8vHA2E43opNCyqIPTl89sOqkc7zd1CyyABDWxsbqI9Ih6xTT6hnQ==
|
||||
|
||||
"@braintree/sanitize-url@^6.0.0":
|
||||
version "6.0.2"
|
||||
|
@ -151,7 +151,7 @@
|
||||
"devDependencies": {
|
||||
"@apidevtools/swagger-parser": "10.1.0",
|
||||
"@babel/core": "7.23.7",
|
||||
"@biomejs/biome": "1.4.1",
|
||||
"@biomejs/biome": "1.5.1",
|
||||
"@swc/core": "1.3.102",
|
||||
"@swc/jest": "0.2.29",
|
||||
"@types/bcryptjs": "2.4.6",
|
||||
|
@ -42,6 +42,7 @@ export default abstract class Addon {
|
||||
options: any = {},
|
||||
retries: number = 1,
|
||||
): Promise<Response> {
|
||||
// biome-ignore lint/suspicious/noImplicitAnyLet: Due to calling upstream, it's not easy knowing the real type here
|
||||
let res;
|
||||
try {
|
||||
res = await fetch(url, {
|
||||
|
@ -52,7 +52,7 @@ export default class DatadogAddon extends Addon {
|
||||
event,
|
||||
};
|
||||
|
||||
let text;
|
||||
let text: string;
|
||||
if (typeof bodyTemplate === 'string' && bodyTemplate.length > 1) {
|
||||
text = Mustache.render(bodyTemplate, context);
|
||||
} else {
|
||||
|
@ -26,7 +26,7 @@ jest.mock('@slack/web-api', () => ({
|
||||
}));
|
||||
|
||||
describe('SlackAppAddon', () => {
|
||||
let addon;
|
||||
let addon: SlackAppAddon;
|
||||
const accessToken = 'test-access-token';
|
||||
const loggerMock = {
|
||||
debug: jest.fn(),
|
||||
@ -102,7 +102,10 @@ describe('SlackAppAddon', () => {
|
||||
],
|
||||
};
|
||||
|
||||
await addon.handleEvent(eventWith2Tags, { accessToken });
|
||||
await addon.handleEvent(eventWith2Tags, {
|
||||
accessToken,
|
||||
defaultChannels: '',
|
||||
});
|
||||
|
||||
expect(slackApiCalls.length).toBe(2);
|
||||
expect(slackApiCalls[0].channel).toBe('general');
|
||||
@ -132,6 +135,7 @@ describe('SlackAppAddon', () => {
|
||||
it('should not post a message if there are no tagged channels and no defaultChannels', async () => {
|
||||
await addon.handleEvent(event, {
|
||||
accessToken,
|
||||
defaultChannels: '',
|
||||
});
|
||||
|
||||
expect(slackApiCalls.length).toBe(0);
|
||||
@ -167,7 +171,10 @@ describe('SlackAppAddon', () => {
|
||||
.mockResolvedValueOnce({ ok: true })
|
||||
.mockRejectedValueOnce(mockError);
|
||||
|
||||
await addon.handleEvent(eventWith3Tags, { accessToken });
|
||||
await addon.handleEvent(eventWith3Tags, {
|
||||
accessToken,
|
||||
defaultChannels: '',
|
||||
});
|
||||
|
||||
expect(postMessage).toHaveBeenCalledTimes(3);
|
||||
expect(loggerMock.warn).toHaveBeenCalledWith(
|
||||
|
@ -24,7 +24,7 @@ export default class Webhook extends Addon {
|
||||
event,
|
||||
};
|
||||
|
||||
let body;
|
||||
let body: string | undefined;
|
||||
|
||||
if (typeof bodyTemplate === 'string' && bodyTemplate.length > 1) {
|
||||
body = Mustache.render(bodyTemplate, context);
|
||||
|
@ -10,7 +10,7 @@ import rbacMiddleware from './middleware/rbac-middleware';
|
||||
import apiTokenMiddleware from './middleware/api-token-middleware';
|
||||
import { IUnleashServices } from './types/services';
|
||||
import { IAuthType, IUnleashConfig } from './types/option';
|
||||
import { IUnleashStores } from './types/stores';
|
||||
import { IUnleashStores } from './types';
|
||||
|
||||
import IndexRouter from './routes';
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
import dbInit from '../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../test/e2e/helpers/database-init';
|
||||
import getLogger from '../../test/fixtures/no-logger';
|
||||
import { PermissionRef } from 'lib/services/access-service';
|
||||
import { AccessStore } from './access-store';
|
||||
import { BadDataError } from '../../lib/error';
|
||||
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('access_store_serial', getLogger);
|
||||
|
@ -1,10 +1,10 @@
|
||||
import dbInit from '../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../test/e2e/helpers/database-init';
|
||||
import getLogger from '../../test/fixtures/no-logger';
|
||||
import { IClientMetricsStoreV2 } from '../types';
|
||||
import { IClientMetricsStoreV2, IUnleashStores } from '../types';
|
||||
import { endOfDay, setHours, startOfHour, subDays } from 'date-fns';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
let clientMetricsStore: IClientMetricsStoreV2;
|
||||
|
||||
beforeAll(async () => {
|
||||
|
@ -1,11 +1,14 @@
|
||||
import dbInit from '../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../test/e2e/helpers/database-init';
|
||||
import getLogger from '../../test/fixtures/no-logger';
|
||||
import FeatureStrategiesStore from '../features/feature-toggle/feature-toggle-strategies-store';
|
||||
import FeatureToggleStore from '../features/feature-toggle/feature-toggle-store';
|
||||
import StrategyStore from './strategy-store';
|
||||
import { IFeatureStrategy, PartialSome } from '../types';
|
||||
import {
|
||||
IFeatureStrategiesStore,
|
||||
IFeatureStrategy,
|
||||
IFeatureToggleStore,
|
||||
IStrategyStore,
|
||||
PartialSome,
|
||||
} from '../types';
|
||||
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('feature_strategy_store_serial', getLogger);
|
||||
@ -21,7 +24,7 @@ afterAll(async () => {
|
||||
|
||||
test('returns 0 if no custom strategies', async () => {
|
||||
// Arrange
|
||||
const featureStrategiesStore: FeatureStrategiesStore =
|
||||
const featureStrategiesStore: IFeatureStrategiesStore =
|
||||
db.stores.featureStrategiesStore;
|
||||
|
||||
// Act
|
||||
@ -34,22 +37,21 @@ test('returns 0 if no custom strategies', async () => {
|
||||
|
||||
test('returns 0 if no custom strategies are in use', async () => {
|
||||
// Arrange
|
||||
const featureToggleStore: FeatureToggleStore = db.stores.featureToggleStore;
|
||||
const featureStrategiesStore: FeatureStrategiesStore =
|
||||
const featureToggleStore: IFeatureToggleStore =
|
||||
db.stores.featureToggleStore;
|
||||
const featureStrategiesStore: IFeatureStrategiesStore =
|
||||
db.stores.featureStrategiesStore;
|
||||
const strategyStore: StrategyStore = db.stores.strategyStore;
|
||||
const strategyStore: IStrategyStore = db.stores.strategyStore;
|
||||
|
||||
featureToggleStore.create('default', {
|
||||
await featureToggleStore.create('default', {
|
||||
name: 'test-toggle-2',
|
||||
createdByUserId: 9999,
|
||||
});
|
||||
|
||||
strategyStore.createStrategy({
|
||||
await strategyStore.createStrategy({
|
||||
name: 'strategy-2',
|
||||
built_in: 0,
|
||||
parameters: [],
|
||||
description: '',
|
||||
createdAt: '2023-06-09T09:00:12.242Z',
|
||||
});
|
||||
|
||||
// Act
|
||||
@ -62,10 +64,11 @@ test('returns 0 if no custom strategies are in use', async () => {
|
||||
|
||||
test('counts custom strategies in use', async () => {
|
||||
// Arrange
|
||||
const featureToggleStore: FeatureToggleStore = db.stores.featureToggleStore;
|
||||
const featureStrategiesStore: FeatureStrategiesStore =
|
||||
const featureToggleStore: IFeatureToggleStore =
|
||||
db.stores.featureToggleStore;
|
||||
const featureStrategiesStore: IFeatureStrategiesStore =
|
||||
db.stores.featureStrategiesStore;
|
||||
const strategyStore: StrategyStore = db.stores.strategyStore;
|
||||
const strategyStore: IStrategyStore = db.stores.strategyStore;
|
||||
|
||||
await featureToggleStore.create('default', {
|
||||
name: 'test-toggle',
|
||||
@ -74,10 +77,8 @@ test('counts custom strategies in use', async () => {
|
||||
|
||||
await strategyStore.createStrategy({
|
||||
name: 'strategy-1',
|
||||
built_in: 0,
|
||||
parameters: [],
|
||||
description: '',
|
||||
createdAt: '2023-06-09T09:00:12.242Z',
|
||||
});
|
||||
|
||||
await featureStrategiesStore.createStrategyFeatureEnv({
|
||||
@ -108,8 +109,9 @@ const baseStrategy: PartialSome<IFeatureStrategy, 'id' | 'createdAt'> = {
|
||||
variants: [],
|
||||
};
|
||||
test('increment sort order on each new insert', async () => {
|
||||
const featureToggleStore: FeatureToggleStore = db.stores.featureToggleStore;
|
||||
const featureStrategiesStore: FeatureStrategiesStore =
|
||||
const featureToggleStore: IFeatureToggleStore =
|
||||
db.stores.featureToggleStore;
|
||||
const featureStrategiesStore: IFeatureStrategiesStore =
|
||||
db.stores.featureStrategiesStore;
|
||||
|
||||
await featureToggleStore.create('default', {
|
||||
|
@ -1,10 +1,11 @@
|
||||
import { ISegmentStore } from '../types/stores/segment-store';
|
||||
import dbInit from '../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../test/e2e/helpers/database-init';
|
||||
import getLogger from '../../test/fixtures/no-logger';
|
||||
import NotFoundError from '../error/notfound-error';
|
||||
import { IUnleashStores, IUser } from '../types';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
let segmentStore: ISegmentStore;
|
||||
|
||||
beforeAll(async () => {
|
||||
@ -36,7 +37,7 @@ describe('unexpected input handling for get segment', () => {
|
||||
});
|
||||
|
||||
describe('usage counting', () => {
|
||||
let user;
|
||||
let user: IUser;
|
||||
beforeAll(async () => {
|
||||
user = await db.stores.userStore.insert({
|
||||
username: 'test',
|
||||
@ -54,10 +55,12 @@ describe('usage counting', () => {
|
||||
|
||||
const flag1 = await db.stores.featureToggleStore.create('default', {
|
||||
name: 'test',
|
||||
createdByUserId: -1137,
|
||||
});
|
||||
|
||||
const flag2 = await db.stores.featureToggleStore.create('default', {
|
||||
name: 'test2',
|
||||
createdByUserId: -1137,
|
||||
});
|
||||
|
||||
const segment = await segmentStore.create(
|
||||
@ -142,6 +145,7 @@ describe('usage counting', () => {
|
||||
|
||||
const flag = await db.stores.featureToggleStore.create('default', {
|
||||
name: 'test',
|
||||
createdByUserId: -1137,
|
||||
});
|
||||
|
||||
const segment1 = await segmentStore.create(
|
||||
@ -174,6 +178,7 @@ describe('usage counting', () => {
|
||||
rollout: '100',
|
||||
stickiness: 'default',
|
||||
},
|
||||
constraints: [],
|
||||
});
|
||||
|
||||
await db.rawDatabase.table('change_requests').insert({
|
||||
|
@ -19,9 +19,9 @@ class PermissionError extends UnleashError {
|
||||
.map((perm) => `"${perm}"`)
|
||||
.join(', ')}`;
|
||||
|
||||
const message =
|
||||
`You don't have the required permissions to perform this operation. To perform this action, you need ${permissionsMessage}` +
|
||||
(environment ? ` in the "${environment}" environment.` : `.`);
|
||||
const message = `You don't have the required permissions to perform this operation. To perform this action, you need ${permissionsMessage}${
|
||||
environment ? ` in the "${environment}" environment.` : `.`
|
||||
}`;
|
||||
|
||||
super(message);
|
||||
|
||||
|
@ -7,8 +7,10 @@ import FeatureController from '../client-feature-toggle.controller';
|
||||
import { createTestConfig } from '../../../../test/config/test-config';
|
||||
import { secondsToMilliseconds } from 'date-fns';
|
||||
import { ClientSpecService } from '../../../services/client-spec-service';
|
||||
import { Application } from 'express';
|
||||
import { IFlagResolver } from '../../../types';
|
||||
|
||||
let app;
|
||||
let app: Application;
|
||||
|
||||
async function getSetup() {
|
||||
const base = `/random${Math.round(Math.random() * 1000)}`;
|
||||
@ -38,10 +40,10 @@ const callGetAll = async (controller: FeatureController) => {
|
||||
);
|
||||
};
|
||||
|
||||
let base;
|
||||
let request;
|
||||
let base: string;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
|
||||
let flagResolver;
|
||||
let flagResolver: Partial<IFlagResolver>;
|
||||
|
||||
beforeEach(async () => {
|
||||
const setup = await getSetup();
|
||||
|
@ -6,10 +6,11 @@ import {
|
||||
} from '../../../../test/e2e/helpers/test-helper';
|
||||
import getLogger from '../../../../test/fixtures/no-logger';
|
||||
import { DEFAULT_ENV } from '../../../util/constants';
|
||||
import { IUserWithRootRole } from '../../../types';
|
||||
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
let dummyAdmin;
|
||||
let dummyAdmin: IUserWithRootRole;
|
||||
|
||||
const apiClientResponse = [
|
||||
{
|
||||
|
@ -18,6 +18,7 @@ import { ImportTogglesSchema, VariantsSchema } from '../../openapi';
|
||||
import { IContextFieldDto } from '../../types/stores/context-field-store';
|
||||
import { AccessService } from '../../services';
|
||||
import { DEFAULT_ENV } from '../../util';
|
||||
import { IRole } from '../../types/stores/access-store';
|
||||
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
@ -27,7 +28,7 @@ let contextFieldStore: IContextFieldStore;
|
||||
let projectStore: IProjectStore;
|
||||
let toggleStore: IFeatureToggleStore;
|
||||
let accessService: AccessService;
|
||||
let adminRole;
|
||||
let adminRole: IRole;
|
||||
let stores: IUnleashStores;
|
||||
|
||||
const regularUserName = 'import-user';
|
||||
|
@ -103,6 +103,7 @@ import { IPrivateProjectChecker } from '../private-project/privateProjectChecker
|
||||
import { IDependentFeaturesReadModel } from '../dependent-features/dependent-features-read-model-type';
|
||||
import EventService from '../../services/event-service';
|
||||
import { DependentFeaturesService } from '../dependent-features/dependent-features-service';
|
||||
import { FeatureToggleInsert } from './feature-toggle-store';
|
||||
|
||||
interface IFeatureContext {
|
||||
featureName: string;
|
||||
@ -1148,7 +1149,7 @@ class FeatureToggleService {
|
||||
);
|
||||
}
|
||||
if (exists) {
|
||||
let featureData;
|
||||
let featureData: FeatureToggleInsert;
|
||||
if (isValidated) {
|
||||
featureData = { createdByUserId, ...value };
|
||||
} else {
|
||||
|
@ -269,7 +269,7 @@ export default class FeatureToggleStore implements IFeatureToggleStore {
|
||||
'last_seen_at_metrics.environment as last_seen_at_env',
|
||||
);
|
||||
|
||||
let rows;
|
||||
let rows: any[];
|
||||
|
||||
if (project) {
|
||||
rows = await builder.internalQuery
|
||||
|
@ -1,11 +1,12 @@
|
||||
import FeatureToggleService from '../feature-toggle-service';
|
||||
import { createTestConfig } from '../../../../test/config/test-config';
|
||||
import dbInit from '../../../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../../../test/e2e/helpers/database-init';
|
||||
import { DEFAULT_ENV } from '../../../util';
|
||||
import { FeatureStrategySchema } from '../../../openapi';
|
||||
import User from '../../../types/user';
|
||||
import {
|
||||
IConstraint,
|
||||
IUnleashConfig,
|
||||
IUnleashStores,
|
||||
IVariant,
|
||||
SKIP_CHANGE_REQUEST,
|
||||
@ -17,18 +18,18 @@ import { ForbiddenError, PatternError, PermissionError } from '../../../error';
|
||||
import { ISegmentService } from '../../../segments/segment-service-interface';
|
||||
import { createFeatureToggleService, createSegmentService } from '../..';
|
||||
import {
|
||||
insertLastSeenAt,
|
||||
insertFeatureEnvironmentsLastSeen,
|
||||
insertLastSeenAt,
|
||||
} from '../../../../test/e2e/helpers/test-helper';
|
||||
import { EventService } from '../../../services';
|
||||
|
||||
let stores: IUnleashStores;
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
let service: FeatureToggleService;
|
||||
let segmentService: ISegmentService;
|
||||
let eventService: EventService;
|
||||
let environmentService: EnvironmentService;
|
||||
let unleashConfig;
|
||||
let unleashConfig: IUnleashConfig;
|
||||
const TEST_USER_ID = -9999;
|
||||
const mockConstraints = (): IConstraint[] => {
|
||||
return Array.from({ length: 5 }).map(() => ({
|
||||
@ -276,6 +277,7 @@ test('adding and removing an environment preserves variants when variants per en
|
||||
stores,
|
||||
{
|
||||
...unleashConfig,
|
||||
// @ts-expect-error - incomplete flag resolver definition
|
||||
flagResolver: {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
isEnabled: (toggleName: string) => false,
|
||||
@ -472,6 +474,7 @@ test('If change requests are enabled, cannot change variants without going via C
|
||||
// Force all feature flags on to make sure we have Change requests on
|
||||
const customFeatureService = createFeatureToggleService(db.rawDatabase, {
|
||||
...unleashConfig,
|
||||
// @ts-expect-error - incomplete flag resolver definition
|
||||
flagResolver: {
|
||||
isEnabled: () => true,
|
||||
},
|
||||
@ -537,6 +540,7 @@ test('If CRs are protected for any environment in the project stops bulk update
|
||||
// Force all feature flags on to make sure we have Change requests on
|
||||
const customFeatureService = createFeatureToggleService(db.rawDatabase, {
|
||||
...unleashConfig,
|
||||
// @ts-expect-error - incomplete flag resolver definition
|
||||
flagResolver: {
|
||||
isEnabled: () => true,
|
||||
},
|
||||
|
@ -1,10 +1,14 @@
|
||||
import dbInit from '../../../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../../../test/e2e/helpers/database-init';
|
||||
import getLogger from '../../../../test/fixtures/no-logger';
|
||||
import { IFeatureToggleStore, IProjectStore } from '../../../types';
|
||||
import {
|
||||
IFeatureToggleStore,
|
||||
IProjectStore,
|
||||
IUnleashStores,
|
||||
} from '../../../types';
|
||||
import { FeatureToggleInsert } from '../feature-toggle-store';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
let featureToggleStore: IFeatureToggleStore;
|
||||
let projectStore: IProjectStore;
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
import { IFeatureStrategiesStore } from 'lib/features/feature-toggle/types/feature-toggle-strategies-store-type';
|
||||
import { IFeatureToggleStore } from 'lib/features/feature-toggle/types/feature-toggle-store-type';
|
||||
import dbInit from '../../../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../../../test/e2e/helpers/database-init';
|
||||
import getLogger from '../../../../test/fixtures/no-logger';
|
||||
import { IUnleashStores } from '../../../types';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
let featureStrategiesStore: IFeatureStrategiesStore;
|
||||
let featureToggleStore: IFeatureToggleStore;
|
||||
|
||||
@ -85,7 +86,7 @@ test('Can query for features with tags', async () => {
|
||||
name: 'not-tagged',
|
||||
createdByUserId: 9999,
|
||||
});
|
||||
await stores.featureTagStore.tagFeature('to-be-tagged', tag);
|
||||
await stores.featureTagStore.tagFeature('to-be-tagged', tag, -1337);
|
||||
const features = await featureStrategiesStore.getFeatureOverview({
|
||||
projectId: 'default',
|
||||
tag: [[tag.type, tag.value]],
|
||||
@ -127,10 +128,12 @@ test('Can query for features with namePrefix and tags', async () => {
|
||||
await stores.featureTagStore.tagFeature(
|
||||
'to-be-tagged-nameprefix-and-tags',
|
||||
tag,
|
||||
9999,
|
||||
);
|
||||
await stores.featureTagStore.tagFeature(
|
||||
'tagged-but-not-hit-nameprefix-and-tags',
|
||||
tag,
|
||||
9999,
|
||||
);
|
||||
const features = await featureStrategiesStore.getFeatureOverview({
|
||||
projectId: 'default',
|
||||
|
@ -1375,6 +1375,7 @@ test('Can update a strategy based on id', async () => {
|
||||
.post('/api/admin/projects/default/features')
|
||||
.send({ name: featureName })
|
||||
.expect(201);
|
||||
// biome-ignore lint/suspicious/noImplicitAnyLet: Due to assigning from res.body later on. we ignore the type here
|
||||
let strategy;
|
||||
await app.request
|
||||
.post(
|
||||
@ -1456,7 +1457,7 @@ test('Can patch a strategy based on id', async () => {
|
||||
.post(`${BASE_URI}/features`)
|
||||
.send({ name: featureName })
|
||||
.expect(201);
|
||||
let strategy;
|
||||
let strategy: { id: number } | undefined;
|
||||
await app.request
|
||||
.post(
|
||||
`${BASE_URI}/features/${featureName}/environments/${envName}/strategies`,
|
||||
@ -1476,13 +1477,17 @@ test('Can patch a strategy based on id', async () => {
|
||||
|
||||
await app.request
|
||||
.patch(
|
||||
`${BASE_URI}/features/${featureName}/environments/${envName}/strategies/${strategy.id}`,
|
||||
`${BASE_URI}/features/${featureName}/environments/${envName}/strategies/${
|
||||
strategy!.id
|
||||
}`,
|
||||
)
|
||||
.send([{ op: 'replace', path: '/parameters/rollout', value: 42 }])
|
||||
.expect(200);
|
||||
await app.request
|
||||
.get(
|
||||
`${BASE_URI}/features/${featureName}/environments/${envName}/strategies/${strategy.id}`,
|
||||
`${BASE_URI}/features/${featureName}/environments/${envName}/strategies/${
|
||||
strategy!.id
|
||||
}`,
|
||||
)
|
||||
.expect(200)
|
||||
.expect((res) => {
|
||||
@ -1580,7 +1585,7 @@ test('Deleting a strategy should include name of feature strategy was deleted fr
|
||||
})
|
||||
.set('Content-Type', 'application/json')
|
||||
.expect(201);
|
||||
let strategyId;
|
||||
let strategyId: number | undefined;
|
||||
await app.request
|
||||
.post(
|
||||
`/api/admin/projects/default/features/${featureName}/environments/${environment}/strategies`,
|
||||
@ -1839,7 +1844,7 @@ test('Deleting last strategy for feature environment should disable that environ
|
||||
.post('/api/admin/projects/default/features')
|
||||
.send({ name: featureName })
|
||||
.expect(201);
|
||||
let strategyId;
|
||||
let strategyId: number | undefined;
|
||||
await app.request
|
||||
.post(
|
||||
`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`,
|
||||
@ -1902,7 +1907,7 @@ test('Deleting strategy for feature environment should not disable that environm
|
||||
.post('/api/admin/projects/default/features')
|
||||
.send({ name: featureName })
|
||||
.expect(201);
|
||||
let strategyId;
|
||||
let strategyId: number | undefined;
|
||||
await app.request
|
||||
.post(
|
||||
`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`,
|
||||
@ -3250,7 +3255,7 @@ test('Disabling last strategy for feature environment should disable that enviro
|
||||
.post('/api/admin/projects/default/features')
|
||||
.send({ name: featureName })
|
||||
.expect(201);
|
||||
let strategyId;
|
||||
let strategyId: number | undefined;
|
||||
await app.request
|
||||
.post(
|
||||
`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`,
|
||||
@ -3322,7 +3327,7 @@ test('Enabling a feature environment should add the default strategy when only d
|
||||
.post('/api/admin/projects/default/features')
|
||||
.send({ name: featureName })
|
||||
.expect(201);
|
||||
let strategyId;
|
||||
let strategyId: number | undefined;
|
||||
await app.request
|
||||
.post(
|
||||
`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`,
|
||||
|
@ -33,7 +33,7 @@ export class FileStorageProvider<T> implements StorageProvider<T> {
|
||||
|
||||
async get(key: string): Promise<T | undefined> {
|
||||
const path = this.getPath(key);
|
||||
let data;
|
||||
let data: string | undefined;
|
||||
try {
|
||||
data = await readFile(path, 'utf8');
|
||||
} catch (error: any) {
|
||||
|
@ -45,7 +45,7 @@ function getSeed(context: Context, stickiness: string = 'default'): string {
|
||||
const value = resolveContextValue(context, stickiness);
|
||||
return value ? value.toString() : randomString();
|
||||
}
|
||||
let result;
|
||||
let result: string | undefined;
|
||||
stickinessSelectors.some((key: string): boolean => {
|
||||
const value = context[key];
|
||||
if (typeof value === 'string' && value !== '') {
|
||||
|
@ -1,13 +1,13 @@
|
||||
import EnvironmentService from './environment-service';
|
||||
import { createTestConfig } from '../../../test/config/test-config';
|
||||
import dbInit from '../../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init';
|
||||
import NotFoundError from '../../error/notfound-error';
|
||||
import { IUnleashStores, SYSTEM_USER } from '../../types';
|
||||
import NameExistsError from '../../error/name-exists-error';
|
||||
import { EventService } from '../../services';
|
||||
|
||||
let stores: IUnleashStores;
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
let service: EnvironmentService;
|
||||
let eventService: EventService;
|
||||
|
||||
|
@ -1,9 +1,12 @@
|
||||
import dbInit from '../../../test/e2e/helpers/database-init';
|
||||
import { setupAppWithCustomConfig } from '../../../test/e2e/helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../../test/e2e/helpers/test-helper';
|
||||
import getLogger from '../../../test/fixtures/no-logger';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('tag_types_api_serial', getLogger);
|
||||
|
@ -2,7 +2,7 @@ import { register } from 'prom-client';
|
||||
import EventEmitter from 'events';
|
||||
import { IEventStore } from './types/stores/event-store';
|
||||
import { createTestConfig } from '../test/config/test-config';
|
||||
import { REQUEST_TIME, DB_TIME } from './metric-events';
|
||||
import { DB_TIME, REQUEST_TIME } from './metric-events';
|
||||
import {
|
||||
CLIENT_METRICS,
|
||||
CLIENT_REGISTER,
|
||||
@ -15,7 +15,7 @@ import { InstanceStatsService } from './features/instance-stats/instance-stats-s
|
||||
import VersionService from './services/version-service';
|
||||
import { createFakeGetActiveUsers } from './features/instance-stats/getActiveUsers';
|
||||
import { createFakeGetProductionChanges } from './features/instance-stats/getProductionChanges';
|
||||
import { IEnvironmentStore } from './types';
|
||||
import { IEnvironmentStore, IUnleashStores } from './types';
|
||||
import FakeEnvironmentStore from './features/project-environments/fake-environment-store';
|
||||
|
||||
const monitor = createMetricsMonitor();
|
||||
@ -24,7 +24,7 @@ const prometheusRegister = register;
|
||||
let eventStore: IEventStore;
|
||||
let environmentStore: IEnvironmentStore;
|
||||
let statsService: InstanceStatsService;
|
||||
let stores;
|
||||
let stores: IUnleashStores;
|
||||
beforeAll(() => {
|
||||
const config = createTestConfig({
|
||||
server: {
|
||||
|
@ -18,7 +18,7 @@ export function responseTimeMetrics(
|
||||
const { statusCode } = res;
|
||||
const pathname = req.route ? req.baseUrl + req.route.path : '(hidden)';
|
||||
|
||||
let appName;
|
||||
let appName: string | undefined;
|
||||
if (
|
||||
!flagResolver.isEnabled('responseTimeWithAppNameKillSwitch') &&
|
||||
(instanceStatsService.getAppCountSnapshot('7d') ??
|
||||
|
@ -9,7 +9,7 @@ function sessionDb(
|
||||
config: Pick<IUnleashConfig, 'session' | 'server' | 'secureHeaders'>,
|
||||
knex: Knex,
|
||||
): RequestHandler {
|
||||
let store;
|
||||
let store: session.Store;
|
||||
const { db, cookieName } = config.session;
|
||||
const age =
|
||||
hoursToMilliseconds(config.session.ttlHours) || hoursToMilliseconds(48);
|
||||
|
@ -338,7 +338,7 @@ export class ApiTokenController extends Controller {
|
||||
this.logger.error(req.body);
|
||||
return res.status(400).send();
|
||||
}
|
||||
let tokenToUpdate;
|
||||
let tokenToUpdate: IApiToken | undefined;
|
||||
try {
|
||||
tokenToUpdate = await this.apiTokenService.getToken(token);
|
||||
} catch (error) {}
|
||||
@ -374,7 +374,7 @@ export class ApiTokenController extends Controller {
|
||||
res: Response,
|
||||
): Promise<void> {
|
||||
const { token } = req.params;
|
||||
let tokenToUpdate;
|
||||
let tokenToUpdate: IApiToken | undefined;
|
||||
try {
|
||||
tokenToUpdate = await this.apiTokenService.getToken(token);
|
||||
} catch (error) {}
|
||||
|
@ -31,8 +31,8 @@ async function getSetup() {
|
||||
};
|
||||
}
|
||||
|
||||
let request;
|
||||
let base;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
let base: string;
|
||||
|
||||
beforeEach(async () => {
|
||||
const setup = await getSetup();
|
||||
|
@ -23,8 +23,8 @@ async function getSetup() {
|
||||
};
|
||||
}
|
||||
|
||||
let base;
|
||||
let request;
|
||||
let base: string;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
|
||||
beforeEach(async () => {
|
||||
const setup = await getSetup();
|
||||
|
@ -4,6 +4,7 @@ import permissions from '../../../test/fixtures/permissions';
|
||||
import getApp from '../../app';
|
||||
import { createTestConfig } from '../../../test/config/test-config';
|
||||
import { createServices } from '../../services';
|
||||
import { IUnleashStores } from '../../types';
|
||||
|
||||
async function getSetup() {
|
||||
const stores = createStores();
|
||||
@ -22,8 +23,8 @@ async function getSetup() {
|
||||
};
|
||||
}
|
||||
|
||||
let stores;
|
||||
let request;
|
||||
let stores: IUnleashStores;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
|
||||
beforeEach(async () => {
|
||||
const setup = await getSetup();
|
||||
|
@ -5,6 +5,7 @@ import getApp from '../../app';
|
||||
import supertest from 'supertest';
|
||||
import permissions from '../../../test/fixtures/permissions';
|
||||
import { RoleName, RoleType } from '../../types/model';
|
||||
import { IUnleashStores } from '../../types';
|
||||
|
||||
describe('Public Signup API', () => {
|
||||
async function getSetup() {
|
||||
@ -36,8 +37,8 @@ describe('Public Signup API', () => {
|
||||
};
|
||||
}
|
||||
|
||||
let stores;
|
||||
let request;
|
||||
let stores: IUnleashStores;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
|
||||
const user = {
|
||||
username: 'some-username',
|
||||
@ -67,7 +68,11 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
stores.roleStore.create({ name: RoleName.VIEWER });
|
||||
stores.roleStore.create({
|
||||
description: '',
|
||||
roleType: '',
|
||||
name: RoleName.VIEWER,
|
||||
});
|
||||
const bodyCreate = createBody();
|
||||
|
||||
const res = await request
|
||||
@ -86,8 +91,11 @@ describe('Public Signup API', () => {
|
||||
expect.assertions(2);
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
stores.publicSignupTokenStore.insert({
|
||||
await stores.clientApplicationsStore.upsert({ appName });
|
||||
await stores.publicSignupTokenStore.insert({
|
||||
roleId: 0,
|
||||
secret: '',
|
||||
url: '',
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
createdBy: 'johnDoe',
|
||||
@ -108,6 +116,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - hacked in via fake store
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
@ -127,6 +136,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - hacked in via fake store
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
@ -151,6 +161,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - hacked in via fake store
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
@ -170,6 +181,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - hacked in via fake store
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
|
@ -102,6 +102,7 @@ class StateController extends Controller {
|
||||
const userName = extractUsername(req);
|
||||
const { drop, keep } = req.query;
|
||||
// TODO: Should override request type so file is a type on request
|
||||
// biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
|
||||
let data;
|
||||
// @ts-expect-error
|
||||
if (req.file) {
|
||||
|
@ -4,6 +4,7 @@ import permissions from '../../../test/fixtures/permissions';
|
||||
import getApp from '../../app';
|
||||
import { createTestConfig } from '../../../test/config/test-config';
|
||||
import { createServices } from '../../services';
|
||||
import { ITagStore } from '../../types';
|
||||
|
||||
async function getSetup() {
|
||||
const base = `/random${Math.round(Math.random() * 1000)}`;
|
||||
@ -24,9 +25,9 @@ async function getSetup() {
|
||||
};
|
||||
}
|
||||
|
||||
let base;
|
||||
let tagStore;
|
||||
let request;
|
||||
let base: string;
|
||||
let tagStore: ITagStore;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
|
||||
beforeEach(async () => {
|
||||
const setup = await getSetup();
|
||||
|
@ -9,11 +9,11 @@ import {
|
||||
IUnleashServices,
|
||||
IUnleashStores,
|
||||
} from '../../types';
|
||||
import dbInit from '../../../test/e2e/helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init';
|
||||
import { subMinutes } from 'date-fns';
|
||||
import { ApiTokenType } from '../../types/models/api-token';
|
||||
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
|
||||
async function getSetup(opts?: IUnleashOptions) {
|
||||
const config = createTestConfig(opts);
|
||||
@ -30,10 +30,10 @@ async function getSetup(opts?: IUnleashOptions) {
|
||||
};
|
||||
}
|
||||
|
||||
let request;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
let stores: IUnleashStores;
|
||||
let services: IUnleashServices;
|
||||
let destroy;
|
||||
let destroy: () => Promise<void>;
|
||||
|
||||
beforeAll(async () => {
|
||||
const setup = await getSetup();
|
||||
@ -43,8 +43,8 @@ beforeAll(async () => {
|
||||
services = setup.services;
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
destroy();
|
||||
afterAll(async () => {
|
||||
await destroy();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
|
@ -16,7 +16,7 @@ async function getSetup() {
|
||||
stores,
|
||||
};
|
||||
}
|
||||
let request;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
beforeEach(async () => {
|
||||
const setup = await getSetup();
|
||||
request = setup.request;
|
||||
|
@ -39,7 +39,8 @@ interface IRouteOptionsNonGet extends IRouteOptionsBase {
|
||||
type IRouteOptions = IRouteOptionsNonGet | IRouteOptionsGet;
|
||||
|
||||
const checkPermission =
|
||||
(permission: Permission = []) => async (req, res, next) => {
|
||||
(permission: Permission = []) =>
|
||||
async (req, res, next) => {
|
||||
const permissions = (
|
||||
Array.isArray(permission) ? permission : [permission]
|
||||
).filter((p) => p !== NONE);
|
||||
|
@ -17,7 +17,7 @@ async function getSetup() {
|
||||
stores,
|
||||
};
|
||||
}
|
||||
let request;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
beforeEach(async () => {
|
||||
const setup = await getSetup();
|
||||
request = setup.request;
|
||||
|
@ -5,6 +5,7 @@ import getApp from '../app';
|
||||
import supertest from 'supertest';
|
||||
import permissions from '../../test/fixtures/permissions';
|
||||
import { RoleName, RoleType } from '../types/model';
|
||||
import { IUnleashStores } from 'lib/types';
|
||||
|
||||
describe('Public Signup API', () => {
|
||||
async function getSetup() {
|
||||
@ -49,8 +50,8 @@ describe('Public Signup API', () => {
|
||||
};
|
||||
}
|
||||
|
||||
let stores;
|
||||
let request;
|
||||
let stores: IUnleashStores;
|
||||
let request: supertest.SuperTest<supertest.Test>;
|
||||
|
||||
const user = {
|
||||
username: 'some-username',
|
||||
@ -81,6 +82,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - This method is available on our fake store, but not our real store
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
@ -103,6 +105,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - We need more fields, but since this is a test. we get away with this call
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
@ -129,14 +132,15 @@ describe('Public Signup API', () => {
|
||||
test('should not be able to send root role in signup request body', async () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
stores.publicSignupTokenStore.create({
|
||||
await stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - We need more fields, but since this is a test. we get away with this call
|
||||
await stores.publicSignupTokenStore.insert({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
});
|
||||
|
||||
const roles = await stores.roleStore.getAll();
|
||||
const adminId = roles.find((role) => role.name === RoleName.ADMIN).id;
|
||||
const adminId = roles.find((role) => role.name === RoleName.ADMIN)!.id;
|
||||
|
||||
return request
|
||||
.post('/invite/some-secret/signup')
|
||||
@ -148,6 +152,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - This method is available on our fake store, but not our real store
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(-1),
|
||||
@ -163,6 +168,7 @@ describe('Public Signup API', () => {
|
||||
const appName = '123!23';
|
||||
|
||||
stores.clientApplicationsStore.upsert({ appName });
|
||||
// @ts-expect-error - This method is available on our fake store, but not our real store
|
||||
stores.publicSignupTokenStore.create({
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
|
@ -3,8 +3,12 @@ import { IClientApp } from '../../types/model';
|
||||
import FakeEventStore from '../../../test/fixtures/fake-event-store';
|
||||
import { createTestConfig } from '../../../test/config/test-config';
|
||||
import { FakePrivateProjectChecker } from '../../features/private-project/fakePrivateProjectChecker';
|
||||
import { IUnleashConfig } from '../../types';
|
||||
import FakeClientMetricsStoreV2 from '../../../test/fixtures/fake-client-metrics-store-v2';
|
||||
import FakeStrategiesStore from '../../../test/fixtures/fake-strategies-store';
|
||||
import FakeFeatureToggleStore from '../../features/feature-toggle/fakes/fake-feature-toggle-store';
|
||||
|
||||
let config;
|
||||
let config: IUnleashConfig;
|
||||
beforeAll(() => {
|
||||
config = createTestConfig({});
|
||||
});
|
||||
@ -19,9 +23,9 @@ test('Multiple registrations of same appname and instanceid within same time per
|
||||
};
|
||||
const clientMetrics = new ClientInstanceService(
|
||||
{
|
||||
clientMetricsStoreV2: null,
|
||||
strategyStore: null,
|
||||
featureToggleStore: null,
|
||||
clientMetricsStoreV2: new FakeClientMetricsStoreV2(),
|
||||
strategyStore: new FakeStrategiesStore(),
|
||||
featureToggleStore: new FakeFeatureToggleStore(),
|
||||
clientApplicationsStore,
|
||||
clientInstanceStore,
|
||||
eventStore: new FakeEventStore(),
|
||||
@ -69,9 +73,9 @@ test('Multiple unique clients causes multiple registrations', async () => {
|
||||
|
||||
const clientMetrics = new ClientInstanceService(
|
||||
{
|
||||
clientMetricsStoreV2: null,
|
||||
strategyStore: null,
|
||||
featureToggleStore: null,
|
||||
clientMetricsStoreV2: new FakeClientMetricsStoreV2(),
|
||||
strategyStore: new FakeStrategiesStore(),
|
||||
featureToggleStore: new FakeFeatureToggleStore(),
|
||||
clientApplicationsStore,
|
||||
clientInstanceStore,
|
||||
eventStore: new FakeEventStore(),
|
||||
@ -119,9 +123,9 @@ test('Same client registered outside of dedup interval will be registered twice'
|
||||
|
||||
const clientMetrics = new ClientInstanceService(
|
||||
{
|
||||
clientMetricsStoreV2: null,
|
||||
strategyStore: null,
|
||||
featureToggleStore: null,
|
||||
clientMetricsStoreV2: new FakeClientMetricsStoreV2(),
|
||||
strategyStore: new FakeStrategiesStore(),
|
||||
featureToggleStore: new FakeFeatureToggleStore(),
|
||||
clientApplicationsStore,
|
||||
clientInstanceStore,
|
||||
eventStore: new FakeEventStore(),
|
||||
@ -169,9 +173,9 @@ test('No registrations during a time period will not call stores', async () => {
|
||||
};
|
||||
const clientMetrics = new ClientInstanceService(
|
||||
{
|
||||
clientMetricsStoreV2: null,
|
||||
strategyStore: null,
|
||||
featureToggleStore: null,
|
||||
clientMetricsStoreV2: new FakeClientMetricsStoreV2(),
|
||||
strategyStore: new FakeStrategiesStore(),
|
||||
featureToggleStore: new FakeFeatureToggleStore(),
|
||||
clientApplicationsStore,
|
||||
clientInstanceStore,
|
||||
eventStore: new FakeEventStore(),
|
||||
|
@ -164,7 +164,7 @@ class ContextService {
|
||||
async validateUniqueName({
|
||||
name,
|
||||
}: Pick<IContextFieldDto, 'name'>): Promise<void> {
|
||||
let msg;
|
||||
let msg: string | undefined;
|
||||
try {
|
||||
await this.contextFieldStore.get(name);
|
||||
msg = 'A context field with that name already exist';
|
||||
|
@ -66,7 +66,7 @@ export default class ResetTokenService {
|
||||
};
|
||||
|
||||
async isValid(token: string): Promise<IResetToken> {
|
||||
let t;
|
||||
let t: IResetToken;
|
||||
try {
|
||||
t = await this.store.getActive(token);
|
||||
if (!t.usedAt) {
|
||||
|
@ -6,7 +6,7 @@ import SettingService from './setting-service';
|
||||
import EventService from './event-service';
|
||||
import MaintenanceService from '../features/maintenance/maintenance-service';
|
||||
|
||||
function ms(timeMs) {
|
||||
function ms(timeMs: number) {
|
||||
return new Promise((resolve) => setTimeout(resolve, timeMs));
|
||||
}
|
||||
|
||||
@ -29,7 +29,7 @@ const getLogger = () => {
|
||||
};
|
||||
|
||||
let schedulerService: SchedulerService;
|
||||
let getRecords;
|
||||
let getRecords: () => any[];
|
||||
|
||||
beforeEach(() => {
|
||||
const config = createTestConfig();
|
||||
|
@ -205,6 +205,7 @@ export default class StateService {
|
||||
}
|
||||
|
||||
if (importData.features) {
|
||||
// biome-ignore lint/suspicious/noImplicitAnyLet: too many formats to consider here. Allowing this to be any
|
||||
let projectData;
|
||||
if (!importData.version || importData.version === 1) {
|
||||
projectData = await this.convertLegacyFeatures(importData);
|
||||
|
@ -17,16 +17,19 @@ export const parseFile: (file: string, data: string) => any = (
|
||||
export const filterExisting: (
|
||||
keepExisting: boolean,
|
||||
existingArray: any[],
|
||||
) => (item: any) => boolean = (keepExisting, existingArray = []) => (item) => {
|
||||
if (keepExisting) {
|
||||
const found = existingArray.find((t) => t.name === item.name);
|
||||
return !found;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
) => (item: any) => boolean =
|
||||
(keepExisting, existingArray = []) =>
|
||||
(item) => {
|
||||
if (keepExisting) {
|
||||
const found = existingArray.find((t) => t.name === item.name);
|
||||
return !found;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
export const filterEqual: (existingArray: any[]) => (item: any) => boolean =
|
||||
(existingArray = []) => (item) => {
|
||||
(existingArray = []) =>
|
||||
(item) => {
|
||||
const toggle = existingArray.find((t) => t.name === item.name);
|
||||
if (toggle) {
|
||||
return JSON.stringify(toggle) !== JSON.stringify(item);
|
||||
|
@ -317,7 +317,7 @@ class UserService {
|
||||
? { email: usernameOrEmail }
|
||||
: { username: usernameOrEmail };
|
||||
|
||||
let user, passwordHash;
|
||||
let user: IUser | undefined, passwordHash: string | undefined;
|
||||
try {
|
||||
user = await this.store.getByQuery(idQuery);
|
||||
passwordHash = await this.store.getPasswordHash(user.id);
|
||||
|
@ -53,7 +53,7 @@ export const mapLegacyProjects = (
|
||||
project?: string,
|
||||
projects?: string[],
|
||||
): string[] => {
|
||||
let cleanedProjects;
|
||||
let cleanedProjects: string[];
|
||||
if (project) {
|
||||
cleanedProjects = [project];
|
||||
} else if (projects) {
|
||||
@ -76,7 +76,7 @@ export const mapLegacyToken = (
|
||||
return {
|
||||
tokenName: token.username ?? token.tokenName!,
|
||||
type: token.type,
|
||||
environment: token.environment,
|
||||
environment: token.environment || 'development',
|
||||
projects: cleanedProjects,
|
||||
expiresAt: token.expiresAt,
|
||||
};
|
||||
|
@ -1,5 +1,8 @@
|
||||
export interface OmitKeys {
|
||||
<T extends object, K extends [...(keyof T)[]]>(obj: T, ...keys: K): {
|
||||
<T extends object, K extends [...(keyof T)[]]>(
|
||||
obj: T,
|
||||
...keys: K
|
||||
): {
|
||||
[K2 in Exclude<keyof T, K[number]>]: T[K2];
|
||||
};
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ test('should calculate the correct time in seconds', () => {
|
||||
test('timer should track the time', async () => {
|
||||
jest.useFakeTimers();
|
||||
const tt = timer.new();
|
||||
let diff;
|
||||
let diff: number | undefined;
|
||||
timeout(() => {
|
||||
diff = tt();
|
||||
}, 20);
|
||||
|
@ -1,11 +1,14 @@
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
|
||||
const MASKED_VALUE = '*****';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('addon_api_serial', getLogger);
|
||||
@ -104,11 +107,11 @@ test('should update addon configuration', async () => {
|
||||
const { id } = res.body;
|
||||
|
||||
const updatedConfig = {
|
||||
...config,
|
||||
parameters: {
|
||||
url: 'http://example.com',
|
||||
bodyTemplate: "{'name': '{{event.data.name}}' }",
|
||||
},
|
||||
...config,
|
||||
};
|
||||
|
||||
await app.request
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { setupAppWithCustomAuth } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { ApiTokenType } from '../../../../lib/types/models/api-token';
|
||||
import { RoleName } from '../../../../lib/types/model';
|
||||
@ -7,6 +7,7 @@ import {
|
||||
CREATE_CLIENT_API_TOKEN,
|
||||
CREATE_PROJECT_API_TOKEN,
|
||||
DELETE_CLIENT_API_TOKEN,
|
||||
IUnleashStores,
|
||||
READ_CLIENT_API_TOKEN,
|
||||
READ_FRONTEND_API_TOKEN,
|
||||
SYSTEM_USER_ID,
|
||||
@ -15,8 +16,8 @@ import {
|
||||
import { addDays } from 'date-fns';
|
||||
import { AccessService, UserService } from 'lib/services';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('token_api_auth_serial', getLogger);
|
||||
@ -51,18 +52,27 @@ test('editor users should only get client or frontend tokens', async () => {
|
||||
const { request, destroy } = await setupAppWithCustomAuth(stores, preHook);
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'test',
|
||||
secret: '1234',
|
||||
type: ApiTokenType.CLIENT,
|
||||
});
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'frontend',
|
||||
secret: '12345',
|
||||
type: ApiTokenType.FRONTEND,
|
||||
});
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'test',
|
||||
secret: 'sdfsdf2d',
|
||||
type: ApiTokenType.ADMIN,
|
||||
@ -99,12 +109,18 @@ test('viewer users should not be allowed to fetch tokens', async () => {
|
||||
const { request, destroy } = await setupAppWithCustomAuth(stores, preHook);
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'test',
|
||||
secret: '1234',
|
||||
type: ApiTokenType.CLIENT,
|
||||
});
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'test',
|
||||
secret: 'sdfsdf2d',
|
||||
type: ApiTokenType.ADMIN,
|
||||
@ -402,17 +418,27 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
|
||||
username: 'client',
|
||||
secret: 'client_secret',
|
||||
type: ApiTokenType.CLIENT,
|
||||
});
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'admin',
|
||||
secret: 'sdfsdf2admin_secret',
|
||||
type: ApiTokenType.ADMIN,
|
||||
});
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'frontender',
|
||||
secret: 'sdfsdf2dfrontend_Secret',
|
||||
type: ApiTokenType.FRONTEND,
|
||||
@ -464,17 +490,26 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'client',
|
||||
secret: 'client_secret_1234',
|
||||
type: ApiTokenType.CLIENT,
|
||||
});
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'admin',
|
||||
secret: 'admin_secret_1234',
|
||||
type: ApiTokenType.ADMIN,
|
||||
});
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'frontender',
|
||||
secret: 'frontend_secret_1234',
|
||||
type: ApiTokenType.FRONTEND,
|
||||
@ -508,17 +543,26 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'client',
|
||||
secret: 'client_secret_4321',
|
||||
type: ApiTokenType.CLIENT,
|
||||
});
|
||||
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'admin',
|
||||
secret: 'admin_secret_4321',
|
||||
type: ApiTokenType.ADMIN,
|
||||
});
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'frontender',
|
||||
secret: 'frontend_secret_4321',
|
||||
type: ApiTokenType.FRONTEND,
|
||||
@ -551,16 +595,25 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'client',
|
||||
secret: 'client_secret_4321',
|
||||
type: ApiTokenType.CLIENT,
|
||||
});
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'admin',
|
||||
secret: 'admin_secret_4321',
|
||||
type: ApiTokenType.ADMIN,
|
||||
});
|
||||
await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'frontender',
|
||||
secret: 'frontend_secret_4321',
|
||||
type: ApiTokenType.FRONTEND,
|
||||
@ -621,6 +674,9 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
const token = await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'cilent',
|
||||
secret: 'update_client_token',
|
||||
type: ApiTokenType.CLIENT,
|
||||
@ -670,6 +726,9 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
const token = await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'frontend',
|
||||
secret: 'update_frontend_token',
|
||||
type: ApiTokenType.FRONTEND,
|
||||
@ -720,6 +779,10 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
const token = await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
|
||||
username: 'admin',
|
||||
secret: 'update_admin_token',
|
||||
type: ApiTokenType.ADMIN,
|
||||
@ -773,6 +836,9 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
const token = await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'cilent',
|
||||
secret: 'delete_client_token',
|
||||
type: ApiTokenType.CLIENT,
|
||||
@ -822,6 +888,9 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
const token = await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'frontend',
|
||||
secret: 'delete_frontend_token',
|
||||
type: ApiTokenType.FRONTEND,
|
||||
@ -871,6 +940,9 @@ describe('Fine grained API token permissions', () => {
|
||||
preHook,
|
||||
);
|
||||
const token = await stores.apiTokenStore.insert({
|
||||
environment: '',
|
||||
projects: [],
|
||||
tokenName: '',
|
||||
username: 'admin',
|
||||
secret: 'delete_admin_token',
|
||||
type: ApiTokenType.ADMIN,
|
||||
|
@ -1,12 +1,15 @@
|
||||
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { ALL, ApiTokenType } from '../../../../lib/types/models/api-token';
|
||||
import { DEFAULT_ENV } from '../../../../lib/util';
|
||||
import { addDays } from 'date-fns';
|
||||
|
||||
let db;
|
||||
let app;
|
||||
let db: ITestDb;
|
||||
let app: IUnleashTest;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('token_api_serial', getLogger);
|
||||
@ -123,8 +126,11 @@ test('update client token with expiry', async () => {
|
||||
|
||||
await db.stores.apiTokenStore.insert({
|
||||
username: 'test',
|
||||
projects: ['*'],
|
||||
tokenName: 'test_token',
|
||||
secret: tokenSecret,
|
||||
type: ApiTokenType.CLIENT,
|
||||
environment: 'development',
|
||||
});
|
||||
|
||||
await app.request
|
||||
@ -184,6 +190,9 @@ test('removes api token', async () => {
|
||||
const tokenSecret = 'random-secret';
|
||||
|
||||
await db.stores.apiTokenStore.insert({
|
||||
environment: 'development',
|
||||
projects: ['*'],
|
||||
tokenName: 'testtoken',
|
||||
username: 'test',
|
||||
secret: tokenSecret,
|
||||
type: ApiTokenType.CLIENT,
|
||||
|
@ -1,10 +1,13 @@
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { IClientMetricsEnv } from '../../../../lib/types/stores/client-metrics-store-v2';
|
||||
import { subHours } from 'date-fns';
|
||||
|
||||
let app;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
const fetchHoursBack = (hoursBack: number, feature: string = 'demo') => {
|
||||
|
@ -1,9 +1,12 @@
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
const PATH = '/api/admin/constraints/validate';
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
let app: IUnleashTest;
|
||||
|
||||
beforeAll(async () => {
|
||||
|
@ -3,12 +3,13 @@ import { IUnleashStores, RoleName } from '../../../../lib/types';
|
||||
import { AccessService } from '../../../../lib/services';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { IRole } from '../../../../lib/types/stores/access-store';
|
||||
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
let stores: IUnleashStores;
|
||||
let accessService: AccessService;
|
||||
let editorRole;
|
||||
let editorRole: IRole;
|
||||
|
||||
const regularUserName = 'favorites-user';
|
||||
|
||||
@ -96,7 +97,7 @@ beforeAll(async () => {
|
||||
accessService = app.services.accessService;
|
||||
|
||||
const roles = await accessService.getRootRoles();
|
||||
editorRole = roles.find((role) => role.name === RoleName.EDITOR);
|
||||
editorRole = roles.find((role) => role.name === RoleName.EDITOR)!;
|
||||
|
||||
await createUserEditorAccess(
|
||||
regularUserName,
|
||||
|
@ -1,4 +1,4 @@
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import {
|
||||
IUnleashTest,
|
||||
@ -8,7 +8,7 @@ import { validateSchema } from '../../../../lib/openapi/validate';
|
||||
import { featureTypesSchema } from '../../../../lib/openapi/spec/feature-types-schema';
|
||||
|
||||
let app: IUnleashTest;
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('feature_type_api_serial', getLogger);
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { setupAppWithAuth } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
|
||||
let db;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('feature_api_auth', getLogger);
|
||||
|
@ -1,11 +1,12 @@
|
||||
import { setupAppWithCustomAuth } from '../../helpers/test-helper';
|
||||
import AuthenticationRequired from '../../../../lib/types/authentication-required';
|
||||
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { IUnleashStores } from '../../../../lib/types';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('feature_api_custom_auth', getLogger);
|
||||
|
@ -1,13 +1,17 @@
|
||||
import { Application, NextFunction, Request, Response } from 'express';
|
||||
import { setupAppWithCustomAuth } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomAuth,
|
||||
} from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { IUnleashConfig } from '../../../../lib/types/option';
|
||||
import { IUnleashServices } from '../../../../lib/types/services';
|
||||
import { IUnleashStores } from '../../../../lib/types';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let app;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
let app: IUnleashTest;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('feedback_api_serial', getLogger);
|
||||
|
@ -1,10 +1,10 @@
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import { setupApp } from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import { IUnleashTest, setupApp } from '../../helpers/test-helper';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { IUnleashStores } from '../../../../lib/types';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
let stores: IUnleashStores;
|
||||
|
||||
beforeAll(async () => {
|
||||
|
@ -1,12 +1,15 @@
|
||||
import dbInit from '../../../helpers/database-init';
|
||||
import { setupAppWithCustomConfig } from '../../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../../helpers/test-helper';
|
||||
import getLogger from '../../../../fixtures/no-logger';
|
||||
import { ApiTokenStore } from '../../../../../lib/db/api-token-store';
|
||||
import { IApiTokenStore } from '../../../../../lib/types';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
let apiTokenStore: ApiTokenStore;
|
||||
let apiTokenStore: IApiTokenStore;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('projects_api_serial', getLogger);
|
||||
|
@ -1,10 +1,14 @@
|
||||
import dbInit from '../../../helpers/database-init';
|
||||
import { setupAppWithCustomConfig } from '../../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../../helpers/test-helper';
|
||||
import getLogger from '../../../../fixtures/no-logger';
|
||||
import { IUser } from '../../../../../lib/types';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let user;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
let user: IUser;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('project_health_api_serial', getLogger);
|
||||
|
@ -1,14 +1,15 @@
|
||||
import { setupAppWithCustomAuth } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { RoleName } from '../../../../lib/types/model';
|
||||
import { PublicSignupTokenCreateSchema } from '../../../../lib/openapi/spec/public-signup-token-create-schema';
|
||||
import { IUnleashStores } from '../../../../lib/types';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('test', getLogger);
|
||||
db = await dbInit('public_signup_test', getLogger);
|
||||
stores = db.stores;
|
||||
});
|
||||
|
||||
@ -82,10 +83,10 @@ test('no permission to validate a token', async () => {
|
||||
const { request, destroy } = await setupAppWithCustomAuth(stores, preHook);
|
||||
|
||||
await stores.publicSignupTokenStore.insert({
|
||||
url: 'http://localhost:4242/invite/some-secret/signup',
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
secret: 'some-secret',
|
||||
createAt: new Date(),
|
||||
createdBy: 'admin@example.com',
|
||||
roleId: 3,
|
||||
});
|
||||
@ -136,7 +137,6 @@ test('users can signup with invite-link', async () => {
|
||||
expiresAt: expireAt(),
|
||||
secret: 'some-secret',
|
||||
url: 'http://localhost:4242/invite/some-secret/signup',
|
||||
createAt: new Date(),
|
||||
createdBy: 'admin@example.com',
|
||||
roleId: 3,
|
||||
});
|
||||
@ -177,10 +177,10 @@ test('can get a token with users', async () => {
|
||||
const { request, destroy } = await setupAppWithCustomAuth(stores, preHook);
|
||||
|
||||
await stores.publicSignupTokenStore.insert({
|
||||
url: 'http://localhost:4242/invite/some-secret',
|
||||
name: 'some-name',
|
||||
expiresAt: expireAt(),
|
||||
secret: 'some-secret',
|
||||
createAt: new Date(),
|
||||
createdBy: 'admin@example.com',
|
||||
roleId: 3,
|
||||
});
|
||||
@ -188,9 +188,6 @@ test('can get a token with users', async () => {
|
||||
const user = await stores.userStore.insert({
|
||||
username: 'some-username',
|
||||
email: 'some@example.com',
|
||||
password: 'eweggwEG',
|
||||
sendEmail: false,
|
||||
rootRole: 3,
|
||||
});
|
||||
|
||||
await stores.publicSignupTokenStore.addTokenUser('some-secret', user.id);
|
||||
|
@ -12,6 +12,7 @@ import {
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import { StrategiesUsingSegment } from 'lib/segments/segment-service-interface';
|
||||
import { IUser } from '../../../../lib/types';
|
||||
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
@ -556,12 +557,12 @@ test('Should show usage in features and projects', async () => {
|
||||
describe('detect strategy usage in change requests', () => {
|
||||
const CR_TITLE = 'My change request';
|
||||
const CR_ID = 54321;
|
||||
let user;
|
||||
let user: IUser;
|
||||
|
||||
// Change request data is only counted for enterprise
|
||||
// instances, so we'll instantiate our own version of the app
|
||||
// for that.
|
||||
let enterpriseApp;
|
||||
let enterpriseApp: IUnleashTest;
|
||||
|
||||
// likewise, we want to fetch from the right app to make sure
|
||||
// we get the right data
|
||||
@ -611,7 +612,7 @@ describe('detect strategy usage in change requests', () => {
|
||||
});
|
||||
});
|
||||
afterAll(async () => {
|
||||
user = await db.stores.userStore.delete(user.id);
|
||||
await db.stores.userStore.delete(user.id);
|
||||
await db.rawDatabase.table('change_requests').delete();
|
||||
});
|
||||
|
||||
|
@ -1,13 +1,17 @@
|
||||
import { Application, NextFunction, Request, Response } from 'express';
|
||||
import { setupAppWithCustomAuth } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomAuth,
|
||||
} from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { IUnleashConfig } from '../../../../lib/types/option';
|
||||
import { IUnleashServices } from '../../../../lib/types/services';
|
||||
import { IUnleashStores } from '../../../../lib/types';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let app;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
let app: IUnleashTest;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('splash_api_serial', getLogger);
|
||||
|
@ -1,9 +1,12 @@
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('strategy_api_serial', getLogger);
|
||||
|
@ -1,9 +1,12 @@
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('tag_api_serial', getLogger);
|
||||
@ -128,7 +131,7 @@ test('Can tag features', async () => {
|
||||
});
|
||||
|
||||
await db.stores.tagStore.createTag(removedTag);
|
||||
await db.stores.featureTagStore.tagFeature(featureName, removedTag);
|
||||
await db.stores.featureTagStore.tagFeature(featureName, removedTag, -1337);
|
||||
|
||||
const initialTagState = await app.request.get(
|
||||
`/api/admin/features/${featureName}/tags`,
|
||||
|
@ -1,5 +1,8 @@
|
||||
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupAppWithCustomConfig,
|
||||
} from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import {
|
||||
USER_CREATED,
|
||||
@ -14,10 +17,11 @@ import { IRoleStore } from 'lib/types/stores/role-store';
|
||||
import { randomId } from '../../../../lib/util/random-id';
|
||||
import { omitKeys } from '../../../../lib/util/omit-keys';
|
||||
import { ISessionStore } from '../../../../lib/types/stores/session-store';
|
||||
import { IUnleashStores } from '../../../../lib/types';
|
||||
|
||||
let stores;
|
||||
let db;
|
||||
let app;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
let app: IUnleashTest;
|
||||
|
||||
let userStore: IUserStore;
|
||||
let eventStore: IEventStore;
|
||||
@ -383,7 +387,7 @@ test('Anonymises name, username and email fields if anonymiseEventLog flag is se
|
||||
const anonymisedApp = await setupAppWithCustomConfig(
|
||||
stores,
|
||||
{ experimental: { flags: { anonymiseEventLog: true } } },
|
||||
db,
|
||||
db.rawDatabase,
|
||||
);
|
||||
await anonymisedApp.request
|
||||
.post('/api/admin/user-admin')
|
||||
|
@ -10,8 +10,8 @@ let db: ITestDb;
|
||||
let patStore: IPatStore;
|
||||
|
||||
const tomorrow = new Date();
|
||||
let firstSecret;
|
||||
let firstId;
|
||||
let firstSecret: string;
|
||||
let firstId: string;
|
||||
tomorrow.setDate(tomorrow.getDate() + 1);
|
||||
|
||||
beforeAll(async () => {
|
||||
@ -282,10 +282,10 @@ test('should fail creation of PAT when PAT limit has been reached', async () =>
|
||||
})
|
||||
.expect(200);
|
||||
|
||||
const tokenCreations = [];
|
||||
const tokenCreations: Promise<any>[] = [];
|
||||
for (let i = 0; i < PAT_LIMIT; i++) {
|
||||
tokenCreations.push(
|
||||
await app.request
|
||||
app.request
|
||||
.post('/api/admin/user/tokens')
|
||||
.send({
|
||||
description: `my pat ${i}`,
|
||||
|
@ -1,9 +1,9 @@
|
||||
import dbInit from '../../../helpers/database-init';
|
||||
import dbInit, { ITestDb } from '../../../helpers/database-init';
|
||||
import getLogger from '../../../../fixtures/no-logger';
|
||||
import { setupAppWithAuth } from '../../../helpers/test-helper';
|
||||
import { IUnleashTest, setupAppWithAuth } from '../../../helpers/test-helper';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let db: ITestDb;
|
||||
|
||||
const email = 'user@getunleash.io';
|
||||
|
||||
|
@ -6,8 +6,12 @@ import UserService from '../../../../lib/services/user-service';
|
||||
import { AccessService } from '../../../../lib/services/access-service';
|
||||
import ResetTokenService from '../../../../lib/services/reset-token-service';
|
||||
import { IUser } from '../../../../lib/types/user';
|
||||
import { setupApp, setupAppWithAuth } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import {
|
||||
IUnleashTest,
|
||||
setupApp,
|
||||
setupAppWithAuth,
|
||||
} from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { EmailService } from '../../../../lib/services/email-service';
|
||||
import SessionStore from '../../../../lib/db/session-store';
|
||||
@ -17,10 +21,11 @@ import SettingService from '../../../../lib/services/setting-service';
|
||||
import FakeSettingStore from '../../../fixtures/fake-setting-store';
|
||||
import { GroupService } from '../../../../lib/services/group-service';
|
||||
import { EventService } from '../../../../lib/services';
|
||||
import { IUnleashStores } from '../../../../lib/types';
|
||||
|
||||
let app;
|
||||
let stores;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
const config: IUnleashConfig = createTestConfig({
|
||||
getLogger,
|
||||
server: {
|
||||
@ -59,7 +64,7 @@ beforeAll(async () => {
|
||||
);
|
||||
const emailService = new EmailService(config);
|
||||
const sessionStore = new SessionStore(
|
||||
db,
|
||||
db.rawDatabase,
|
||||
new EventEmitter(),
|
||||
config.getLogger,
|
||||
);
|
||||
@ -129,7 +134,7 @@ test('Can use token to reset password', async () => {
|
||||
userService.loginUser(user.email!, password),
|
||||
).rejects.toThrow(Error);
|
||||
|
||||
let token;
|
||||
let token: string | undefined;
|
||||
await app.request
|
||||
.get(relative)
|
||||
.expect(200)
|
||||
@ -154,7 +159,7 @@ test('Trying to reset password with same token twice does not work', async () =>
|
||||
adminUser.username!,
|
||||
);
|
||||
const relative = getBackendResetUrl(url);
|
||||
let token;
|
||||
let token: string | undefined;
|
||||
await app.request
|
||||
.get(relative)
|
||||
.expect(200)
|
||||
@ -215,7 +220,7 @@ test('Calling reset endpoint with already existing session should logout/destroy
|
||||
adminUser.username!,
|
||||
);
|
||||
const relative = getBackendResetUrl(url);
|
||||
let token;
|
||||
let token: string | undefined;
|
||||
await request
|
||||
.get(relative)
|
||||
.expect(200)
|
||||
@ -258,7 +263,7 @@ test('Trying to change password to undefined should yield 400 without crashing t
|
||||
adminUser.username!,
|
||||
);
|
||||
const relative = getBackendResetUrl(url);
|
||||
let token;
|
||||
let token: string | undefined;
|
||||
await app.request
|
||||
.get(relative)
|
||||
.expect(200)
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { createTestConfig } from '../../../config/test-config';
|
||||
import { IUnleashConfig } from '../../../../lib/types';
|
||||
import { IUnleashConfig, IUnleashStores } from '../../../../lib/types';
|
||||
import UserService from '../../../../lib/services/user-service';
|
||||
import { AccessService } from '../../../../lib/services/access-service';
|
||||
import { IUser } from '../../../../lib/types/user';
|
||||
import { setupApp } from '../../helpers/test-helper';
|
||||
import dbInit from '../../helpers/database-init';
|
||||
import { IUnleashTest, setupApp } from '../../helpers/test-helper';
|
||||
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||||
import getLogger from '../../../fixtures/no-logger';
|
||||
import { EmailService } from '../../../../lib/services/email-service';
|
||||
import SessionService from '../../../../lib/services/session-service';
|
||||
@ -14,9 +14,9 @@ import { GroupService } from '../../../../lib/services/group-service';
|
||||
import ResetTokenService from '../../../../lib/services/reset-token-service';
|
||||
import { EventService } from '../../../../lib/services';
|
||||
|
||||
let app;
|
||||
let stores;
|
||||
let db;
|
||||
let app: IUnleashTest;
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
const config: IUnleashConfig = createTestConfig({
|
||||
getLogger,
|
||||
server: {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user