From 4068e4749f86fb3c5c0dcb7ebda740d0cff924ad Mon Sep 17 00:00:00 2001 From: sellinjaanus <107852002+sellinjaanus@users.noreply.github.com> Date: Mon, 17 Oct 2022 11:44:36 +0300 Subject: [PATCH 01/39] Fix all groups being removed, even when no external groups were defined (#2197) * Syncing groups * Add tests * Fix all groups being removed Co-authored-by: sjaanus --- src/lib/db/group-store.ts | 4 ++- src/lib/services/group-service.ts | 28 ++++++++++--------- .../e2e/services/group-service.e2e.test.ts | 28 +++++++++++++++++++ 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/lib/db/group-store.ts b/src/lib/db/group-store.ts index 732ebd113d..63315b7b5f 100644 --- a/src/lib/db/group-store.ts +++ b/src/lib/db/group-store.ts @@ -254,9 +254,11 @@ export default class GroupStore implements IGroupStore { .select('id') .whereRaw('mappings_sso \\?| :groups', { groups: externalGroups, - }), + }) + .orWhereRaw('jsonb_array_length(mappings_sso) = 0'), ) .where('gu.user_id', userId); + return rows.map(rowToGroupUser); } diff --git a/src/lib/services/group-service.ts b/src/lib/services/group-service.ts index 6287a64b56..46c5995afe 100644 --- a/src/lib/services/group-service.ts +++ b/src/lib/services/group-service.ts @@ -220,19 +220,21 @@ export class GroupService { userId: number, externalGroups: string[], ): Promise { - let newGroups = await this.groupStore.getNewGroupsForExternalUser( - userId, - externalGroups, - ); - await this.groupStore.addUserToGroups( - userId, - newGroups.map((g) => g.id), - ); - let oldGroups = await this.groupStore.getOldGroupsForExternalUser( - userId, - externalGroups, - ); - await this.groupStore.deleteUsersFromGroup(oldGroups); + if (Array.isArray(externalGroups)) { + let newGroups = await this.groupStore.getNewGroupsForExternalUser( + userId, + externalGroups, + ); + await this.groupStore.addUserToGroups( + userId, + newGroups.map((g) => g.id), + ); + let oldGroups = await this.groupStore.getOldGroupsForExternalUser( + userId, + externalGroups, + ); + await this.groupStore.deleteUsersFromGroup(oldGroups); + } } async getGroupsForUser(userId: number): Promise { diff --git a/src/test/e2e/services/group-service.e2e.test.ts b/src/test/e2e/services/group-service.e2e.test.ts index 18a3c6a128..0b23591bff 100644 --- a/src/test/e2e/services/group-service.e2e.test.ts +++ b/src/test/e2e/services/group-service.e2e.test.ts @@ -2,11 +2,13 @@ import dbInit, { ITestDb } from '../helpers/database-init'; import getLogger from '../../fixtures/no-logger'; import { createTestConfig } from '../../config/test-config'; import { GroupService } from '../../../lib/services/group-service'; +import GroupStore from '../../../lib/db/group-store'; let stores; let db: ITestDb; let groupService: GroupService; +let groupStore: GroupStore; let user; beforeAll(async () => { @@ -20,6 +22,7 @@ beforeAll(async () => { getLogger, }); groupService = new GroupService(stores, config); + groupStore = stores.groupStore; await stores.groupStore.create({ name: 'dev_group', @@ -69,3 +72,28 @@ test('should add person to completely new group with new name', async () => { expect(groups.length).toBe(1); expect(groups[0].name).toEqual('dev_group'); }); + +test('should not update groups when not string array ', async () => { + await groupService.syncExternalGroups(user.id, 'Everyone' as any); + const groups = await groupService.getGroupsForUser(user.id); + expect(groups.length).toBe(1); + expect(groups[0].name).toEqual('dev_group'); +}); + +test('should clear groups when empty array ', async () => { + await groupService.syncExternalGroups(user.id, []); + const groups = await groupService.getGroupsForUser(user.id); + expect(groups.length).toBe(0); +}); + +test('should not remove user from no SSO definition group', async () => { + const group = await groupStore.create({ + name: 'no_mapping_group', + description: 'no_mapping_group', + }); + await groupStore.addUserToGroups(user.id, [group.id]); + await groupService.syncExternalGroups(user.id, []); + const groups = await groupService.getGroupsForUser(user.id); + expect(groups.length).toBe(1); + expect(groups[0].name).toEqual('no_mapping_group'); +}); From 7524dad7e8136d6ff013f22b899c10fa81439231 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 18:20:19 +0000 Subject: [PATCH 02/39] chore(deps): update dependency @swc/core to v1.3.9 (#2196) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 138 +++++++++++++++++++++++++-------------------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index f63d80fe22..098e5e228c 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "devDependencies": { "@apidevtools/swagger-parser": "10.1.0", "@babel/core": "7.19.3", - "@swc/core": "1.3.7", + "@swc/core": "1.3.9", "@swc/jest": "0.2.23", "@types/bcryptjs": "2.4.2", "@types/cors": "2.8.12", diff --git a/yarn.lock b/yarn.lock index e3aabd1b7c..b7f43f2c69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1203,101 +1203,101 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@swc/core-android-arm-eabi@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.7.tgz#31dc887e5dc2db25ac1a9503478ea6cabc1da9ac" - integrity sha512-zvUpTBOUnXDkfp2JXv1T3NfyimxsAnqEfT65gWC/3ZpB/gmc59vqYVko4Pifyvuxo5aVvEdT2gfHlWM/aXwtpg== +"@swc/core-android-arm-eabi@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.9.tgz#6ab77525f2d22fcd321d0e29704d0820608b9e18" + integrity sha512-+F+sU2l49Po4tJoNtIpFwt0k1sspymvPMM+DCpnkHF1idzRiOU5NGgVzmLDjoO9AnxHa7EBJ3itN+PP2Dd06+A== dependencies: "@swc/wasm" "1.2.122" -"@swc/core-android-arm64@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.3.7.tgz#2b6d35343d68946b5bc2b654fa2fa4c0e8afe4d6" - integrity sha512-qnh1aYTrIjuFOkgxUYG8SGzpPD92o/w5hrHUy71LfUbHf5HRs7FpMgQXtTGnk33S/uMCvSv7V/ewv+t+N6tlVA== +"@swc/core-android-arm64@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.3.9.tgz#d9467488dd9c00d50180f9ccded9eed6f54e4423" + integrity sha512-HSWdex3yd4CRefkM2WVz0nTKjpirNZnwSlghqe4ct9QAYGMiiPesYgWPAnq/PpnYfmjQse4yvEclamGiek6zDA== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-darwin-arm64@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.7.tgz#addfcf1dd1562b04ead371a3a228f1e33eb8c2d3" - integrity sha512-q8NgUK/CleCmGYIuskL1sCad8opkfJD/8GWd+MkGSi+MGkExrLMmJftgG5FCj0l/xCHxGGNYj1TCrM/qV6CheA== +"@swc/core-darwin-arm64@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.9.tgz#60ad2157bfa67038cf94fa0f9169f5d2609f6011" + integrity sha512-E7WJY1LsMJtOtUYc/JXl8qlt6USnzodWmdO1eAAOSAODEdX9AjgG3fRT94o3UcmvMrto7sxBXVExj8wG7Cxeng== -"@swc/core-darwin-x64@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.7.tgz#d0886d5c0573c871a42cac77cfaf091c6cc2768d" - integrity sha512-dKrJkZYbF7Qi1wQgyVnR1a5Vk8UN7fJ/WlK6pZVJwMvWLoZgYE+U0Nn7RsVB4LmOxHtaJF7eesbGUm2y2NVEwA== +"@swc/core-darwin-x64@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.9.tgz#947095894b526c90724f273b968e124019a3c267" + integrity sha512-0+dFCAcLEBxwIO+0Nt+OT8mjPpvBMBWIuFWB1DNiUu2K73+OB0i+llzsCJFoasISHR+YJD0bGyv+8AtVuUdFAw== -"@swc/core-freebsd-x64@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.7.tgz#2fa4f8554fcf3101a411570032b3ccfcd4833d3e" - integrity sha512-ENHthc4iFPlBj0xaf2DbJLDzYSBA4QMQEA2HhZoSWWMsqhg8mGZxwgRd6+loROGZ2a5HKMZXIxCev8BbYnE0OA== +"@swc/core-freebsd-x64@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.9.tgz#ebcb068df6528f824c803329d43d752889eef46f" + integrity sha512-JbHIeklQPRBEZUfKAKt/IB/ayi7dJZ9tEGu/fDxNfk8Znu1Md+YOKRyN5FPMXfYrL5yFUXnlFOb2LX6wjNhhjQ== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-linux-arm-gnueabihf@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.7.tgz#76e5f6d114c3051c12bfb603bb51bfee67d512e0" - integrity sha512-anE65tcRLr/fYayXkpwZ7p7Ft5HCH4rvi3wSFdK8ycRWn9fVZhyWUJkJ3p1S0R19xr7hcb14hyxqPbd4m0I4yA== +"@swc/core-linux-arm-gnueabihf@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.9.tgz#0882d86a301f5eece588ec41fe7f1d0c9629f2c7" + integrity sha512-Yc1G8FGXmq6yGKtu5wYCcvVWBtqU0/3FUk6zJM+7pFiivKsVHJcgWrkgLO1u6h7bgEdQIYwfM3/BbRNE5CtdnA== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-linux-arm64-gnu@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.7.tgz#924076423e4ac7eb3d95f5dc5de03d3301aac81a" - integrity sha512-Qv6f76Tt8t51qb29R2isWvuQM26Xi7ZJavAv0hMdCxfkF+h1Yd14j82H7afGzdONH1LyLaPrhWSQirU/ZtBtdA== +"@swc/core-linux-arm64-gnu@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.9.tgz#6bcf96a3826b069cb053f4b9b9f9148388d0f067" + integrity sha512-PrBjmPIMhoQLCpfaZl2b1cCXnaNPddQB/ssMVqQ6eXChBJfcv14M5BjxtI2ORi4HoEDlsbX+k50sL666M3lnBw== -"@swc/core-linux-arm64-musl@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.7.tgz#967ce8320b9c39d3ff7efe495b3af03ddfc8cf2b" - integrity sha512-paYbmvm7+7QxjyMzRd4X4tyhHw5VgkGCMBYC3PbfpuI7SsCdmEFG9v1t5uMbTf60VU1wB4/n+AxY9KCZLfK7DQ== +"@swc/core-linux-arm64-musl@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.9.tgz#cac78de3fcdd22417532d95ddc7c229ccfef9920" + integrity sha512-jJT56vt81o2N3O2nXp+MZGM6mbgkNx6lvvRT6yISW29fLM6NHBXmkGcjaWOD9VFJDRmu/MtFxbElPxr6ikrFYQ== -"@swc/core-linux-x64-gnu@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.7.tgz#2f55017c05f0a7a9099d1b85ee6ae22bee93a118" - integrity sha512-tkIHt64mmqEVM0CTGvUsB37Pv7AD/BinOEe6oPfMcS/2a00kYvXn9kEVKPqNTpiFpjYGoFQJaVV8UsD+iv8IvQ== +"@swc/core-linux-x64-gnu@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.9.tgz#e457e5f50ecc344278f69e90aafdcef4a152bae8" + integrity sha512-60ZreTvrJk3N7xvPzQeQJDePsXUmSUZkKD6lc0xzug4bv53NyUIQ8gH8nzVsV++D9NZeVxXp6WqqFLcgt7yEDQ== -"@swc/core-linux-x64-musl@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.7.tgz#ce3a83a99389436e8ef1d86a59b6bdba16b2a0e3" - integrity sha512-V0xeTS8kvnTlghO1YyO1QgfPqsY896MknYCzBeK9CGKkGbc3JaxSoyb11nbGEDEaUwzDd9gj9L4D2uP+IWpoyw== +"@swc/core-linux-x64-musl@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.9.tgz#0009205aeb5a42009794d75949f79d622563dac3" + integrity sha512-UBApPfUSP+w6ye6V1oT4EGh3LFCFrZaQsC1CkTuiYXXSmQMzkYE0Jzegn3R7MHWCJSneRwXRTKrkdhrNBUqWKA== -"@swc/core-win32-arm64-msvc@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.7.tgz#11e53a2b79f7de2b78e4f10cc45c45e87753b0ce" - integrity sha512-LeauQIok8tw4Mjmj7wlc7C62HCUx3xa5k6tNQnKWbDs7odZVWisgDxn7RSl9/xxlC8wPLTVUyBh3O1rHigVfWg== +"@swc/core-win32-arm64-msvc@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.9.tgz#2f4522c3da4d37dd08c1249a837c4a6643571c0a" + integrity sha512-4FQSalXbbnqTLVGRljRnw/bJ99Jwj1WnXz/aJM/SVL8S9Zbc82+3v+wXL/9NGwaAndu2QUkb2KPYNAHvB7PCdw== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-win32-ia32-msvc@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.7.tgz#126b930a77af3d0dcbacf07782d6f20a16511b32" - integrity sha512-E1C8bpUrml0vIv4FTSP7f4CwkZVGsCY9fBsBHCC4j9N1mtQk8/nzpGOUsPo4QP+FTYJiNKedZ4Cy7baihnV4Lw== +"@swc/core-win32-ia32-msvc@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.9.tgz#e5dd2830a103b8fcb89e843cc6cd0587dbd9140a" + integrity sha512-ZkTw1Cm+b2QBf/NjkJJbocvgT0NWdfPQL0OyMkuTAinRzfrMmq/lmshjnqj3ysFVeI4uuJTNemiT6mivpLmuBw== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-win32-x64-msvc@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.7.tgz#a1298b635d2cbbcf3cba3dbd37cdd6b577296efa" - integrity sha512-Ti9H/1hqBrxhYtNLVaLsahO/iiJn1Zd4qSc0LZpl6wBJxP4LltLV4MLeib6i8lg11pj4ijIhzZfC6bT614ee3w== +"@swc/core-win32-x64-msvc@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.9.tgz#49462ebcaed4caa5a3f99dcd2a48035b870750ae" + integrity sha512-moKi2prCKzYnXXlrLf5nwAN4uGSm4YpsW2xzYiZWJJDRqu74VoUWoDkG25jalHTfN/PSBQg4dkFWhhUe89JJVw== -"@swc/core@1.3.7": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.7.tgz#46eaa4af5f61ced1694fca64fb6d93ba5485747a" - integrity sha512-g4ptYRZRE+g/6wLB3WBuWhAWJsZDUeiSOvKVM1Wdn29Vi/EgLuVaY5ssz0HLQJxuDSJGwtAOZA8exh4+AKNHLw== +"@swc/core@1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.9.tgz#9dcc342cbcbe72ba6613a23840a2092c13699881" + integrity sha512-PCRCO9vIoEX3FyS3z/FkWVYJzuspUq0LLaWdK3L30+KQDtH29K+LQdRc2Dzin2MU5MpY4bSHydAwl9M6cmZ9OA== optionalDependencies: - "@swc/core-android-arm-eabi" "1.3.7" - "@swc/core-android-arm64" "1.3.7" - "@swc/core-darwin-arm64" "1.3.7" - "@swc/core-darwin-x64" "1.3.7" - "@swc/core-freebsd-x64" "1.3.7" - "@swc/core-linux-arm-gnueabihf" "1.3.7" - "@swc/core-linux-arm64-gnu" "1.3.7" - "@swc/core-linux-arm64-musl" "1.3.7" - "@swc/core-linux-x64-gnu" "1.3.7" - "@swc/core-linux-x64-musl" "1.3.7" - "@swc/core-win32-arm64-msvc" "1.3.7" - "@swc/core-win32-ia32-msvc" "1.3.7" - "@swc/core-win32-x64-msvc" "1.3.7" + "@swc/core-android-arm-eabi" "1.3.9" + "@swc/core-android-arm64" "1.3.9" + "@swc/core-darwin-arm64" "1.3.9" + "@swc/core-darwin-x64" "1.3.9" + "@swc/core-freebsd-x64" "1.3.9" + "@swc/core-linux-arm-gnueabihf" "1.3.9" + "@swc/core-linux-arm64-gnu" "1.3.9" + "@swc/core-linux-arm64-musl" "1.3.9" + "@swc/core-linux-x64-gnu" "1.3.9" + "@swc/core-linux-x64-musl" "1.3.9" + "@swc/core-win32-arm64-msvc" "1.3.9" + "@swc/core-win32-ia32-msvc" "1.3.9" + "@swc/core-win32-x64-msvc" "1.3.9" "@swc/jest@0.2.23": version "0.2.23" From d261097151e4e8e0c988f2fac9ac9922e75ac374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20G=C3=B3is?= Date: Tue, 18 Oct 2022 12:22:28 +0100 Subject: [PATCH 03/39] PAT: add "never", "custom" options to expiry date (#2198) * add DateTimePicker component * PAT expiry - custom, never * show "never" in PAT table * add alert, some styling --- .../common/DateTimePicker/DateTimePicker.tsx | 65 +++++++ .../CreatePersonalAPIToken.tsx | 160 ++++++++++++++---- .../PersonalAPITokensTab.tsx | 9 +- 3 files changed, 202 insertions(+), 32 deletions(-) create mode 100644 frontend/src/component/common/DateTimePicker/DateTimePicker.tsx diff --git a/frontend/src/component/common/DateTimePicker/DateTimePicker.tsx b/frontend/src/component/common/DateTimePicker/DateTimePicker.tsx new file mode 100644 index 0000000000..92330d4f78 --- /dev/null +++ b/frontend/src/component/common/DateTimePicker/DateTimePicker.tsx @@ -0,0 +1,65 @@ +import { INPUT_ERROR_TEXT } from 'utils/testIds'; +import { TextField, OutlinedTextFieldProps } from '@mui/material'; +import { parseValidDate } from '../util'; +import { format } from 'date-fns'; + +interface IDateTimePickerProps extends Omit { + label: string; + type?: 'date' | 'datetime'; + error?: boolean; + errorText?: string; + min?: Date; + max?: Date; + value: Date; + onChange: (e: any) => any; +} + +export const formatDate = (value: string) => { + const date = new Date(value); + return format(date, 'yyyy-MM-dd'); +}; + +export const formatDateTime = (value: string) => { + const date = new Date(value); + return format(date, 'yyyy-MM-dd') + 'T' + format(date, 'HH:mm'); +}; + +export const DateTimePicker = ({ + label, + type = 'datetime', + error, + errorText, + min, + max, + value, + onChange, + InputProps, + ...rest +}: IDateTimePickerProps) => { + const getDate = type === 'datetime' ? formatDateTime : formatDate; + const inputType = type === 'datetime' ? 'datetime-local' : 'date'; + + return ( + { + const parsedDate = parseValidDate(e.target.value); + onChange(parsedDate ?? value); + }} + FormHelperTextProps={{ + ['data-testid']: INPUT_ERROR_TEXT, + }} + inputProps={{ + min: min ? getDate(min.toISOString()) : min, + max: max ? getDate(max.toISOString()) : max, + }} + {...rest} + /> + ); +}; diff --git a/frontend/src/component/user/Profile/PersonalAPITokensTab/CreatePersonalAPIToken/CreatePersonalAPIToken.tsx b/frontend/src/component/user/Profile/PersonalAPITokensTab/CreatePersonalAPIToken/CreatePersonalAPIToken.tsx index 64b6cd1b93..b4d12f0df9 100644 --- a/frontend/src/component/user/Profile/PersonalAPITokensTab/CreatePersonalAPIToken/CreatePersonalAPIToken.tsx +++ b/frontend/src/component/user/Profile/PersonalAPITokensTab/CreatePersonalAPIToken/CreatePersonalAPIToken.tsx @@ -1,4 +1,4 @@ -import { Button, styled, Typography } from '@mui/material'; +import { Alert, Button, styled, Typography } from '@mui/material'; import FormTemplate from 'component/common/FormTemplate/FormTemplate'; import { SidebarModal } from 'component/common/SidebarModal/SidebarModal'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; @@ -13,6 +13,7 @@ import { formatDateYMD } from 'utils/formatDate'; import { useLocationSettings } from 'hooks/useLocationSettings'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { INewPersonalAPIToken } from 'interfaces/personalAPIToken'; +import { DateTimePicker } from 'component/common/DateTimePicker/DateTimePicker'; const StyledForm = styled('form')(() => ({ display: 'flex', @@ -31,18 +32,37 @@ const StyledInput = styled(Input)(({ theme }) => ({ marginBottom: theme.spacing(2), })); -const StyledExpirationPicker = styled('div')(({ theme }) => ({ - display: 'flex', - alignItems: 'center', - gap: theme.spacing(1.5), - [theme.breakpoints.down('sm')]: { - flexDirection: 'column', - alignItems: 'flex-start', - }, -})); +const StyledExpirationPicker = styled('div')<{ custom?: boolean }>( + ({ theme, custom }) => ({ + display: 'flex', + alignItems: custom ? 'start' : 'center', + gap: theme.spacing(1.5), + marginBottom: theme.spacing(2), + [theme.breakpoints.down('sm')]: { + flexDirection: 'column', + alignItems: 'flex-start', + }, + }) +); const StyledSelectMenu = styled(SelectMenu)(({ theme }) => ({ minWidth: theme.spacing(20), + marginRight: theme.spacing(0.5), + [theme.breakpoints.down('sm')]: { + width: theme.spacing(50), + }, +})); + +const StyledDateTimePicker = styled(DateTimePicker)(({ theme }) => ({ + width: theme.spacing(28), + [theme.breakpoints.down('sm')]: { + width: theme.spacing(50), + }, +})); + +const StyledAlert = styled(Alert)(({ theme }) => ({ + marginBottom: theme.spacing(2), + maxWidth: theme.spacing(50), })); const StyledButtonContainer = styled('div')(({ theme }) => ({ @@ -62,6 +82,8 @@ enum ExpirationOption { '7DAYS' = '7d', '30DAYS' = '30d', '60DAYS' = '60d', + NEVER = 'never', + CUSTOM = 'custom', } const expirationOptions = [ @@ -80,8 +102,26 @@ const expirationOptions = [ days: 60, label: '60 days', }, + { + key: ExpirationOption.NEVER, + label: 'Never', + }, + { + key: ExpirationOption.CUSTOM, + label: 'Custom', + }, ]; +enum ErrorField { + DESCRIPTION = 'description', + EXPIRES_AT = 'expiresAt', +} + +interface ICreatePersonalAPITokenErrors { + [ErrorField.DESCRIPTION]?: string; + [ErrorField.EXPIRES_AT]?: string; +} + interface ICreatePersonalAPITokenProps { open: boolean; setOpen: React.Dispatch>; @@ -103,10 +143,14 @@ export const CreatePersonalAPIToken: FC = ({ const [expiration, setExpiration] = useState( ExpirationOption['30DAYS'] ); - const [errors, setErrors] = useState<{ [key: string]: string }>({}); + const [errors, setErrors] = useState({}); - const clearErrors = () => { - setErrors({}); + const clearError = (field: ErrorField) => { + setErrors(errors => ({ ...errors, [field]: undefined })); + }; + + const setError = (field: ErrorField, error: string) => { + setErrors(errors => ({ ...errors, [field]: error })); }; const calculateDate = () => { @@ -114,7 +158,11 @@ export const CreatePersonalAPIToken: FC = ({ const expirationOption = expirationOptions.find( ({ key }) => key === expiration ); - if (expirationOption) { + if (expiration === ExpirationOption.NEVER) { + expiresAt.setFullYear(expiresAt.getFullYear() + 1000); + } else if (expiration === ExpirationOption.CUSTOM) { + expiresAt.setMinutes(expiresAt.getMinutes() + 30); + } else if (expirationOption?.days) { expiresAt.setDate(expiresAt.getDate() + expirationOption.days); } return expiresAt; @@ -124,10 +172,12 @@ export const CreatePersonalAPIToken: FC = ({ useEffect(() => { setDescription(''); + setErrors({}); setExpiration(ExpirationOption['30DAYS']); }, [open]); useEffect(() => { + clearError(ErrorField.EXPIRES_AT); setExpiresAt(calculateDate()); }, [expiration]); @@ -166,19 +216,26 @@ export const CreatePersonalAPIToken: FC = ({ const isDescriptionUnique = (description: string) => !tokens?.some(token => token.description === description); const isValid = - isDescriptionEmpty(description) && isDescriptionUnique(description); + isDescriptionEmpty(description) && + isDescriptionUnique(description) && + expiresAt > new Date(); const onSetDescription = (description: string) => { - clearErrors(); + clearError(ErrorField.DESCRIPTION); if (!isDescriptionUnique(description)) { - setErrors({ - description: - 'A personal API token with that description already exists.', - }); + setError( + ErrorField.DESCRIPTION, + 'A personal API token with that description already exists.' + ); } setDescription(description); }; + const customExpiration = expiration === ExpirationOption.CUSTOM; + + const neverExpires = + expiresAt.getFullYear() > new Date().getFullYear() + 100; + return ( = ({ Token expiration date - + = ({ options={expirationOptions} /> ( - - Token will expire on{' '} - - {formatDateYMD( - expiresAt!, - locationSettings.locale - )} - - + { + clearError(ErrorField.EXPIRES_AT); + if (date < new Date()) { + setError( + ErrorField.EXPIRES_AT, + 'Invalid date, must be in the future' + ); + } + setExpiresAt(date); + }} + min={new Date()} + error={Boolean(errors.expiresAt)} + errorText={errors.expiresAt} + required + /> )} + elseShow={ + + The token will{' '} + never expire! + + } + elseShow={() => ( + + Token will expire on{' '} + + {formatDateYMD( + expiresAt!, + locationSettings.locale + )} + + + )} + /> + } /> + + We strongly recommend that you set an + expiration date for your token to help keep + your information secure. + + } + /> diff --git a/frontend/src/component/user/Profile/PersonalAPITokensTab/PersonalAPITokensTab.tsx b/frontend/src/component/user/Profile/PersonalAPITokensTab/PersonalAPITokensTab.tsx index 0d735c40ff..21f93a7268 100644 --- a/frontend/src/component/user/Profile/PersonalAPITokensTab/PersonalAPITokensTab.tsx +++ b/frontend/src/component/user/Profile/PersonalAPITokensTab/PersonalAPITokensTab.tsx @@ -17,6 +17,7 @@ import { TablePlaceholder, VirtualizedTable } from 'component/common/Table'; import { ActionCell } from 'component/common/Table/cells/ActionCell/ActionCell'; import { DateCell } from 'component/common/Table/cells/DateCell/DateCell'; import { HighlightCell } from 'component/common/Table/cells/HighlightCell/HighlightCell'; +import { TextCell } from 'component/common/Table/cells/TextCell/TextCell'; import { SearchHighlightProvider } from 'component/common/Table/SearchHighlightContext/SearchHighlightContext'; import { usePersonalAPITokens } from 'hooks/api/getters/usePersonalAPITokens/usePersonalAPITokens'; import { useSearch } from 'hooks/useSearch'; @@ -116,7 +117,13 @@ export const PersonalAPITokensTab = ({ user }: IPersonalAPITokensTabProps) => { { Header: 'Expires', accessor: 'expiresAt', - Cell: DateCell, + Cell: ({ value }: { value: string }) => { + const date = new Date(value); + if (date.getFullYear() > new Date().getFullYear() + 100) { + return Never; + } + return ; + }, sortType: 'date', maxWidth: 150, }, From 5c6fce0f986c7d346238409c9fb7810e93c760fd Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 18 Oct 2022 13:53:06 +0200 Subject: [PATCH 04/39] docs: update appId and apiKey to new DocSearch (#2202) ## What This change updates the details used for the doc search integration we use. ## Why Algolia has migrated to a new doc search platform. The old credentials still work, but the crawlers stopped working months ago. This is why new articles don't show up in the search at all. This update _should_ allow us to update our indices and get search working properly again. --- website/docusaurus.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 695519acd4..8bab2d2a36 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -22,8 +22,8 @@ module.exports = { disableSwitch: true, respectPrefersColorScheme: false, algolia: { - appId: 'BH4D9OD16A', - apiKey: '9772249a7262b377ac876853d32bd760', + appId: '5U05JI5NE1', + apiKey: 'dc9c4491fcf9143ee34015f22d1dd9d6', indexName: 'getunleash', }, announcementBar: { From bd4e648eaeb49fab2fe30e4829d629955169d8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Tue, 18 Oct 2022 19:58:05 +0200 Subject: [PATCH 05/39] fix: should only require CREATE_ADDON when creating addon (#2204) --- frontend/src/component/addons/AddonForm/AddonForm.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/component/addons/AddonForm/AddonForm.tsx b/frontend/src/component/addons/AddonForm/AddonForm.tsx index cfafd7fab2..47059e0cb4 100644 --- a/frontend/src/component/addons/AddonForm/AddonForm.tsx +++ b/frontend/src/component/addons/AddonForm/AddonForm.tsx @@ -22,7 +22,10 @@ import { AddonMultiSelector } from './AddonMultiSelector/AddonMultiSelector'; import FormTemplate from 'component/common/FormTemplate/FormTemplate'; import useUiConfig from '../../../hooks/api/getters/useUiConfig/useUiConfig'; import PermissionButton from '../../common/PermissionButton/PermissionButton'; -import { ADMIN } from '../../providers/AccessProvider/permissions'; +import { + CREATE_ADDON, + UPDATE_ADDON, +} from '../../providers/AccessProvider/permissions'; import { StyledForm, StyledFormSection, @@ -334,7 +337,7 @@ export const AddonForm: VFC = ({ type="submit" color="primary" variant="contained" - permission={ADMIN} + permission={editMode ? UPDATE_ADDON : CREATE_ADDON} > {submitText} From e52611debda20e8d42e593af544564c231017800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Tue, 18 Oct 2022 20:51:08 +0200 Subject: [PATCH 06/39] fix: pin @xmldom/xmldom to v0.7.6 --- frontend/package.json | 3 ++- frontend/yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 79037f8096..61ec14a883 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -97,7 +97,8 @@ "whatwg-fetch": "3.6.2" }, "resolutions": { - "@codemirror/state": "6.1.2" + "@codemirror/state": "6.1.2", + "@xmldom/xmldom": "^0.7.6" }, "jest": { "moduleNameMapper": { diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 5676491812..5954159a09 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2711,10 +2711,10 @@ magic-string "^0.26.2" react-refresh "^0.14.0" -"@xmldom/xmldom@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d" - integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A== +"@xmldom/xmldom@^0.7.5", "@xmldom/xmldom@^0.7.6": + version "0.7.6" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.6.tgz#6f55073fa73e65776bd85826958b98c8cd1457b5" + integrity sha512-HHXP9hskkFQHy8QxxUXkS7946FFIhYVfGqsk0WLwllmexN9x/+R4UBLvurHEuyXRfVEObVR8APuQehykLviwSQ== "@zxing/text-encoding@0.9.0": version "0.9.0" From 233e38874c3ecb234fa56b4c47af71f892349ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Tue, 18 Oct 2022 21:17:09 +0200 Subject: [PATCH 07/39] fix: heroku manifest --- app.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app.json b/app.json index 67ad0584da..353846e48b 100644 --- a/app.json +++ b/app.json @@ -4,6 +4,9 @@ "repository": "https://github.com/heroku/node-js-sample", "logo": "https://github.com/Unleash/unleash/blob/main/.github/logo.png?raw=true", "keywords": ["node", "feature toggles", "release"], + "scripts": { + "build": "yarn build && cd frontend && yarn && yarn build" + }, "addons": [ { "plan": "heroku-postgresql", From 4e1b371f8dd96b9b487e41b81ba8b2adc1d768cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Tue, 18 Oct 2022 21:24:12 +0200 Subject: [PATCH 08/39] fix: add heroku postbuild step --- app.json | 3 --- package.json | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app.json b/app.json index 353846e48b..67ad0584da 100644 --- a/app.json +++ b/app.json @@ -4,9 +4,6 @@ "repository": "https://github.com/heroku/node-js-sample", "logo": "https://github.com/Unleash/unleash/blob/main/.github/logo.png?raw=true", "keywords": ["node", "feature toggles", "release"], - "scripts": { - "build": "yarn build && cd frontend && yarn && yarn build" - }, "addons": [ { "plan": "heroku-postgresql", diff --git a/package.json b/package.json index 098e5e228c..2da327eebe 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,8 @@ "seed:setup": "ts-node src/test/e2e/seed/segment.seed.ts", "seed:serve": "UNLEASH_DATABASE_NAME=unleash_test UNLEASH_DATABASE_SCHEMA=seed yarn run start:dev", "clean": "del-cli --force dist", - "preversion": "./scripts/check-release.sh" + "preversion": "./scripts/check-release.sh", + "heroku-postbuild": "cd frontend && yarn build" }, "jest": { "automock": false, From d0ea49b92b6d73a3ec668d466b6ad47468afa476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Tue, 18 Oct 2022 21:28:31 +0200 Subject: [PATCH 09/39] fix: add heroku postbuild step - second attempt --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2da327eebe..f7462a0f3e 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "seed:serve": "UNLEASH_DATABASE_NAME=unleash_test UNLEASH_DATABASE_SCHEMA=seed yarn run start:dev", "clean": "del-cli --force dist", "preversion": "./scripts/check-release.sh", - "heroku-postbuild": "cd frontend && yarn build" + "heroku-postbuild": "cd frontend && yarn && yarn build" }, "jest": { "automock": false, From f1c678e5c46d0fc96f3a72d80c390f501f75b2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Tue, 18 Oct 2022 21:35:50 +0200 Subject: [PATCH 10/39] fix: tell heroku to not build in production mode --- app.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app.json b/app.json index 67ad0584da..3c0f40b02c 100644 --- a/app.json +++ b/app.json @@ -4,6 +4,10 @@ "repository": "https://github.com/heroku/node-js-sample", "logo": "https://github.com/Unleash/unleash/blob/main/.github/logo.png?raw=true", "keywords": ["node", "feature toggles", "release"], + "env": { + "NPM_CONFIG_PRODUCTION": "false", + "YARN_PRODUCTION": "false" + }, "addons": [ { "plan": "heroku-postgresql", From b0626d46bc7f97184e3d9d34a672cf968503b81b Mon Sep 17 00:00:00 2001 From: Fredrik Strand Oseberg Date: Wed, 19 Oct 2022 12:29:00 +0200 Subject: [PATCH 11/39] fix: respect environment if set on context (#2206) When using the frontend api (embedded proxy) we should allow the use to self-define the environment on the proxy. --- src/lib/proxy/create-context.test.ts | 43 ++++++++++++++++++++++-- src/lib/proxy/create-context.ts | 6 ++++ src/lib/routes/proxy-api/index.ts | 6 ++-- src/test/e2e/api/proxy/proxy.e2e.test.ts | 41 ++++++++++++++++++++++ 4 files changed, 89 insertions(+), 7 deletions(-) diff --git a/src/lib/proxy/create-context.test.ts b/src/lib/proxy/create-context.test.ts index 6e6b4ff4aa..8ba87dbbf7 100644 --- a/src/lib/proxy/create-context.test.ts +++ b/src/lib/proxy/create-context.test.ts @@ -1,6 +1,6 @@ // Copy of https://github.com/Unleash/unleash-proxy/blob/main/src/test/create-context.test.ts. -import { createContext } from './create-context'; +import { createContext, enrichContextWithIp } from './create-context'; test('should remove undefined properties', () => { const context = createContext({ @@ -55,13 +55,50 @@ test('will not blow up if properties is an array', () => { properties: ['some'], }); - // console.log(context); - expect(context.userId).toBe('123'); expect(context).not.toHaveProperty('tenantId'); expect(context).not.toHaveProperty('region'); }); +test('will respect environment set in context', () => { + const context = createContext({ + userId: '123', + tenantId: 'some-tenant', + environment: 'development', + region: 'eu', + properties: ['some'], + }); + + expect(context.environment).toBe('development'); +}); + +test('will not set environment to be development if not set in context', () => { + const context = createContext({ + userId: '123', + tenantId: 'some-tenant', + region: 'eu', + properties: ['some'], + }); + + expect(context.environment).toBe(undefined); +}); + +test('will enrich context with ip', () => { + const query = {}; + const ip = '192.168.10.0'; + const result = enrichContextWithIp(query, ip); + + expect(result.remoteAddress).toBe(ip); +}); + +test('will not change environment when enriching', () => { + const query = { environment: 'production' }; + const ip = '192.168.10.0'; + const result = enrichContextWithIp(query, ip); + + expect(result.environment).toBe('production'); +}); + test.skip('will not blow up if userId is an array', () => { const context = createContext({ userId: ['123'], diff --git a/src/lib/proxy/create-context.ts b/src/lib/proxy/create-context.ts index 41430a8dd1..3d6adccdb6 100644 --- a/src/lib/proxy/create-context.ts +++ b/src/lib/proxy/create-context.ts @@ -32,3 +32,9 @@ export function createContext(value: any): Context { return cleanContext; } + +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +export const enrichContextWithIp = (query: any, ip: string): Context => { + query.remoteAddress = query.remoteAddress || ip; + return createContext(query); +}; diff --git a/src/lib/routes/proxy-api/index.ts b/src/lib/routes/proxy-api/index.ts index 5cee80a53c..d68bfdc6a1 100644 --- a/src/lib/routes/proxy-api/index.ts +++ b/src/lib/routes/proxy-api/index.ts @@ -9,7 +9,7 @@ import { ProxyFeaturesSchema, } from '../../openapi/spec/proxy-features-schema'; import { Context } from 'unleash-client'; -import { createContext } from '../../proxy/create-context'; +import { enrichContextWithIp } from '../../proxy/create-context'; import { ProxyMetricsSchema } from '../../openapi/spec/proxy-metrics-schema'; import { ProxyClientSchema } from '../../openapi/spec/proxy-client-schema'; import { createResponseSchema } from '../../openapi/util/create-response-schema'; @@ -168,8 +168,6 @@ export default class ProxyController extends Controller { private static createContext(req: ApiUserRequest): Context { const { query } = req; - query.remoteAddress = query.remoteAddress || req.ip; - query.environment = req.user.environment; - return createContext(query); + return enrichContextWithIp(query, req.ip); } } diff --git a/src/test/e2e/api/proxy/proxy.e2e.test.ts b/src/test/e2e/api/proxy/proxy.e2e.test.ts index a6f34c248c..aabcea615f 100644 --- a/src/test/e2e/api/proxy/proxy.e2e.test.ts +++ b/src/test/e2e/api/proxy/proxy.e2e.test.ts @@ -538,6 +538,47 @@ test('should filter features by constraints', async () => { .expect((res) => expect(res.body.toggles).toHaveLength(0)); }); +test('should be able to set environment as a context variable', async () => { + const frontendToken = await createApiToken(ApiTokenType.FRONTEND); + const featureName = 'featureWithEnvironmentConstraint'; + await createFeatureToggle({ + name: featureName, + enabled: true, + strategies: [ + { + name: 'default', + constraints: [ + { + contextName: 'environment', + operator: 'IN', + values: ['staging'], + }, + ], + parameters: {}, + }, + ], + }); + + await app.request + .get('/api/frontend?environment=staging') + .set('Authorization', frontendToken.secret) + .expect('Content-Type', /json/) + .expect(200) + .expect((res) => { + expect(res.body.toggles).toHaveLength(1); + expect(res.body.toggles[0].name).toBe(featureName); + }); + + await app.request + .get('/api/frontend') + .set('Authorization', frontendToken.secret) + .expect('Content-Type', /json/) + .expect(200) + .expect((res) => { + expect(res.body.toggles).toHaveLength(0); + }); +}); + test('should filter features by project', async () => { const projectA = 'projectA'; const projectB = 'projectB'; From 0e3e725a1774b35b71be9dc34939815ddfcae852 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Wed, 19 Oct 2022 13:14:49 +0200 Subject: [PATCH 12/39] docs: add "The Anatomy of Unleash" (#2138) ## What This PR 1. adds a new topic document, "The Anatomy of Unleash", which explains how Unleash is built up as a system. 2. It also moves the "topic guides" sidebar entry from position 4 to position 2. 3. Finally, it introduces a new `Figure` component for the documentation, to be used with images that should be shown with captions. ## Why Referring to the same numbers as mentioned above, here's some background for these changes: 1. We have gotten requests from enterprise users for a way to help new Unleash users understand the system. Together with customer success and customer journey, we agreed that an explanatory guide would be suitable. It aims to give the reader an introduction into what pieces constitute the Unleash system. 2. As part of a discussion, it was suggested to move topic guides higher up to make them more visible. There's a few reasons for this: 1. New users of Unleash should be able to keep reading about Unleash after the basic introductory material. When left at the bottom, topic guides are often overlooked 2. As a justification, it was proposed that reference docs are often the last thing you look for, so it makes sense to put that last. 3. Thinking about a new user's flow, it also makes some sense: first read introductory material, then dive deeper into what Unleash is and what you can use it for, then look for how-to guides if you're stuck, and finally consult the reference material for later. 3. These diagrams aren't necessarily very self-explanatory, so adding a caption makes a lot of sense. We didn't have a component from this previously, so I added one. Co-authored-by: NicolaeUnleash <103567375+NicolaeUnleash@users.noreply.github.com> Co-authored-by: Simon Hornby ## Commits * docs: add raw export of anatomy document * docs: move the topic guides section to near top of sidebar * docs: add inter-doc links, some reformatting * docs: fix broken links * docs: add a Figure element for figures with captions * docs: add more styling to figures * docs: align on styles * Fix: add fuller figure caption * docs: rephrase heading * Docs(test): try new way of importing images * Docs(test): images take 3 * docs: Convert all images to using the figure component * docs: add projects to list of top-level resources * docs: add captions for all figures. * docs: reorder images * Docs(fix): typo: extra brackets * Docs(style): remove box shadows and border on fig caption images * Docs(chore): remove commented-out css * Docs(refactor): use css variable for small font size. To facilitate reusability and convey meaning. * docs: rename anatomy doc * docs: add note about strategies vs constraints * Updating the images * Apply suggestions from code review Co-authored-by: Simon Hornby * Update website/docs/topics/the-anatomy-of-unleash.mdx * Docs(fix): remove redundant comma * docs: add link to node js sdk * docs: mention that a toggle must be active in an env to be enabled * docs: add note about environments and api keys * Docs(reword): swap dev and prod in example * docs: fix typo in the image * docs: make figures in text full-width * docs: move environments and API keys call-out to after figure * docs: add borders to figures * docs: add image float css idea * Revert "docs: add image float css idea" This reverts commit 69f27d304b4a4d2a7422046475380011345736a2. Co-authored-by: NicolaeUnleash <103567375+NicolaeUnleash@users.noreply.github.com> Co-authored-by: Simon Hornby --- .../docs/topics/the-anatomy-of-unleash.mdx | 202 ++++++++++++++++++ website/sidebars.js | 30 +-- .../src/components/Figure/Figure.stories.tsx | 30 +++ website/src/components/Figure/Figure.tsx | 90 ++++++++ .../src/components/Figure/styles.module.css | 23 ++ website/src/css/custom.css | 2 + .../img/anatomy-of-unleash-constraint.png | Bin 0 -> 24049 bytes .../img/anatomy-of-unleash-customer-tiers.png | Bin 0 -> 53846 bytes .../img/anatomy-of-unleash-environment.png | Bin 0 -> 11948 bytes ...omy-of-unleash-environments-strategies.png | Bin 0 -> 41074 bytes ...my-of-unleash-environments-strategies2.png | Bin 0 -> 56656 bytes .../img/anatomy-of-unleash-features.png | Bin 0 -> 18217 bytes ...anatomy-of-unleash-new-feature-rollout.png | Bin 0 -> 50385 bytes .../img/anatomy-of-unleash-segments.png | Bin 0 -> 38678 bytes .../img/anatomy-of-unleash-strategy.png | Bin 0 -> 21222 bytes .../img/anatomy-of-unleash-variants.png | Bin 0 -> 56724 bytes 16 files changed, 364 insertions(+), 13 deletions(-) create mode 100644 website/docs/topics/the-anatomy-of-unleash.mdx create mode 100644 website/src/components/Figure/Figure.stories.tsx create mode 100644 website/src/components/Figure/Figure.tsx create mode 100644 website/src/components/Figure/styles.module.css create mode 100644 website/static/img/anatomy-of-unleash-constraint.png create mode 100644 website/static/img/anatomy-of-unleash-customer-tiers.png create mode 100644 website/static/img/anatomy-of-unleash-environment.png create mode 100644 website/static/img/anatomy-of-unleash-environments-strategies.png create mode 100644 website/static/img/anatomy-of-unleash-environments-strategies2.png create mode 100644 website/static/img/anatomy-of-unleash-features.png create mode 100644 website/static/img/anatomy-of-unleash-new-feature-rollout.png create mode 100644 website/static/img/anatomy-of-unleash-segments.png create mode 100644 website/static/img/anatomy-of-unleash-strategy.png create mode 100644 website/static/img/anatomy-of-unleash-variants.png diff --git a/website/docs/topics/the-anatomy-of-unleash.mdx b/website/docs/topics/the-anatomy-of-unleash.mdx new file mode 100644 index 0000000000..7ced4d7cf5 --- /dev/null +++ b/website/docs/topics/the-anatomy-of-unleash.mdx @@ -0,0 +1,202 @@ +--- +title: The Anatomy of Unleash +--- +import Figure from '@site/src/components/Figure/Figure.tsx' + +This guide's purpose is to give you a conceptual overview of how Unleash works. It covers the various components that exist within an Unleash system and how they interact with each other and with external applications. The diagrams are intended to help you understand the fundamental building blocks, such as [projects](../user_guide/projects.md), [environments](../user_guide/environments.md), [variants](../advanced/feature-toggle-variants.md) and, of course, [feature toggles](../reference/feature-toggles.mdx). + +The end of this guide presents a [short use case, explaining how you might configure Unleash](#use-case) to start working with feature toggles. + + +## The global level + +Some things in Unleash are configured and defined on the global level. These options apply across the entire Unleash instance. The most important global configuration options for day-to-day operations are: + +- [API access tokens](../reference/api-tokens-and-client-keys.mdx) +- [Projects](../user_guide/projects.md) +- [Segments](../reference/segments.mdx) +- [Strategy types](../user_guide/activation-strategies.md) (including [custom activation strategy types](../advanced/custom-activation-strategy.md)) +- [Tag types](../advanced/tags.md) +- [Unleash context](../user_guide/unleash-context.md) fields (including [custom context fields](../user_guide/unleash-context.md#custom-context-fields)) +- Users, [user groups](../user_guide/rbac.md#user-groups) and [global roles](../user_guide/rbac.md) + + +## Projects + +[**Projects**](../user_guide/projects.md) contain [feature toggles](../reference/feature-toggles.mdx) and their configurations, and a set of active [environments](../user_guide/environments.md). + +All Unleash instances must have at least one project at any given time. New instances get a project called “Default”. + +Pro and Enterprise customers can create, rename, and delete projects as they wish (as long as there is always **at least one project**). Open-source users, on the other hand, only get access to the Default project. + +
+ +## Environments and project environments + +
+ +[**Environments**](../user_guide/environments.md) in Unleash let you change how a feature toggle works in your application’s different environments. For instance, while you are developing a feature, it’s likely that you’ll want it to be available in your development environment, but not in your production environment: environments let you do that. You might also want to enable a feature for only some users in your development environment, but no users in your production environment: environments let you do that. + +Environments exist on two different levels within Unleash. The set of **all available environments is defined on the global level**. Additionally, **each project** can choose which of these global environments should be **available on the project level**. The set of environments available to any given project is **always a subset** of the set of globally available environments. + +Each project must always have **at least one** active environment. + +Enterprise users can create and remove environments. Open-source and Pro customers get access to two environments: **development** and **production.** + +Environments are adjacent to [feature toggles](../reference/feature-toggles.mdx) in Unleash: neither one contains the other, but they come together to let you define activation strategies. + +
+ +:::info Environments and API keys + +When connecting an SDK to Unleash, it's the **API key that decides which environment to** fetch features for. For legacy reasons, all Unleash SDKs accept a configuration option called `environment`, but this **does not affect the environment** at all. It is an Unleash context field and a holdover from before Unleash had native environments. + +::: + + +## Features (feature toggles) + +[**Feature toggles**](../reference/feature-toggles.mdx) are at the heart of Unleash’s functionality. Feature toggles belong to projects and live next to project environments. In and of itself, a feature toggle doesn’t do anything. You must assign [**activation strategies**](../user_guide/activation-strategies.md) to it for it to start taking effect. + +When creating a feature toggle, you must assign a unique (across your Unleash instance) name, a [feature toggle type](../advanced/feature-toggle-types.md), a [project](../user_guide/projects.md) it belongs to, and an optional description. Everything except for the name can be changed later. + +
+ +## Activation strategies + +
+ +[**Activation strategies**](../user_guide/activation-strategies.md) (or just **strategies** for short) are the part of feature toggles that tell Unleash **who should get a feature**. An activation strategy is assigned to **one **feature toggle in **one **environment. + +When you check a [feature toggle](../reference/feature-toggles.mdx) in an application, the following decides the result: +1. Is the toggle active in the current environment? If not, it will be disabled. +2. If the toggle **is** active in the current environment, the toggle’s strategies decide the result. As long as **at least one** of a toggle’s strategies resolve to true for the current context (user or application), then the toggle will be considered enabled. In other words, if you have a hundred strategies and ninety-nine of them resolve to false, but one of them resolves to true, then the toggle is enabled. + +Activation strategies tie feature toggles and [environments](../user_guide/environments.md) together. When you assign an activation strategy to a feature toggle, you do so in one environment at a time. You can assign the same strategy to the same toggle in different environments, but they will be different instances of the same strategy, and do not stay in sync. Unleash also lets you copy strategies from one environment to another. + +Unleash comes with a number of strategies built in (refer the [activation strategies documentation](../user_guide/activation-strategies.md) for more information on those). You can also create your own [custom activation strategies](../advanced/custom-activation-strategy.md) if you need them. All strategies can be further augmented by [**strategy constraints**](../advanced/strategy-constraints.md). + + +
+ +
+ +## Strategy constraints + +[**Strategy constraints**](../advanced/strategy-constraints.md) (or just **constraints**) help you fine-tune your strategies. They are an extra layer of prerequisites that help you narrow the audience of a strategy down. Strategy constraints are applied to [**activation strategies**](../user_guide/activation-strategies.md). + +For example, if you wanted to roll a feature out to 50% of users with **a specific email domain **(such as “@mycompany.com”), then strategy constraints would let you target only users with that email domain. + +Constraints can also be used for more general purposes, such as timing feature releases or releasing features in specific regions. + +An activation strategy can have as many constraints as you want. When an activation strategy has multiple constraints, then **every constraint **must be satisfied for the strategy to be evaluated. So if you have two constraints: one that says users must have an “@mycompany.com” email address and one that says users must have signed up for a beta program, then the strategy would **only be evaluated for users with @mycompany.com emails that have signed up for the program**. + +:::tip Strategies and constraints + +Feature toggle strategies are **permissive**: As long as **one** strategy resolves to true, the feature is considered enabled. On the other hand, constrains are **restrictive**: for a given strategy, **all** constraints must be met for it to resolve to true. + +We can exemplify this difference with the logical operators AND and OR: +- For a feature toggle, if Strategy1 OR Strategy2 OR .. OR StrategyN is true, **then the feature is enabled**. +- For a strategy, it can be evaluated **if and only if** Constraint1 AND Constraint2 AND .. AND ConstraintN are met. + +Note that even if all the constraints are met, the strategy itself might not resolve to true: that will depend on the strategy and the provided context. + +::: + + +You can define constraints on whatever properties you want in your [Unleash context](../user_guide/unleash-context.md). + +Constraints are applied to individual strategies and do not stay in sync with each other. When you need to have the same constraints applied to multiple strategies and need those constraints to stay in sync, use [**segments**](../reference/segments.mdx). + +
+ +## Segments + +[**Segments**](../reference/segments.mdx) add extra functionality on top of [**strategy constraints**](../advanced/strategy-constraints.md). A segment is a reusable collection of strategy constraints with a name and an optional description. When you apply a segment to a [strategy](../user_guide/activation-strategies.md), the strategy will be evaluated as if all of the segment's constraints were applied to it. + +Segments let you apply a set of constraints to multiple strategies **and** keep the constraints in sync between those strategies. Whenever you apply a segment to a strategy, you essentially create a **reference** to that segment. This means that whenever you change the segment by adding, removing, or changing constraints, this change propagates to all the strategies that reference this segment. + +You can apply multiple segments to a strategy. Much like with constraints, **every segment** needs **every constraint** to be satisfied for the strategy to be evaluated. If you also have other constraints on the strategy, then those must also be satisfied. + +Segments are only available to Pro and Enterprise users. + +
+ +## Variants and feature toggle payloads + +By default, a [feature toggle](../reference/feature-toggles.mdx) in Unleash only tells you whether a feature is enabled or disabled, but you can also add more information to your toggles by using [**feature toggle variants**](../advanced/feature-toggle-variants.md). Variants also allow you to run [A/B testing experiments](a-b-testing.md). + +Feature toggles are designed to let you decide which users get access to a feature. Variants are designed to let you decide **which version** of the feature a user gets access to. For instance, if user A is part of your beta testing program and gets access to a new beta feature, then you can use variants to decide whether they should get the red version or the green version of the feature. + +When you create new variants for a feature, they must be given a name and a **weighting** indicating how many users should see this particular variant of the feature. They can also be given a **payload**. + +You can use the variant payload to attach arbitrary data to a variant. Variants can have different kinds of payloads. + +A feature toggle can have as many variants as you want. Importantly, variants are independent of [environments](../user_guide/environments.md). In other words: you’ll always have the exact same variants with the exact same weightings and the exact same payloads in all environments. + +
+ +## Use case: changing website colors {#use-case} + +Using the concepts we have looked at in the previous sections, let’s create a hypothetical case and see how Unleash would solve it. + +**Problem statement:** You have an existing website with a **red** color scheme, but you’re feeling a bit adventurous and would like to try and see if changing it to a blue color scheme would be better. + +**Current state:** You have an existing website that gets server-side rendered and you have a newly created instance of Unleash. + +### Configuring Unleash for development + +Assuming you have a brand new Unleash instance, you already have the “Default” project and the “Development” and “Production” environments available. That’s going to be all you need for now. + +First things first, in the Default project, you create a new feature toggle, called “new-color-scheme” (toggle names have to be URL-friendly, so no spaces allowed!). + +Because you’d like to see the new color scheme while you’re developing it, you assign a “standard” strategy to the new-color-scheme toggle in the development environment and turn it on. + +### In your application + +You configure an [Unleash SDK for your server](../sdks/index.md) to communicate with Unleash. When rendering the page, you check the state of the new-color-scheme feature and render a different stylesheet based on the results. + +In pseudocode (loosely based on the [Node.js SDK](../sdks/node.md)), that might look like this: + +```js +if (unleash.isEnabled(“new-color-scheme”)) { + // load stylesheet with new color scheme +} else { + // load stylesheet with old color scheme +} +``` + +And with that, the new color scheme is now live in your development environment. Because there aren’t any strategies defined in the production environment yet, the feature is not active, and everything is as it was. + + +### Rolling out the feature to users + +When you’re happy with the new color scheme, you decide to start rolling it out to users. But you want it to go out to only a small number of users at first, so that you can get some feedback while rolling out. + +You decide to add a _gradual rollout_ strategy to the new-color-scheme feature in the production environment. Because you want to start small, you set the rollout percentage to 5%. + +As soon as you enable the production environment, the feature gets rolled out to 5% of your users (assuming you’ve deployed the code to production). + + +### Adding variants + +While you were developing the new color scheme, you also dabbled a bit with other colors in addition to blue: green and purple might be nice too! So you decide to create two extra color schemes that you’re happy with. But you’d like to hear what your users think too, so you need to roll it out to them somehow. + +You decide to use feature toggle variants to differentiate between the different themes, creating three variants: blue, green, and purple. You want each of them to roll out to the same number of users, so you leave them equally weighted. + +```js + +const theme = unleash.getVariant(“new-color-scheme”).name; + +if (theme === “green”) { + // load stylesheet with green color scheme +} else if (theme === “blue”) { + // load stylesheet with blue color scheme +} else if (theme === “purple”) { + // load stylesheet with purple color scheme +} else { + // load stylesheet with old color scheme +} +``` + +Now users that are included in the gradual rollout will get one of the three themes. Users that aren’t included get the old theme. diff --git a/website/sidebars.js b/website/sidebars.js index 527b4599ca..9f22bb96ae 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -28,6 +28,23 @@ module.exports = { 'user_guide/quickstart', ], }, + { + label: 'Topic guides', + collapsed: false, + type: 'category', + link: { + type: 'generated-index', + title: 'Topic guides', + description: + 'Discussions, explanations, and explorations regarding topics related to Unleash.', + slug: '/topics', + }, + items: [ + 'topics/the-anatomy-of-unleash', + 'topics/a-b-testing', + 'topics/proxy-hosting', + ], + }, { label: 'How-to guides', collapsed: false, @@ -305,18 +322,5 @@ module.exports = { }, ], }, - { - label: 'Topic guides', - collapsed: false, - type: 'category', - link: { - type: 'generated-index', - title: 'Topic guides', - description: - 'Discussions, explanations, and explorations regarding topics related to Unleash.', - slug: '/topics', - }, - items: ['topics/a-b-testing', 'topics/proxy-hosting'], - }, ], }; diff --git a/website/src/components/Figure/Figure.stories.tsx b/website/src/components/Figure/Figure.stories.tsx new file mode 100644 index 0000000000..fc9ac86b07 --- /dev/null +++ b/website/src/components/Figure/Figure.stories.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import Component from './Figure'; +import Layout from '@theme/Layout'; +import { BrowserRouter } from 'react-router-dom'; + +export default { + title: 'Figure', + component: Component, +}; + +const Template = (args) => ( + + + + + +); + +export const WithCaption = Template.bind({}); +WithCaption.args = { + img: '/img/anatomy-of-unleash-constraint.png', + caption: 'This explanatory caption is visible to everyone.', +}; + +export const WithCaptionAndAlt = Template.bind({}); +WithCaption.args = { + img: '/img/anatomy-of-unleash-constraint.png', + caption: 'This explanatory caption is visible to everyone.', + alt: "This alt text is read out by screen readers and displayed if the image doesn't load", +}; diff --git a/website/src/components/Figure/Figure.tsx b/website/src/components/Figure/Figure.tsx new file mode 100644 index 0000000000..681a2f4098 --- /dev/null +++ b/website/src/components/Figure/Figure.tsx @@ -0,0 +1,90 @@ +/** + This component displays a figure with an accompanying figure caption. Use it + to display diagrams, charts, and other images that have an explanatory + caption that should be visible to everyone. + + For some info regarding alt text vs fig captions, see this stack overflow + response from a blind user (available at + https://stackoverflow.com/questions/58447538/accessibility-difference-between-img-alt-and-figcaption): + + I'm a blind user. I would say that there are two big categories of images on the web: + + 1. Functional images + 2. Illustrative images a.k.a. figures + + AS the name says, figcaption is a caption for a figure. The caption is + always visible by everybody, not only blind people. Figures are images that + can be found in a book, an article, or whatever more or less long paragraphs + of text. Most of the time, figures are purely illustrative. + + When you use figcaption, the alt attribute should probably be empty: + + - Copying the text of the figcaption into the alt attribute, or any + shortened version, is almost always useless: the screen reader will read + twice the same or almost the same information, and it's worth absolutely + nothing + + - You may think that the alt attribute could be useful for a longer + description of the image, that wouldn't fit in the figcaption; for example + a detailed description of a chart or a diagram. But in fact, this kind of + description is better below the image or in another page (then available + for everybody), rather than in the alt attribute. The alt attribute should + normally remain short. + + - You may think that the figcaption is useless and only set the alt + attribute to something. Example: "Photo with Alice on the left, Bob on the + right". But in fact sighted people could as well find this information + useful, if they don't know Alice and Bob for example. So it could be + interesting to move this description to the figcaption, so that everybody + benefits from it and not only blind people. + + Now, the biggest case when you won't use figure/figcaption is when images + are functional: a button taht can be clicked, an icon with a precise + meaning, etc. The basic rules for alt texts of functional images are: + + - If you can interact with the image to perform actions (click, etc.), or if + the icon conveys an information, then you must set a non-empty alt. It + must be a function description, not a objective description of the image. + + Example 1: "Go back" is good, while "Blue left arrow" is bad. + Example 2: "Unread message" is good, while "Closed enveloppe" is bad + + - Otherwise, if the image provide no interaction and if it doesn't convey + any information, then it is illustrative; the alt should be empty in that + case. + + ------ + + However, even when using fig captions, there **may** be times when also + using an alt is appropriate, which is why it's an optional attribute on + this component. However, if you do use it, make sure it conveys + **separate** information to what the fig caption does. + + +**/ + +import React from 'react'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +import './styles.module.css'; + +type Props = { + // An optional alt text, if the caption does not already convey all relevant + // information. + alt?: string; + // The figure caption, visible to everyone + caption: string; + // the path to the image, starting with `/img/`. Example: /img/image.png + img: string; +}; + +const Component: React.FC = ({ img, alt, caption }) => { + return ( +
+ {alt} +
{caption}
+
+ ); +}; + +export default Component; diff --git a/website/src/components/Figure/styles.module.css b/website/src/components/Figure/styles.module.css new file mode 100644 index 0000000000..8079842656 --- /dev/null +++ b/website/src/components/Figure/styles.module.css @@ -0,0 +1,23 @@ +/* Figures (with captions) */ +figure { + box-shadow: var(--ifm-global-shadow-lw); + border-radius: var(--ifm-global-radius); + border: var(--ifm-global-border-width) solid var(--unleash-color-gray); + padding: var(--ifm-pre-padding); + margin-inline: 0; +} + +figure img { + box-shadow: none; + border: none; +} + +figure * + * { + margin-block-start: var(--ifm-pre-padding); +} + +figcaption { + font-size: var(--unleash-font-size-smaller); + padding-inline: var(--ifm-pre-padding); + border-inline-start: 5px solid var(--ifm-color-primary); +} diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 2a2d2b861b..398c47b3e5 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -13,6 +13,8 @@ --ifm-code-font-size: 90%; --ifm-font-size-base: 15px; --navbar-link-color: #122d33; + + --unleash-font-size-smaller: 90%; } footer { diff --git a/website/static/img/anatomy-of-unleash-constraint.png b/website/static/img/anatomy-of-unleash-constraint.png new file mode 100644 index 0000000000000000000000000000000000000000..44dd2fe01e466439bc7c424f9ba8ee409f849a8a GIT binary patch literal 24049 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 literal 0 HcmV?d00001 diff --git a/website/static/img/anatomy-of-unleash-customer-tiers.png b/website/static/img/anatomy-of-unleash-customer-tiers.png new file mode 100644 index 0000000000000000000000000000000000000000..f91ac2badf92e45643ee93e83b810b25a548d8f6 GIT binary patch literal 53846 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 literal 0 HcmV?d00001 diff --git a/website/static/img/anatomy-of-unleash-environments-strategies2.png b/website/static/img/anatomy-of-unleash-environments-strategies2.png new file mode 100644 index 0000000000000000000000000000000000000000..3de4404d97178c21d679ae14fc222d18646955d7 GIT binary patch literal 56656 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

Ps+4bCBAWM^u9n_aK< z@S_3k9kUtl5w|?s$@8_7J95#U;t=%U-V1-xHKk@Gtn}S7$)&$HdNJFIQZC?dc&%A( ziLNBZ5HMe36$8Z%a#DSPjvhJKC8)j(miv}Wn&?nk}b!^&*F z=cU&Y0*2E9=1f-xxsID=dr`hl=S^}cnTst2q-&8_3Y)LyqndROZO8`8Bue_nDQ`u~ zzP4*5R=qY=g4PY%Q>jO7p5||%828=uN44q{^|iD&&Nex`x*@*C96b#iAB(_o&irwCr%rvu?M9gZdSoubXL? zaoO%Cbp}umx&B|n_f4Qi-KJJ7zPZyjCTt9kw@aB7$}2XOekn3?rKm0wDPR!>x}Hv@ zHC0|w?LF?TkL8#+m51#ch`^6>f*zU>vf8q_5A!wQK*lK{A8*Ml)}w7}DU<}UOZCFP<(3!%PO?OxV-+6GK57cQ zJFt1l$*$%h6Rw(yFm$v^8~+R^L2tQ;w-nK}HzB%Vj?CHY$aGzf>bjz%G&F!yDigQf z7X?6Tw}rPXQZ~mI&V5av*@_8yRp$MDrh^gYnIh`tb~|TpqZQoT*rt{a6_+8cOn3AJ zv>zK(d48wxdt0xMgG3*uH;q)Z&Fd}i2JDAkQ(2nkXjU~=LM)1&BiRa-0?fElO-6+ zC~wn5Zn-duK zc$7H}S6qD`7KfW~LE4RpCtzcPLX6aOxmW9j82hW-_9|(HFqJTbvIolqJxhNe)*FB5 zoclXTPKAUF9&toG14Tue+foz5uhgB;ZyDX|*-; z=C>fe+CD;ezL&2t2<|q+amV2seKIc?ZJOd5%SP7Qh0l=V;se&PyXR<(^BuS-+t^BAbq~-^PISh4@+mVj+dB~ z-OH1ea9*UQINwX-C3gAvHGe45IXlK>J$W9S&36^Wj#50@gOxEQsi5QcJ_mT-Pwt8E z4x`n-r+cO~txiDHm{B(fL=a(#y70eo%SRe_zXdHLxwdMMJmd{gmb@86Y_=D1O)_(= z=t(wN479czjob6B=kenjfnv+e$L!`ZX7iS$#t?p&zW)L0^1rx~P#n3^aXG5yu>W^{3 z(}0%l=Z!zNp5~M`mVW;Dyw<8p!3}O?hvj+5@%BX-SAzPS+k%B{TJ%uUT&#!={PNsn zNu2E&lAYJJp6WRN?$bU!+!G5kwkx{ZD0iV&QMo*(4Wts{+X+n>qJT8{G@Y_JV4<#5 zG~=}NgI;m9%i!}nQ#J-?r+#IYUeH|2hDX(wo7}XMFldQy2{I6APFH+JV3uE+EX8HQ zMZkuZg3QpaEr>v2d;05hr*=ly@16vrdw;!d{KOR-Z5qh%vjaD=@ws46A=6gZx_`C9 zOOHmK2Z<^KcGD%t_55lJInF;LZKx+<7j53t%wjE2>AIBKymGpLXYuT>t7*rs6mn}A zgpb=6XZN-%;RnBP-)|Fgx0Qx8GmnUC;=C}C7GKkn^pXjrMJ)UR^uV z#TwU-onM6hJ;isti%2gHG5t2ZIdgd)TXuTJ2XlVJ7{=jM5;7@PXXb^eyF?BUo-4t3 zy#DMRhBE6t#C~7UEL!rDnBz1_C^a?OWqh^txMQ^?i;n3IUE8;c9AYeKj4LVa#mJuG zC*HvBbH$KWDTZQF?4;!0fZT)C1`^!Y$XzWJogZ4i-YUFM7-JK|KXOiEGDf3U4ag>yzL1cZSFe^)~@&Xy+1-Z$kz zKhJVuAPSK86RU?ETi>%Me_Uu1Q%F+Gjc{ToHsG7xd@1DjLwFl5>4jT-G8&S%co^ z+)oL_Fxjgmwa0~I7S;3625gW?tgmf^w#rcx*cN+);JB=;&3!iPR>zS_f2I6TPS5Yx zG~)}f7(evZfn9Tkz-XLo?^5)TH|d8a|(kc;k^;0j%dOYgT1*47dICFS|-> z1mkO{L$6TJ=!`XxtM)qlSHWg2D#8`9xlH+yceC%m7V|vxt;*fN3lt;vF*8xod0epn z=Ru*zoG*I6O@qc`Nf)j4BDh9#N{L)sd>D*)gbBpX=C&gOwV5RQ?X$6W)4o}5Fd3d% z;cID65R4NrUBBT$`L9e=4z})FA6-*RHs&LZFKkr?t$~skoJrWp1mlliAHNO#jdveN z+C5<;%Z|^mYqGo_IYa?cjbUkINWC*|R>(YdefHIV1MQ`x%kVP-_mv8_>%!$vS~DYr zTJ~T4u|4mdyb-9_%YmvVOt$M~zntejHy^(DG*Mo9J*r5#(vx+c@xcebBOwXa+=J}i zXO)GOTYl0y-*e12viLdXuS~R`i8}Je^Xl5~DqM$bHaNdhD!kn3_nH!L%TCp$J3HO< zPbr~xzVNfIPD>ihGH^Gmn|-!83~n>%9uv8IVM7n@k~@zr-Ty=~m$$o6t4n}GTY25= z6=I+8Mnz#}&W9pf5H8os=jo5sX%*@F6P5n86DB>uC+R|Y;kR6!$}D}`Srtjh zr)7fZZqt8SGEeT;EPr~kp>=wfu2_6XJuV}?)BT`T(t`q4B1W&5cs2gczu64M!`fL zLg&%X^)T%ZN4i)?UdZS6gqc-3-01Io_}E`f+oZ_b-)rrsGz27s+8pw9mU`{l3ltHD zzOh9TQ)sEpX8NYnfHnhNoQTqF?#EaTJfACQxB~Ef7pQ{u$IZfdeyo4GhAb}FD zd!3^2B5t$6iI5xP7vgxiX_m+ z@io3yJcwxhG2rFG3S8aVSV$ck-kXo5**B4DO-tf`5$pf= zzG=*VeqQ#UKH}4>6W;eWD{3xFmyi@quge`mvCQv_O&cSp#3m}^P9J#PkqzFw;HZJ z-46>+^0H06s}j%0SFH20D^IE}b_XceLgNfm!jWqcj^J)eX|R%szdzTw=Iq6_jFDWC zMYq!V2uU6IBx6?wH?>& zUtF@;OS?$5FX)J<7Fo|+y0=8NsV76kK=k7`*eVEf2wp>P>~%N7|&t$F7apW zF70i!nD1UgznIG*N3bxN3O_~eL7g>_G%YIdH7&#NnBf7$v+%vfQs1qijKKkk{VMbj z%g>Z>2ML$O@s}$ekV!YrvZ*FZ(#hIgUu8V_(veV&g!}bq7x`nmbRgB;xOtk$l9z)f zbe=>k`!D0LyPV#6qj{z`$u9!ZES?b8wIZ4JtIRj3@Y6VI`@Oa{qf`4n)(yz%O}2%{ zT@NQlo#Ls<4rX1ejjeAo8B%SLBBAN%eOs^X!rz+m;v#>1me4vtIE{b3V)5z0cw0vcw3<~W6Dk8FD)&MX4T!trryxL z@|CjF`rDgSTbPPyo=fU4wPyiA&xA4c|l9RC+#=JMp@rBXc zkhbG^=dpu!KIq_$*#ONT(&?zx!9gRTIx&@))dyn-e?*~!b1>hu*j=wQ3*d-EP%K#9 z(EZ7x&o(L{;mQ*m(-n8HR#P10dnO!uPdZZ z%SfL3I^EPmf=FMW`!Yn(*UcYqx&G^I6g<5R+in`a>EynfftxidSHel0r%0`~d<3ho zUX5k>cNNOt53~y}p*F3o$26uls5GO-}%becsF((M57$-_H2(#lMVg&~2sv z%kTICdtvm8lK(`W@2N;9AA3Qqmc5RhrvTUmwNEv_jZnDQ_*cFS;s}po2ZUGQOOlji zp4!Kz!@MJe&ZFf(Z%A%(d$hUF%IbupO&xDFFEw{lihc%Cdj<;B_?n-mN|wf({@U>A zn3WjqJ~CtLgCA?34jCB@Ahvd59_$CYI*!+bnDv8#y4qasf;j9^48Ca%!!;r&lNFdD zPC9(LkNe27Pz*M`!x4NP3TUpbhb%-$XkgJ7zOv|hlRJ$GUwRAzRqZSZGzq_!q<8F3 zvH^4{1|0w-7k1Ao34{UF7(nS>2#9(VF`1kPOY0z%uDu=;qtkdgJ>{AB%*L>0vBP60 z?R{+FL`{ERNw-a$H@dHX zJ>8dbi9+sL3u2dL^X_>F?lE~3*;#a0E7^O8Q*56K3pAs(^Ghjw%`TuPi`#Q$U%aly z_F5|%BsPkM1lXX!8GJ^KA9Ppi?6Ny#%4YV3z|Nq?WH;9I;I8LDUbRwo`_j=O)-<5% zJE|_neAfMXchnyxUZpg!9V=_;zVSz>tZB4QMz#*RuyXybSGtS2;`^v*xQm#H{~epz zOQXRBE=Q}{^C>T>hvbG-7>j0uMo+Z2=l0ZnL1lZwp>A834^Q_#oOwtsVc)c>5c{I|NmU9pZB?0kqs>C| zR14?F)9mG+Yvdg9zs1$w=$nZN5+25NLU^0Ck_LbXDQF^7Mssd8+2Z_y|6` zGECikdJC10pZffW>eticUdEO|u+t_{*bn7NIXNgzF;f&WRY3=LH@Dwi(k+Mu}X%1Z$;>aF_vsY~C$BayhL$I9<&{y{8@(At^9 z;9AEG=8}Pampt^nYvE>3a}zTSg27&|9hRf3x}kzd*(?_<^+x+wWOTrRf)m47gT~ZP zg07r6d)x2~V|vl-KDjKE-5NgcN78f#w(>F_+R|-@_@V3V?%JA!pH3AfHeT-ut;5ny z{k?v|>Lyk!Xg^avacD%DCRPIXWBFu_hk%cNS-oKHH%#H&RCD(b@}*JBOowBK=@XKV zi06cjNLJszqw@mkA;cW563PNIfLnQD#8Jvx%4L~L^Hl|qwz8& zlV}G!d)5)xLPeMlKsu6)Q5^+DC?1;Dy<5i4>}^D0}wX)KLKLtSRC?7FSwcallZo8Rfi zZ?h-L^7TpXCjIg=tXu5(dYM7#ww}|gc|}(#Ui3QrA3 zC=f`uDvAnY=Z|;r{_w^_5UFlx*FD419zvNckRdfwWL8d-;R1+a3%k|A4wT7$^hDsE>tX;}B-Jj94c%}Kq zsx_53GkwptYMUqMw}`FY4jUyEW{xxTCxAt$M_bVnM}rofci6w?NjP$=8P^Rvz0Cie zT!e8R{Jo@G_cxO$$mhm2DsLy5%|+^0em6>H$-7oa6#&OOJ=Z?e;H0sc)spw zH`c66jXp;(b1O3~Qr)Byef<wK1VQ|pvkz+1@}1MLtM_h?zW%Y!@Ke8BSBv~&J!DG4JbctJBvoBKq2OuZ`xqlK zvIn;%++KAzSE0RnuteQMGT&f?>$y*!mydMaJ|#;XJc2}rc*{%I^borlV_)H4gU=6Z`SZsxZtCGm+e2> zvM--B+F6a0!Aip`sUwE4+Y4_}R?I$h+Z2IuXl}g>9GBQ8>vL@W@vGs+KfdfJ$ZWh!@&pRK zIAVZ!K|BZWGZ&+!Vi8eR2ezX#o#C281WcfrbV+@@d_-KgER{ zbzAbN!1OY|yML!7yL#b$dtNJPfi+(MrjgRr$ZO83>5d} zZ+XiJ_>^rShX`p#_Wcrt>DBO6w0VSSkesiKCFOc-hYj??1Lp($~tc-U2JA z(bfOT6-euP`Z&>7u)Y-D=B_iNGor&Vt8UU-y*poCnp(p6sEr(?c?&Nk+88_Fye}L9n9#ocX#uY zTUS;qA){Mtr8qU_8&4>zo~_eQ5fY%NlB&zIH7y`ZG`Ki$O28vksx1rflXE6GWuHY4 zq2kLeH}at^Ph^gI?PFPyPfE!gq&^cQ32&)hlfT|2*O6U5ST{ zE0dMaro|E*`I>!ds>@#1`gH(k?(04^8iYrDIm%Jv zJ}KBi12OxU`I}Yuj9Ep={2RSU)%Ce3WV1ukL`V4ZMdp`lty(Hg<_ld&=Y+C4VwSRe zL^iHf-ZnY!`$VsW)m`7R5e%;}rJQ4Q2_eGQMzDZli~e%Q%xG@Q?EaRl@1Mi@&w^Pv zAh1c5_fe+$g^>UM7a91wITmSRwWpC<-35~8oEX$z!NE9Q@%Y)tw5f#}xtjSjE1K6% z$?1BHShMZYq3XKCo-1w1hHAG2Ku$cXJa>muMBbqkIg{+kOPNEYRnF1!+ki;sv@O6#t@s)C7kEws1?cKLHv=P5r4W<{GrvB(W zyTswlS{n}J+&ls*n%TRZUT-%KE|S`tS%GF^Y=t?iBt`?njte^_@0w zlk?D?Y%yc~WXeUscj^M$zJ$JReG#>5*jZA+V4S5-4i8?50)Q3icI?Mx{&rh?Zfk`51w0p ztv&b`(t}xIVpn9xPm6?|a`fHA?4^ z(O(=;Jc|bf0SK;K?UZ_+%fC55n>IA}UV$|DL2F~=9T^;UjRK%bSo1z@(**3OhCzE+ zc8fkypJ7aQg09-yF~OBWL5@HU>SCruj33lw!O})60p;Yw3rg&g3h8O}n7XBl28XqY z7oCGPBtYx9m;Sit*zr2A9Al$vUKC9k2fhPCYh zC9~zDPV>mYKYgYG=ttJ8&_UUZQ;AFT!tla`8#VBp z)~?E)8o(S?+3cp(a4tDC*UCt*o2?}>EQ#gE+_mZJo4W&wi4Y0lHq3grykAE($n$}E zBVWG2)Bo?R4-h2CKD(-_v6;dP{IC7-Hnw#}^vfHvQ*5kQ%e#1cCl`LqNUY8=kz&ohM&Nb+d7OL1d@XQ7sU+}aZ?oajfvBEZmfvwz zVH=-WG&&CUUi~g2(>-3_MES|ho77@I z;5Bs0x7FOxr*#9lGe5esRFcq32d2)!@WC%S;B)5-{rf4)W^7K6YC12&>aSKNZK}{U zHE6PmSNYB0?$gL_jpCz#(fqNBCX)fIWPZv+`EF>ZkQIpAp{)5hZ#Q6bdZ-ASA@TN| zhw-A`KDw<{?rdgaV#23Y68*?`zY+LRZgW*{BHrc6Ba1C6*9#cch{=nv z6Mrk@h%r>}ODVL>9_-rhFKh3I1)fx$DgPBdF zMP&Ic@*gRhYYt3z&RD_3gA1)KTvOuuRz5G@x3 zPh2TKOAdeQe0>euUu<~za=}r&XuYDNC8qX}up{XO^JW8cOwuD>I-8CkiK_ z6JF4Cyyoi`mvMZe^zEMJJ$`=tKA+30aW{oW=@YS{&E@0B8+ z<>!obML!_H%V2G_ox`&^GztgY&@A!t5i_h}W%sos(i+bXZ)VRSq6N&G(Xu-AZh?6SRlam=f(=%U=+aR{T zh(MO6ZWEXgw-%j{*0eSR%d2#nSj@)@f*<&wwMC^|BK8`>7U*yt#~Jkwepit-Py2J& z-mpTR<83xZCwW8K6keL;tNt=$^&az_{X$yyR`Oksyb)#|2`e(#!Q7f6kcW`>&n3So z@>S@#t$Wx7lU;Hjs_-vgU0JK%Q@ zV>$+JyRyrg^YP@Ya{iUzebuZwr_g@%+NsR`i-kjKjmfD0)6Q!(AH)E&?NOb7kv;UzP z4P;H0bFA6Y)&BUzvS9;{ao)kmN=0b& z@Y4q;ks1|w|lPha^Kf=F2`}4XZGFv*^0qD$cXWani%mxwjw+G z^N5*Rn}^dEfVBMNh2LR*g+EA1x$LWZCGnfxu)fh?tU|Z%ZdiS_a;u)BN3v+<9Ovjh z1EDpaBK31uu~OHcZO$3EClv#x6+H943)>%r2{c5tUs8wBFkMGp_1T>xDUWYW#!ThP zz(766GJS^dHEZZ8AnO0)w857kl&xlo@{svn4T60mXrlHreO5BBoI?J-Lx%ap+R4UA zu0UxQb0kk4b_yy&9|3vjqF@ia$rM&0{f;NerlWY+{M~DKX6sBut(fb;6jqs^GM;_h zZ+MZBCuH=8cJyf%vy5w}mT)Dw=QA?SAH32S|NfIEQLI&;wL6#sQ~b~M-mis5pC3y` zfZo}-P+w%aseHN9s;+OuKzFUg@k)%_6<`Hi9T{|h-hPc$_=^4{!Y5d{claS!;vMa6 zB#e|=V>hZ^WM+Ks{@_ZB*XzbkRVdhAan}`cBl)L;#TyNbn1OiBnM)kwA%$m7qs)sS zi^nGT`QzA~d4Z&kNVOd6PX={k z{Ed&Vf39)E3@m2AOX{QxRyLBC6n^U0R`ZJ@vzDvjg z8wj+LsdM^27ZKJyBippQIlr$>GQD$CZGY*iTZKgt3y9+lV z$8dF>!?k7FfJUi1ScWC`{7yB;|Foe3+ij{izi|8*3nSf^dv!MbfDI*WcZR)t>fo_~ zg6xV;<2XNLTv7OL8+PFWf^^PeUGfsjsmO)d_|9ec+Dt;~lZl@;0!_5jJ3~A0`zXP{ zLm%cZo{Sn?8O00>xQ&o-D*cYO1G7;L``yZ*)Bzk4)h}4Mb>MEK)LATe*k)cQgHo~A8SR1i?*VWuR9ZA>)Lq~+ug$Y+&^6Py7@ zW)G^vS}T5L@REWEto@ktlwg|HA#k;h(*=Qj4+kYHyJq|hkGqu*zbpj)=20-M6b)dB zu7ZZESJ@>AB_yED1?FPgvciXzA??|K2V}2R1d#h8JK0vf#A0pS$5)Q&UF^^s!%}lY z>=VDWKl1w|PKSYd{Ke9EcPN50iW7k+B07&)S2MpPd8sr9NnJG*W~8SZD&5RrXffI& zLlS|c>?bndAmKj9`)0Ghgt7_vep9cXgmv8#g5npZk2dp-af1L>>QDDoKP?`NA&S1r zLb1PfHZO2+-;osI(#duR3P-?r=u>Yn(hL93#M<9(y<#GT;`!rpOVsxdA#A_(Aaqo6 z@jdzAgIn&m=$1auXT6D81<-!>_$8dGNm;d*`N(1|OQlpe@e=B_GTu2&W6ly(|BWv4 z8N=4#N$Lhu?f6U{vE^*=_*(|zH>qSI5yz8fZWBI?yn{3VbNl|<3Jub>o`b%)V;MRJ z=U*T{>VZd@2>8)*^KiN0P#3i?zlQ%D^k0i8NDxX$fyT@zF0MN**&B8;N`U4^40fAh zNx`F7cy`|rvVXNFD-UA>24>h{IyflAiq4`Cs;y3b zNVwHSE~fT9y)3@^kzdK0vz5$o>Ol0REo``O9Ajt1b!x`i4D$OHpYU0Ar|jFz+In_d zYJL0#WBSF(RXeKu9?i1i=K!a>STcC*prTC9)Wv?%l8B!5ukUXS;{zORz{p%tPfl^= z-r5`c8|^{!9qjTV3U7O*UQ>W#CD#>$Gdsjj&Uusz5w_rv)#OH>m&p%7UrxL{%F*&` z(Gh;(&8Q)JI#)86b_y}ts>^DDs~Gf*ZbOH z!DRB_Nx{6-%m{Z?oBFZ7`KCL-n#%o$>wa?}={cFyWYgz-oe8J~pEYhdH5KFQ)$Hu-y0=<6NPc-+&^EfKNv-71!rlZh z2Ip*5mAKsc6v2L)q4pc0rw&hoxxYk(2|nSbJDGBvQR75csdjuq8K+AF*xs zB>HTxlwSdcN6!+?3%d_oCyQFRF8zzGeuYC#iZ0=`=ImCf&N=#MopRc8tJMB&rF)z# zf*N&Ss?L9+9%o&uVEh$NJyq|sXrcr@t3GFX{rS(|OiR^(*>tk4bGpe$nO(Q03taLs zw$Vo$#0rB>hBFFuzqMp`prSvXY82gVK?j5V<+bRN;RY~izunn$fxVCa>+BKM80)wK zJGx(~V;8KJK}#pNTFoH#|355Z$8r=PD`*;oK-#utxju-mhGBjq%6M?xq*cKHOC zYQRH#ccC9d41CrtK!TzpM(X2+J9%} zW8h(vYeK*iD`~+-2f#7uPe;34nIt0MuFdAU40Jbd1KFyZ*LXR{MXQ>59Dn9Rt&v+o(eM`&q@n zH(<^9f3w<^40>2J5B*s`G$ncvPDh?w~DMcO2<4`MHhmrU0Wx_MP=7@@^{@)L;4XY-`B*i6aAHW4!;J5hRFJ z5ZFu@Z)M9lt>o&|L%))@*N43b~|6ZbvtG2b(w5O)((`eKBxtL8STFNIysSt*2{zp7+Eq9c96MMGD7V2eJsrlr&=zx8t(NW^6dd-?Rs&46ry{Re0hw*XsYjd z{FS432d>~59O3v=IZWj(-@m*p`%gKAo37$_Z!)eO9j7#Xk$vAj*4a<+LZ7*JbvHz1 z+KuE{o1v75tVHHM{qo@l+Uyej~#ErEH!n(NM&7#kT_h}mnnwLaF^_AJ^) z%?lV_zb+J<*D`Yz`Xb+d#AVos#d7U=$nI>tW+83?SaIuSD63K1~mkMZ~Tq@qmlQwicO1k5*A|^V9mH$V2~%QSx35T0}`VANO0fPt1C?Aa8v> z?+lLWPtM!y=cM~RCkXFPh*VqtzT507vi|rmsy_0=+M+z2lNckq_Cu8mU%;{c;(+Rn zkM5Qc=wY{`!zb41`K1Dd$GiL@mP0D2iMQgdtKLLIXY49fIa)|G=DNP{08InnVgAlc zd8nDD`bSI>&9Mv31r_+m*Zf}HV~K_~#-rJ5o2h0;$I(}78?5i_J&T$(V=_^oEqGdD znXtReaSeA=b3n$f<)k6%M++GSPQ5 z22`s#;h%`v$KJpT@iU<9Q(-n@nVc=qys~yXsqEO{qjTI z6#1_h(T@UooR=h4kbBK!1?LH9SxV4EkS9ena1j}{d<@p^;_pW+W_&lCSZ?4T>Sf-x zv88&EQ%i}hdmLGl(852zu?3%PM!ye6shIKanltT9-muBe+4^(*mtM6GPed02`>4_o z^e!{JsYwPBd4edniG(DD?cyq#6!DOFNRQ=bwk za^|2g`?%TTCEOIhH$EUHkQ6s4IjK7?WgeyhFXbsmZ$`wid$z5w_I1x3%iX?tSe58p zccr>;(Q=f=O_4GCamI6sQ(ZGmno|dR6njFp^M_t-zT(3S}bEcGjk}0v5{)$9o z^f_<7p(^uZI^t}-)cn9LxDWm#mD%enSdp2#4zDy;g-&JOjFPMS{Y$Sz5WP32SS?yv zG~1r7`ic~^!8EA;gfqlS@JBP7%2(#AM8l&MA75*^j)+;@Nk7mlFe@OMsh1%hQD@HA zV59I>zb@ux?Ui5TiPhPKUZ-S(T}_9lD9zY2v8O@w+M_jq&{hOSsA6Hw>gAs~O(G47 zJHzuKKsmNv+AGS={&tW%^b_co3XSBv-e-7Z^2OkS*_bxcZ@C8I39|=(uh+h|f7yR2 zLw>7iz3O`NLnSvq_SCOfxyP^TG3wKf4xC=+y27Kj#Tm9iaU!^PI-u9r;TO@5Y)c9&CgJNV(1zNziiMh# zhM&pWOfTHG%o#vZ2R%n9*Gx*WrC{w>XbcOBc+#p?W5;=D3HdE0J0^NXDq;)C4GkC_ zOnBGG@h23V{+;p0#lcoC5pGHUaQ<$L)8nGQQ*#Y^=<=LLfz|bCw(0eU!rw8EL1MIT zlD`G7M%wl3E=gN}Nce>^e9==RyFH8)9Bh?Vu&7qJ@(mk*iX%4hUT}bI`HBKBi)7JtpIUHBUYSn27>7-@1i8tYI_4 zDeA&o`Gd}q64|qidhet3bLcI1PB;#BwnJk!zamseIF7w+u0wuoJ~Ebkx~df{X|(p~ zzF?mWP$F`Rk4>37L$ma@Qo!Qs}I9(p6!4atBT!2FJB(OjpQxNmv$S_lR}aFpv&iRO7(bK?HVMP#lO(n#|ToB11n~n)mT& zuW7OL?S}P>)HScIY--_K>cDJ=m75a3R`e9py=^RZ6knE3vOiX)4vngF`qYk$ObE^;-_{tkZkcA$JX0Kmbk?6g?ty7Wo;<;e=H%ZHTt;t zV}H6&^5Ta(trchiDa}hnv3G&Q0D{=D8UyXT0M7?s1OIn|)_SpBbpy5bx52HFhfn{R zqL~{8w&_G7}m0i=i3DczAt%I{P%@YryG%g{?p7&HFIb6jRZ<_)#lI+*N(YI6x;fTqX^cHL&s7t-GpAavoPO^*bfxkB<{S07Da{e zkaydZ$MdBuC>{Eh{IzOG zw&B*m-$BVKh)eOm4#BnOCw7o-dG|du64uLt=^r*dg43)%9D?PQ5#zV^5cjWx}>XHK= zwuAIW4z4TS!0OYdL{;aD#GdYRL5rM!^3tQ5nP_Njd=y#X89s9aK5HgFm(M8ii(fJ~qZ;hG`9dNG>J^>HAfk#bEz{9wJr~)lo*eq~6Wxu)$=Hn&emZ(C7ya zi(TAKJ=r@%3T0~N#p+m1^9hsfAjJFo(VF%@M+}Sv8;%9X_o9{fAnYRZnHffWh>l{` z6I2dzzTyT|!I;2#OgJA9x%%p(K7AjxHDUTW+`8?Oft*wS&p__36gb~DtG&+1vHm6v z|Le#2H>C}>q6x*gM#wVUmU`78$yTv-GJv8wk|9qh)AYY{44Ot$*4qa>xZlfp4kdd8 zs0Bfz%Muf8MqLZ;3;vogX_o#9X2! zl>nn-ajHH4@oZ5Z8ZO$<=*VDVT;xYI9vJja25F?yNkmF6ED#N2l9wTcB?qh9h|9d7pw|Nghq5FdGEOq2g)Ycm66hJ`cZEUO>p;pBjZJN=Z z+Sh)$@V5aFfKdFeHyNbJLJQJ4UI zg?i|UbLP!&kU+yA!sug4w&i>&>40W`BX>~sC1>B$8${}pxfu`6@TlvMmsru8W(T~e2~1obnp{^H`)38NW0p*?~|1iw?^dGI+~beLI`W6N;XM*OnNwd z;$bA^P+w^H>==g5JNdGieDO}t*}pM2fUG^Lq|b^v9b>znN8qvEoZ3pY*g|cH2q%W^&nA5SYgth3 z$%34_Q=;n3&8Lr=2iHPkH)i|69`)U>j7X3H zCAFc{wZgnyn<@8{HqW=d{zC67*DGmX8#TwM*2ApPDXdX$dgCX<3`EZhp6w<+-}xEy zVtsS1G2Yk2XIU_iV3zR+Az~X*sRxb9SBX{U*V5Brgr$bw4(^pXeSggf`sq!iqB(7T zOCwbEZc`#wud=}W#~JDgb&uixK3XFZ#22${gzC|?N$*kR55fWx$F7jSY`Erk9!8*m z4?kgY@a%B3|8rdSk*P?HRI)2|@uk7&9eAE*iP7hK(w~x4Ki*(buU)tK?7`dBt61fo z2og=dzv;Ia#Hx~vkaOlFUm4jvG zhV)7_`ja*MiRR<^@_SD#-}=Kbb8&h4RTdyq>_erYfI-8f+_0#E=34AtvC+J!=b>cb zO}eH8Ffb{P<{pfepl65g)GRcTA$Wh-dpmfRRe@zhN(H3gC*pyBwSH}Kn8D{umd8g1 zqsZB#jsSDe(_M)>b1ot#M5V?CUF6~d?Yj-_8d=fWZ|7OMAvf`4c6hEDE$3tZupHMV zy`cCw{~M=VPoc`KMR?KQ?u%zu{utZl4eed`^IUBa8I|V+h*NvaH)sd9r8gz3+gA&3 z$!4Wr6b|BA@;5z|w;X$ihtc}xPS9!4mz~$QJrz~E2C<$U(3Kx z@pX1DtCHQ}9^4lQf#}{A(&kF*RA6W_GQypFHPDjZhT`$Grm~J`CIkvHU%*^P2=ez^ z%p&|g^IRj`O9WdcXw-3)HQ(1lbH0*&6{A_+>AG^Bv*~Hc70XV@iX6PZsca|L4DVuP z&qtCm@+Ll{HGZwb9XYe~E?(2Qc?L+3hM-iW3mOv5NBszy+<^Z$%GeyS7NQ_;G}^A; zELiHDB&g5^V`+793KND*afsKCDln6peJO*tkKdwe0t#uGHZ?77n<|HcfDSy6B2P#rGCOGoq(`!G^ z8EF`ygtby6?J@Sd+t4>usTeWXx@xfNhmx=l;w5xzdKuQq9%djzdk)85bcWQwK~8Sx zz71gD7Fah0v_>`0GNuK2)^yF@mnwNw%+GMC^5$nx+hJqe_xeJ1|9Zi&Z^}!AZ#L{! zmrsXjVTwTKR(-4BAkbG$pu2{zd6=+Ko4C7j(L#H6)Kn1}_GO79sc)dTIaSSJ<*kS{ zH+Mi(j=A=46N#3BSp+`TitfjIOPKUs2KO=MN@M3ov45Afv;~rk_q3JDhBD&JJ!UBQro4;H$%g55`b|~J zyh(pD)O;3*OS&R)KK8r*Sm990CST2cbiD0ugcj}u8?!P3RR3|>`)jY$)PA=+&J=VN zBWbuUBdNTUXB(dc?7 zwdbAZ3s(6JM|F6(nh!+YpP-Y~$7&%jeM|+=@GoMD9u;QV8LjM?GiaaiINUwye!Wid zbB8TS^?2jmIrcf5YVZ;0RCV5NStLjifhQVz_-lZ;AJ>e2l!TSt@K@!{x~L4O0`s!2 zpDM3&^@~g_k8Mm5GD>)=Tj$d_``$ggkUq161qySNPld6RiiQ$CpY4NQ)qCn!hlxh0@|6BH8CEE(@XvBdZ*_u9QDg zp;1%WUU}R0{fT%_@=Sp|=Z%>Q7`6FdqJCdf#SNMWX>ANG@?ahmfu3}^BXoJ*EO=S5 zQ)yYq8ap?Q*w*uBKN1Xk(sO(tCmCGBY5jE;@z|ezC!ppfPI3@&2K@Ct?%5yQRxEbP zxeJewqZ`P60zdp_;9)=@^;UrQAuEAAA5_M|=RMY^Xe<81O_1eAV(rDCryOA(hW#YSmN z1sYNpZ~5))q3)9k{nz4`x*!sUO@tz?lespJ^Dm2ytrUeXY;52l zi$flSYVqWKsVO8_X{^t?qk_Lllh~B`L1#dK=3W=c5MhsxGkdR7J>>2JPL=i;Mt};`^FzK89TUHr2YxeCF(nvUSy{8_4u~sXK)9rVEk)Wpfz}x zgZ&Yo##u9ZAgi_Z?mJ;znU zo(P*^sW9?Ya;9M-hFpOM)6q$51D|SIq2}_U`~}5#E;nSxU&dz$Xu|l=DcB@gA?Ak*TZr+xO48oqsrT;s& z%tqi2AEYxlL0WA8C?p3U4V`|>>1G2h0n#O|0_$H#a&u1-ublkSHV|fT)JRfSavv_m zt$WE6&;bfBW|C%h<}Mj9kQ{+0du`r$ot>^IvivcoH|`eGr*P=jq~tVfOe9McfT-8` zz>fkb6y89oQ~a+$!~;P9u268~r9k(h=ax%vC1rXNaeOciV$98Xs)s?d+ z^#<6{vzhpK7-fiESs%^V`SgJDAhtdsVV{NYt}M~r(QEacc6oL6l-0$`Lr~b!C7Gr0 zqhmR+<>R|{*~IhEh1I6hoZ?c%7F;qJT#-;Ln!U5skLW}@A2JLcugJNfChOadz(j$7 zxu?x)x^TJPB=Zw0L;6R(HBOFuEcngsg&W_@czA+O_)j+A-ShSuQy`tP@-WC%Iw3zm z-yr%1#h(aSe)r|cn3vwfq74OkYSX^Yd4fZNFje)a(JTlYgq z3ZWvVlsr-4WpiW&x^`3CYTu;C$12SKLqY-zpTiBSz)uI?*%fkR`Y*epOx43DS>N(@ zSK4Q0W##Z;(w?dKXv>;S%BQN#F#qIh!6hIEo6HY1ud@tGR6LeaH~kWJiLvdxg2NWw ze~bv1I2#Y!iq}ljEP{fm+o3G4>^lksG4QmqI(g?lzrooG+X|mJ7K;>UD0ImHyL^Ig ze=3j~aqIq?6jR&Eb||G@K}CLq70Tk+XGA*60N>p^sS)4EHY^*<+0Rt3P^h==tQz7 zN-|Ih#QrihK1%Aqec*0q-9n>$AnZX@&glSF_Dwz9ea>z`%m3-AnCqT%>!gcCw`MU` z!RU};Lu-*^)}LaHtL55rJi6_6A*5k%+DPm?uL)T<>3JW-!2|3H- zIS=KUE0I3+(Vh?LH7lgTSg#b{o|xY*)lEeZjO3K6AgPlo-y!KDu~k28F&e#(dEIxu zu}voZ30**-*ao<^z|6o(nB3(4?%zTXyZj1@z9dQbD3#*WHS$gDs&0YjA;*fV)+IW4BQh%Sc`ls%_uzNU~#IqwdX@g`3TfJ4e%zQ25C_H zA$X)}sfvf{_TqWgI>on^W}~kQ8#}NzuPcd&be1jr7h~0jGtvn;PaQ_AJ)XET5Ft&N zU9_1LKF3t$k7P~vR9b6}xWeu#19YX+#tocT@a#dc=VsrT)1neL{R*+APtZZ7%6?_3pvyt(qj2zf@ZqGH+ru0!5N8Zj(!$p z!4_0cHQ1Ub7!5!RnfcpG=7&8o-8~20rhmNy=^#Sb>syS677v?0PaRWlFHxicUe=qE zQg5k+Vzs;@fyj3EH;nAMc3VikTB(RLm9nu8a}d%vvS2H@SOkX-Smio6O6<+T)0uEd0){h8`(u2iij>`#T|HDw(zB;SL9D1ZUNY@0w_>GPCNJH`I zz3(Vl_#&CLsbLH}faWa`PV}%mZK}OdUvMMt2BEID>$lCzv-AlUN&=R<)hdAV8zWt&mX|fo+o>sTQtCLWSzT*>%C60G9l@1nW(2_ zfb(U=;1`ss?WInIY0u11_~1npv^2F&W7vk@k6;Fh_dik@hRnFYO>TwiA8|5`#KN&2 zSnS~tDYx})T{%lRJx(Ih-?gC|1`VNZN4U{sC2X6JY}=C+QvW;>l8xVL&{bTer+d-L z<&J}n-s_4IL_OkmVU`N`T92#cjr>QD-i~Clv)Ll({0;q1KNV@HNMz(Q)7DtSVvgfGHk!2iJFUrugPXA7mZFb1@V(XFE?Ky~ z>5%kc9R>`!>W)lQ5Z2XlOgvPjASsFcy~bM)ll&~Q+$PQXvLARe*f$+j zlkQpuS}r-uCd(WHJfDHn-<>vJ2IW|pJT*~&8|QEFfxl`ux!c?1EPvSiFTBUfy*5_A z&tF&_LiMc$E5hbF1Y@k8`VsDN({YdZ+t_$v=Wa_iDpK-30~aYZvmdZBlQ_6F9cLV7<5lZRb? zn1=c5gSh1`8G0DhuqWjV-GdQM1`|zR^dmZgB}(f6)L!sn@0b*YgRgNy_IeZe`4`YP ztD8n!q2nQ zW=4J)YDB{m4~3011_jR?pLoEDTcLVOd;|oEU7YlIxIj$1DC16(Q~G0(YW!LXcWMQ6 zmbo{cD1B#z$+V<355VZ%#z5Bg{CeEu@#$Xm%bCgX&b~DxncZ}0f`z|=<4>5M^V4w2 zJ__z7!S<(68G&gn6&-{gQH>|}?ttk`O;8bsidcd=fUPs=+vUc$( z0?B(ossfeRBrH?kB00yQgQVX>RTxB6CS1JKXBOVUS`L}o=1`37y6 z4;;g}6KwFKr)=-sm`(t9hRq)rO_w7Xb{9psEou__gHb+l#?q6H?x1Y;7l%#&=j$H1 zy<+dTu8v(yWwvk5$4WB^f)3pnut!{*G3!GS$Jy`+IE$$i5t>}s)S%ivS(#8~6+&Dr zCicq~t^TzR8>vrVl!r1pB|`I{id3&?gGp0&KyZ%RPsi_r1ZUbE&cI_ksAb zNx-yhk^j$}Ri{>e9;6J-POso1@BVPg0UZ_r;K^bl1*6yaqg9e{-t-clQ?=f z_}+DV@QORL4ed3z;p3;RwfBxr+bc`~%+6Y{T_0Is=QYL^Jbp=GQ`+xu>OH}e+i7(O zeYUBM^+{+=%&#{x{hwHeD67Lb{VmmN2MoFG?*xYZP+>;{tz3^g4>ijmr2^|ujP3B! z{wwF?UCbl@(+Ag+7DzJ1IbV7@XG$XzY5z<@JA0hGpW!5$6sv)}=tXY2UGL8e8F{XTH2j z6-5~j7oqZeRY6qaIZ`>tAnvG$=}CJvf2yxFd5G0H-W!Y!&#YgPwvyB63?>Q^W$l5@A$GR z(iH9H9h3qM33ra1>`tFVgcPG@>d3IeN=v2;$zM4!>6+Q4X{C>*KHTdMIRW<+J^=F0 zvR@4qJ9;9k#p$Yi$D4!HWV()~RY(=0_^YXZ?k(*}2TXc^gB6G3uEt)EHAHbV=kxs5 z3FVdp?ROkae)O>7gF)lM>^85mDwI}AGvK_nj8XFBN*D&b98k(52{dK#Di3bk?)f68GhCLC z)`4jfPhpAMt2v)cr5-FLY^ccy$yvA^9=> z>E}&Ldunw*)>^t;;)Q$#Z@%N6U5zmgQYD&yqVeE14E>z=D$55P+ct=mx7&K(I_cAW&&5C^fZJ?qlIZ@?~)PpuwZ_GWQR5fF_sVR5x<_ zWA3bDq{Bp<>dD=@eh?gNk6Sa{+o*m(F;#)PbSJTIYt@FnJr;xrS`lVggNAwFbA?}j6rfZfA-?&xM?j<(*6)ZK zOsLJ@FlU0?IV#>!+IbIs-)ZIocxu^NOqBSyh*JTos~;3{<7Ttf1EMec23tQck%U!N z)xY;PdsmtpF} zLnr^p8~O6L=aS%VdQZcq7}Xr7%{#V*vjDD^D2wN_=NcKxpl^V*Z;GW0VP@3SexJ)N z1`n|WO|0P&pPMO)5k`68odhYO>C-)uX=>B=nNBPDpQ?d*UQO|44Qe3u(Lh`z>ccC` zYE_;!O`!clvCP$C3k^x`=8j^o-~6%dYY&<|K)ADvdFW|ykulE?7#uAx-m=f|LDU(Y z%omkIbX!FyGo$=uJ?nz5h2MG;-!aN0=DmX=)DQCLJbNfmzfQip+-HU6DnXv2`TU$5RZw0ugqfkI!1oV z;f4OKS5tBeXOyH8HM1-&2aLZ<-pyMArHiAi)tniTIH1)6oK_u#>*{-3^wG_{Ap(5% zaN<40o?Iml3$0oZ`<4&|7|az}aeP?of_voC{m@EE^>_xGWAf%n5$M#Y!E(9KDK6;$ zIhCMyBQUv1&2fl#ID5%Pb=-{b8~u|zHhue&_yG99RLpY8R)%|Zp{S4ERnFdzlk%LS zZ$E{yJOY}JB;-I~BA6<}>-|w5R4rBlbH#bq*6^Dh@BS-E&;Y2uCdB7uF9K3xH>8b< z2ER!{E0g&Y+III^-SD^4;R>jk$O?9K-mgLXbGr8nhaUd!J!Fg(o{&uW-pjh`mx$&=VC|p?(GcpwuG=@M zK+mS6LuB)(Ux%0v>olIPe-3YaiVAO8T0)2vicWG!9>_*fWgZq*TzNV#`{|+7$u@m@ z;}D0Y*Y0`^yIMwCUoFv{Kao~e^;S2@6kpSlx{pHTIda^#Q}!%!;tiGa%LVD@oKupj zif-MPgCM)bb7sMCA7846tX74H$>3c@+B#Q?s5F~yuC{->V*vL(gfZyRVB|>ej)}zO zJ^`wC!yRh8i>!dpT7!))X}!r|fpL^*Mld>FhWo@ppHE)W#H3Y4H2NV%AHjKptIRK% zp-h>^%D@>WCw#Z(ziaa_CgwxUzF%epkQFRatNxumW+i2UF}%FfLn@Dvi}SgQnxC*) zg8;vgP95XYo@FaHU>t1B{n$=>6g~}JgiYZxOf+=u*E2(fp(Q0@F4@LqBuy_q(8awL z+8)&-a+W9tj5eiCo;n{#uvW1~JqDfc?&>bJr(GrlEnjIv-W;!TLwyd_o(d5`%R}Ww z-I;Al;k8366*>2hmwoo+(pzwbZy;iHbpJYB`ifW>8LvEiaxdLqG;DR_27eX#?S|Dz zpFS*YFC>|U_*?vA?aFFA?8`pQ#XH?i$NTkv%L$t?>REkCqS2eo0hEx+NzkzK%M&cd z|9OWEU=jlAGzRZ{|F%DE(gGx(fUleX-E&e3@XAqJdqMv)jeTco>?;DcO$JNWCNIS5 zc6+$oVyhW_vk~@xnTni{f{?E|{eHi0>Z$M@uY)hyy7@5`@W!iZuAf?J=U%A&?|g82 z`(NfS@To7_$u#O~wHJ;t2||BI0niK#cVlWuHuk+us z+rJ#PKl>e@h0X%!e>EKP%^ovzxa2~owNqDjxBJsPAcin~^28HxZJ(|{xZb!yo;Uw; zA2(XSI8p3bZm}4Z>L$xY9PT2Db?mm^zNT#uNX|n6tFQDnUdel^xy^7%-1j(jc_t3f z|HcQL2EYwYx!MBeMU#sWn8P&)@t`+5B=sIX%)KwYKZMfl(Kxj3-|Csicf-a@Fl-zG zL!RD@`qOw?{!5jIr`qaJq(}%(XSrknWM($r$;}p!yzA$U(^EUCqUP}9tq-om617Qo zR=9q)^{sU&w*R%WEPG29ASO)r&4@1a*Exx;_oJ~nQ0QEFs3Rh02~=>Nsm+Xw&RLCI zmm{-$&vcIIf^qg>r1P`_Vaofs*OjDew~VwTB_Oql02<};`4?P69U&TB#@SGEjCmdZ zUym25Rjk)$qOpy{lalaGWc$?dfyJARO@TLi-130Ee{#V|b8a(^FVKb|Rx3ZfHW8o2 z8f98RaN5j?bl82ij~c|?#{s-HHQ>G#ila{kKvnJiWt`&36J?gyE;~M-YtM53!nXeW zS-yt34pFz0gL!Bg{QY*48e>9xI#|&CwSb?s8aH_Zm*$Zvo=gNF-mm-M*3G+O(UGO$ zb0$l@@O5d}0JOF+1qwJU>yxXs+LHbv=nHgo`+wWBN?8qTLCl{xeHOlZ!7!sPf$gQE zg~f6Elh1*b>x*e$Q+tB*tcF6E@kUR;o>2NZPP!L|f9r1zz14zKnSZr3gYrF$Ms)N zPAdIOSr+)Y^JlY_f$S#0|4P2Z$0Pe|>*~fuO{Kvkp2xB}1~%5H?@*{6vb##e+^0SW zn&;%bWEAjHUp~DO{Tv!$-&r8&QP@ES?mpDR*D)EuA{W@`S*Y0W)SCoE&CqO%2cu+t z9#>pIWq(g4OBC8QhF^iRs=3xPiV7(XL>Gd_5d+s`_HqWfw#Dy;RsXA26ajn3lUnM? zzp~|qu`S;k=(`TkZ0#_+qmHQ)f8bh@4n%?V(T}){A_2fAi5voio|EdUGjOM!-JpPQ z0IgL1+-knIWRj#pQMT2}!KaEQ(I59l9%T6B1~|uhlKx*g5q- z7<=z{Hs8N}SO;yRTCG`%j!*4Tdlf~i%O<;`X$)j8gI6cA$x8&M&8gOy0@ z&*B$i4L6ir=MeK9P#EKiY^>1Eedx0%i9*}{({VmtC8zF|^obY-BGF(0uGQaT6WhHU zAH6RQ8-m)s$PX>buDzp6@aW-Kqb`KankR1U8Gl!)sF<$2yL%kk^E-%w`3K!*zEIpz z?3#v%;EpfOIB`y0!P9#Sbt#2Jr|EM~{bbx5D=#fGyfy29-u7pBTAGMUdw8+^E9n=} z4XBi_B={2lu$*{gDSPvI+OTo%rv7DQNak&RuR&k^rv25v51czrC;ZjjUJJ*uhKAW& z2D78^@rn9W9@=IqfR4B~HPmwSQ1&0^B9*_t@Ah^|j>1qaFnXYrzRQ`ZfWI3yss>~l zu*iT1M=c0`+hY&a8{2L6hhb{ldJXJemTRH{#!p&0gwx*Enbnxbw>iY9lnEIDwT^@| z!0byL+BLO~3Q0K2!3ei0t#x*JW%TENcARD|wE)bcf`QqJe`{#-NH||_1HfbZ+^NLu z3?yrRzJFm4lqXVwyf#Nm@NgL_?QR&k2SQq4cax5z1P1M%(4o{H-q(~>bZvrAA z9$N37G>GD)fXy0!b!@aLK)5wqh5UlMdcn&PTxO{rO?SgC`9PvA-uZ^Wu35K0-T9lL z89Q%|KMXn%Q?FiEH~6~3wy(5bnoN!=x7;%3K}NJYXRNR-uNz;gu*`MlXpV>~uWfKH zrave)oVeB$#H+X}Y!D1M+tV-fCA^0WXvn+OW?V#AsTi~R>rj{t-R^yz~TC4ie*Kr zXXC9Pbd)=0@BmA(>n0N8X1ORWv;!+d3;KF&e6VldOaMh_gv^uSm)rOk-4B@FmER%D zNqRiMG67YQ6oGCFjuzZcc@()Bdd-+%7EgO2KH;DLA83#nN&N#ou>8hR&aOn7G;uXQ z-qH}vVgFzJ9a4}XH-pUJ!#8?f{p&Q3gCzS-KLM4!$9nY$yQtoRPeEwZ40-1#aD=Jj z^i!EJ@!@~KJ^G)WS^NKNR2C~N;7okNZ1Ze?^++?r+u2i@e8z2+hycXH&D5FWJ5=M6 ze$FV7qS*k+-!3849IR*DM5EfSTi86a%=$T?C!T2Rz;8Dg)TRFEqVlQaHS%i*!c&d( zyuFL;NPTK5#%kGWV_<-VW8*U#-v41Dx}5!uH}cqL9_&v0%N_%`5CoJ;ilaDg#_O_q z+*wAd->y>T5mlE7z$Y$B8kWJ`xpIbQx~Xf65G_6m$JS`(CIilQ)|$;3`mcZJ~yLE$WGrbE-7Mh{zObkhSZdDg+P77Nt#_SEd7rJiuW>*8Vdw zp@S>&UtlDb>@Q`$>S|HL>~sAd+r)txDZ}f@mc#vvy{Ku39bk4{@#qS7?^lV!-z(fJ z=widiPb7neTQo8Mu=h(tmp%PAPecQd*Tn6*%Sm4UCN;f;X7;=Zb@)Z_g}s^gSCXdi zb~J#X#=7ijEe+M38~;wYZ_Np+GVyS%2&QC`0TNbM#L@DB^!!XeH4E&**&TQH%pGpY z*OgnuW^yS7h0@8Iu#W$L~t_;#7uK;EEmY%~6NffmTIVfvEtPzKQ}t`~B1vG{W`V zXaRjwoh`OA`+EiK=YLL2W?$!zBa$@r`3%QKqJHLr!Lkg8Z)`V4hJX@crX zqu&^L#op-FL*@% zhJK}x2+^Laq&O0*HX*UP>2C@Fh!q|gr;MF2O?4p6xJ@)wA*phE2JBxau7OF6Vnv!w zgS2_i{7`ET*tgj3vF7>%NKFXP!LNKqvbm`4o0t?zhDK`OLx#!_xUgy9`XkfRmY1jDU{vzLmSG@2%6&nK+5K?ItdlbG*Qkvtv zTDIF^`ZWJ2kqp)A4mK)}Lw;cQG5kUYWwzE(h=B)D;LTGT5}!KFzB&^vUr8(O;dZQLs?r$#cf|Oc6z*%AoOTN! z<$wCZqGSut{eGLM1s?Kj3SYyEy3OkClWkB}sNU%V9NzEVOC)Nv^Njqx(Hs47z!gsK zy?9n&Fyrmyw*bY66Pqx?({owA63>-2;~NDd1s!t;U>(2@mCX5=iRu#cGw&JSvG)V_ zy5D7J1W3ljlr>XWegTdUmeV5V;fU{HW0X^O3=VrOTvee^G(A!8#HXdZ08rug z{|hv)NZr_)ZR~%b7gT>sbWSX0>_788F?Og?K!oUr7(wU?`5x& zs~9%~p8X{OER8xcPdf6zCv1B0OO!YzCYvHxiUJ2)lq_7R77Z0oEROfItWJem|93LL z9-xiA1ONN$pw6^Sam+Oh9;#g)_SNhtH^fY1J&-RGa~zw{<-jDd4MT7xQ_C>Rz9(GnvciG$NX& zgNUYhAN=k7b?KQVsUX0+IJF-B*qF7#MpNOH>&)6b3B1)>?zP3njht+EPF^wobjsGc zl|)weZK|UQw~kdT;~d1D&*@{EPLCaW3A(~S0JsZ}8E?1dqr^t5O9fO(kwngVOluL|o&~ioVjJbI>!6giVSWq`F^ZmIvRycS#*ta9X<$`ea z#YzCwS&G_u$r8){b^rY{_ZBcLe`pO@nBPG^9#r2q{K z>QmepnhFK9UGM1A<@7H_m>rMZmii* zg-_3gD?PK+XxFLGtJMLDfj|R^s)NbV{wfQ{^%b<3&B~4a*7KR6sX#gX3$+pYKT}d*t!WgqVqCgcfV4m@eto;fTUtg?|a%~F|DOYZG0-cbe zWp1|NJ~`kQpC5n@G(7jO9W<&y7@Hf|4TJHe^oI-2SDpmLum+XGmq^?n(`P$b;!bju z9RafH;{T3!*c6kO%(7-F8yY$MBdp2_L4Yg%jA&S-v!q+Ai5X1UNry)c9Ki#xE3LAc zOw*=Osm0ej0HPT}2tocivxV>yoxE-}(nMKqQ{ymgXkJSXW0!u}j+^!HFl{tql%SY| z40OUA#VU_ixdtx|?;~aPie{H76Rk5d-k43%@1UyA`%DumD;_3mtQO%`MWlzpzo`Ix zUbu$tdB*#*{XcUQLtacg6e81aw8DGD2*RsKSAHXe*h=Xx0w(-T__eNd;ZLsfgl+!s zZM*MPGL$a%9T(w~XJ@TX_M;Fn2(fFotUf>cAJFm{_Rux-^{o)APXESL+6YDPO2qBV z*IuP{h225mY<>}vmjI+rJ|EHKcvtY!jYk$<)m~V~FG?hy|Asf8C3+S!x-TBF_*ax+ z>C3+D5ir98SxP9=z=_%sQ6J4*(a@-?w{)d7-|iNRx|<1_ZRt+wvW&iw9tfv37hBbp zH?tjijr4RkK35G}Y_8o1=UQhvPxU>j*NTejbpgGEn>iM30!O+!4P^^L~kj@{BcM#J1n7Bw?|X-$4@Bw4F~I%L_M?tM8E}ID^w> zwk0@4iv#~jUVFqeK6B{gajRAXD_?t^d~|D!umC^n7K+ernIsripf-xAsBCBfQ}P+S z5cD>MC3O?XEf0WRC*FN7ZtZl8{RKQIS9B!gSAc{8eFm%A9}Ut(pdQAd4HRDI?4ZD{ zIU<;D|CIadNGkwdAs#QVOmGW*Uym))mJznmWdjrSd&j@iKjV~~5;Qk8q}Feen2zo! z1iG2mZdbG}qrVZxoF(<(=Ii?<^hOD4kpSAzOprHAg-?k0`W;c`Z^Hv$pBD(r+;}Nw ztf~A;{Gcf^f?(LMwYxbs{7t$tEkCw?ykrvWb53YP6zjWkXw#!dEiw|MKQShlz31o_ zSZHC&RvClo! zVVv;TBo`&PijCM_W9+Z8TWw9avwVv!z`HP03EfcV{DYnz?>^5EDzzQDCJnq+XbUSVL=bA#j zCFnSumBhrk{5o!Xp~C?~d(s~bpi?Pw$IYLvJhfV3Z0;0mEP?K(cOqd~=+A}{0*ZE+^A+!v?RNkE0i~=!(N(Fj zAc~2}i}kPVRvQ4y%y!miPYC++pk#0joW*)Zm-T8!q2Ap7sE*wV3mnQphpD`%c{YeY@eCt?G%sSw?wGY*h?k*9#8G4YY@6a*^&&^0r=I=^(4Kb zWUCxRLg=UTz}d^H?EqqyaGbO?KXqjlqC26U|``(0%u=@3(8TWt@-?g+m+y02W7| zgVifIl=d;^fXb~0<_t)9&OX8rJm&u2*fzIj?6+Fyb?V{;2Nx z%VY}vqG#Brb6@K^ooP8jig=jh;xksaITf^aQ=WK8UAI<1w10GLPfmK8F?NPIRHq+P z6v>d84mwR{83+1m$0Hb8-QQDYsedB9Npa5cLngybQW>jYx@TGbegob-w-v@W{Syu0 zbagDh9tibRT6WTm6zgAhwE0X&J=vQ9FG*;|rLBFHT_BOBH&f&` zr|}t%njiH=C{E662q%QYnhbh>y@&G_%bY%zjDm{zfh&6JK9V9)ObE#e$ zQEGwk8l*cU-bLnb8m0cw+e85;f3u6(2bV=@=^qRb$rhsXtQd!aT&+b)$PbDLOjjoc zJwjQ2cy3&Ycdd!bm{X{4mp=vIZS{Zpv{3W6iL8DZp`}O%Cll&lqDeo6<;*OGIeg zC9LCQ`Xbr@0P&cq=q4NcyJJra%-W&(rQPqCwpHrRS8AufX)Q#i9^y$zmeSpWVE>8{ z5pGDu7HNgcJ}t{UFhgNqtKyK0SmiC{!&iv~(q2+O4p)uO`mG2HW=Kz|vm6+JBusH%!=Xo7X8fPYs~RY>usugik3$+J8rX@8Rf_~e8$ z){Iq)G1*E_R{S-Nbh%RREJr+-e(q(We@Fi^NHcPt->u$PxtmLd$y6=w5jG;D;EOGf z{w+PAirdR|{^`PcXq;>v`%3cEJ1@)p^?dZIO7@g%J`a~$+sQ@g zqLvH3%t&2q9@29=<_oR&hw;|+*4W61$2wbj_1YYy_=Kz{6=DC*ORgMEsjvqoc8G(= zTZh8YIaK>6C>ugxW}3BvA38RFtJ3^)HF~q6 z=CrNFKO`PmPEtBqYW=Z!-uIk$nNfR#&1`J8=g5Pd zN(kxj4&T3^?7#SePJZdd=h}^2<$@GYVI-alwI$Lm%+h$$MkEfvjtLv4LDkjbJ83DX zo$chF&4J@(={6k99=6<)MJy<=t>CLwX-h1b?)$(c@hWjY zKL68uJM$4NGkfj}-DxS}_9+n&4CoE}Ds0b7c3!Yqy3C)O;_mY{hPKW2)7Kd=M}2ww zU_(PUwKzqLgoIS8*LqM^729f@Wd;T9Kq|0KmWP?opU{c4zF`(@5G7D7FUDE)NJ6^> zVWpp#1Baud;|%pl(@O%0+;!}t0pC(Yt?Oh@k7);){R7c8T50kd`)g=~^=lge0i>3} zOw+iaMXSVi!xaV*DZL_ftw(M9Wl#rKpgAVXG0yTNMmp{2=*XKe`DI5{2Ba6Ka2Uz= zZIY2F3o_@}yK8u*`A0-?k*T3NxU1&mCeX@e%z1chTB5Pxc7Nr-RDZ;U||SVX%qh{yQ8^L=S|m zEaPV;{V{4~9JQAgr_$Jv?g~mQH||bkXsT6-4V!A6{7K;)&+Fc#&@^Gt`ylnSOaY^F z>eBJWp_&VG3+S22FXf2CEke~a=fVgh$+>hsGCozEuXwHaV+nsf8-}+%JBHuJA|D@D zt!&rNEdGFA-DWU#!ftXy08**vkh1LB^diI=t!MZ8&YYROY9AZ>8%7tkXx7zGZ0T#m z6l{q52a^Tm7i|n6tr#gPr&CZ)%!?ec=Xc*8?P@hykBP3xBn3z_n+CF`dhLOQ@9@1R z%wp#|Ai~Uo&F!U?=iCYvggM$WttU51X7VM=LZH95*VB)EU8gE%C6rqEZ|r-7M4@Fc`HU1vUeIf&~5WuA*%vg{~{ii zU3tq`BboWIF?8ir&(sjrlkK5VlfVbA_O7pKAcircsq*M$f=`5^F#1Ai0GgWL8YBdA z65tB@L6d57GtTg*Q#xG|dPvV_1TRnhoa?wIgIA`o`ZtXLM_6XRUh-(G{S+c2^lPle zFp-oLz?s6^To#%2>fvQFev5HY-`CW(q~PRWg1MLRd>El%f8+$bebtpnQgZLGfsqZ^ zuSx1TRnoNt3|$|Y?^!+EOa(<`G>*UP{!Tf}r8V2r0t*8zCU=RB)~!K1d#^8;L(EEb zi>^564ss*6mtxBKr>1Fsh83&0^PNvb#&7<5ST}5F&ZJMdD3i*_16*-QLE!pF_WTfi z*84_FVrAl}*Nn%@<`h5$i{~QZZ_*64E>?=t#X}cn^~XuKdA|6C;a5lUoL~~Zhv(IZ zdRDI|W^=N`6T4+iW&}!M>*MN$8KTQVX7vVK?@qsX1|zCM*l@h?SfB?s@Z9V!6da8b zL;HB`_H<=bAczP#(FD~e2kL}nX%wKx=^DSQEQbd?JjC)ZlSzy@}js#H| z`V-(ljoG?9{D&FF`|o)V1`kld?nwbE*>(f!nKe%m)ReY+e;oLKw=x_vdv3Z8qaAk`qq^<+_JhcP3Mp1II2cF7CW)Ew|n!G%7qLjn(tF z6a?e)t*-Egg3Hs9tt-0s^s!cx=yMK|y2-F04jzy%X`a}u11Uafjp`KLf* z+1wwqb%68cE<<*kB+00k6cLn8^cn_tB{BUQa9MQ=uk> zw$*KGhM_JyPOlKcib=a6zO3#wX?F*L2uR(v&7_+-@sXN3Wp*w!44>3zz#mA0^uT(b zV#-Sj#)b`MbhojJ6M^4b%PCT2e2IC*TGbVv$55APXfC)GE^RiC4mdHLw3%Q$#AJ1e35WPVRez=}2oC)7NP0TPPAtPlprCVBQlhFgt9u2Dw8`oHkoHzh{9UHJ6!TPU_v8sf zMm>Kq;yq1C08#_1OxbQeM#Z=m8rG^J$`L_)ar)Ku%qFrei8`zomA}ymrDZ>0VRQ`u zRA;2Xj^pYX%FqqST6ysmTRStD-n=*UownxCqIHl)KUVHt6@)23!a#F4X&C(>h1Up< zDGi+qmB%5>kDz_hrjGkMZ8H%UhfPAXC!W_@zs)&d*zhfJHvhZ*&#(diG&fp#Y3x8L zoPLlu^|qW;sYRC2R$z3Q4cxfkCHU?6l-d_q1xhl~CIuNT)g7li@!h5US-Uoim;J=H zdZU$J@f>`spl<=`^Hap#)Hyh-279Iao;1F{2@0x7b>Ie*SCE-{So0R6B=ojj_rSE> z@c~r5x{UegWr>m!_z6^2Nx!^lvvCZ3C?UL6zs;ZB5z8Ob`zd2xs=f{v>F&ogvzYweCGEX8&N%hwzF4H6wFsSD%q-f=_kDsqU}w z&PbcTBtc8P*bIE}^lnKH4l zg(r7)u#W6AtR3z&30ilF=IjC8tt1H+DFX#IT3_IinsdiCi%h?AF~L^Y-U#p+^U|Qo z%ZBzor~=iTkF{$^=S+5a`ik4ZKxRndtj@4t zw_Ccrs4+iZwZ=D;Kakml>X3P|aMF03iX{CN(1TuQqU}v@lkn_CL=yKWU*aVYmnTS4 z)d2zh%N^{I`#OjeST2_Qs8x7up$le77kl^O%a}Wnh@uw`jPFC4#KCx1!r`$v;=&=`{6&-5r?N~M%uCV(H?Dx0dnPU8i}EIr+Tkq!&mFn^Nly4V z3MeRL==zFF>U%Y1Ue*Bp3=^x*I>CTu9e3#qbHDrS)X!5oE(%4` zhrUT@+WIaq=IvF=3<`9*RNwmM(N(97^ejNoogs%Y6iEDcuu)rrNrl`o)#}f%YLbe8 zh`?7J1kGP#;pU@*^Tftko}goshuI2tB?0ZisqKVN@~BM1m-}j|55+iC5$_Pf$-To# zFA#x?)n;PU9qQOO;_>`>`*)Kq(?6OEmnXs{o@4oYGJ-9w&iQ*`#v7h! z#Ohua+Bf2^TITeqv^KHiR^j8Zu<&VF=Y&5U=c0^NSGoIjMs%yp-AcH1UO~eMiux-L z^&7}mzHt9mgO3m(3Yt9C#jmGg&_%VVX}uva-8WHP?tzk&efjtNTCQth>iehFZV14a z__10wJ-NKjOTcM)T)6WHT;BnF?N+oy$bo6;>uR({N8U8}9M$Dd zfV64kw?CcFQVykOt(FHGXZ7=_XQmZOOLR z&Y#x7;e$ z{fQ;0K)$NPH=mKAnrSDFq?T4ECED|5sw{#H?WWSiS9WDs($A!T0fqXat^A&qL(dUX zFH`Mnz{OF10Tw5iU>wal-@N@hoC7&-J(glO4`?T#vPcnhA~n-(NazuCQmVJ7@@Ehc z)6G?~pXZtZ8L~DmrBf6anxttbQ%)$dG;x7z-&QwSi$Tn@f166yJ9qXW@&j&JK7DtB zgHOgRO#RiK*0v;$Z~}6Os*LATgDL*iKWRd`m3z{nxMYW;Sto5k@B*(mcnQJz?{@sD z?+i7KkR-h~w$Wv{q|WCcICapq342K7vc_1Y_l5^Iqje!Nd!uno0UFIi4*lV<8AvR; z;yO0aq?k~xP_$`rvXGTRC*tN&0k^8T;F0&HaIWaLsNe4EO@Hd5?(XicjxCTl$j^F% zVthG>a7L#_RGp=L`5~!QA zZ=BR{f!mL*nKIefwBDM%SYKZ^_0f$42^+Qf!(Lf^IZ6??Yr-&=G7C44a1;f{e&7oF zt!VeDNh5AVYK#fF5g5O*Gn6jcPk5&6GLfhC&yaFYHsn~e7{ZOoCjAamg2vAtSZCN` z>_V||LpnY1cWZIboy0-Aj}VjEopJaWf%vNBmZ*o#h7k*HQzbJtuq*P5>nYo-)nP5X zq*WI$N-dH*{2fklJAc|T?A@dr`S(+nhN?KL+FZ{Jd0R4G2^K>e9!bMBxs1*h?~J%X{rPamO_YJh)TMJY zR|><=D{SnUbW7T`IYky)CmTEyZl|%s55vijTRQYAJ!-9fim@aftNisd4Wmnf$6AhX z;GmYhZcRSh_ej^Tg!5qwdyW=HjhgO+7ZmgdB^%Y4TlRA$0gz4JdJ)1iOn~j?UO8KG zz^vKEhsK2KJ%}8TE!uASdwr}j9_P@x`j-hJ;EDdQzZ9p3Zwc!3gW*`4i0<2)l}_S> z5>d{3V4d+gJ=4o^9AVc(X1D&_$AI~7(5;1%Y8!EHac!iTDk-X3^tyC|wh=GlQ6NeF zu%be4Hln5}5qC@OqM}pS0?}n|(9^Vj#wSg7B;rkY1Cx}^vTh2}d)X9~7`W~PiF_nK zk{JGtklt~0)UiI8v~0%UM}AOme{u*3SY@gXT)#$2{aR8OG!m|IM-YhAT&D?*lx_V; zqwOEVrpZpxAK+13io?{o=*P7^UhT(T8%kqGZ@8|S3j}XB_(vlhTx;Df_mbB4=|mu6 z)|yJw(TW7@rc}6q!Us-yDpHc@4oCt4OdRaXljBDZ+CL)}3gB$P;Y%0x(DLs zMjEE%2Ie_da#5+Fy-_=>Rp_|73DHCRXr1+jVkm?d2M%#v5=k9&@K2*{*`{2IsUlB2 zSbhZEbzosJ>NH4&1`6Gmc22c6V`O?BYNi0L#UKkH(&}K^F#R$N{dM{Io@$LM3nmb% z^z{+~GR=E%@Mcj`skJZQ4{bFDQbNDfWPkKAUBw`<`719-vsc`6aspM~Xl`PNZ;g#M zT%M8g=0X<*m#So!^T6U0gkC`6A8qPbiVg_ofT9ovh?2FgsCZ2HkGa-ReDn}(eLh?k zQbC`C7$mtc{W5gcr_;Zqo4jph_R!jLA+YWxbLqyTqhHpWqHDR0ftY=7;1nXb-Cq!?o0HK_8tt?5sXZ!wp+uCz%YpKyDRrg2xOl!*}Z5| zvXT;og>*ZY=+(6UC+ii4_pJjL=-)d8@-CVp6SCgc$D#8{gU0?tPP7)QY)9oe!j+no znI-PD2e?BmmP}&c+t+C?UwdRv`mRkentPSDFO1cxYO$rt;ND1%)~jyWf8IHREYJ>I^1l?d;{99ohGl*donda;t_VgyrnkpCg$N)1 z@r$aa5VI_AH^0?VpSd>3Q;0#++gn$Eo*a1H9+WDDmmRyi)LD47x$2n+WUu>cK}x-U z2Yy;uz>fm8DP>6Ge9tKXZ4$6#7-!hz7~BdJCK@S+j={NES+QeWpOg%+oV58>gxz$c zO=)7f1veivOBJ2LVWKso>r$QR^eRPxhuG|fMBe(a0 z46C0&rKx~26T zsY4r%jrL_6x+fUrS^+B9zuyJ`k(NJxDoU}3@Qy(0XAU6sSqegBn z?{3rjID(Xexu`FaPG*>UNRJh+7oOIPdz^!gV z4Sah-5it*}YQv-24?{$B3Ur2q&f<^GM4J(^$pHysSXnrSr|-%$fd$L0vc3w=Qw&cK ze!u>BldC(+{{trJw6PAo-?9{8!q77x2kt3*yjDL3UBjoua4vMZ88x;h>i8C4zQ+Ti z5-$qoCs07lD4~WhaOMuYVAX1B6 zKgV#CzHx+K0SoYOQ}^~vmU@G$tn|CpVs9_05Yj~~aKi7r?TqxA*2S!sU4XEc3rZ-` zCLCs|LLio^4?XfKCHAt$44W8r8O=8X9USiou3ey@mS^UW$A^{0+ZGE869Uwt;T^q6 z8lFtqw@!~l%I_@+1b{9qFqv)yF{Xzy?(dq;!rbD(3pFCak3g_o{7ER5)OM-kYcp}C znt|yNxP*~gOM${jItD#mfb4k${BjQlLG)DgF9asouZp(nLz_9W#Bd_jwe05u+xS5x>8^^1!bz8!5b%)qQ8tKPN0{HhYIlxVt|Jh3O5 zwDn!S6AG6v*k>wbHMhj@u(o;zo!n-!qFjpjv;Szk926n2z%Xr-w~36x2dz$cEA{;0 zq3b>Hfv|6MzfM}J{p!j^n)+PwW7b90{+r!{GH=EA#m>2Qt&Cm_6J6ZxDMFpP??!@Z zu2ZMQjxGuf4wjh0z~Dc}11YK5cDkJ4Zd2ad0y9p!DSO+Ze$ETkVNNPZv0G*@DFb-` zm%_^p6H;TZ_gDU$wV;wYlNBdkkG!^iIKOo!LK$?W{bNqKz`!9QNYn-)27LA3miM_Zj>mTik|%NV`_UGje6-y z^anfusl_16{e(I{vVOkZgQtK_;1`A%K9gH3%PHy$Te^Wh*V)VUdrh3e-qjhBMzI`M zZGRTJegio`TMwqSF#=n>4rK@1!(y<vjGKun&I;=LeX2WCePzIE-%=IFXI0ebSw? zvbvhS-DBG{+EtJ~85YUQ-i!iq<@KZ|?6fkb&%Ebl5Z-(%sm-YAWx8gCNKqN)^iNH* z9Mjs=y(-6|!Ir#a_kF>Z6W%=T|9-1Qq`b}%{6wwS==qtB<8 zAQ->6gUd^iR&8}dq!#s>j%(;KO`8^%6a~=~%-QACS{mobO%<^IinwF6bnMem31oD( z57bj&|D4a_x=^>diZ^@uT>OCAen|iMC?o}`>}RsjuTw0Lqhee6F*)Y^*N)Dw`S_t{ zfsxYJ6+UoR>AcgJRU9++UpqoXnIvB7$Oa-emNW%%W@H$ll-wbxmDA%AV`#tksGZ*` z89EAetB!Mvg;7sHOEAu@V&VNix7|}u4tHl7qi+oC)ke?oZ8_BS@ni*b#~7NltX&~V zvMy!@Zzg#EdG?C4tGm9oAVspaO~2LAjnx0*U>&}HH#KC8t3T}e$w29MoYoc36h^GH zI3KIid1el`Li`ryADF1dY!>=)ec4B@59sHX5=Ks@m z53F30!hQVfrw#kKcUM#JkyA|Cx2~W!hDoX#iTB!5#3?Gcv(-QsseGl?H&ajJw~_)q z2N}XMoANpYtFrM%ww+byUHn(^H1Iug5!_*@*Vn8HDT5X_wRUN5e~-JGPjh1=99R17j<&5DY{jd3Y@ zx$XXO-(4koFPsXW%y5e@jmFilcC+SN|Asnyuqlx8;})g62b3zh>jztopoEUnj*9Nl z-l;hAFAdoG)#fzj#&^jcxVk}!6RicFz1yuqU^+dpI!k!No3s_tphrM=j;>#N5T~E% zTT}Zw=uHJpi0>GO(p#3sIf{LwXbMMxbz7H#@19o31gSpjX47oz2+gq9%%!0|cp3!o zT|Co~|12A?@<;IAjz4c<%@h4f-AgzH9avy;y0!8A#FT%qR(v_RCo|xm-F-h1-8mg2 zoqAQ^k{t}G$fJ9wi47JDTa0hV!8&Fa+iGP@wXP{>1{+GMxvW&?L~Rv6&f5+a(P}|Q zj9h^rMQK)9f$gri^+mOVcNgFOVeLkH7)i;+?ikZnLt703c$zeC2RqJt;|f7qt3zgH zB1Ge$4`q|s6=cFuojy#P`i_~z?87PUB8LsDNYO~dZFBNZ*>bvF8KqgV0okaaSOoWx zD>B#Vt#ErY_7H7tm|%$auo#_sdYax29rV)Z{?}DCn=JJ`b||Fljv;6B!83v-3Tj{$ zj@2GJl0_-*^$OOYB`jWZZR>-5I5YSy;~U+w{vuJ=)y@8YunW5Zpv#u~MS&6*?ZgH@ z@Mj}5m;E?Xdv^uuJ~G?2d(|#%9yAunEthRC$$BVcdB*iGrOQRF$vdvAB zg3f=*;R!c671~&^8fMuHtj-(G=*zx+A-kw{XA~?P-w1k>NS42cUGR`C8gl7>h#wh& zQUgg;*X|mvTa4We*P}&wInDcv4KDte2aOHVb1bmfK6BqP2546M2Cr5vbI28nBX#dR zGViDQcvr^zYDUR_zr1tVP88o=SIsP(UO#r$;S!lhJbs4Zya{#l#okd!j5~Yp9lt7o zx&F_;r5?tNoM$P-bBvu!@kQ*}H~;Hwj@z#P{;Pe}xS9RzxH3KP(fK#9b2Y+f{Ga4%kt{b>x;tsouw(vbZ)+_iA9Y=i6W;-{Jd*^qEbs3M z-Rx*c{bXjRr@ydyo&pNIpB@jXf`}y^vCZU=yBt zOJtpW!fsY6Xj;hSK936n|x|x13!; zJ;dYbsLg{_^j2sU%m2p}FrDa6XifwbEB@a%2+uvQFpQ~%j9U?3;j*))_=2l{Hx+ML z?y>MSR!4PICQY&avsg}1dE-+j(5kovyW{5Jk>7>vnwQ&62N|cuZqUF@K$n$BP$jsWwgXhnk!LNePky$du4?!0 z?+jm~iacWsdGd3lv-|d9m>B=qY}o0;4{>MYrw#zq!Q*c=Cqm4ZLqHz8D>ufDxS8Cj zB5$63q4&#$I?wN&R0;V@gBki4&fT#B`sU~*$uPF+xQCH_zpVs9{I6|_0i#$d9||fS zUa^z8pncxI9UR$m%tA`(_hXu>ejM~N;RdwSbb2W=c9a%_Xe2e z`tf~c8vm9-s-^iKe_EDf0x>JsK-tA=8AE=}jsH%~aUh%f^GHK`CS{{w_GD>OBZ2-) z?hn|(FXf%(oEAG`J8JNT3Ef4iCje(WRbL384)GrOtxvRw?Fp_fkq%&&c1adIt1(a^ zt|~vAcbc7iv)|S_LB-2Kx#mqYv!{B3tGd88=_sd-k0rPGRy`>kwT(2#R?pR{1_%ZpKdfo(S zsT1HHev8_+E=t8c+F_`ModN`A5>iva-N$3kL*Iy0kgV<6TG7ugH9bqeak#>;nVE)~V>qghOkxG#hZP%B#^wO1OsrhV}Cc>v!{` z#2H+WSC-?^Z!pc{!vp*aoF`bBJLcTSS8dQZ#o8HlIk!S(z~}CN$A5z-9ol#}_H~$n zCgk1-F*OLEsu;jD@i=>+_~v#_mENGnD8Ogu%&DHgg_%O7pU>WfqEtt-H1ifG@9> z(|8JN^yP0iq(0as;LSBJU+kOdx*jyL3x`Xif??muZ(qVBv!RZ<+%Y|1Ll^L$DdeJbVguPHeB!1L~UV%trIUrrPa^qIJ1h^#nA^*KYac`Zx;i=ujW)~W+YhOBAd7?@8uB}^|L zMG+spIeYI(|FQ-oZ?ICQfWXG)1r*dajYld5_riC)+0G7+{QWVi2q_@UaX7HqE z(+py*(RS_wo!I@$b|W$e+G*=1FhB?$mWe94404MvZ=8KL4&;UE@h#iNe1` zLn~9wa0vZvndFaeq<{-!W4{I*Jht!`)uac;jr<(5-c;Xs5}Whks@VMz8+YBYkgoTl zsyN@@rf-Khty%p+XJ_wjWNC3+yVRvv?Hn*CAHgZ{tF%ekAYRx>)GIJ9l>zsEm2~BS zP;GzwVwfTO64^)bCdv}SqlOvld!a^5ibj-uM3y0hG1gEh`&5R)Sf|HBMhHc=j6DhO z6`n0iwh;5X<9Gl4e$MxN&pF?-eDA&I^X)puh9&0Nl*rx9?xQd$s7fBVFvR5d{gfv6 z>BzhzX|-6MV6GD~MTkG9ssJ9ea7!#O#9baFxB&_)9P3|f*PQ?Mx=j%lKitmKs*XQ0 z9v1MPA}{XOrUZ+BDS0(@B_sE!y^AY+dUjmxO0YR<_|A(U5%z#66;lpUrXKb$=)+-i zw34%WAxqs+?9n43?xJ?)Me}Orp{>46R>Paip`U_^z#NEqK@09!d5{|11)yGe)6kOK z_;P6ExM$dQ($rdImD^f#R~}4`$}$)pmeqv{1|t&$Yx@VI?$>qv3c}soSP7BSG)a)v z5#SP{a2yCufJCT#fLj^iGRU=GaC-Cm)X2#4m#IFV$lCJp*Ubs~`)~C67H$juJ#iI} zdEvmje3fUFG9X0ue%J1ohxjpRD)bqBZ)V<+ReJ59+|ZqMSfwt!`1lxiM}vKf?~ko+ z*0xSa<-Era;@s)|zM_0jt=+KY2hHwVVi8u&hF+<&`O8|fgw|)BIe5RBo5JjkvumtM zk1_r&l+rZ@y18f7(;x9&*-kaAts#Ra^pAVj5B^I!bpOVhyZLX<{`;{$(%~+v^X|uo zow@gkqpP7F2NmiUJm?MoJVoW|E#@5Skgnhfn%V>H#V6m?-ZcmeQV3iq+4uNT>^LSrxAt$$iTcpRb*Gib^z|p( zxi%#VI=g$V^@K@i%l(5Ty=y(eGv4M9vfsVQj0LmZ@Wv{G*$|EpRxzji% z1E3dlhExAGD;#Y0)74|0`*tv(VN=SnFvkfLz2Fmrzw+_y{t+<$7y@KoL}_1?<7`Ky zHYYXx$UhJTm>ASXey;d?+|Wr@t~duEH&h;es68ubGM1OuJM?8`I-j+<8oJb)APgXK zpC1TxTlTLEC{Q?o%(4*3;fd_C?Wei2EX=T&G~Yh~th61Z=MvpFqNmVN6tF9F63Ic# zF$=Zyd6%n?b`p)QUH8;jy zy|c1+9(n5|lJ{3bZ7uTKL2YeqF#(Ui)A7*3;oRy=+NQfX zScH#WUwMkSnbAC^P=plgm5i;pjZnY%xw(o{cX3jGFPHTPsD z5_}6Xjd88MZ~QpXt@D098H_m9Mz?ZUnbdq%>W8{m)0r}IiX#W9?O#71GaKBiW^kDX zsMtbrPGv{f=5GI4#B@s(>rL?0AcwJ}ztjNcZrE1x!9z2%0mfAu=|*r|jC;&zj-DB= zYG1wXQ(r667EH7s+z`%Sz^!DtfM;D>ukR&b+@zWN5S2$9q)RVbN)N(>bZu$~V=^aJ z6*Lu(-!Q>JLRRkgnLbj{qV9_VLC-(eYh$dqmqu$XW*8bAX#FKW6Xy(-#PzmbDOGjY zo?XtR9F7F#f&F{#BHW~p)RvMU-pYHms8p?pTr+XtM{!Gu&622Ux6gPMi(o48 zli;qVm6hUNw=~rW00y-1)oVy$97e2jbN(vm;BrGR99RDc=FRlUwH`qm*?8JVee>^> zqpV}nm*rKZSFuJJ%E|!sOG+`cs@C%{MQwIUlc?bhmo#2ifQqu_H-VXw zgkr1|xq$Cpw{ikt(G9`JGIcR`*Z#p=Z%jD+?nkknS>XCeNak%be*#d%Wc zavg)BfG|~A=?48lVgj01J60pK>#Z(E(`tuV4I_huYcjTar*vx&fSuZbKm`h3X9|fD zO2@GBTHVpBVpft)zX4@AhdkRgQ9`w*rrGLvYyA($AtPsXLL1%&dyEe2ymKwADoDrM zYD%0_E|%;=`G4=rC^8hNTOr8II45g`*GUJ?kT^)yAmI&f^)PqFI)2`D zFKxJ_69B_3l=}`PN-rUF8iJh@2aqSMp7lXy&k1T~YNC)s61!J;Fhqe7{=!@yxxF&y zAIsWqCio(ToY;QqE{Egf{UN7qmJt`=W)gk*HXv~*)gQ-c8)Acl5ywOB){jSd){lo% z`NN?cGzY#YllI9N_Fw(P*06aV<3G9g8{#Sps-VpHX{pn|J4*{C^YdW^c1{9mit zdxwZs3czRTa#<(qdba$e_m^0W%;UevZN1`orP7EKCD1$G(zjy%(azQN$6*A}y}Co5 z*9W0h^2DG9PCyY7@z0fz@{98U+<;Bd?60;I0UvMa$LohFBIEYl+BTwR8)r{}XF`C= z@70iazdZVJ?Nx(-nM5DT>liODFC<$;YJ)k(62MYKN(Bb{=eY?6xjHgpyEW-Z_-J=1 z|9Ka~I>(zDD~%cl`(jB7eb)8oprwWk8-V`rin69-HkSKsaWPya1x&mN*X$J>G1HlF z0Erbr?O=wSV-w0cR!FRIe@WR&fy?n!dr6xsKoC>84r#iBu0#?THNWUrE0V}pDz0;kaM`h^Nn*(b7?b$#$$AZ zsU7+u?4lOkeZ%9azXR>T`I?1*;d9U4+W%^MO7e7mkyXgHo80&EG+aZ26t+mB7%TJ4|LM~#+ zR0O~3!d$hhsqIkOn-a`X>`1fG!#?EYFHeJG`Hn;0)8o=DrIwd5X>4P#s;X(Fd^Ea? z#7Qv;9oR*SHY(Va{xwO#9mBLEfR(gLNtae&DQA)@=^0APN|jrPTxfo+CDP>M5_EBf zk{6%T8UsDS#v-5-b$3GGnq%OOk(xEGX0BC%z%XrZ2f22^xZBcCTI6tW?H&1TqLMYw zMzHk;UaZZrq|72#4e*)0yc6d1IwoyT~{*zM5$M^9jO^BSuLKVg|>$U<+Q=AiUK0 z_psOO?R!4QfD};jKC%;>(TkqUmSI)Dkq!%VET$9y{yEHU?&C(xbzJ%?`**epx|w zW)kR4SvhSIY*CU~^yQ65rcL`EDsD0m6pja3Sx$x*u)}sV{O4MU+v4y+%@=zm#J-}` z%kikcI}$hx^7oF48W`6^sQz5|YA;U{mym!w*>$F2=Uam3!W7wxRbz~wkILKs9I_|w zR?KX5su{qFze*+#+jE-`&k9tjDOs7aS0g*YmPh$y{OT0)L2Wy6oseuFFmE}_;xa99 Ubi Date: Wed, 19 Oct 2022 14:02:00 +0200 Subject: [PATCH 13/39] docs: Remove/update references to Heroku (#2099) ## What This PR removes or updates references in the docs to Heroku. Most of the code samples have been replaced with a more generic `unleash.example.com` url, while other references have been removed or updated. Also removes old OpenAPI files that are out of date and redundant with the new generation. ## Background Come November and Heroku will no longer offer free deployments of Unleash, so it's about time we remove that claim. Links to the heroku instance are also outdated because we don't have that instance running anymore. Finally, the OpenAPI files we do have there are old and static, so they don't match the current reality. ## Commits * Meta: update ignore file to ignore autogenerated docs I must've missed the ignore file when looking for patterns. * docs: delete old openapi file. This seems to have been a holdover from 2020 and is probably hand-written. It has been superseded by the new autogenerated OpenAPI docs. * docs: add notes for heroku changes to the frontend readme and pkg * docs: remove old openapi article and add redirects to new openapi * docs: fix link in overview doc: point to GitHub instead of heroku * docs: update quickstart docs with new heroku details * docs: remove reference to crashing heroku instance * docs: remove references to herokuapp in code samples * docs: add a placeholder comment * docs: update references for heroku updates * docs: keep using unleash4 for enterprise * docs: remove start:heroku script in favor of start:sandbox * docs: remove 'deploy on heroku button' Now that it's not free anymore (or won't be very shortly), let's remove it. * docs: remove extra newline --- docs/api/oas/openapi.yaml | 1671 ----------------- frontend/README.md | 8 +- frontend/package.json | 2 +- website/docs/api/open-api.md | 10 - website/docs/deploy/import-export.md | 2 +- website/docs/deploy/securing-unleash-v3.md | 2 - .../how-to/how-to-use-custom-strategies.md | 2 +- website/docs/sdks/go.md | 2 +- website/docs/sdks/java.md | 2 +- website/docs/sdks/php.md | 2 +- website/docs/user_guide/index.md | 2 +- website/docs/user_guide/quickstart.md | 16 +- website/docs/user_guide/unleash_overview.md | 1 - website/docusaurus.config.js | 4 + 14 files changed, 27 insertions(+), 1699 deletions(-) delete mode 100644 docs/api/oas/openapi.yaml delete mode 100644 website/docs/api/open-api.md diff --git a/docs/api/oas/openapi.yaml b/docs/api/oas/openapi.yaml deleted file mode 100644 index 4fbbda51dc..0000000000 --- a/docs/api/oas/openapi.yaml +++ /dev/null @@ -1,1671 +0,0 @@ -# TESTING -# QA team test cases. Test code exists but were these based on a list of steps required to produce a result? -# Are there any real-world users of Unleash who are happy to read and test the Open API specification and make suggestions for improvement? Would they be happy to screen-record what they are doing (how they use the API will give invaluable insights)? -# Ideally, you'd want developers using Java, Node.js, Go, Ruby, Python and .Net to test -# Could there be a simple sample app that implemented all API calls (using realistic scenarios)? Might just be a consolidated version of the tests/e2e code with some triggers (buttons) and some UI to display outcomes. -# OAS REVIEW -# Move responses to root responses section in components (from schema section) -# Issues with rendering as nested externaldocs from Swagger UI. See GET /admin/feature-types. Not an issue in other tools (see redoc.html) -# Other candidates for $ref: createdAt, lastSeen/updatedAt, instanceId, appName/appNamePath, sdkVersion, feature toggle type titles, enabled, stale, weight -# STYLE -# Add style guide MD. UK/US = US, Newspaper/Movie, Plurals. &. What 's the closest match for Unleash? http://apistylebook.com/design/guidelines/ -# OAS styler - Only use backticks for code samples and API paths. Use bold for schema items and italic for schema item settings - -openapi: 3.0.3 -servers: - - description: Local host - url: 'http://localhost:4242/api' - - description: Unleash open source demo - url: 'http://unleash.herokuapp.com/api' -# - description: Windows server -# url: 'http://192.168.178.108:4242/api' -tags: - - name: Feature toggles - description: Accessing feature toggles - - name: Archive - description: Handling Feature Toggle archiving and un-archiving - - name: Events - description: Identifying events on the Unleash server - - name: Feature types - description: Details of the five Unleash Feature Toggle types - - name: Import and export - description: Importing and exporting feature toggles and strategies - - name: Metrics - description: Determining usage of feature toggles and applications - - name: Strategies - description: Accessing and updating strategies - - name: Client - description: Client application aspects of the Unleash API -info: - title: Unleash API - description: |- - - > The Open API specifications are currently considered a **"beta feature"** and will not cover the full Unleash Admin API. - > You can follow the progress on making OAS official in [GitHub issue 1391](https://github.com/Unleash/unleash/issues/1391) - - Unleash is an open source feature flag and toggle system for all your applications and services. - - # Try it out - - ## Try it in your browser - - Once you have [set your Unleash server up](https://docs.getunleash.io/deploy/getting_started), you can test the API from inside your browser. The following assumes the server is running on localhost:4242. - - The following 'endpoints' (such as `GET /admin/metrics/applications`) provide reference documentation for the Unleash REST API. To try out API calls: - 1. Navigate to an endpoint - 2. Click **Try it out** - in the right-hand (black) panel - 3. Customize the **Request body** and/or **Parameters**. - 4. Click **Execute**. - - You will see the cURL request submitted to the API server and the corresponding response. - - ## Try it in Postman - - Alternatively, you can test the API in [Postman](https://app.getpostman.com/run-collection/8552ddcd4cc9fc012548) - - [![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/8552ddcd4cc9fc012548) - version: 4.0.13 - contact: - name: The Unleash team - url: 'https://docs.getunleash.io' -externalDocs: - description: Unleash documentation - url: 'https://unleash.github.io/docs/getting_started' -paths: - /client/register: - post: - summary: Registers a client instance with the Unleash server. - description: You can retrieve this data with a `GET /admin/metrics/applications/{appName}` API call. - operationId: clientRegister - externalDocs: - description: Client specification - url: 'https://unleash.github.io/docs/client_specification' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/clientRegistrationSchema' - tags: - - Client - responses: - '202': - description: Successful response - client has been registered - '400': - description: 'Bad body request (for example, appName is not correct)' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/client/register \ - --data '{"appName":"my-application","instanceId":"generated-732038-17080","sdkVersion":"unleash-client-node:3.4.0","strategies":[{"strategy":"default"}],"started":"2016-11-03T07:16:43.572Z","interval":10000}' - /client/metrics: - post: - summary: Register a metrics *bucket*. - description: A *bucket* is a set of metrics data that tells you how often a Feature Toggle was enabled or disabled during a specified period of time - operationId: sendMetrics - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/metricsPayloadSchema' - tags: - - Client - - Metrics - responses: - '202': - description: Successful response - payload has been accepted - '400': - description: 'Bad body request (for example, appName is not correct)' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/client/metrics \ - --data '{"appName":"my-application","instanceId":"generated-732038-17080","bucket":{"start":"2020-12-08T13:50:00.000Z","stop":"2020-12-08T13:55:00.000Z","toggles":{"yesno":{"yesorno":"yes"},"metricsCount":{"count":1}}}}' - /client/features: - # Would normally $ref here but it tangles with an OAS bug - which affects both Redoc and Swagger UI - https://github.com/swagger-api/swagger-ui/issues/6249 (closed issue but still broken in latest release) - get: - summary: Fetches all feature toggles from the Unleash server. - description: |- - The response returns all active feature toggles and their current strategy configuration: - - Feature toggles will have *at least* one strategy - - Strategies have a `name` and `parameters` map. - operationId: getClientFeatures - externalDocs: - description: Activation strategies - url: 'https://unleash.github.io/docs/activation_strategy' - tags: - - Client - - Feature toggles - responses: - '200': - $ref: '#/components/responses/clientResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/client/features - '/client/features/{featureName}': - get: - summary: Fetches a specific Feature Toggle from the Unleash server. - description: | - The response returns the Feature Toggle's current strategy configuration: - - It will have *at least* one configured strategy. - - A strategy will have a *name* and *parameters* map. - **This is mainly provided to help debug the API. Do not use for client implementations.** - externalDocs: - description: Activation strategies - url: 'https://unleash.github.io/docs/activation_strategy' - operationId: getClientFeature - parameters: - - $ref: '#/components/parameters/featureNamePath' - tags: - - Client - - Feature toggles - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/client/features/featureName - /admin/features: - get: - summary: Fetches all feature toggles from the Unleash server. - description: | - The response returns all active feature toggles and their current strategy configuration: - - A feature toggle will have *at least* one configured strategy. - - A strategy will have a `name` and `parameters` map. - externalDocs: - description: Activation strategies - url: 'https://unleash.github.io/docs/activation_strategy' - operationId: getFeatures - tags: - - Feature toggles - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/features - post: - summary: Create a Feature Toggle - description: Create a new Feature Toggle - tags: - - Feature toggles - operationId: createFeatureToggle - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/featureToggleSchema' - responses: - '201': - description: Feature Toggle successfully created - '400': - description: 'Bad body request (for example, Feature Toggle name is not unique)' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/admin/features \ - --data '{"name":"featureX","description":"Toggles featureX on and off","type":"release","enabled":true,"stale":false,"strategies":[{"name":"default","editable":true,"description":"Default on/off strategy.","parameters":{"parameter":{"name":"groupId","type":"string","description":"Define activation groups to allow you to correlate across feature toggles.","required":false}}}],"variants":[{"name":"yellow","weight":20}],"createdAt":"string"}' - '/admin/features/{featureName}': - get: - summary: Fetches a specific Feature Toggle from the Unleash server. - description: | - The response returns the Feature Toggle's current strategy configuration: - - It will have *at least* one configured strategy. - - A strategy will have a *name* and *parameters* map. - externalDocs: - description: Activation strategies - url: 'https://unleash.github.io/docs/activation_strategy' - operationId: getFeature - parameters: - - $ref: '#/components/parameters/featureNamePath' - tags: - - Feature toggles - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/features/featureName - put: - summary: Update a Feature Toggle - description: Update a Feature Toggle. - operationId: featureName - tags: - - Feature toggles - parameters: - - $ref: '#/components/parameters/featureNamePath' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/featureToggleSchema' - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '400': - description: Bad body request (for example 'strategies' is not an array) - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request PUT \ - --url http://localhost:4242/api/admin/features/featureName \ - --data '[{"name":"featureX","description":"Toggles featureX on and off","type":"release","enabled":true,"stale":false,"strategies":[{"name":"default","editable":true,"description":"Default on/off strategy.","parameters":{"parameter":{"name":"groupId","type":"string","description":"Define activation groups to allow you to correlate across feature toggles.","required":false}}}],"variants":[{"name":"yellow","weight":20}],"createdAt":"string"}]' - - lang: 'Go' - source: | - package main - import ( - "fmt" - "strings" - "net/http" - "io/ioutil" - ) - func main() { - url := "http://localhost:4242/api/admin/features/featureName" - payload := strings.NewReader("[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]") - req, _ := http.NewRequest("PUT", url, payload) - res, _ := http.DefaultClient.Do(req) - defer res.Body.Close() - body, _ := ioutil.ReadAll(res.Body) - fmt.Println(res) - fmt.Println(string(body)) - } - - lang: 'Java' - source: | - AsyncHttpClient client = new DefaultAsyncHttpClient(); - client.prepare("PUT", "http://localhost:4242/api/admin/features/featureName") - .setBody("[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]") - .execute() - .toCompletableFuture() - .thenAccept(System.out::println) - .join(); - client.close(); - - lang: 'Python' - source: | - import requests - url = "http://localhost:4242/api/admin/features/featureName" - payload = "[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]" - response = requests.request("PUT", url, data=payload) - print(response.text) - - lang: 'Ruby' - source: | - require 'uri' - require 'net/http' - url = URI("http://localhost:4242/api/admin/features/featureName") - http = Net::HTTP.new(url.host, url.port) - request = Net::HTTP::Put.new(url) - request.body = "[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]" - response = http.request(request) - puts response.read_body - - lang: 'JavaScript' - source: | - fetch("http://localhost:4242/api/admin/features/featureName", { - "method": "PUT", - "headers": {}, - "body": "[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]" - }) - .then(response => { - console.log(response); - }) - .catch(err => { - console.error(err); - }); - delete: - summary: Archive a Feature Toggle. - description: | - Feature toggles can only be archived - they cannot be deleted. - - If an old Feature Toggle *re-appears*, this is because someone else has created a new one with the same name. - operationId: archiveFeatureToggle - tags: - - Feature toggles - - Archive - parameters: - - $ref: '#/components/parameters/featureNamePath' - responses: - '200': - description: Feature Toggle successfully archived - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request DELETE \ - --url http://localhost:4242/api/admin/features/featureName - '/admin/features/{featureName}/toggle/on': - post: - summary: Enable a Feature Toggle. - description: '**featureName** must match an existing Feature Toggle.' - operationId: enableFeatureToggle - tags: - - Feature toggles - parameters: - - $ref: '#/components/parameters/featureNamePath' - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/admin/features/featureName/toggle/on - '/admin/features/{featureName}/toggle/off': - post: - summary: Disable a Feature Toggle. - description: '**featureName** must match an existing Feature Toggle.' - operationId: disableFeatureToggle - tags: - - Feature toggles - parameters: - - $ref: '#/components/parameters/featureNamePath' - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/admin/features/featureName/toggle/off - '/admin/features/{featureName}/stale/on': - post: - summary: Mark a Feature Toggle as 'stale' (deprecated). - description: '**featureName** must match an existing Feature Toggle.' - externalDocs: - description: Feature Toggle types - url: 'https://unleash.github.io/docs/feature_toggle_types' - operationId: markFeatureToggleStale - tags: - - Feature toggles - parameters: - - $ref: '#/components/parameters/featureNamePath' - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/admin/features/featureName/stale/on - '/admin/features/{featureName}/stale/off': - post: - summary: Mark a Feature Toggle as active. - description: '**featureName** must match an existing Feature Toggle.' - externalDocs: - description: Feature Toggle types - url: 'https://unleash.github.io/docs/feature_toggle_types' - operationId: markFeatureToggleActive - tags: - - Feature toggles - parameters: - - $ref: '#/components/parameters/featureNamePath' - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/admin/features/featureName/stale/off - /admin/archive/features: - get: - summary: List all the archived feature toggles on the Unleash server - description: Archived feature toggles are those that have been previously deleted - operationId: fetchArchivedToggles - tags: - - Archive - responses: - '200': - $ref: '#/components/responses/successResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/archive/features - '/admin/archive/revive/{featureName}': - post: - summary: Un-archive a Feature Toggle - description: Restore a Feature Toggle that has been previously deleted - operationId: reviveFeatureToggle - tags: - - Archive - parameters: - - $ref: '#/components/parameters/featureNamePath' - responses: - '200': - description: Feature Toggle successfully revived - '404': - description: Feature Toggle not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/admin/archive/revive/featureName - /admin/strategies: - get: - summary: Fetch all strategies and their parameters. - description: Fetch all strategies and their parameters. - operationId: getStrategies - tags: - - Strategies - responses: - '200': - $ref: '#/components/responses/strategyExistsResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/strategies - post: - summary: Create Strategy - description: Create Strategy - operationId: createStrategy - tags: - - Strategies - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/createStrategy' - responses: - '201': - description: Strategy successfully added - '400': - description: Bad body request (for example 'strategies' is not an array) - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '409': - $ref: '#/components/responses/strategyExistsResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url http://localhost:4242/api/admin/strategies \ - --data '{"name":"gradualRollout","description":"Gradual rollout to logged in users","parameters":[{"name":"percentage","type":"percentage","description":"What percent of users should the new Feature Toggle be active for?","required":true}]}' - '/admin/strategies/{strategyName}': - put: - summary: Update Strategy - description: | - Use to update a Strategy definition. - - **name** and **strategyName** must match and must also match an existing Strategy name. - - **Caution: It can be dangerous to change a Strategy (as the implementation also might need to be changed).** - operationId: updateStrategy - tags: - - Strategies - parameters: - - $ref: '#/components/parameters/strategyNamePath' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/createStrategy' - responses: - '200': - description: Strategy successfully updated. - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: Strategy not updated due to errors in query and/or request body (such as **name** and **strategyName** not matching). - x-code-samples: - - lang: 'cURL' - source: | - curl --request PUT \ - --url http://localhost:4242/api/admin/strategies/strategyName \ - --data '{"name":"gradualRollout","description":"Gradual rollout to logged in users","parameters":[{"name":"percentage","type":"percentage","description":"What percent of users should the new Feature Toggle be active for?","required":true}]}' - /admin/metrics/seen-toggles: - get: - summary: Returns a list of applications and the feature toggles that Unleash has 'seen' for each application. - description: 'It is only guaranteed that feature toggles reported by client applications within the last hour will be returned. However, in most cases, earlier reported feature toggles will also be returned.' - operationId: seenToggles - tags: - - Metrics - responses: - '200': - $ref: '#/components/responses/seenTogglesResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/metrics/seen-toggles - /admin/metrics/feature-toggles: - get: - summary: Gives 'last minute' and 'last hour' metrics for all active feature toggles (based on what was reported by the client applications). - description: |- - - **Yes** is the number of times a given feature toggle was enabled in a client applucation - - **No** is the number of times it was disabled. - operationId: featureToggles - tags: - - Metrics - responses: - '200': - $ref: '#/components/responses/featureAccessResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/metrics/feature-toggles - /admin/metrics/applications: - get: - summary: A list of known applications ('seen' by Unleash in the last two days) - description: Also has a link for more details. - operationId: getApplications - tags: - - Metrics - responses: - '200': - $ref: '#/components/responses/applicationsResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/metrics/applications - '/admin/metrics/applications/{appName}': - get: - summary: Details about a client application. - description: 'Details include things such as instances, strategies implemented and seen feature toggles.' - operationId: getApplicationDetails - tags: - - Metrics - parameters: - - $ref: '#/components/parameters/appNamePath' - responses: - '200': - $ref: '#/components/responses/appDetailsResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '500': - description: Application name not found - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/metrics/applications/appName - /admin/metrics/seen-apps: - get: - summary: Details about seen applications - description: (per Feature Toggle) - operationId: seenApps - tags: - - Metrics - responses: - '200': - $ref: '#/components/responses/applicationsResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/metrics/seen-apps - /admin/events: - get: - operationId: get-admin-events - summary: Fetch all changes in the Unleash system - description: |- - Returns one of the twelve event types: - - feature-created - - feature-metadata-updated - - feature-project-change - - feature-archived - - feature-revived - - feature-strategy-update - - feature-strategy-add - - feature-strategy-remove - - feature-stale-on - - feature-stale-off - - feature-environment-enabled - - feature-environment-disabled - tags: - - Events - responses: - '200': - $ref: '#/components/responses/eventsResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/events - /admin/state/export: - get: - operationId: get-admin-state-export - summary: Export feature toggles and strategies - description: Exports a list of feature toggles and/or strategies in either JSON or YAML format. - externalDocs: - description: Import and export - url: 'https://unleash.github.io/docs/import_export' - tags: - - Import and export - parameters: - - schema: - type: string - enum: - - json - - yaml - in: query - name: format - description: | - Choose export format, either json or yaml. json is the default - example: json - - schema: - type: boolean - in: query - name: download - example: false - description: Do you want to export the data as a file? Default is false - - schema: - type: boolean - in: query - name: featureToggles - description: Do you want to include feature toggles in the export? Default is true - example: true - - schema: - type: boolean - in: query - name: strategies - description: Do you want to include strategies in the export? Default is true - example: true - responses: - '200': - $ref: '#/components/responses/exportResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/state/export - /admin/state/import: - post: - summary: Import feature toggles and strategies - operationId: post-admin-state-import - tags: - - Import and export - description: |- - Upload the data, in JSON or YAML format. - You can add in the POST body or upload a file - - **POST body** (JSON format only) - next to **Request body**, choose the *application/json* dropdown option. - - **File upload** (JOSN or YAML format) - next to **Request body**, choose the *multipart/form-data* dropdown option. This adopts the same schema as `GET /admin/state/export` - externalDocs: - description: Import and export - url: 'https://unleash.github.io/docs/import_export' - parameters: - - schema: - type: boolean - default: 'false' - example: false - in: query - name: drop - description: Be careful using this in production environments. Set to true if you want the to remove all strategies and feature toggles from the datebase before import. Default is false. - - schema: - type: boolean - default: 'false' - example: false - in: query - name: keep - description: Set to *true* if you want keep all existing feature toggles and strategies as is; only the missing feature toggles and strategies will be inserted from the import data. Default is true. - example: true - requestBody: - content: - multipart/form-data: - schema: - type: object - properties: - fileName: - type: string - format: binary - application/json: - schema: - $ref: '#/components/schemas/200export' - responses: - '200': - description: Successful import. - '401': - $ref: '#/components/responses/notAuthorizedResponse' - '404': - description: No import data provided. - x-code-samples: - - lang: 'cURL' - source: | - curl --request POST \ - --url 'http://localhost:4242/api/admin/state/import?drop=false&keep=false' \ - --data '{"fileName":"string"}' - /admin/feature-types: - get: - summary: Fetch the list of Unleash feature types - description: |- - - release - - experiment - - ops - - killswitch - - permission - operationId: get-admin-feature-types - tags: - - Feature types - responses: - '200': - $ref: '#/components/responses/featureTypeResponse' - '401': - $ref: '#/components/responses/notAuthorizedResponse' - x-code-samples: - - lang: 'cURL' - source: | - curl --request GET \ - --url http://localhost:4242/api/admin/feature-types -components: - parameters: - featureNamePath: - name: featureName - description: Must match an existing Feature Toggle name. - example: featureX - required: true - in: path - schema: - type: string - strategyNamePath: - name: strategyName - required: true - in: path - description: Must match an existing Strategy name. - example: flexibleRollout - schema: - type: string - appNamePath: - name: appName - required: true - in: path - description: Must match an existing application name. - example: my-application - schema: - type: string - responses: - successResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200' - notAuthorizedResponse: - description: 'Not authorized' - content: - application/json: - schema: - $ref: '#/components/schemas/401' - clientResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200Client' - strategyExistsResponse: - description: 'Strategy already exists' - content: - application/json: - schema: - $ref: '#/components/schemas/409' - strategyResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200strategy' - seenTogglesResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200seen' - featureAccessResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200feature' - appDetailsResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200appdetails' - applicationsResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/applicationArray' - eventsResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200-events' - exportResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200export' - featureTypeResponse: - description: 'Successful response' - content: - application/json: - schema: - $ref: '#/components/schemas/200featuretype' - schemas: - '200': - type: object - properties: - version: - $ref: '#/components/schemas/versionSchema' - features: - $ref: '#/components/schemas/featureToggleListSchema' - x-tags: - - Responses - '401': - type: object - properties: - type: - type: string - minLength: 1 - path: - type: string - minLength: 1 - message: - type: string - minLength: 1 - required: - - type - - path - - message - x-tags: - - Responses - '409': - type: object - required: - - isJoi - - name - - details - properties: - isJoi: - description: For internal use by the Unleash developers - type: boolean - name: - description: Title of error - type: string - minLength: 1 - details: - type: array - uniqueItems: true - minItems: 1 - items: - required: - - message - properties: - message: - description: Error message - type: string - minLength: 1 - x-tags: - - Responses - 200strategy: - type: object - required: - - version - - strategies - properties: - version: - $ref: '#/components/schemas/versionSchema' - strategies: - $ref: '#/components/schemas/strategySchema' - x-tags: - - Responses - createStrategy: - type: object - properties: - name: - type: string - minLength: 1 - example: gradualRollout - description: - type: string - minLength: 1 - example: Gradual rollout to logged in users - parameters: - type: array - uniqueItems: true - minItems: 1 - items: - required: - - name - - type - - description - - required - properties: - name: - type: string - minLength: 1 - example: percentage - type: - type: string - minLength: 1 - example: percentage - description: - type: string - minLength: 1 - example: What percent of users should the new Feature Toggle be active for? - required: - type: boolean - example: true - required: - - name - - description - - parameters - x-tags: - - Schemas - 200seen: - type: array - minItems: 1 - uniqueItems: true - items: - type: object - required: - - appName - - seenToggles - - metricsCount - properties: - appName: - type: string - minLength: 1 - description: 'Application name' - example: 'my-application' - seenToggles: - $ref: '#/components/schemas/toggleSchema' - x-tags: - - Responses - 200feature: - description: |- - - **lastHour** - how many times a Feature Toggle was accessed in the last hour. - - **lastMinute** - how many times a Feature Toggle was accessed in the last minute. - type: array - minItems: 1 - uniqueItems: true - items: - type: object - required: - - appName - - seenToggles - properties: - appName: - type: string - enum: - - lastHour - - lastMinute - minLength: 1 - example: lastHour - seenToggles: - $ref: '#/components/schemas/toggleSchema' - x-tags: - - Responses - metricsPayloadSchema: - description: A *bucket* of metrics data that tells you how often a Feature Toggle was enabled or disabled during a specified period of time - type: object - required: - - appName - - instanceId - - bucket - properties: - appName: - type: string - description: 'The name of your application' - example: 'my-application' - instanceId: - description: The name of the system running the application - type: string - minLength: 1 - example: generated-732038-17080 - bucket: - type: object - required: - - start - - stop - - toggles - properties: - start: - type: string - description: 'The start time for your metrics (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' - example: '2020-12-08T13:50:00.000Z' - stop: - type: string - description: 'The end time for your metrics (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' - example: '2020-12-08T13:55:00.000Z' - toggles: - $ref: '#/components/schemas/toggleSchema' - x-tags: - - Schemas - toggleSchema: - type: object - required: - - yesno - - metricsCount - properties: - yesno: - description: Was a Feature Toggle enabled (yes) or disabled (no)? - type: object - properties: - yesorno: - type: string - enum: - - 'yes' - - 'no' - example: 'yes' - metricsCount: - description: The number of times a Feature Toggle was enabled or disabled during the specified start and end time - type: object - properties: - count: - type: number - example: 1 - x-tags: - - Schemas - clientRegistrationSchema: - type: object - required: - - appName - - instanceId - - strategies - - started - - interval - properties: - appName: - type: string - description: 'The name of your application' - example: 'my-application' - instanceId: - type: string - description: The name of the system running the application - minLength: 1 - example: generated-732038-17080 - sdkVersion: - description: The version of the Unleash client SDK running the application - type: string - example: 'unleash-client-node:3.4.0' - strategies: - type: array - description: List of strategy names implemented by this application - items: - required: - - strategy - properties: - strategy: - type: string - description: Strategy name - minLength: 1 - example: 'default' - started: - type: string - description: 'When the client started (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' - example: '2016-11-03T07:16:43.572Z' - interval: - type: number - description: 'How often to send metrics to the Unleash API (in milliseconds)' - example: 10000 - x-tags: - - Schemas - applicationArray: - type: array - items: - $ref: '#/components/schemas/application' - x-tags: - - Schemas - application: - type: object - required: - - applications - properties: - applications: - type: array - uniqueItems: true - minItems: 1 - items: - required: - - appName - - createdAt - - updatedAt - - strategies - properties: - appName: - description: Application name - type: string - example: my-application - createdAt: - description: 'The first time the application registered with Unleash (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' - type: string - example: '2016-12-09T14:56:36.730Z' - updatedAt: - description: "The last time the application 'talked' to Unleash (sent metrics, registered, fetched feature toggles) - in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime)" - type: string - example: '2020-11-14T09:55:23.653Z' - description: - description: A description of what the application does - type: string - strategies: - description: A description of what the application does - type: string - url: - description: Absolute URL to the actual application - type: string - example: 'http://someapp.internal.url' - color: - description: Deprecated. Do not use - type: string - icon: - description: "The application's icon. Must be one of the [Material Design icon names](https://material.io/resources/icons/?style=baseline)" - type: string - example: comment_bank - x-tags: - - Schemas - 200appdetails: - type: object - required: - - application - - instances - - strategies - - seenToggles - properties: - application: - $ref: '#/components/schemas/application' - strategies: - $ref: '#/components/schemas/strategySchema' - instances: - type: object - required: - - appName - - instanceId - - sdkVersion - - clientIp - - lastSeen - - createdAt - properties: - appName: - description: Application name - type: string - minLength: 1 - example: my-application - instanceId: - description: The name of the system running the application - type: string - minLength: 1 - example: generated-732038-17080 - sdkVersion: - description: The version of the Unleash client SDK running the application - type: string - minLength: 1 - example: 'unleash-client-node:3.4.0' - clientIp: - description: The IP address of the system running this instance of the application - type: string - minLength: 1 - example: '::ffff:127.0.0.1' - lastSeen: - description: "The last time the application 'talked' to Unleash (sent metrics, registered, fetched feature toggles) - in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime)" - type: string - minLength: 1 - example: '2020-11-14T11:17:24.482Z' - createdAt: - description: 'The first time the application registered with Unleash (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' - type: string - minLength: 1 - example: '2020-11-13T16:56:29.279Z' - seenToggles: - $ref: '#/components/schemas/featureToggleListSchema' - links: - type: object - properties: - self: - description: Deprecated. Do not use - type: string - minLength: 1 - x-tags: - - Responses - featureToggleTypeSchema: - type: string - enum: - - release - - experiment - - ops - - killswitch - - permission - description: |- - 'One of the five Unleash Feature Toggle types. - - **type** is optional. If not defined, it defaults to *release*' - default: release - externalDocs: - description: Feature Toggle types - url: 'https://unleash.github.io/docs/feature_toggle_types' - minLength: 1 - example: release - x-tags: - - Schemas - versionSchema: - type: number - description: For internal use by the Unleash developers - example: 1 - x-tags: - - Schemas - featureToggleListSchema: - type: array - items: - type: array - featureToggleSchema: - type: object - required: - - name - - description - - type - - enabled - - stale - - strategies - properties: - name: - description: Feature Toggle name must be unique. - type: string - minLength: 1 - example: featureX - description: - type: string - minLength: 1 - example: Toggles featureX on and off - type: - $ref: '#/components/schemas/featureToggleTypeSchema' - enabled: - description: Is the Feature Toggle enabled? - type: boolean - example: true - stale: - description: Is the Feature Toggle 'stale' (deprecated)? - type: boolean - example: false - strategies: - $ref: '#/components/schemas/strategySchema' - variants: - $ref: '#/components/schemas/variantsSchema' - createdAt: - type: string - minLength: 1 - x-tags: - - Schemas - strategySchema: - type: array - items: - type: object - properties: - name: - description: Name of the Strategy - type: string - minLength: 1 - example: default - editable: - type: boolean - example: true - description: - description: What the Strategy is - type: string - example: Default on/off strategy. - parameters: - type: object - properties: - parameter: - type: object - required: - - name - - type - properties: - name: - description: The name of the parameter - type: string - example: groupId - type: - description: The type of the parameter - type: string - example: string - description: - description: What the parameter does - type: string - example: Define activation groups to allow you to correlate across feature toggles. - required: - description: Is this a required parameter? - type: boolean - example: false - x-tags: - - Schemas - variantsSchema: - externalDocs: - description: How to use Feature Toggle variants - url: 'https://unleash.github.io/docs/toggle_variants' - type: array - items: - required: - - name - - weight - properties: - name: - description: The name of the Feature Toggle variant - type: string - minLength: 1 - example: yellow - weight: - description: |- - A number between 0 and 1,000. - The client SDK will summarize all variant weights, hash the number and divide the users among them. The distribution will be according to the weight as a fraction of the sum of weight. - type: number - example: 20 - x-tags: - - Schemas - - 200Client: - type: object - properties: - version: - $ref: '#/components/schemas/versionSchema' - features: - type: array - uniqueItems: true - minItems: 1 - items: - required: - - name - - description - - type - - enabled - - stale - - strategies - - createdAt - properties: - name: - type: string - description: 'Feature Toggle name' - minLength: 1 - example: 'Demo' - description: - type: string - description: 'A description of the Feature Toggle' - minLength: 1 - example: 'Show off fedfdfature toggles' - type: - type: string - enum: - - Release - - Experiment - - Operational - - Kill switch - - Permission - description: 'The title of one of the five Feature Toggle types' - minLength: 1 - example: 'Operational' - enabled: - description: Is the Feature Toggle enabled? - type: boolean - example: true - stale: - description: Is the Feature Toggle 'stale' (deprecated)? - type: boolean - example: false - strategies: - $ref: '#/components/schemas/strategySchema' - variants: - type: array - uniqueItems: true - items: - properties: - name: - type: string - description: 'Variant name' - minLength: 1 - example: 'Red' - weight: - description: |- - A number between 0 and 1,000. - The client SDK will allocate traffic to each variant based on this weighting (as a fraction of the sum of all variant weights). - **Examples** - - You have four variants, each with a weight of 1000. The SDK will distribute traffic evenly: 25% each - - You have two variants, one with a weight of 100 and one with a weight of 900. The SDK will send 90% of traffic to the variant with a weight of 900 - type: number - example: 20 - weightType: - type: string - minLength: 1 - example: 'variable' - payload: - type: object - description: 'Optional data associated with the variant, consisting of a *type/value* pair (as defined in the SDK)' - properties: - type: - type: string - example: 'string' - value: - type: string - example: 'Something' - overrides: - type: array - description: An optional array of overrides. If any [context](https://unleash.github.io/docs/unleash_context) field matches any of these overrides, *this* variant will be selected. - items: - type: object - properties: - contextName: - type: string - description: 'One of the six context fields' - enum: - - userId - - sessionId - - remoteAddress - - properties - - appName - - environment - example: 'userId' - values: - type: array - description: 'The value(s) for the context field' - items: - properties: - value: - type: string - example: '123' - createdAt: - type: string - minLength: 1 - x-tags: - - Responses - 200-events: - type: object - properties: - version: - $ref: '#/components/schemas/versionSchema' - events: - type: array - required: - - id - - type - - createdBy - - createdAt - uniqueItems: true - minItems: 1 - items: - properties: - id: - description: The event number. All events have a unique id. - type: number - example: 55 - type: - description: Identifies the event - type: string - enum: - - feature-created - - feature-metadata-updated - - feature-project-change - - feature-archived - - feature-revived - - feature-strategy-update - - feature-strategy-add - - feature-strategy-remove - - feature-stale-on - - feature-stale-off - - feature-environment-enabled - - feature-environment-disabled - minLength: 1 - example: feature-updated - createdBy: - description: The current user's *email* or *username* (taken from the *User* object on the current session) - type: string - minLength: 1 - createdAt: - description: 'The first time the application registered with Unleash (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' - type: string - example: '2016-12-09T14:56:36.730Z' - data: - description: The current state of the updated resource - type: object - preData: - description: The previous state of the updated resource - type: object - featureName: - description: Name of the feature toggle (if event related to a feature toggle) - type: string - project: - description: Name of the project (if event related to a project resource) - type: string - environment: - description: Name of the environment (if event related to a environment resource) - type: string - - x-tags: - - Responses - 200export: - type: object - required: - - version - - features - - strategies - properties: - version: - $ref: '#/components/schemas/versionSchema' - features: - $ref: '#/components/schemas/featureToggleListSchema' - strategies: - $ref: '#/components/schemas/strategySchema' - x-tags: - - Responses - 200featuretype: - type: object - required: - - version - - types - properties: - version: - $ref: '#/components/schemas/versionSchema' - types: - type: array - uniqueItems: true - minItems: 1 - items: - required: - - id - - name - - description - - lifetimeDays - properties: - id: - $ref: '#/components/schemas/featureToggleTypeSchema' - name: - description: The title of the Feature Toggle type - type: string - enum: - - Release - - Experiment - - Operational - - Kill switch - - Permission - minLength: 1 - example: Release - description: - description: A description of what this Feature Toggle type could be used for - type: string - enum: - - Enables trunk-based development for teams practicing continuous delivery - - Performs multivariate or A/B testing - - Controls operational aspects of the system behavior - - Gracefully degrades system functionality - - Changes the features or product experiences that certain users receive - minLength: 1 - lifetimeDays: - description: The number of days this Feature Toggle is intended to be used. This information is used to issue deprecation notices - externalDocs: - description: Feature Toggle types - url: 'https://unleash.github.io/docs/feature_toggle_types' - type: number - example: 40 - x-tags: - - Responses diff --git a/frontend/README.md b/frontend/README.md index e93e8f0e44..c75f08d563 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -13,14 +13,14 @@ yarn install yarn run start ``` -## Run with a heroku-hosted instance of unleash-api +## Run with a sandbox instance of the Unleash API -Alternatively, instead of running unleash-api on localhost, use a remote instance: +Alternatively, instead of running unleash-api on localhost, you can use a remote instance: ``` cd ~/frontend yarn install -yarn run start:heroku +yarn run start:sandbox ``` ## Running end-to-end tests @@ -30,7 +30,7 @@ so it's important that you check these yourself before submitting a PR. On the server the tests will run against the deployed Heroku app so this is what you probably want to test against: ``` -yarn run start:heroku +yarn run start:sandbox ``` In a different shell, you can run the tests themselves: diff --git a/frontend/package.json b/frontend/package.json index 61ec14a883..61ce00d5ee 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,7 +13,7 @@ "build": "vite build", "lint": "yarn fmt:check", "start": "vite", - "start:heroku": "UNLEASH_API=https://unleash.herokuapp.com yarn run start", + "start:sandbox": "UNLEASH_API=https://sandbox.getunleash.io/ospro yarn run start", "start:enterprise": "UNLEASH_API=https://unleash4.herokuapp.com yarn run start", "start:demo": "UNLEASH_BASE_PATH=/demo/ yarn start", "test": "tsc && vitest run", diff --git a/website/docs/api/open-api.md b/website/docs/api/open-api.md deleted file mode 100644 index 015fe0fcdb..0000000000 --- a/website/docs/api/open-api.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: open_api -title: Open API Specification ---- - -> The Unleash Open API Specifications are still considered a beta functionality. We have (for now) manually written all the specifications for all API endpoints. We are testing this functionality, and the ultimate goal will be to auto-generate these specifications from the code itself. - -The Open API Specification is hosted as part of the online demo: http://unleash.herokuapp.com/oas/ - -You can also allow your own Unleash instance to serve the Open API specification by setting the `ENABLE_OAS` environment variable to true: `ENABLE_OAS=true` diff --git a/website/docs/deploy/import-export.md b/website/docs/deploy/import-export.md index 63f4b00aa1..9dc2b45d54 100644 --- a/website/docs/deploy/import-export.md +++ b/website/docs/deploy/import-export.md @@ -63,7 +63,7 @@ Example with curl: ```sh curl -X GET -H "Content-Type: application/json" \ -H "Authorization: Basic YWRtaW46" \ - http://unleash.herokuapp.com/api/admin/state/export?&featureToggles=1&strategies=0 > export.json + https://unleash.example.com/api/admin/state/export?&featureToggles=1&strategies=0 > export.json ``` ### API Import {#api-import} diff --git a/website/docs/deploy/securing-unleash-v3.md b/website/docs/deploy/securing-unleash-v3.md index f08097a972..0c38e34542 100644 --- a/website/docs/deploy/securing-unleash-v3.md +++ b/website/docs/deploy/securing-unleash-v3.md @@ -47,8 +47,6 @@ Examples of custom authentication hooks: - [basic-auth-hook.js](https://github.com/Unleash/unleash-examples/blob/7ed25f97a31dfd8f773c00847080b1a4c889fd87/v3/securing-basic-auth/basic-auth-hook.js) - [keycloak-auth-hook.js](https://github.com/Unleash/unleash-examples/blob/7ed25f97a31dfd8f773c00847080b1a4c889fd87/v3/securing-keycloak-auth/keycloak-auth-hook.js) -We also have a version of Unleash deployed on Heroku which uses Google OAuth 2.0: https://secure-unleash.herokuapp.com - ## Securing the Client API {#securing-the-client-api} A common way to support client access is to use pre-shared secrets. This can be solved by having clients send a shared key in an HTTP header with every client request to the Unleash API. All official Unleash clients should support this. diff --git a/website/docs/how-to/how-to-use-custom-strategies.md b/website/docs/how-to/how-to-use-custom-strategies.md index 9ebf424adf..2d3576b6fc 100644 --- a/website/docs/how-to/how-to-use-custom-strategies.md +++ b/website/docs/how-to/how-to-use-custom-strategies.md @@ -65,7 +65,7 @@ The steps to implement a custom strategy for your client depend on the kind of c } const instance = initialize({ - url: 'http://unleash.herokuapp.com/api/', + url: 'https://unleash.example.com/api/', appName: 'unleash-demo', instanceId: '1', // highlight-next-line diff --git a/website/docs/sdks/go.md b/website/docs/sdks/go.md index 2b5bd9f4b9..e56b7deab8 100644 --- a/website/docs/sdks/go.md +++ b/website/docs/sdks/go.md @@ -32,7 +32,7 @@ func init() { unleash.Initialize( unleash.WithListener(&unleash.DebugListener{}), unleash.WithAppName("my-application"), - unleash.WithUrl("http://unleash.herokuapp.com/api/"), + unleash.WithUrl("https://unleash.example.com/api/"), unleash.WithCustomHeaders(http.Header{"Authorization": {""}}), ) } diff --git a/website/docs/sdks/java.md b/website/docs/sdks/java.md index e7087a5298..0af966173b 100644 --- a/website/docs/sdks/java.md +++ b/website/docs/sdks/java.md @@ -111,7 +111,7 @@ UnleashContextProvider contextProvider = new MyAwesomeContextProvider(); UnleashConfig config = new UnleashConfig.Builder() .appName("java-test") .instanceId("instance x") - .unleashAPI("http://unleash.herokuapp.com/api/") + .unleashAPI("https://unleash.example.com/api/") .unleashContextProvider(contextProvider) .build(); diff --git a/website/docs/sdks/php.md b/website/docs/sdks/php.md index cf5d2572f2..33c5359656 100644 --- a/website/docs/sdks/php.md +++ b/website/docs/sdks/php.md @@ -90,7 +90,7 @@ $contextProvider = new MyAwesomeContextProvider(); $unleash = UnleashBuilder::create() ->withAppName('my.php-app') ->withInstanceId('your-instance-1') - ->withAppUrl('http://unleash.herokuapp.com/api/') + ->withAppUrl('https://unleash.example.com/api/') ->withContextProvider($contextProvider) ->build(); diff --git a/website/docs/user_guide/index.md b/website/docs/user_guide/index.md index ab3cd6c66d..9437952151 100644 --- a/website/docs/user_guide/index.md +++ b/website/docs/user_guide/index.md @@ -62,7 +62,7 @@ The reference docs are organized into the following topics: ## Other resources and communities -💻 The core of Unleash is all open source and [hosted on GitHub](https://www.heroku.com/deploy/?template=https://github.com/Unleash/unleash 'Unleash on GitHub'). +💻 The core of Unleash is all open source and [hosted on GitHub](https://github.com/Unleash/unleash/ 'Unleash on GitHub'). 💬 If you've got questions or just wanna chat to the team and other Unleash users, come [join our Slack community](https://slack.unleash.run/) diff --git a/website/docs/user_guide/quickstart.md b/website/docs/user_guide/quickstart.md index 88fbd838d9..0afb73be88 100644 --- a/website/docs/user_guide/quickstart.md +++ b/website/docs/user_guide/quickstart.md @@ -115,21 +115,29 @@ Now you can fetch the feature toggle you created and try turning it on / off in If you want to set up your own instance for testing purposes you can easily do so by using one of our premade setup kits for Heroku or DigitalOcean. -> The Heroku instance setup is FREE, and includes a DB to save your state but it will eventually go to sleep when not used. The DigitalOcean setup utilises droplets and will cost you around $10/month to run, but in turn it will not go to sleep. NOTE: If you use the DigitalOcean link below and are a new user, you will receive $100 in FREE credits. +::: info Pricing -### Deploy a free version of Unleash to Heroku +Both DigitalOcean and Heroku will charge you for running Unleash on their services. However, if you use the DigitalOcean link below and are a new user, you will receive $100 in free credits. + +::: + +### Deploy a paid version of Unleash to Heroku [![Deploy to Heroku](https://www.herokucdn.com/deploy/button.png)](https://www.heroku.com/deploy/?template=https://github.com/Unleash/unleash) ### Deploy a paid version of Unleash to DigitalOcean -> You'll receive $100 in free credits if you are a new DigitalOcean user using this link. +:::tip Free credits + +You'll receive $100 in free credits if you are a new DigitalOcean user using this link. + +::: [![Deploy to DigitalOcean](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Unleash/unleash/tree/main&refcode=0e1d75187044) ### Accessing your new instance -Once you have set up the new instance, click the URL provided by either Heroku or DigitalOcean and you'll be taken to the application login screen. +Once you have set up the new instance, follow the URL provided by either Heroku or DigitalOcean and it will take you to the application login screen. Input the following credentials to log in: diff --git a/website/docs/user_guide/unleash_overview.md b/website/docs/user_guide/unleash_overview.md index cc451d21c5..ad5d213b41 100644 --- a/website/docs/user_guide/unleash_overview.md +++ b/website/docs/user_guide/unleash_overview.md @@ -13,7 +13,6 @@ Before you can connect your application to Unleash you need a Unleash server. Yo 1. **Unleash Open-source** - [Docker](../deploy/getting-started.md) - [Helm Chart](https://github.com/unleash/helm-charts/) - - [Click-to-deploy on Heroku](https://www.heroku.com/deploy/?template=https://github.com/Unleash/unleash) - [GitLab](https://docs.gitlab.com/ee/operations/feature_flags.html#choose-a-client-library) 2. **Unleash Enterprise** - [Hosted Plans](https://www.getunleash.io/plans) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 8bab2d2a36..3d946d736a 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -185,6 +185,10 @@ module.exports = { from: '/advanced/audit_log', to: '/reference/event-log', }, + { + from: '/api/open_api', + to: '/reference/api/unleash', + }, ], createRedirects: function (toPath) { if ( From 8618cec83219ac39dbddec4942d61bb354b04763 Mon Sep 17 00:00:00 2001 From: sellinjaanus <107852002+sellinjaanus@users.noreply.github.com> Date: Wed, 19 Oct 2022 15:05:07 +0300 Subject: [PATCH 14/39] Import of feature still showing env on feature, when environment is disabled on project (#2209) * Import state test * Update importer Co-authored-by: sjaanus --- src/lib/db/project-store.ts | 14 ++++- src/lib/services/feature-toggle-service.ts | 1 - src/lib/services/state-service.ts | 43 +++++++++------ src/lib/types/stores/project-store.ts | 7 ++- src/test/e2e/api/admin/state.e2e.test.ts | 41 ++++++++++---- src/test/examples/import-state.json | 53 +++++++++++++++++++ .../fake-feature-environment-store.ts | 2 +- src/test/fixtures/fake-project-store.ts | 13 ++++- 8 files changed, 139 insertions(+), 35 deletions(-) create mode 100644 src/test/examples/import-state.json diff --git a/src/lib/db/project-store.ts b/src/lib/db/project-store.ts index efddf733a6..1c661c0462 100644 --- a/src/lib/db/project-store.ts +++ b/src/lib/db/project-store.ts @@ -2,7 +2,7 @@ import { Knex } from 'knex'; import { Logger, LogProvider } from '../logger'; import NotFoundError from '../error/notfound-error'; -import { IProject, IProjectWithCount } from '../types/model'; +import { IEnvironment, IProject, IProjectWithCount } from '../types/model'; import { IProjectHealthUpdate, IProjectInsert, @@ -169,7 +169,10 @@ class ProjectStore implements IProjectStore { } } - async importProjects(projects: IProjectInsert[]): Promise { + async importProjects( + projects: IProjectInsert[], + environments?: IEnvironment[], + ): Promise { const rows = await this.db(TABLE) .insert(projects.map(this.fieldToRow)) .returning(COLUMNS) @@ -177,6 +180,13 @@ class ProjectStore implements IProjectStore { .ignore(); if (rows.length > 0) { await this.addDefaultEnvironment(rows); + environments + ?.filter((env) => env.name !== DEFAULT_ENV) + .forEach((env) => { + projects.forEach((project) => { + this.addEnvironmentToProject(project.id, env.name); + }); + }); return rows.map(this.mapRow); } return []; diff --git a/src/lib/services/feature-toggle-service.ts b/src/lib/services/feature-toggle-service.ts index 43c32b98ad..9eb72be567 100644 --- a/src/lib/services/feature-toggle-service.ts +++ b/src/lib/services/feature-toggle-service.ts @@ -1006,7 +1006,6 @@ class FeatureToggleService { const defaultEnv = environments.find((e) => e.name === DEFAULT_ENV); const strategies = defaultEnv?.strategies || []; const enabled = defaultEnv?.enabled || false; - return { ...legacyFeature, enabled, strategies }; } diff --git a/src/lib/services/state-service.ts b/src/lib/services/state-service.ts index d0de790505..4737c549f7 100644 --- a/src/lib/services/state-service.ts +++ b/src/lib/services/state-service.ts @@ -164,8 +164,9 @@ export default class StateService { } const importData = await stateSchema.validateAsync(data); + let importedEnvironments: IEnvironment[] = []; if (importData.environments) { - await this.importEnvironments({ + importedEnvironments = await this.importEnvironments({ environments: data.environments, userName, dropBeforeImport, @@ -173,6 +174,16 @@ export default class StateService { }); } + if (importData.projects) { + await this.importProjects({ + projects: data.projects, + importedEnvironments, + userName, + dropBeforeImport, + keepExisting, + }); + } + if (importData.features) { let projectData; if (!importData.version || importData.version === 1) { @@ -208,15 +219,6 @@ export default class StateService { }); } - if (importData.projects) { - await this.importProjects({ - projects: data.projects, - userName, - dropBeforeImport, - keepExisting, - }); - } - if (importData.tagTypes && importData.tags) { await this.importTagData({ tagTypes: data.tagTypes, @@ -258,11 +260,14 @@ export default class StateService { async importFeatureEnvironments({ featureEnvironments }): Promise { await Promise.all( featureEnvironments.map((env) => - this.featureEnvironmentStore.addEnvironmentToFeature( - env.featureName, - env.environment, - env.enabled, - ), + this.toggleStore + .getProjectId(env.featureName) + .then((id) => + this.featureEnvironmentStore.connectFeatureToEnvironmentsForProject( + env.featureName, + id, + ), + ), ), ); } @@ -410,7 +415,7 @@ export default class StateService { userName, dropBeforeImport, keepExisting, - }): Promise { + }): Promise { this.logger.info(`Import ${environments.length} projects`); const oldEnvs = dropBeforeImport ? [] @@ -427,8 +432,9 @@ export default class StateService { const envsImport = environments.filter((env) => keepExisting ? !oldEnvs.some((old) => old.name === env.name) : true, ); + let importedEnvs = []; if (envsImport.length > 0) { - const importedEnvs = await this.environmentStore.importEnvironments( + importedEnvs = await this.environmentStore.importEnvironments( envsImport, ); const importedEnvironmentEvents = importedEnvs.map((env) => ({ @@ -447,11 +453,13 @@ export default class StateService { this.apiTokenStore.delete(apiToken.secret), ); } + return importedEnvs; } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types async importProjects({ projects, + importedEnvironments, userName, dropBeforeImport, keepExisting, @@ -477,6 +485,7 @@ export default class StateService { if (projectsToImport.length > 0) { const importedProjects = await this.projectStore.importProjects( projectsToImport, + importedEnvironments, ); const importedProjectEvents = importedProjects.map((project) => ({ type: PROJECT_IMPORT, diff --git a/src/lib/types/stores/project-store.ts b/src/lib/types/stores/project-store.ts index cdacb37337..56834ac937 100644 --- a/src/lib/types/stores/project-store.ts +++ b/src/lib/types/stores/project-store.ts @@ -2,7 +2,7 @@ import { IEnvironmentProjectLink, IProjectMembersCount, } from '../../db/project-store'; -import { IProject, IProjectWithCount } from '../model'; +import { IEnvironment, IProject, IProjectWithCount } from '../model'; import { Store } from './store'; export interface IProjectInsert { @@ -31,7 +31,10 @@ export interface IProjectStore extends Store { updateHealth(healthUpdate: IProjectHealthUpdate): Promise; create(project: IProjectInsert): Promise; update(update: IProjectInsert): Promise; - importProjects(projects: IProjectInsert[]): Promise; + importProjects( + projects: IProjectInsert[], + environments?: IEnvironment[], + ): Promise; addEnvironmentToProject(id: string, environment: string): Promise; deleteEnvironmentForProject(id: string, environment: string): Promise; getEnvironmentsForProject(id: string): Promise; diff --git a/src/test/e2e/api/admin/state.e2e.test.ts b/src/test/e2e/api/admin/state.e2e.test.ts index 7ccf1856c7..9cd69cab13 100644 --- a/src/test/e2e/api/admin/state.e2e.test.ts +++ b/src/test/e2e/api/admin/state.e2e.test.ts @@ -260,14 +260,7 @@ test('Roundtrip with strategies in multiple environments works', async () => { id: projectId, description: 'Project for export', }); - await app.services.environmentService.addEnvironmentToProject( - environment, - projectId, - ); - await app.services.environmentService.addEnvironmentToProject( - DEFAULT_ENV, - projectId, - ); + await app.services.featureToggleServiceV2.createFeatureToggle( projectId, { @@ -277,6 +270,15 @@ test('Roundtrip with strategies in multiple environments works', async () => { }, userName, ); + await app.services.environmentService.addEnvironmentToProject( + environment, + projectId, + ); + + await app.services.environmentService.addEnvironmentToProject( + DEFAULT_ENV, + projectId, + ); await app.services.featureToggleServiceV2.createStrategy( { name: 'default', @@ -307,7 +309,7 @@ test('Roundtrip with strategies in multiple environments works', async () => { userName: 'export-tester', }); const f = await app.services.featureToggleServiceV2.getFeature(featureName); - expect(f.environments).toHaveLength(2); + expect(f.environments).toHaveLength(4); }); test(`Importing version 2 replaces :global: environment with 'default'`, async () => { @@ -320,7 +322,7 @@ test(`Importing version 2 replaces :global: environment with 'default'`, async ( const feature = await app.services.featureToggleServiceV2.getFeatureToggle( 'this-is-fun', ); - expect(feature.environments).toHaveLength(1); + expect(feature.environments).toHaveLength(4); expect(feature.environments[0].name).toBe(DEFAULT_ENV); }); @@ -437,3 +439,22 @@ test(`should clean apitokens for not existing environment after import with drop const apiTokens = await app.services.apiTokenService.getAllTokens(); expect(apiTokens.length).toEqual(0); }); + +test(`should not show environment on feature toggle, when environment is disabled`, async () => { + await app.request + .post('/api/admin/state/import?drop=true') + .attach('file', 'src/test/examples/import-state.json') + .expect(202); + + await app.request + .post('/api/admin/projects/default/environments') + .send({ environment: 'state-visible-environment' }) + .expect(200); + + const { body } = await app.request + .get('/api/admin/projects/default/features/my-feature') + .expect(200); + + expect(body.environments).toHaveLength(1); + expect(body.environments[0].name).toBe('state-visible-environment'); +}); diff --git a/src/test/examples/import-state.json b/src/test/examples/import-state.json new file mode 100644 index 0000000000..0360445bc5 --- /dev/null +++ b/src/test/examples/import-state.json @@ -0,0 +1,53 @@ +{ + "version": 2, + "features": [ + { + "name": "my-feature", + "description": "", + "type": "release", + "project": "default", + "stale": false, + "variants": [], + "createdAt": "2021-09-17T07:06:40.925Z", + "lastSeenAt": null + } + ], + "featureStrategies": [ + { + "id": "2ea91298-4565-4db2-8a23-50757001a076", + "featureName": "my-feature", + "projectId": "default", + "environment": "state-visible-environment", + "strategyName": "gradualRolloutRandom", + "parameters": { + "percentage": "100" + }, + "constraints": [], + "createdAt": "2021-09-17T07:23:39.374Z" + } + ], + "environments": [ + { + "name": "state-visible-environment", + "type": "production", + "displayName": "Visible" + }, + { + "name": "state-hidden-environment", + "type": "production", + "displayName": "Hidden" + } + ], + "featureEnvironments": [ + { + "enabled": true, + "featureName": "my-feature", + "environment": "state-visible-environment" + }, + { + "enabled": false, + "featureName": "my-feature", + "environment": "state-hidden-environment" + } + ] +} diff --git a/src/test/fixtures/fake-feature-environment-store.ts b/src/test/fixtures/fake-feature-environment-store.ts index d14db3aba0..197032c0ff 100644 --- a/src/test/fixtures/fake-feature-environment-store.ts +++ b/src/test/fixtures/fake-feature-environment-store.ts @@ -150,7 +150,7 @@ export default class FakeFeatureEnvironmentStore // eslint-disable-next-line @typescript-eslint/no-unused-vars projectId: string, ): Promise { - return Promise.reject(new Error('Not implemented')); + return Promise.resolve(); } disableEnvironmentIfNoStrategies( diff --git a/src/test/fixtures/fake-project-store.ts b/src/test/fixtures/fake-project-store.ts index 7cf6635377..a447ef8fca 100644 --- a/src/test/fixtures/fake-project-store.ts +++ b/src/test/fixtures/fake-project-store.ts @@ -3,7 +3,11 @@ import { IProjectInsert, IProjectStore, } from '../../lib/types/stores/project-store'; -import { IProject, IProjectWithCount } from '../../lib/types/model'; +import { + IEnvironment, + IProject, + IProjectWithCount, +} from '../../lib/types/model'; import NotFoundError from '../../lib/error/notfound-error'; import { IEnvironmentProjectLink, @@ -110,7 +114,12 @@ export default class FakeProjectStore implements IProjectStore { return this.exists(id); } - async importProjects(projects: IProjectInsert[]): Promise { + async importProjects( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + projects: IProjectInsert[], + // eslint-disable-next-line @typescript-eslint/no-unused-vars + environments?: IEnvironment[], + ): Promise { return projects.map((p) => this.createInternal(p)); } From 50fb671b666e817c472a4034c44d1d659fc816d5 Mon Sep 17 00:00:00 2001 From: Fredrik Strand Oseberg Date: Wed, 19 Oct 2022 14:32:37 +0200 Subject: [PATCH 15/39] Docs/dev docs (#2134) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: add ADRs * docs/adrs * fix: update developer guide * fix: add space * Update website/docs/contributing/backend/overview.md Co-authored-by: Ivar Conradi Østhus * docs: remove auto-generated sidebar This should've been in .gitignore, but has only been ignored to the ignore file for the website subdirectory. (This has been fixed on main.) * docs: delete empty file * Revert "docs: delete empty file" This reverts commit 2435f173ff0d73f31301a8c4b5b1dfe07a0b4737. * docs: add frontmatter to new dev docs * Docs(fix): add quotes around page titles In yaml, the colon is a special character, so we need to use quotes. * docs: fix remaining titles * Update website/docs/contributing/backend/overview.md Co-authored-by: Ivar Conradi Østhus * fix: update empty ADR * fix: update text to reflect postgres 12 * fix: update backend overview * fix: remove link * fix: add form ADR Co-authored-by: Ivar Conradi Østhus Co-authored-by: Thomas Heartman --- .../docs/contributing/backend/ADR/naming.md | 21 +++ .../backend/ADR/preferred-export.md | 11 ++ website/docs/contributing/backend/overview.md | 134 ++++++++++++++++++ website/docs/contributing/developer-guide.md | 127 +++-------------- .../frontend/ADR/component-naming.md | 29 ++++ .../frontend/ADR/interface-naming.md | 23 +++ .../ADR/preferred-component-props-usage.md | 37 +++++ .../ADR/preferred-data-fetching-method.md | 83 +++++++++++ .../ADR/preferred-data-mutation-method.md | 92 ++++++++++++ .../frontend/ADR/preferred-export.md | 39 +++++ .../ADR/preferred-folder-structure.md | 32 +++++ .../ADR/preferred-form-architecture.md | 17 +++ .../frontend/ADR/preferred-function-type.md | 23 +++ .../ADR/preferred-styles-import-placement.md | 52 +++++++ .../frontend/ADR/preferred-styling-method.md | 16 +++ .../docs/contributing/frontend/overview.md | 23 +++ 16 files changed, 651 insertions(+), 108 deletions(-) create mode 100644 website/docs/contributing/backend/ADR/naming.md create mode 100644 website/docs/contributing/backend/ADR/preferred-export.md create mode 100644 website/docs/contributing/backend/overview.md create mode 100644 website/docs/contributing/frontend/ADR/component-naming.md create mode 100644 website/docs/contributing/frontend/ADR/interface-naming.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-component-props-usage.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-data-fetching-method.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-data-mutation-method.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-export.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-folder-structure.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-form-architecture.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-function-type.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-styles-import-placement.md create mode 100644 website/docs/contributing/frontend/ADR/preferred-styling-method.md create mode 100644 website/docs/contributing/frontend/overview.md diff --git a/website/docs/contributing/backend/ADR/naming.md b/website/docs/contributing/backend/ADR/naming.md new file mode 100644 index 0000000000..e3ca8d43e9 --- /dev/null +++ b/website/docs/contributing/backend/ADR/naming.md @@ -0,0 +1,21 @@ +--- +title: "ADR: Naming" +--- + +## Background + +In the codebase, we have found a need to have a common way of naming things in order to ensure consistency. It's important that files are named after the contents of the file to ensure that it's easy to search for files. You should be able to find the file you need in the command line without the help of advanced IDEs. This can easily be solved by proper naming. It's also crucial that the naming is consistent across the project, if we are using different naming conventions in different places, it will be hard to navigate the codebase. + +## Decision + +We have decided to use a naming convention where the files are named after the main class that it contains. Example: + +```js +feature-toggle-service.ts + +class FeatureToggleService { + ... +} +``` + +The reason for this decision is to remove mental clutter and free up capacity to easily navigate the codebase. Knowing that a file is named after the class that it contains allows you to quickly scan a file without watching for a context where the class is used in order to understand what it is. diff --git a/website/docs/contributing/backend/ADR/preferred-export.md b/website/docs/contributing/backend/ADR/preferred-export.md new file mode 100644 index 0000000000..5408c21dee --- /dev/null +++ b/website/docs/contributing/backend/ADR/preferred-export.md @@ -0,0 +1,11 @@ +--- +title: "ADR: Preferred export" +--- + +## Background + +In the codebase, we have discovered that default exports create multiple problems. One is that you can rename the component when importing it, which can cause confusion. Another is that it is harder to find the component when you are looking for it, as you have to look for the file name instead of the component name (solved by ADR for naming, but still relevant). + +## Decision + +We have decided to use named exports. This will allow us to eliminate the possiblity of exporting a component and renaming it in another file. It also allows us easy access to advanced refactors across the project, because renaming in one place will propagate to all the other places where that import is referenced. This resolves the issues described in the background without any significant downsides. diff --git a/website/docs/contributing/backend/overview.md b/website/docs/contributing/backend/overview.md new file mode 100644 index 0000000000..d971456e5e --- /dev/null +++ b/website/docs/contributing/backend/overview.md @@ -0,0 +1,134 @@ +--- +title: Back end +--- + +The frontend is written in nodejs/typescript. It's written as a REST API following a CSR (controller, service, repository/store) pattern. The following ADRs are defined for the backend: + +## ADRs + +We have created a set of ADRs to help guide the development of the backend: + +* [Naming](./ADR/naming.md) +* [Preferred export](./ADR/preferred-export.md) + +## Requirements + +Before developing on this project you will need two things: + +- PostgreSQL 12.x or newer +- Node.js 14.x or newer + +```sh +yarn install +yarn run start:dev +``` + +## PostgreSQL {#postgresql} + +To run and develop unleash, you need to have PostgreSQL database (PostgreSQL v12.x or newer) locally. + +Unleash currently also work with PostgreSQL v12+, but this might change in a future feature release, and we have stopped running automatic integration tests below PostgreSQL v10. + +### Create a local unleash databases in postgres {#create-a-local-unleash-databases-in-postgres} + +```bash +$ psql postgres < Password is intentionally set to 'passord', which is the Norwegian word for password. + +Then set env vars: + +(Optional as unleash will assume these as default values). + +``` +export DATABASE_URL=postgres://unleash_user:passord@localhost:5432/unleash +export TEST_DATABASE_URL=postgres://unleash_user:passord@localhost:5432/unleash_test +``` + +## PostgreSQL with docker {#postgresql-with-docker} + +If you don't want to install PostgreSQL locally, you can spin up an Docker instance. We have created a script to ease this process: `scripts/docker-postgres.sh` + +## Start the application {#start-the-application} + +In order to start the application you will need Node.js v14.x or newer installed locally. + +``` +// Install dependencies +yarn install + +// Start server in development +yarn start:dev + +// Unleash UI +http://localhost:4242 + +// API: +http://localhost:4242/api/ + +// Execute tests in all packages: +yarn test +``` + +## Database changes {#database-changes} + +We use database migrations to track database changes. Never change a migration that has been merged to main. If you need to change a migration, create a new migration that reverts the old one and then creates the new one. + +### Making a schema change {#making-a-schema-change} + +To run migrations, you will set the environment variable for DATABASE_URL + +`export DATABASE_URL=postgres://unleash_user:passord@localhost:5432/unleash` + +Use db-migrate to create new migrations file. + +```bash +> yarn run db-migrate create YOUR-MIGRATION-NAME +``` + +All migrations require one `up` and one `down` method. There are some migrations that will maintain the database integrity, but not the data integrity and may not be safe to run on a production database. + +Example of a typical migration: + +```js +/* eslint camelcase: "off" */ +'use strict'; + +exports.up = function(db, cb) { + db.createTable( + 'examples', + { + id: { type: 'int', primaryKey: true, notNull: true }, + created_at: { type: 'timestamp', defaultValue: 'now()' }, + }, + cb, + ); +}; + +exports.down = function(db, cb) { + return db.dropTable('examples', cb); +}; +``` + +Test your migrations: + +```bash +> yarn run db-migrate up +> yarn run db-migrate down +``` + +## Publishing / Releasing new packages {#publishing--releasing-new-packages} + +Please run `yarn test` checks before publishing. + +Run `npm run publish` to start the publishing process. + +`npm run publish:dry` diff --git a/website/docs/contributing/developer-guide.md b/website/docs/contributing/developer-guide.md index de6d1a62cc..9c924f3356 100644 --- a/website/docs/contributing/developer-guide.md +++ b/website/docs/contributing/developer-guide.md @@ -1,122 +1,33 @@ +--- +title: Developer guide +--- + ## Introduction {#introduction} -Before developing on this project you will need two things: +This repository contains two main parts. The backend and the frontend of unleash. The backend is a Node.js application that is built using TypeScript. The frontend is a React application that is built using TypeScript. The backend specific code can be found in the `src` lib folder. The frontend specific code can be found in the `frontend` folder. -- PostgreSQL 10.x or newer -- Node.js 14.x or newer +## Development philosophy -```sh -yarn install -yarn run start:dev -``` +The development philosophy at unleash is centered at delivering high quality software. We do this by following a set of principles that we believe will help us achieve this goal. We believe that these principles will also help us deliver software that is easy to maintain and extend, serving as our north star. -## PostgreSQL {#postgresql} +We believe that the following principles will help us achieve our goal of delivering high quality software: -To run and develop unleash, you need to have PostgreSQL database (PostgreSQL v10.x or newer) locally. +* We test our code always -> Unleash currently also work with PostgreSQL v9.5+, but this might change in a future feature release, and we have stopped running automatic integration tests below PostgreSQL v10. +Software is difficult. Being a software engineer is about acknowledging our limits, and taking every precaution necessary to avoid introducing bugs. We believe that testing is the best way to achieve this. We test our code always, and prefer automation over manual testing. -### Create a local unleash databases in postgres {#create-a-local-unleash-databases-in-postgres} +* We strive to write code that is easy to understand and maintain -```bash -$ psql postgres < Password is intentionally set to 'passord', which is the Norwegian word for password. +We don't jump to implementation immediately. We think about the problem at hand, and try to examine the impact that this solution may have in a multitude of scenarios. As our product core is open source, we need to balance the solutions and avoid implementations that may be cumbersome for our community. The need to improve our paid offering must never come at the cost of our open source offering. -Then set env vars: +### Required reading -(Optional as unleash will assume these as default values). +The following resources should be read before contributing to the project: -``` -export DATABASE_URL=postgres://unleash_user:passord@localhost:5432/unleash -export TEST_DATABASE_URL=postgres://unleash_user:passord@localhost:5432/unleash_test -``` - -## PostgreSQL with docker {#postgresql-with-docker} - -If you don't want to install PostgreSQL locally, you can spin up an Docker instance. We have created a script to ease this process: `scripts/docker-postgres.sh` - -## Start the application {#start-the-application} - -In order to start the application you will need Node.js v14.x or newer installed locally. - -``` -// Install dependencies -yarn install - -// Start server in development -yarn start:dev - -// Unleash UI -http://localhost:4242 - -// API: -http://localhost:4242/api/ - -// Execute tests in all packages: -yarn test -``` - -## Database changes {#database-changes} - -We use database migrations to track database changes. - -### Making a schema change {#making-a-schema-change} - -To run migrations, you will set the environment variable for DATABASE_URL - -`export DATABASE_URL=postgres://unleash_user:passord@localhost:5432/unleash` - -Use db-migrate to create new migrations file. - -```bash -> yarn run db-migrate create YOUR-MIGRATION-NAME -``` - -All migrations require one `up` and one `down` method. - -Example of a typical migration: - -```js -/* eslint camelcase: "off" */ -'use strict'; - -exports.up = function(db, cb) { - db.createTable( - 'examples', - { - id: { type: 'int', primaryKey: true, notNull: true }, - created_at: { type: 'timestamp', defaultValue: 'now()' }, - }, - cb, - ); -}; - -exports.down = function(db, cb) { - return db.dropTable('examples', cb); -}; -``` - -Test your migrations: - -```bash -> yarn run db-migrate up -> yarn run db-migrate down -``` - -## Publishing / Releasing new packages {#publishing--releasing-new-packages} - -Please run `yarn test` checks before publishing. - -Run `npm run publish` to start the publishing process. - -`npm run publish:dry` +* [Clean code javascript](https://github.com/ryanmcdermott/clean-code-javascript) +* [frontend overview](./frontend/overview.md) +* [backend overview](./backend/overview.md) diff --git a/website/docs/contributing/frontend/ADR/component-naming.md b/website/docs/contributing/frontend/ADR/component-naming.md new file mode 100644 index 0000000000..f683d8308b --- /dev/null +++ b/website/docs/contributing/frontend/ADR/component-naming.md @@ -0,0 +1,29 @@ +--- +title: "ADR: Component naming and file naming" +--- + +## Background + +In the codebase, we have found a need to have a common way of naming components so that components can be (a) easily searched for, (b) easily identified as react components and (c) be descriptive in what they do in the codebase. + +## Decision + +We have decided to use a naming convention for components that uppercases the first letter of the component. This also extends to the filename of the component. The two should always be the same: + +```jsx +// Do: +// MyComponent.ts + +const MyComponent = () => {}; + +// Don't: +// someRandomName.ts + +const MyComponent = () => {}; +``` + +The reason for this decision is to remove mental clutter and free up capacity to easily navigate the codebase. Knowing that a component name has the same name as the filename will remove any doubts about the file contents quickly and in the same way follow the React standard of uppercase component names. + +### Deviations + +In some instances, for simplicity we might want to create internal components or child components for a larger component. If these child components are small enough in size and it makes sense to keep them in the same file as the parent (AND they are used in no other external components) it's fine to keep in the same file as the parent component. diff --git a/website/docs/contributing/frontend/ADR/interface-naming.md b/website/docs/contributing/frontend/ADR/interface-naming.md new file mode 100644 index 0000000000..c13ed8d706 --- /dev/null +++ b/website/docs/contributing/frontend/ADR/interface-naming.md @@ -0,0 +1,23 @@ +--- +title: "ADR: Interface naming" +--- + +## Background + +In the codebase, we have found a need to have a common way of naming interfaces in order to ensure consistency. + +## Decision + +We have decided to use a naming convention of appending the letter `I` in front of interfaces to signify that we are in fact using an interface. For props, we use `IComponentNameProps`. + +```jsx +// Do: +interface IMyInterface {} +interface IMyComponentNameProps {} + +// Don't: +interface MyInterface {} +interface MyComponentName {} +``` + +The reason for this decision is to remove mental clutter and free up capacity to easily navigate the codebase. Knowing that an interface is prefixed with `I` allows you to quickly scan a file without watching for a context where the interface is used in order to understand what it is. diff --git a/website/docs/contributing/frontend/ADR/preferred-component-props-usage.md b/website/docs/contributing/frontend/ADR/preferred-component-props-usage.md new file mode 100644 index 0000000000..049131178b --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-component-props-usage.md @@ -0,0 +1,37 @@ +--- +title: "ADR: Preferred component props usage" +--- + +## Background + +In the codebase, we have found a need to standardise how to use props, in order to easily be able to figure out what a component is doing and what properties it is given without having to look up the interface. + +## Decision + +We have decided to use props destructuring inline in components in order to quickly display what properties a component is using. + +```tsx +// Do: +const MyComponent = ({ name, age, occupation }: IComponentProps) => { + return ( +

+

{age}

+

{name}

+

{occupation}

+ + ) +}; + +// Don't: +function MyComponent(props) { + return ( +
+

{props.age}

+

{props.name}

+

{props.occupation}

+ + ) +} +``` + +The reason for this decision is to remove mental clutter and free up capacity to easily navigate the codebase. In addition, when components grow, the ability to look at the signature and instantly know what dependencies this component uses gives you an advantage when scanning the codebase. diff --git a/website/docs/contributing/frontend/ADR/preferred-data-fetching-method.md b/website/docs/contributing/frontend/ADR/preferred-data-fetching-method.md new file mode 100644 index 0000000000..6d693fa34e --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-data-fetching-method.md @@ -0,0 +1,83 @@ +--- +title: "ADR: Preferred data fetching method" +--- + +## Background + +We have found a need to standardise how we fetch data from APIs, in order to reduce complexity and simplify the data fetching process. + +## Decision + +We have decided to remove redux from our application and fetch all of our data via a third party library called `useSWR` (SWR stands for stale-while-revalidate and is a common cache strategy). + +```tsx +// Do: +// useSegments.ts + +import useSWR from 'swr'; +import { useCallback } from 'react'; +import { formatApiPath } from 'utils/formatPath'; +import handleErrorResponses from '../httpErrorResponseHandler'; +import { ISegment } from 'interfaces/segment'; +import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; +import { IFlags } from 'interfaces/uiConfig'; + +export interface UseSegmentsOutput { + segments?: ISegment[]; + refetchSegments: () => void; + loading: boolean; + error?: Error; +} + +export const useSegments = (strategyId?: string): UseSegmentsOutput => { + const { uiConfig } = useUiConfig(); + + const { data, error, mutate } = useSWR( + [strategyId, uiConfig.flags], + fetchSegments + ); + + const refetchSegments = useCallback(() => { + mutate().catch(console.warn); + }, [mutate]); + + return { + segments: data, + refetchSegments, + loading: !error && !data, + error, + }; +}; + +export const fetchSegments = async ( + strategyId?: string, + flags?: IFlags +): Promise => { + if (!flags?.SE) { + return []; + } + + return fetch(formatSegmentsPath(strategyId)) + .then(handleErrorResponses('Segments')) + .then(res => res.json()) + .then(res => res.segments); +}; + +const formatSegmentsPath = (strategyId?: string): string => { + return strategyId + ? formatApiPath(`api/admin/segments/strategies/${strategyId}`) + : formatApiPath('api/admin/segments'); +}; + +// Don't: +const MyComponent = () => { + useEffect(() => { + const getData = () => { + fetch(API_URL) + .then(res => res.json()) + .then(setData); + }; + getData(); + }, []); +}; +``` diff --git a/website/docs/contributing/frontend/ADR/preferred-data-mutation-method.md b/website/docs/contributing/frontend/ADR/preferred-data-mutation-method.md new file mode 100644 index 0000000000..2ddec1bfec --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-data-mutation-method.md @@ -0,0 +1,92 @@ +--- +title: "ADR: Preferred data mutation method" +--- + +## Background + +Because our product is open-core, we have complexities and needs for our SaaS platform that are not compatible with the needs of our open-source product. We have found a need to standardise how we fetch data from APIs, in order to reduce complexity and simplify the data fetching process. + +## Decision + +We have decided to standardise data-fetching and error handling by implementing a top level `useAPI` hook that will take care of formatting the +request in the correct way adding the basePath if unleash is hosted on a subpath, wrap with error handlers and return the data in a consistent way. + +Example: + +```tsx +import { ITagPayload } from 'interfaces/tags'; +import useAPI from '../useApi/useApi'; + +const useTagTypesApi = () => { + const { makeRequest, createRequest, errors, loading } = useAPI({ + propagateErrors: true, + }); + + const createTag = async (payload: ITagPayload) => { + const path = `api/admin/tag-types`; + const req = createRequest(path, { + method: 'POST', + body: JSON.stringify(payload), + }); + + try { + const res = await makeRequest(req.caller, req.id); + + return res; + } catch (e) { + throw e; + } + }; + + const validateTagName = async (name: string) => { + const path = `api/admin/tag-types/validate`; + const req = createRequest(path, { + method: 'POST', + body: JSON.stringify({ name }), + }); + try { + const res = await makeRequest(req.caller, req.id); + return res; + } catch (e) { + throw e; + } + }; + const updateTagType = async (tagName: string, payload: ITagPayload) => { + const path = `api/admin/tag-types/${tagName}`; + const req = createRequest(path, { + method: 'PUT', + body: JSON.stringify(payload), + }); + + try { + const res = await makeRequest(req.caller, req.id); + return res; + } catch (e) { + throw e; + } + }; + + const deleteTagType = async (tagName: string) => { + const path = `api/admin/tag-types/${tagName}`; + const req = createRequest(path, { method: 'DELETE' }); + + try { + const res = await makeRequest(req.caller, req.id); + return res; + } catch (e) { + throw e; + } + }; + + return { + createTag, + validateTagName, + updateTagType, + deleteTagType, + errors, + loading, + }; +}; + +export default useTagTypesApi; +``` diff --git a/website/docs/contributing/frontend/ADR/preferred-export.md b/website/docs/contributing/frontend/ADR/preferred-export.md new file mode 100644 index 0000000000..adafde39df --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-export.md @@ -0,0 +1,39 @@ +--- +title: "ADR: Preferred export" +--- + +## Background + +We have seen a need to standardize how to export from files in the project, in order to achieve consistency and avoid situations where we can have a component default exported as one name and renamed as something else in a different file. For example: + +``` +// Problem example +// File A + +const MyComponent = () => { + +} + +export default MyComponent; + +// File B +import NewName from '../components/MyComponent/MyComponent.tsx'; +``` + +The above can cause massive confusion and make it hard to navigate the codebase. + +## Decision + +We have decided to standardise exports on named exports. This will allow us to eliminate the possiblity of exporting a component and renaming it in another file. + +```jsx +// Do: +export const MyComponent = () => {}; + +// Don't: +const MyComponent = () => {}; + +export default MyComponent; +``` + +The reason for this decision is to remove mental clutter and free up capacity to easily navigate the codebase. If you can always deduce that the component is named as it is defined, then finding that component becomes a lot easier. This will ensure that we remove unnecessary hurdles to understand and work within the codebase. diff --git a/website/docs/contributing/frontend/ADR/preferred-folder-structure.md b/website/docs/contributing/frontend/ADR/preferred-folder-structure.md new file mode 100644 index 0000000000..ffc776d40c --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-folder-structure.md @@ -0,0 +1,32 @@ +--- +title: "ADR: Preferred folder structure" +--- + +## Background + +Folder structure is important in how easy it is to navigate and reason about the codebase. It's important to have a clear structure that is easy to understand and follow, while grouping related files together in such a way that is easy to find and remove. + +## Decision + +We have decided to create tree-like folder structure that mimics as closely as possible the relationship of the React components in the project. This has a number of benefits: + +* If you are looking for a component, you can easily find it by looking at the folder structure. +* If you need to delete a component, you can be sure that all of the files connected to that component will be deleted if you delete the folder. This is supremely important, because it allows us to get rid of dead code easily and without having to worry about the consequences of deleting a file and worrying about whether it's used somewhere else. + +## Folder structure example: + +``` +ProfilePage + ProfilePage.tsx + ProfilePage.styles.ts + ProfileSettings + ProfileSettings.tsx + ProfileSettings.styles.ts + ProfilePicture + ProfilePicture.tsx + ProfilePicture.styles.ts +``` + +Now you can clearly see that if you need to delete the `ProfilePage` component, you can simply delete the `ProfilePage` folder and all of the files connected to that component will be deleted. + +If you experience that you need to create a component that is used in multiple places, the component should be moved to the closest possible ancestor. If this is not possible, the component should be moved to the `common` folder. diff --git a/website/docs/contributing/frontend/ADR/preferred-form-architecture.md b/website/docs/contributing/frontend/ADR/preferred-form-architecture.md new file mode 100644 index 0000000000..766b42390a --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-form-architecture.md @@ -0,0 +1,17 @@ +--- +title: "ADR: Preferred form architecture" +--- + +## Background + +Forms can be tricky. In software, we often want to write DRY components, repeating as little as possible. Yet we also want a clear separation of concerns. Forms represent a challenge in this way because you have to choose which principle is the most important. You can't both have it DRY and completely separated. + +## Decision + +We have decided to architecture our forms in the following way: + +* Create a hook that contains all the logic for the form. This hook will return a form object that contains all the form state and functions to update the state. +* Create a reusable form component that does not contain any logic +* Create separate Create and Edit components that use the form component and the form hook to create the form and implements it's own logic for submitting the form. + +In this way, we keep as much of the form as possible DRY, but we avoid passing state internally in the form so the form doesn't need to know wheter it is in create or edit mode. This allows us to keep one thing in mind when working, and not have to worry about dual states of the component. \ No newline at end of file diff --git a/website/docs/contributing/frontend/ADR/preferred-function-type.md b/website/docs/contributing/frontend/ADR/preferred-function-type.md new file mode 100644 index 0000000000..9472f12d9f --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-function-type.md @@ -0,0 +1,23 @@ +--- +title: "ADR: Preferred function type" +--- + +## Background + +In the codebase, we have found a need to standardise function types in order to keep the codebase recognizible across different sections, and to encourage / discourage certain patterns. + +## Decision + +We have decided to use arrow functions across the board in the project. Both for helper functions and for react components. + +```jsx +// Do: +const myFunction = () => {}; +const MyComponent = () => {}; + +// Don't: +function myFunction() {} +function MyComponent() {} +``` + +The reason for this decision is to remove mental clutter and free up capacity to easily navigate the codebase. In addition, using arrow functions allows you to avoid the complexity of losing the scope of `this` for nested functions, and keeps `this` stable without any huge drawbacks. Losing hoisting is an acceptable compromise. diff --git a/website/docs/contributing/frontend/ADR/preferred-styles-import-placement.md b/website/docs/contributing/frontend/ADR/preferred-styles-import-placement.md new file mode 100644 index 0000000000..ce8bdea9f7 --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-styles-import-placement.md @@ -0,0 +1,52 @@ +--- +title: "ADR: preferred styles import placement" +--- + +## Background + +SUPERSEDED BY [ADR: Preferred styling method](./preferred-styling-method.md) + +In the codebase, we have found a need to standardise where to locate the styles import. When using CSS modules, the styles import placement matters for the priority of the styles if you are passing through styles to other components. IE: + +``` +// import order matters, because the useStyles in MyComponent now +// is after the useStyles import it will not take precedence if it has +// a styling conflict. +import useStyles from './SecondComponent.styles.ts'; +import MyComponent from '../MyComponent/MyComponent.tsx'; + +const SecondComponent = () => { + const styles = useStyles(); + + return +} +``` + +## Decision + +We have decided to always place style imports as the last import in the file, so that any components that the file may use can safely be overriden with styles from the parent component. + +```tsx +// Do: +import MyComponent from '../MyComponent/MyComponent.tsx'; + +import useStyles from './SecondComponent.styles.ts'; + +const SecondComponent = () => { + const styles = useStyles(); + + return ; +}; + +// Don't: +import useStyles from './SecondComponent.styles.ts'; +import MyComponent from '../MyComponent/MyComponent.tsx'; + +const SecondComponent = () => { + const styles = useStyles(); + + return ; +}; +``` + +The reason for this decision is to remove the posibillity for hard to find bugs, that are not obvious to detect and that might be time consuming to find a solution to. diff --git a/website/docs/contributing/frontend/ADR/preferred-styling-method.md b/website/docs/contributing/frontend/ADR/preferred-styling-method.md new file mode 100644 index 0000000000..9478fb704d --- /dev/null +++ b/website/docs/contributing/frontend/ADR/preferred-styling-method.md @@ -0,0 +1,16 @@ +--- +title: "ADR: preferred styling method" +--- + +This document supersedes [ADR: preferred styles import placement](./preferred-styles-import-placement.md) + + +## Background + +In the codebase, we need to have a uniform way of performing style updates. + +## Decision + +We have decided to move away from using makeStyles as it's currently deprecated from @material/ui, and kept alive with an +external interop package to maintain compatability with the latest version. The preferred path forward is to use styled components which is +supported natively in @material/ui and sparingly use the sx prop available on all mui components. diff --git a/website/docs/contributing/frontend/overview.md b/website/docs/contributing/frontend/overview.md new file mode 100644 index 0000000000..0dc59d58df --- /dev/null +++ b/website/docs/contributing/frontend/overview.md @@ -0,0 +1,23 @@ +--- +title: Front end +--- + +## Frontend overview + +The frontend is written in react/typescript. It's is a single page application that communicates with the backend via a REST API. The frontend is built using vite and served by the backend. + +## ADRs + +We have created a set of ADRs to help guide the development of the frontend: + +* [Component naming](./ADR/component-naming.md) +* [Interface naming](./ADR/interface-naming.md) +* [Preferred component props usage](./ADR/preferred-component-props-usage.md) +* [Preferred export](./ADR/preferred-export.md) +* [Preferred function type](./ADR/preferred-function-type.md) +* [Preferred style import placement](./ADR/preferred-styles-import-placement.md) +* [Preferred styling method](./ADR/preferred-styling-method.md) +* [Preferred data mutation method](./ADR/preferred-data-mutation-method.md) +* [Preferred data fetching method](./ADR/preferred-data-fetching-method.md) +* [Preferred folder structure](./ADR/preferred-folder-structure.md) +* [Preferred form architecture](./ADR/preferred-form-architecture.md) From 882cef3fdb76a9efa57598f380ba3519c8d6cdd9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Oct 2022 17:33:20 +0000 Subject: [PATCH 16/39] chore(deps): update dependency vite-plugin-svgr to v2.2.2 (#2199) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 154 ++++++++++++++++++++++-------------------- 2 files changed, 82 insertions(+), 74 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 61ce00d5ee..0960814ddc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -91,7 +91,7 @@ "typescript": "4.8.4", "vite": "3.0.9", "vite-plugin-env-compatible": "1.1.1", - "vite-plugin-svgr": "2.2.1", + "vite-plugin-svgr": "2.2.2", "vite-tsconfig-paths": "3.5.1", "vitest": "0.22.1", "whatwg-fetch": "3.6.2" diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 5954159a09..30cd703c02 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2089,13 +2089,14 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== -"@rollup/pluginutils@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== +"@rollup/pluginutils@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.1.tgz#63def51f5a76dadd984689d33c7f000164152a97" + integrity sha512-4HaCVEXXuObvcPUaUlLt4faHYHCeQOOWNj8NKFGaRSrw3ZLD0TWeAFZicV9vXjnE2nkNuaVTfTuwAnjR+6uc9A== dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" "@rushstack/eslint-patch@^1.1.0": version "1.1.3" @@ -2107,85 +2108,87 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.22.tgz#0da18e6e75701d6609c7c68fe18002bb1f47345f" integrity sha512-JsBe3cOFpNZ6yjBYnXKhcENWy5qZE3PQZwExQ5ksA/h8qp4bwwxFmy07A6bC2R6qv6+RF3SfrbQTskTwYNTXUQ== -"@svgr/babel-plugin-add-jsx-attribute@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz#b9a5d84902be75a05ede92e70b338d28ab63fa74" - integrity sha512-jDBKArXYO1u0B1dmd2Nf8Oy6aTF5vLDfLoO9Oon/GLkqZ/NiggYWZA+a2HpUMH4ITwNqS3z43k8LWApB8S583w== +"@svgr/babel-plugin-add-jsx-attribute@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz#21788f7e982aacafc805ed30a14048a1406fbabc" + integrity sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg== -"@svgr/babel-plugin-remove-jsx-attribute@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.1.tgz#4877995452efc997b36777abe1fde9705ef78e8b" - integrity sha512-dQzyJ4prwjcFd929T43Z8vSYiTlTu8eafV40Z2gO7zy/SV5GT+ogxRJRBIKWomPBOiaVXFg3jY4S5hyEN3IBjQ== +"@svgr/babel-plugin-remove-jsx-attribute@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e" + integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== -"@svgr/babel-plugin-remove-jsx-empty-expression@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.1.tgz#2d67a0e92904c9be149a5b22d3a3797ce4d7b514" - integrity sha512-HBOUc1XwSU67fU26V5Sfb8MQsT0HvUyxru7d0oBJ4rA2s4HW3PhyAPC7fV/mdsSGpAvOdd8Wpvkjsr0fWPUO7A== +"@svgr/babel-plugin-remove-jsx-empty-expression@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8" + integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.1.tgz#306f5247139c53af70d1778f2719647c747998ee" - integrity sha512-C12e6aN4BXAolRrI601gPn5MDFCRHO7C4TM8Kks+rDtl8eEq+NN1sak0eAzJu363x3TmHXdZn7+Efd2nr9I5dA== +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz#ca57c0a62a9c22ff11cdb475dc9a2b35586335d1" + integrity sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA== -"@svgr/babel-plugin-svg-dynamic-title@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.1.tgz#6ce26d34cbc93eb81737ef528528907c292e7aa2" - integrity sha512-6NU55Mmh3M5u2CfCCt6TX29/pPneutrkJnnDCHbKZnjukZmmgUAZLtZ2g6ZoSPdarowaQmAiBRgAHqHmG0vuqA== +"@svgr/babel-plugin-svg-dynamic-title@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz#57c0e0409757373d641f115d33cf2559b47bff77" + integrity sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw== -"@svgr/babel-plugin-svg-em-dimensions@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.1.tgz#5ade2a724b290873c30529d1d8cd23523856287a" - integrity sha512-HV1NGHYTTe1vCNKlBgq/gKuCSfaRlKcHIADn7P8w8U3Zvujdw1rmusutghJ1pZJV7pDt3Gt8ws+SVrqHnBO/Qw== +"@svgr/babel-plugin-svg-em-dimensions@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz#dbca40a18c308f135b4b672ea8e410855e8e3352" + integrity sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg== -"@svgr/babel-plugin-transform-react-native-svg@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.1.tgz#d654f509d692c3a09dfb475757a44bd9f6ad7ddf" - integrity sha512-2wZhSHvTolFNeKDAN/ZmIeSz2O9JSw72XD+o2bNp2QAaWqa8KGpn5Yk5WHso6xqfSAiRzAE+GXlsrBO4UP9LLw== +"@svgr/babel-plugin-transform-react-native-svg@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz#a5453127365b925a7f766615ef6f5cfd01018f98" + integrity sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw== -"@svgr/babel-plugin-transform-svg-component@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.1.tgz#21a285dbffdce9567c437ebf0d081bf9210807e6" - integrity sha512-cZ8Tr6ZAWNUFfDeCKn/pGi976iWSkS8ijmEYKosP+6ktdZ7lW9HVLHojyusPw3w0j8PI4VBeWAXAmi/2G7owxw== +"@svgr/babel-plugin-transform-svg-component@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz#ec116e9223a02c6dcd9f8cb2bdbf174a3c2ef2f5" + integrity sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig== -"@svgr/babel-preset@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.3.1.tgz#8bd1ead79637d395e9362b01dd37cfd59702e152" - integrity sha512-tQtWtzuMMQ3opH7je+MpwfuRA1Hf3cKdSgTtAYwOBDfmhabP7rcTfBi3E7V3MuwJNy/Y02/7/RutvwS1W4Qv9g== +"@svgr/babel-preset@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.0.tgz#dc14bbe1c74e0c8c4ab77221064645b3399836db" + integrity sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg== dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.3.1" - "@svgr/babel-plugin-remove-jsx-attribute" "^6.3.1" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.3.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.3.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.3.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.3.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.3.1" - "@svgr/babel-plugin-transform-svg-component" "^6.3.1" + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.5.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.5.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.0" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.0" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.0" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.0" + "@svgr/babel-plugin-transform-svg-component" "^6.5.0" -"@svgr/core@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.3.1.tgz#752adf49d8d5473b15d76ca741961de093f715bd" - integrity sha512-Sm3/7OdXbQreemf9aO25keerZSbnKMpGEfmH90EyYpj1e8wMD4TuwJIb3THDSgRMWk1kYJfSRulELBy4gVgZUA== +"@svgr/core@^6.4.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.0.tgz#13af3337b7b66a2b6ebe197b67b62badbe490bf1" + integrity sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w== dependencies: - "@svgr/plugin-jsx" "^6.3.1" + "@babel/core" "^7.18.5" + "@svgr/babel-preset" "^6.5.0" + "@svgr/plugin-jsx" "^6.5.0" camelcase "^6.2.0" cosmiconfig "^7.0.1" -"@svgr/hast-util-to-babel-ast@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.3.1.tgz#59614e24d2a4a28010e02089213b3448d905769d" - integrity sha512-NgyCbiTQIwe3wHe/VWOUjyxmpUmsrBjdoIxKpXt3Nqc3TN30BpJG22OxBvVzsAh9jqep0w0/h8Ywvdk3D9niNQ== +"@svgr/hast-util-to-babel-ast@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz#0e4aebea26328e22a6fff940711472a47ec24e5c" + integrity sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA== dependencies: "@babel/types" "^7.18.4" entities "^4.3.0" -"@svgr/plugin-jsx@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.3.1.tgz#de7b2de824296b836d6b874d498377896e367f50" - integrity sha512-r9+0mYG3hD4nNtUgsTXWGYJomv/bNd7kC16zvsM70I/bGeoCi/3lhTmYqeN6ChWX317OtQCSZZbH4wq9WwoXbw== +"@svgr/plugin-jsx@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz#c23ba0048007f1591fe7a9b060be373e4771487b" + integrity sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw== dependencies: "@babel/core" "^7.18.5" - "@svgr/babel-preset" "^6.3.1" - "@svgr/hast-util-to-babel-ast" "^6.3.1" + "@svgr/babel-preset" "^6.5.0" + "@svgr/hast-util-to-babel-ast" "^6.5.0" svg-parser "^2.0.4" "@testing-library/dom@8.19.0": @@ -2305,6 +2308,11 @@ resolved "https://registry.yarnpkg.com/@types/deep-diff/-/deep-diff-1.0.1.tgz#eae15119c68b72b541731872a2883da89dc39396" integrity sha512-cZIq2GFcPmW0/M7dtLuphyoU8f3zpTcBgV+wkFFJ0CK0lwRVGGLaBSJZ98qs4LjtLimPq1Bb2VJnhGn6SEE4IA== +"@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + "@types/history@^4.7.11": version "4.7.11" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" @@ -4279,7 +4287,7 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-walker@^2.0.1: +estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== @@ -5910,7 +5918,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -6989,13 +6997,13 @@ vite-plugin-env-compatible@1.1.1: resolved "https://registry.yarnpkg.com/vite-plugin-env-compatible/-/vite-plugin-env-compatible-1.1.1.tgz#2e11b059a5f3e8fc609d6a4bba84ca497081ee20" integrity sha512-4lqhBWhOzP+SaCPoCVdmpM5cXzjKQV5jgFauxea488oOeElXo/kw6bXkMIooZhrh9q7gclTl8en6N9NmnqUwRQ== -vite-plugin-svgr@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-2.2.1.tgz#6e1132a3b66f71e1d69e8c5fe989393260184ac3" - integrity sha512-+EqwahbwjETJH/ssA/66dNYyKN1cO0AStq96MuXmq5maU7AePBMf2lDKfQna49tJZAjtRz+R899BWCsUUP45Fg== +vite-plugin-svgr@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-2.2.2.tgz#c5c9cb573bf455bb079550531847ddc5d2e122af" + integrity sha512-u8Ac27uZmDHTVGawpAhvLMJMuzbGeZGhe61TGeHoRQLxVhmQfIYCefa0iLbjC0ui1zFo6XZnS8EkzPITCYp85g== dependencies: - "@rollup/pluginutils" "^4.2.1" - "@svgr/core" "^6.3.1" + "@rollup/pluginutils" "^5.0.0" + "@svgr/core" "^6.4.0" vite-tsconfig-paths@3.5.1: version "3.5.1" From f713190e34fd051ec1ed6c8c1edb877d10775f40 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Oct 2022 20:59:27 +0000 Subject: [PATCH 17/39] chore(deps): update dependency @xmldom/xmldom to ^0.8.0 (#2210) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 0960814ddc..a5eb62933c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -98,7 +98,7 @@ }, "resolutions": { "@codemirror/state": "6.1.2", - "@xmldom/xmldom": "^0.7.6" + "@xmldom/xmldom": "^0.8.0" }, "jest": { "moduleNameMapper": { diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 30cd703c02..0e5be9f1eb 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2719,10 +2719,10 @@ magic-string "^0.26.2" react-refresh "^0.14.0" -"@xmldom/xmldom@^0.7.5", "@xmldom/xmldom@^0.7.6": - version "0.7.6" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.6.tgz#6f55073fa73e65776bd85826958b98c8cd1457b5" - integrity sha512-HHXP9hskkFQHy8QxxUXkS7946FFIhYVfGqsk0WLwllmexN9x/+R4UBLvurHEuyXRfVEObVR8APuQehykLviwSQ== +"@xmldom/xmldom@^0.7.5", "@xmldom/xmldom@^0.8.0": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.3.tgz#beaf980612532aa9a3004aff7e428943aeaa0711" + integrity sha512-Lv2vySXypg4nfa51LY1nU8yDAGo/5YwF+EY/rUZgIbfvwVARcd67ttCM8SMsTeJy51YhHYavEq+FS6R0hW9PFQ== "@zxing/text-encoding@0.9.0": version "0.9.0" From 726674ea3ecf88ab8ffa408d9f2ba9cbbb199771 Mon Sep 17 00:00:00 2001 From: sellinjaanus <107852002+sellinjaanus@users.noreply.github.com> Date: Thu, 20 Oct 2022 10:47:19 +0300 Subject: [PATCH 18/39] UX additions to groups SSO syncing (#2200) * Initial commit * Fix snapshot * Fixes * Small fix Co-authored-by: sjaanus --- .../component/admin/groups/Group/Group.tsx | 8 ++ .../admin/groups/GroupForm/GroupForm.tsx | 86 +++++++++++++++---- .../hooks/api/getters/useGroup/useGroup.ts | 1 + src/lib/db/group-store.ts | 8 +- .../openapi/spec/group-user-model-schema.ts | 4 + src/lib/services/group-service.ts | 3 + src/lib/types/group.ts | 2 + .../__snapshots__/openapi.e2e.test.ts.snap | 4 + 8 files changed, 99 insertions(+), 17 deletions(-) diff --git a/frontend/src/component/admin/groups/Group/Group.tsx b/frontend/src/component/admin/groups/Group/Group.tsx index a38360cd51..907990755a 100644 --- a/frontend/src/component/admin/groups/Group/Group.tsx +++ b/frontend/src/component/admin/groups/Group/Group.tsx @@ -111,6 +111,14 @@ export const Group: VFC = () => { sortType: 'date', maxWidth: 150, }, + { + id: 'createdBy', + Header: 'Added by', + accessor: 'createdBy', + Cell: HighlightCell, + minWidth: 90, + searchable: true, + }, { Header: 'Last login', accessor: (row: IGroupUser) => row.seenAt || '', diff --git a/frontend/src/component/admin/groups/GroupForm/GroupForm.tsx b/frontend/src/component/admin/groups/GroupForm/GroupForm.tsx index 1b04ff4247..9108797fd5 100644 --- a/frontend/src/component/admin/groups/GroupForm/GroupForm.tsx +++ b/frontend/src/component/admin/groups/GroupForm/GroupForm.tsx @@ -1,5 +1,5 @@ -import { FC } from 'react'; -import { Button, styled } from '@mui/material'; +import React, { FC } from 'react'; +import { Button, styled, Tooltip } from '@mui/material'; import { UG_DESC_ID, UG_NAME_ID } from 'utils/testIds'; import Input from 'component/common/Input/Input'; import { IGroupUser } from 'interfaces/group'; @@ -8,6 +8,9 @@ import { GroupFormUsersSelect } from './GroupFormUsersSelect/GroupFormUsersSelec import { GroupFormUsersTable } from './GroupFormUsersTable/GroupFormUsersTable'; import { ItemList } from 'component/common/ItemList/ItemList'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; +import useAuthSettings from 'hooks/api/getters/useAuthSettings/useAuthSettings'; +import { HelpOutline } from '@mui/icons-material'; +import { Link } from 'react-router-dom'; const StyledForm = styled('form')(() => ({ display: 'flex', @@ -22,13 +25,13 @@ const StyledInputDescription = styled('p')(({ theme }) => ({ const StyledInput = styled(Input)(({ theme }) => ({ width: '100%', - maxWidth: theme.spacing(50), + maxWidth: theme.spacing(60), marginBottom: theme.spacing(2), })); const StyledItemList = styled(ItemList)(({ theme }) => ({ width: '100%', - maxWidth: theme.spacing(50), + maxWidth: theme.spacing(60), marginBottom: theme.spacing(2), })); @@ -46,6 +49,22 @@ const StyledCancelButton = styled(Button)(({ theme }) => ({ marginLeft: theme.spacing(3), })); +const StyledDescriptionBlock = styled('div')(({ theme }) => ({ + width: '100%', + maxWidth: theme.spacing(60), + padding: theme.spacing(3), + backgroundColor: theme.palette.neutral.light, + color: theme.palette.grey[900], + fontSize: theme.fontSizes.smallBody, + borderRadius: theme.shape.borderRadiusMedium, +})); + +const StyledHelpOutline = styled(HelpOutline)(({ theme }) => ({ + fontSize: theme.fontSizes.smallBody, + marginLeft: '0.3rem', + color: theme.palette.grey[700], +})); + interface IGroupForm { name: string; description: string; @@ -76,7 +95,14 @@ export const GroupForm: FC = ({ mode, children, }) => { - const { uiConfig } = useUiConfig(); + const { uiConfig, isOss } = useUiConfig(); + + const { config: oidcSettings } = useAuthSettings('oidc'); + const { config: samlSettings } = useAuthSettings('saml'); + + const isGroupSyncingEnabled = + (oidcSettings?.enabled && oidcSettings.enableGroupSyncing) || + (samlSettings?.enabled && samlSettings.enableGroupSyncing); return ( @@ -108,18 +134,46 @@ export const GroupForm: FC = ({ data-testid={UG_DESC_ID} /> - - Is this group associated with SSO groups? - - - + + + Is this group associated with SSO + groups? + + + + } + elseShow={() => ( + +
+ You can enable SSO groups syncronization + if needed + + + +
+ + + View SSO configuration + + +
+ )} + /> } /> users.map(user => ({ ...user.user, joinedAt: new Date(user.joinedAt), + createdBy: user.createdBy, })); export const useGroup = (groupId: number): IUseGroupOutput => { diff --git a/src/lib/db/group-store.ts b/src/lib/db/group-store.ts index 63315b7b5f..b9f3489d2e 100644 --- a/src/lib/db/group-store.ts +++ b/src/lib/db/group-store.ts @@ -51,6 +51,7 @@ const rowToGroupUser = (row) => { userId: row.user_id, groupId: row.group_id, joinedAt: row.created_at, + createdBy: row.created_by, }; }; @@ -117,7 +118,12 @@ export default class GroupStore implements IGroupStore { async getAllUsersByGroups(groupIds: number[]): Promise { const rows = await this.db - .select('gu.group_id', 'u.id as user_id', 'gu.created_at') + .select( + 'gu.group_id', + 'u.id as user_id', + 'gu.created_at', + 'gu.created_by', + ) .from(`${T.GROUP_USER} AS gu`) .join(`${T.USERS} AS u`, 'u.id', 'gu.user_id') .whereIn('gu.group_id', groupIds); diff --git a/src/lib/openapi/spec/group-user-model-schema.ts b/src/lib/openapi/spec/group-user-model-schema.ts index 6f287ac73e..765de66c30 100644 --- a/src/lib/openapi/spec/group-user-model-schema.ts +++ b/src/lib/openapi/spec/group-user-model-schema.ts @@ -11,6 +11,10 @@ export const groupUserModelSchema = { type: 'string', format: 'date-time', }, + createdBy: { + type: 'string', + nullable: true, + }, user: { $ref: '#/components/schemas/userSchema', }, diff --git a/src/lib/services/group-service.ts b/src/lib/services/group-service.ts index 46c5995afe..2ad66a7487 100644 --- a/src/lib/services/group-service.ts +++ b/src/lib/services/group-service.ts @@ -211,6 +211,7 @@ export class GroupService { return { user: user, joinedAt: roleUser.joinedAt, + createdBy: roleUser.createdBy, }; }); return { ...group, users: finalUsers }; @@ -219,6 +220,7 @@ export class GroupService { async syncExternalGroups( userId: number, externalGroups: string[], + createdBy?: string, ): Promise { if (Array.isArray(externalGroups)) { let newGroups = await this.groupStore.getNewGroupsForExternalUser( @@ -228,6 +230,7 @@ export class GroupService { await this.groupStore.addUserToGroups( userId, newGroups.map((g) => g.id), + createdBy, ); let oldGroups = await this.groupStore.getOldGroupsForExternalUser( userId, diff --git a/src/lib/types/group.ts b/src/lib/types/group.ts index 4c83a774d6..e987334372 100644 --- a/src/lib/types/group.ts +++ b/src/lib/types/group.ts @@ -16,6 +16,7 @@ export interface IGroupUser { userId: number; joinedAt: Date; seenAt?: Date; + createdBy?: string; } export interface IGroupRole { @@ -38,6 +39,7 @@ export interface IGroupProject { export interface IGroupUserModel { user: IUser; joinedAt?: Date; + createdBy?: string; } export interface IGroupModelWithProjectRole extends IGroupModel { diff --git a/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap b/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap index 35dace52bd..1ed06f43d7 100644 --- a/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap +++ b/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap @@ -1420,6 +1420,10 @@ exports[`should serve the OpenAPI spec 1`] = ` "groupUserModelSchema": { "additionalProperties": false, "properties": { + "createdBy": { + "nullable": true, + "type": "string", + }, "joinedAt": { "format": "date-time", "type": "string", From b8c3833ae465a3a3ebdcc9464f8580c96d6703a5 Mon Sep 17 00:00:00 2001 From: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com> Date: Thu, 20 Oct 2022 14:00:48 +0200 Subject: [PATCH 19/39] Suggest changes - initial frontend (#2213) * feat: add initial controller * feat: add fe * feat: return status codes * remove backend experiment * refactor standalone route for project banner * update suggest changeset type * refactor changeset mock * suggest changes banner feature flag * fix: update routes snapshot Co-authored-by: Fredrik Oseberg --- frontend/src/component/App.styles.ts | 4 +- frontend/src/component/App.tsx | 55 ++++--- .../FlexibleStrategy/FlexibleStrategy.tsx | 1 - .../layout/LayoutPicker/LayoutPicker.tsx | 42 ++--- .../layout/MainLayout/MainLayout.tsx | 93 ++++++----- .../__snapshots__/routes.test.tsx.snap | 2 + frontend/src/component/menu/routes.ts | 6 + .../src/component/project/Project/Project.tsx | 22 ++- .../ChangesHeader/ChangesHeader.tsx | 37 +++++ .../ChangesetDiff/ChangesetDiff.tsx | 77 +++++++++ .../DraftBanner/DraftBanner.tsx | 63 ++++++++ .../SuggestedChanges/SuggestedChanges.tsx | 149 ++++++++++++++++++ .../useChangeRequest/useChangeRequest.ts | 50 ++++++ frontend/src/interfaces/route.ts | 1 + frontend/src/interfaces/suggestChangeset.ts | 52 ++++++ frontend/src/interfaces/uiConfig.ts | 1 + frontend/src/utils/formatDate.ts | 2 + src/server-dev.ts | 1 + 18 files changed, 557 insertions(+), 101 deletions(-) create mode 100644 frontend/src/component/project/Project/SuggestedChanges/ChangesHeader/ChangesHeader.tsx create mode 100644 frontend/src/component/project/Project/SuggestedChanges/ChangesetDiff/ChangesetDiff.tsx create mode 100644 frontend/src/component/project/Project/SuggestedChanges/DraftBanner/DraftBanner.tsx create mode 100644 frontend/src/component/project/Project/SuggestedChanges/SuggestedChanges.tsx create mode 100644 frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts create mode 100644 frontend/src/interfaces/suggestChangeset.ts diff --git a/frontend/src/component/App.styles.ts b/frontend/src/component/App.styles.ts index c6b04a0447..f0bb1ed7b3 100644 --- a/frontend/src/component/App.styles.ts +++ b/frontend/src/component/App.styles.ts @@ -18,10 +18,12 @@ export const useStyles = makeStyles()(theme => ({ flex: 1, width: '100%', backgroundColor: theme.palette.contentWrapper, + position: 'relative', }, content: { width: '1250px', - margin: '16px auto', + marginLeft: 'auto', + marginRight: 'auto', [theme.breakpoints.down('lg')]: { width: '1024px', }, diff --git a/frontend/src/component/App.tsx b/frontend/src/component/App.tsx index 8c7776bc10..9ff43b3e8f 100644 --- a/frontend/src/component/App.tsx +++ b/frontend/src/component/App.tsx @@ -40,36 +40,41 @@ export const App = () => { elseShow={
- - - {availableRoutes.map(route => ( - + {availableRoutes.map(route => ( + - } - /> - ))} - + } /> - } - /> - - - - + ))} + + } + /> + } + /> + + +
} /> diff --git a/frontend/src/component/feature/StrategyTypes/FlexibleStrategy/FlexibleStrategy.tsx b/frontend/src/component/feature/StrategyTypes/FlexibleStrategy/FlexibleStrategy.tsx index 9f10c53c8e..c2f3904e0d 100644 --- a/frontend/src/component/feature/StrategyTypes/FlexibleStrategy/FlexibleStrategy.tsx +++ b/frontend/src/component/feature/StrategyTypes/FlexibleStrategy/FlexibleStrategy.tsx @@ -2,7 +2,6 @@ import { Typography } from '@mui/material'; import { IFeatureStrategyParameters } from 'interfaces/strategy'; import RolloutSlider from '../RolloutSlider/RolloutSlider'; import Select from 'component/common/select'; -import React from 'react'; import Input from 'component/common/Input/Input'; import { FLEXIBLE_STRATEGY_GROUP_ID, diff --git a/frontend/src/component/layout/LayoutPicker/LayoutPicker.tsx b/frontend/src/component/layout/LayoutPicker/LayoutPicker.tsx index 01704a1970..359b8ec249 100644 --- a/frontend/src/component/layout/LayoutPicker/LayoutPicker.tsx +++ b/frontend/src/component/layout/LayoutPicker/LayoutPicker.tsx @@ -1,37 +1,19 @@ +import { FC, ReactNode } from 'react'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; -import { matchPath } from 'react-router'; -import { useLocation } from 'react-router-dom'; import { MainLayout } from '../MainLayout/MainLayout'; -import { ReactNode } from 'react'; interface ILayoutPickerProps { children: ReactNode; + isStandalone?: boolean; } -export const LayoutPicker = ({ children }: ILayoutPickerProps) => { - const { pathname } = useLocation(); - - return ( - {children}} - /> - ); -}; - -const isStandalonePage = (pathname: string): boolean => { - return standalonePagePatterns.some(pattern => { - return matchPath(pattern, pathname); - }); -}; - -const standalonePagePatterns = [ - '/login', - '/new-user', - '/reset-password', - '/reset-password-success', - '/forgotten-password', - '/splash/:splashId', - '/404', -]; +export const LayoutPicker: FC = ({ + isStandalone, + children, +}) => ( + {children}} + /> +); diff --git a/frontend/src/component/layout/MainLayout/MainLayout.tsx b/frontend/src/component/layout/MainLayout/MainLayout.tsx index abf6149ad6..d5cb503b92 100644 --- a/frontend/src/component/layout/MainLayout/MainLayout.tsx +++ b/frontend/src/component/layout/MainLayout/MainLayout.tsx @@ -1,4 +1,4 @@ -import React, { ReactNode } from 'react'; +import React, { forwardRef, ReactNode } from 'react'; import classnames from 'classnames'; import { makeStyles } from 'tss-react/mui'; import { Grid } from '@mui/material'; @@ -30,47 +30,58 @@ const useStyles = makeStyles()(theme => ({ interface IMainLayoutProps { children: ReactNode; + subheader?: ReactNode; } -export const MainLayout = ({ children }: IMainLayoutProps) => { - const { classes } = useStyles(); - const { classes: styles } = useAppStyles(); - const { uiConfig } = useUiConfig(); +export const MainLayout = forwardRef( + ({ children, subheader }, ref) => { + const { classes } = useStyles(); + const { classes: styles } = useAppStyles(); + const { uiConfig } = useUiConfig(); - return ( - <> - -
- - -
- -
+ +
+ + +
+ {subheader} + - - - {children} -
-
- -
-
- - - ); -}; +
+ + + {children} +
+ + + +
+ + + ); + } +); diff --git a/frontend/src/component/menu/__tests__/__snapshots__/routes.test.tsx.snap b/frontend/src/component/menu/__tests__/__snapshots__/routes.test.tsx.snap index 1668b92402..1e65cb9645 100644 --- a/frontend/src/component/menu/__tests__/__snapshots__/routes.test.tsx.snap +++ b/frontend/src/component/menu/__tests__/__snapshots__/routes.test.tsx.snap @@ -4,6 +4,7 @@ exports[`returns all baseRoutes 1`] = ` [ { "component": [Function], + "isStandalone": true, "menu": {}, "path": "/splash/:splashId", "title": "Unleash", @@ -78,6 +79,7 @@ exports[`returns all baseRoutes 1`] = ` { "component": [Function], "flag": "P", + "isStandalone": true, "menu": {}, "parent": "/projects", "path": "/projects/:projectId/*", diff --git a/frontend/src/component/menu/routes.ts b/frontend/src/component/menu/routes.ts index 77c87ae6c0..15cb645d8b 100644 --- a/frontend/src/component/menu/routes.ts +++ b/frontend/src/component/menu/routes.ts @@ -68,6 +68,7 @@ export const routes: IRoute[] = [ component: SplashPage, type: 'protected', menu: {}, + isStandalone: true, }, // Project @@ -145,6 +146,7 @@ export const routes: IRoute[] = [ flag: P, type: 'protected', menu: {}, + isStandalone: true, }, { path: '/projects', @@ -546,6 +548,7 @@ export const routes: IRoute[] = [ type: 'unprotected', hidden: true, menu: {}, + isStandalone: true, }, /* If you update this route path, make sure you update the path in SWRProvider.tsx */ { @@ -555,6 +558,7 @@ export const routes: IRoute[] = [ component: NewUser, type: 'unprotected', menu: {}, + isStandalone: true, }, /* If you update this route path, make sure you update the path in SWRProvider.tsx */ { @@ -564,6 +568,7 @@ export const routes: IRoute[] = [ component: ResetPassword, type: 'unprotected', menu: {}, + isStandalone: true, }, /* If you update this route path, make sure you update the path in SWRProvider.tsx */ { @@ -573,6 +578,7 @@ export const routes: IRoute[] = [ component: ForgottenPassword, type: 'unprotected', menu: {}, + isStandalone: true, }, ]; diff --git a/frontend/src/component/project/Project/Project.tsx b/frontend/src/component/project/Project/Project.tsx index b99fe60674..7585a8e3c7 100644 --- a/frontend/src/component/project/Project/Project.tsx +++ b/frontend/src/component/project/Project/Project.tsx @@ -24,6 +24,9 @@ import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import { Routes, Route, useLocation } from 'react-router-dom'; import { DeleteProjectDialogue } from './DeleteProject/DeleteProjectDialogue'; import { ProjectLog } from './ProjectLog/ProjectLog'; +import { SuggestedChanges } from './SuggestedChanges/SuggestedChanges'; +import { DraftBanner } from './SuggestedChanges/DraftBanner/DraftBanner'; +import { MainLayout } from 'component/layout/MainLayout/MainLayout'; const StyledDiv = styled('div')(() => ({ display: 'flex', @@ -53,7 +56,7 @@ const Project = () => { const { classes: styles } = useStyles(); const navigate = useNavigate(); const { pathname } = useLocation(); - const { isOss } = useUiConfig(); + const { isOss, uiConfig } = useUiConfig(); const basePath = `/projects/${projectId}`; const projectName = project?.name || projectId; @@ -65,6 +68,15 @@ const Project = () => { path: basePath, name: 'overview', }, + ...(uiConfig?.flags?.suggestChanges + ? [ + { + title: 'Suggested changes', + path: `${basePath}/changes`, + name: 'changes', + }, + ] + : []), { title: 'Health', path: `${basePath}/health`, @@ -112,7 +124,10 @@ const Project = () => { }, []); return ( -
+ : null} + >

@@ -213,6 +228,7 @@ const Project = () => { }} /> + } /> } /> } /> } /> @@ -220,7 +236,7 @@ const Project = () => { } /> } /> -

+ ); }; diff --git a/frontend/src/component/project/Project/SuggestedChanges/ChangesHeader/ChangesHeader.tsx b/frontend/src/component/project/Project/SuggestedChanges/ChangesHeader/ChangesHeader.tsx new file mode 100644 index 0000000000..7f56c16dc0 --- /dev/null +++ b/frontend/src/component/project/Project/SuggestedChanges/ChangesHeader/ChangesHeader.tsx @@ -0,0 +1,37 @@ +import { VFC } from 'react'; +import { Box } from '@mui/material'; +import { useLocationSettings } from 'hooks/useLocationSettings'; +import { formatDateYMDHMS } from 'utils/formatDate'; +import { UserAvatar } from 'component/common/UserAvatar/UserAvatar'; + +interface IChangesHeaderProps { + author?: string; + avatar?: string; + createdAt?: string; +} + +export const ChangesHeader: VFC = ({ + author, + avatar, + createdAt, +}) => { + const { locationSettings } = useLocationSettings(); + return ( + + +
Suggestion by
+
+ +
+
{author}
+
+ Submitted at:{' '} + {formatDateYMDHMS(createdAt || 0, locationSettings.locale)} +
+
+
+ ); +}; diff --git a/frontend/src/component/project/Project/SuggestedChanges/ChangesetDiff/ChangesetDiff.tsx b/frontend/src/component/project/Project/SuggestedChanges/ChangesetDiff/ChangesetDiff.tsx new file mode 100644 index 0000000000..89bffcd469 --- /dev/null +++ b/frontend/src/component/project/Project/SuggestedChanges/ChangesetDiff/ChangesetDiff.tsx @@ -0,0 +1,77 @@ +import { VFC } from 'react'; +import { Box, Paper, Typography, Card } from '@mui/material'; +import { PlaygroundResultChip } from 'component/playground/Playground/PlaygroundResultsTable/PlaygroundResultChip/PlaygroundResultChip'; // FIXME: refactor - extract to common +import { ISuggestChange } from 'interfaces/suggestChangeset'; + +type ChangesetDiffProps = { + changeset?: ISuggestChange[]; +}; + +export const ChangesetDiff: VFC = ({ + changeset: changeSet, +}) => ( + theme.palette.dividerAlternative, + display: 'flex', + gap: 2, + flexDirection: 'column', + borderRadius: theme => `${theme.shape.borderRadius}px`, + }} + > + Changes + {/*// @ts-ignore FIXME: types */} + {changeSet?.map(item => ( + `${theme.shape.borderRadius}px`, + overflow: 'hidden', + border: '1px solid', + borderColor: theme => theme.palette.dividerAlternative, + }} + > + + theme.palette.tableHeaderBackground, + p: 2, + }} + > + {item.feature} + + + {/* + // @ts-ignore FIXME: types */} + {item?.changes?.map(change => { + if (change?.action === 'updateEnabled') { + return ( + + New status:{' '} + + + ); + } + return ( + + Change with ID: {change.id} + + ); + })} + + + ))} + +); diff --git a/frontend/src/component/project/Project/SuggestedChanges/DraftBanner/DraftBanner.tsx b/frontend/src/component/project/Project/SuggestedChanges/DraftBanner/DraftBanner.tsx new file mode 100644 index 0000000000..b708ae6b72 --- /dev/null +++ b/frontend/src/component/project/Project/SuggestedChanges/DraftBanner/DraftBanner.tsx @@ -0,0 +1,63 @@ +import { VFC } from 'react'; +import { Box, Button, Typography } from '@mui/material'; +import { useStyles as useAppStyles } from 'component/App.styles'; +import WarningAmberIcon from '@mui/icons-material/WarningAmber'; +import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; + +interface IDraftBannerProps { + environment?: string; +} + +export const DraftBanner: VFC = ({ environment }) => { + const { classes } = useAppStyles(); + + return ( + theme.zIndex.appBar, + borderTop: theme => `1px solid ${theme.palette.warning.border}`, + borderBottom: theme => + `1px solid ${theme.palette.warning.border}`, + backgroundColor: theme => theme.palette.warning.light, + }} + > + + theme.palette.warning.main, + }} + > + + + Draft mode! – You have changes{' '} + + in {environment} + + } + /> + that need to be reviewed + + + + + + + ); +}; diff --git a/frontend/src/component/project/Project/SuggestedChanges/SuggestedChanges.tsx b/frontend/src/component/project/Project/SuggestedChanges/SuggestedChanges.tsx new file mode 100644 index 0000000000..9a7f96a0e6 --- /dev/null +++ b/frontend/src/component/project/Project/SuggestedChanges/SuggestedChanges.tsx @@ -0,0 +1,149 @@ +import { useState, VFC } from 'react'; +import { + Box, + Paper, + Button, + Typography, + Popover, + Radio, + FormControl, + FormControlLabel, + RadioGroup, +} from '@mui/material'; +import { useChangeRequest } from 'hooks/api/getters/useChangeRequest/useChangeRequest'; +import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; +import { ChangesetDiff } from './ChangesetDiff/ChangesetDiff'; +import { ChangesHeader } from './ChangesHeader/ChangesHeader'; + +export const SuggestedChanges: VFC = () => { + const [anchorEl, setAnchorEl] = useState(null); + const [selectedValue, setSelectedValue] = useState(''); + const { data: changeRequest } = useChangeRequest(); + + const onClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const onClose = () => setAnchorEl(null); + + const onRadioChange = (event: React.ChangeEvent) => { + setSelectedValue((event.target as HTMLInputElement).value); + }; + + const onSubmit = async (e: any) => { + e.preventDefault(); + if (selectedValue === 'approve') { + console.log('approve'); + } else if (selectedValue === 'requestChanges') { + console.log('requestChanges'); + } + // show an error if no action was selected + }; + + const onApply = async () => { + try { + console.log('apply'); + } catch (e) { + console.log(e); + } + }; + + return ( + `${theme.shape.borderRadiusLarge}px`, + }} + > + {changeRequest?.state} + Environment: {changeRequest?.environment} +
+ {/* */} +
+ + Applied} + /> + + + + } + /> + + + + + + + } + label="Approve" + /> + } + label="Request changes" + /> + + + + + + + } + /> +
+ ); +}; diff --git a/frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts b/frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts new file mode 100644 index 0000000000..d647b910b2 --- /dev/null +++ b/frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts @@ -0,0 +1,50 @@ +// import useSWR from 'swr'; +// import { formatApiPath } from 'utils/formatPath'; +import { ISuggestChangeset } from 'interfaces/suggestChangeset'; +import handleErrorResponses from '../httpErrorResponseHandler'; + +// FIXME: mock +const data: ISuggestChangeset = { + id: 123, + environment: 'production', + state: 'REVIEW', + createdAt: new Date('2021-03-01T12:00:00.000Z'), + project: 'default', + createdBy: '123412341', + changes: [ + { + id: 1, + feature: 'feature1', + action: 'updateEnabled', + payload: true, + createdAt: new Date('2021-03-01T12:00:00.000Z'), + }, + { + id: 2, + feature: 'feature2', + action: 'updateEnabled', + payload: false, + createdAt: new Date('2022-09-30T16:34:00.000Z'), + }, + ], +}; + +export const useChangeRequest = () => { + // const { data, error, mutate } = useSWR( + // formatApiPath(`api/admin/suggest-changes/${id}`), + // fetcher + // ); + + return { + data, + // loading: !error && !data, + // refetchChangeRequest: () => mutate(), + // error, + }; +}; + +const fetcher = (path: string) => { + return fetch(path) + .then(handleErrorResponses('Request changes')) + .then(res => res.json()); +}; diff --git a/frontend/src/interfaces/route.ts b/frontend/src/interfaces/route.ts index 2de24ea8f5..504ee96dc0 100644 --- a/frontend/src/interfaces/route.ts +++ b/frontend/src/interfaces/route.ts @@ -13,6 +13,7 @@ export interface IRoute { enterprise?: boolean; component: VoidFunctionComponent; menu: IRouteMenu; + isStandalone?: boolean; } interface IRouteMenu { diff --git a/frontend/src/interfaces/suggestChangeset.ts b/frontend/src/interfaces/suggestChangeset.ts new file mode 100644 index 0000000000..31df60c4c2 --- /dev/null +++ b/frontend/src/interfaces/suggestChangeset.ts @@ -0,0 +1,52 @@ +export interface ISuggestChangeset { + id: number; + state: string; + project: string; + environment: string; + createdBy?: string; + createdAt?: Date; + changes?: ISuggestChange[]; + events?: ISuggestChangeEvent[]; +} + +export interface ISuggestChange { + id: number; + action: + | 'updateEnabled' + | 'strategyAdd' + | 'strategyUpdate' + | 'strategyDelete'; + feature: string; + payload?: unknown; + createdBy?: string; + createdAt?: Date; +} + +export enum SuggestChangesetEvent { + CREATED = 'CREATED', + UPDATED = 'UPDATED', + SUBMITTED = 'SUBMITTED', + APPROVED = 'APPROVED', + REJECTED = 'REJECTED', + CLOSED = 'CLOSED', +} + +export enum SuggestChangeEvent { + UPDATE_ENABLED = 'updateFeatureEnabledEvent', + ADD_STRATEGY = 'addStrategyEvent', + UPDATE_STRATEGY = 'updateStrategyEvent', + DELETE_STRATEGY = 'deleteStrategyEvent', +} + +export interface ISuggestChangeEvent { + id: number; + event: SuggestChangesetEvent; + data: ISuggestChangeEventData; + createdBy?: string; + createdAt?: Date; +} + +export interface ISuggestChangeEventData { + feature: string; + data: unknown; +} diff --git a/frontend/src/interfaces/uiConfig.ts b/frontend/src/interfaces/uiConfig.ts index 7bfc185b88..d63e4db00c 100644 --- a/frontend/src/interfaces/uiConfig.ts +++ b/frontend/src/interfaces/uiConfig.ts @@ -43,6 +43,7 @@ export interface IFlags { publicSignup?: boolean; personalAccessTokens?: boolean; syncSSOGroups?: boolean; + suggestChanges?: boolean; } export interface IVersionInfo { diff --git a/frontend/src/utils/formatDate.ts b/frontend/src/utils/formatDate.ts index 0bc10ff721..e63fec2039 100644 --- a/frontend/src/utils/formatDate.ts +++ b/frontend/src/utils/formatDate.ts @@ -1,3 +1,5 @@ +import { formatRelative } from 'date-fns'; + export const formatDateYMDHMS = ( date: number | string | Date, locale: string diff --git a/src/server-dev.ts b/src/server-dev.ts index d7b85109de..35d9a41990 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -40,6 +40,7 @@ process.nextTick(async () => { responseTimeWithAppName: true, personalAccessTokens: true, syncSSOGroups: true, + suggestChanges: true, }, }, authentication: { From bc259db8897daacd01466bd9a6df3d6e9ddb0dc0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Oct 2022 01:56:06 +0000 Subject: [PATCH 20/39] chore(deps): update dependency vite-tsconfig-paths to v3.5.2 (#2219) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index a5eb62933c..0beb0817bc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -92,7 +92,7 @@ "vite": "3.0.9", "vite-plugin-env-compatible": "1.1.1", "vite-plugin-svgr": "2.2.2", - "vite-tsconfig-paths": "3.5.1", + "vite-tsconfig-paths": "3.5.2", "vitest": "0.22.1", "whatwg-fetch": "3.6.2" }, diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 0e5be9f1eb..c55dedc3d8 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -7005,10 +7005,10 @@ vite-plugin-svgr@2.2.2: "@rollup/pluginutils" "^5.0.0" "@svgr/core" "^6.4.0" -vite-tsconfig-paths@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-3.5.1.tgz#415f8ef442b71b1a0cd40686a00fe4fbfa7627a2" - integrity sha512-t7cPvDMDxOCUxxNLqngXiX+L6jPYBr+eMgkeVadknxBb89d2s1aejz+wFEep010VfXjGVAUWGEFPe1fkRYTFvg== +vite-tsconfig-paths@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-3.5.2.tgz#fd3232f93c426311d7e0d581187d8b63fff55fbc" + integrity sha512-xJMgHA2oJ28QCG2f+hXrcqzo7IttrSRK4A//Tp94CfuX5eetOx33qiwXHUdi3FwkHP2ocpxHuvE45Ix67gwEmQ== dependencies: debug "^4.1.1" globrex "^0.1.2" From a1dc8339aa1cc849f07f5c4810f8092feae4eee9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Oct 2022 04:41:39 +0000 Subject: [PATCH 21/39] chore(deps): update dependency @babel/core to v7.19.6 (#2216) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- website/package.json | 2 +- website/yarn.lock | 103 ++++++++++++++++++++++++++----------------- yarn.lock | 103 ++++++++++++++++++++++++++----------------- 4 files changed, 126 insertions(+), 84 deletions(-) diff --git a/package.json b/package.json index f7462a0f3e..01220ea0a2 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "10.1.0", - "@babel/core": "7.19.3", + "@babel/core": "7.19.6", "@swc/core": "1.3.9", "@swc/jest": "0.2.23", "@types/bcryptjs": "2.4.2", diff --git a/website/package.json b/website/package.json index 5c3f724ab5..3a695cc474 100644 --- a/website/package.json +++ b/website/package.json @@ -62,7 +62,7 @@ ] }, "devDependencies": { - "@babel/core": "7.19.3", + "@babel/core": "7.19.6", "@docusaurus/module-type-aliases": "2.0.1", "@storybook/addon-actions": "6.5.12", "@storybook/addon-essentials": "6.5.12", diff --git a/website/yarn.lock b/website/yarn.lock index 81eb901824..2b89fdb2d4 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -187,21 +187,21 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== +"@babel/core@7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" + integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.19.6" "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helpers" "^7.19.4" + "@babel/parser" "^7.19.6" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -238,12 +238,12 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.6.tgz#9e481a3fe9ca6261c972645ae3904ec0f9b34a1d" + integrity sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.19.4" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -394,19 +394,19 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== +"@babel/helper-module-transforms@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" + integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.19.4" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -453,6 +453,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-simple-access@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" + integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== + dependencies: + "@babel/types" "^7.19.4" + "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" @@ -472,6 +479,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" @@ -506,14 +518,14 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" + integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.19.4" + "@babel/types" "^7.19.4" "@babel/highlight@^7.18.6": version "7.18.6" @@ -534,10 +546,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== -"@babel/parser@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== +"@babel/parser@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" + integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -1376,19 +1388,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== +"@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" + integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.19.6" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.19.6" + "@babel/types" "^7.19.4" debug "^4.1.0" globals "^11.1.0" @@ -1409,7 +1421,7 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" -"@babel/types@^7.19.0", "@babel/types@^7.19.3": +"@babel/types@^7.19.0": version "7.19.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== @@ -1418,6 +1430,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" + integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" diff --git a/yarn.lock b/yarn.lock index b7f43f2c69..cc17bafe57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -106,21 +106,21 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== -"@babel/core@7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== +"@babel/core@7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" + integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.19.6" "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helpers" "^7.19.4" + "@babel/parser" "^7.19.6" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -196,12 +196,12 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.6.tgz#9e481a3fe9ca6261c972645ae3904ec0f9b34a1d" + integrity sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.19.4" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -327,19 +327,19 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== +"@babel/helper-module-transforms@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" + integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.19.4" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0": version "7.13.0" @@ -370,6 +370,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-simple-access@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" + integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== + dependencies: + "@babel/types" "^7.19.4" + "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" @@ -389,6 +396,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.14.5": version "7.14.9" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz" @@ -437,14 +449,14 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" + integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.19.4" + "@babel/types" "^7.19.4" "@babel/highlight@^7.12.13", "@babel/highlight@^7.14.5": version "7.14.5" @@ -498,10 +510,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== -"@babel/parser@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== +"@babel/parser@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" + integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -699,19 +711,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== +"@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" + integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.19.6" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.19.6" + "@babel/types" "^7.19.4" debug "^4.1.0" globals "^11.1.0" @@ -757,7 +769,7 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" -"@babel/types@^7.19.0", "@babel/types@^7.19.3": +"@babel/types@^7.19.0": version "7.19.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== @@ -766,6 +778,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" + integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" From d696863a5188b62d334d5b7870e80bcbbc63243b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20G=C3=B3is?= Date: Fri, 21 Oct 2022 08:11:14 +0100 Subject: [PATCH 22/39] feat: convert environment actions to a popover menu, add clone option (#2214) * feat: convert environment actions to a popover menu, add clone option * add cloneEnviroment feature flag, hide the clone option behind it * fix: update snap --- .../EnvironmentActionCell.tsx | 40 +---- .../EnvironmentActionCellPopover.tsx | 154 ++++++++++++++++++ frontend/src/interfaces/uiConfig.ts | 1 + .../__snapshots__/create-config.test.ts.snap | 2 + src/lib/types/experimental.ts | 5 + src/server-dev.ts | 1 + src/test/config/test-config.ts | 1 + 7 files changed, 172 insertions(+), 32 deletions(-) create mode 100644 frontend/src/component/environments/EnvironmentTable/EnvironmentActionCell/EnvironmentActionCellPopover/EnvironmentActionCellPopover.tsx diff --git a/frontend/src/component/environments/EnvironmentTable/EnvironmentActionCell/EnvironmentActionCell.tsx b/frontend/src/component/environments/EnvironmentTable/EnvironmentActionCell/EnvironmentActionCell.tsx index 2a2dab69b9..847c3b5c35 100644 --- a/frontend/src/component/environments/EnvironmentTable/EnvironmentActionCell/EnvironmentActionCell.tsx +++ b/frontend/src/component/environments/EnvironmentTable/EnvironmentActionCell/EnvironmentActionCell.tsx @@ -1,9 +1,5 @@ import { ActionCell } from 'component/common/Table/cells/ActionCell/ActionCell'; -import { - DELETE_ENVIRONMENT, - UPDATE_ENVIRONMENT, -} from 'component/providers/AccessProvider/permissions'; -import { Edit, Delete } from '@mui/icons-material'; +import { UPDATE_ENVIRONMENT } from 'component/providers/AccessProvider/permissions'; import { useNavigate } from 'react-router-dom'; import { useState } from 'react'; import { IEnvironment } from 'interfaces/environments'; @@ -15,7 +11,7 @@ import useProjectRolePermissions from 'hooks/api/getters/useProjectRolePermissio import { useEnvironments } from 'hooks/api/getters/useEnvironments/useEnvironments'; import useToast from 'hooks/useToast'; import PermissionSwitch from 'component/common/PermissionSwitch/PermissionSwitch'; -import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton'; +import { EnvironmentActionCellPopover } from './EnvironmentActionCellPopover/EnvironmentActionCellPopover'; interface IEnvironmentTableActionsProps { environment: IEnvironment; @@ -103,32 +99,12 @@ export const EnvironmentActionCell = ({ onClick={() => setToggleModal(true)} /> - navigate(`/environments/${environment.name}`)} - > - - - setDeleteModal(true)} - > - - + navigate(`/environments/${environment.name}`)} + onClone={() => console.log('TODO: CLONE')} + onDelete={() => setDeleteModal(true)} + /> ({ + padding: theme.spacing(1), +})); + +const StyledMenuItem = styled(MenuItem)(({ theme }) => ({ + borderRadius: theme.shape.borderRadius, +})); + +interface IEnvironmentActionCellPopoverProps { + environment: IEnvironment; + onEdit: () => void; + onClone: () => void; + onDelete: () => void; +} + +export const EnvironmentActionCellPopover = ({ + environment, + onEdit, + onClone, + onDelete, +}: IEnvironmentActionCellPopoverProps) => { + const { uiConfig } = useUiConfig(); + + const [anchorEl, setAnchorEl] = useState(null); + + const open = Boolean(anchorEl); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + + const id = `environment-${environment.name}-actions`; + const menuId = `${id}-menu`; + + return ( + <> + + + + + + + + + {({ hasAccess }) => ( + { + onEdit(); + handleClose(); + }} + disabled={!hasAccess || environment.protected} + > + + + + + + Edit + + + + )} + + + {({ hasAccess }) => ( + { + onClone(); + handleClose(); + }} + disabled={!hasAccess} + > + + + + + + Clone + + + + )} + + } + /> + + {({ hasAccess }) => ( + { + onDelete(); + handleClose(); + }} + disabled={!hasAccess || environment.protected} + > + + + + + + Delete + + + + )} + + + + + ); +}; diff --git a/frontend/src/interfaces/uiConfig.ts b/frontend/src/interfaces/uiConfig.ts index d63e4db00c..895fd9e0ac 100644 --- a/frontend/src/interfaces/uiConfig.ts +++ b/frontend/src/interfaces/uiConfig.ts @@ -44,6 +44,7 @@ export interface IFlags { personalAccessTokens?: boolean; syncSSOGroups?: boolean; suggestChanges?: boolean; + cloneEnvironment?: boolean; } export interface IVersionInfo { diff --git a/src/lib/__snapshots__/create-config.test.ts.snap b/src/lib/__snapshots__/create-config.test.ts.snap index df078cf2c6..7559a12f89 100644 --- a/src/lib/__snapshots__/create-config.test.ts.snap +++ b/src/lib/__snapshots__/create-config.test.ts.snap @@ -69,6 +69,7 @@ exports[`should create default config 1`] = ` "ENABLE_DARK_MODE_SUPPORT": false, "anonymiseEventLog": false, "batchMetrics": false, + "cloneEnvironment": false, "embedProxy": false, "embedProxyFrontend": false, "personalAccessTokens": false, @@ -82,6 +83,7 @@ exports[`should create default config 1`] = ` "ENABLE_DARK_MODE_SUPPORT": false, "anonymiseEventLog": false, "batchMetrics": false, + "cloneEnvironment": false, "embedProxy": false, "embedProxyFrontend": false, "personalAccessTokens": false, diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index 95a69bba02..e8af3c9538 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -34,6 +34,10 @@ export const defaultExperimentalOptions = { process.env.UNLEASH_EXPERIMENTAL_RESPONSE_TIME_WITH_APP_NAME, false, ), + cloneEnvironment: parseEnvVarBoolean( + process.env.UNLEASH_EXPERIMENTAL_CLONE_ENVIRONMENT, + false, + ), }, externalResolver: { isEnabled: (): boolean => false }, }; @@ -48,6 +52,7 @@ export interface IExperimentalOptions { anonymiseEventLog?: boolean; personalAccessTokens?: boolean; syncSSOGroups?: boolean; + cloneEnvironment?: boolean; }; externalResolver: IExternalFlagResolver; } diff --git a/src/server-dev.ts b/src/server-dev.ts index 35d9a41990..4d7673a8fa 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -41,6 +41,7 @@ process.nextTick(async () => { personalAccessTokens: true, syncSSOGroups: true, suggestChanges: true, + cloneEnvironment: true, }, }, authentication: { diff --git a/src/test/config/test-config.ts b/src/test/config/test-config.ts index 33a7ca50e6..b2618d634a 100644 --- a/src/test/config/test-config.ts +++ b/src/test/config/test-config.ts @@ -29,6 +29,7 @@ export function createTestConfig(config?: IUnleashOptions): IUnleashConfig { batchMetrics: true, personalAccessTokens: true, syncSSOGroups: true, + cloneEnvironment: true, }, }, }; From 86a5d0956250a2138aeba4b80fab6cbea288c2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20G=C3=B3is?= Date: Fri, 21 Oct 2022 09:36:10 +0100 Subject: [PATCH 23/39] Group misc UI fixes (#2208) * fix: group actions positioning * fix: project tags aligned to the right, fix gap * fix: edit project user / group access button text "save" --- .../groups/GroupsList/GroupCard/GroupCard.tsx | 14 +++++++------- .../GroupCardActions/GroupCardActions.tsx | 1 + .../ProjectAccessAssign/ProjectAccessAssign.tsx | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCard.tsx b/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCard.tsx index b9f0cc5d13..d05db751ff 100644 --- a/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCard.tsx +++ b/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCard.tsx @@ -70,12 +70,12 @@ const StyledCounterDescription = styled('span')(({ theme }) => ({ marginLeft: theme.spacing(1), })); -const ProjectBadgeContainer = styled('div')(() => ({ +const ProjectBadgeContainer = styled('div')(({ theme }) => ({ maxWidth: '50%', -})); - -const StyledBadge = styled(Badge)(() => ({ - marginRight: 0.5, + display: 'flex', + justifyContent: 'flex-end', + gap: theme.spacing(0.5), + flexWrap: 'wrap', })); interface IGroupCardProps { @@ -122,7 +122,7 @@ export const GroupCard = ({ group }: IGroupCardProps) => { placement="bottom-end" describeChild > - { e.preventDefault(); navigate( @@ -133,7 +133,7 @@ export const GroupCard = ({ group }: IGroupCardProps) => { icon={} > {project} - + ))} elseShow={ diff --git a/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCardActions/GroupCardActions.tsx b/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCardActions/GroupCardActions.tsx index c4a277bb54..a441615528 100644 --- a/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCardActions/GroupCardActions.tsx +++ b/frontend/src/component/admin/groups/GroupsList/GroupCard/GroupCardActions/GroupCardActions.tsx @@ -16,6 +16,7 @@ import { Link } from 'react-router-dom'; const StyledActions = styled('div')(({ theme }) => ({ display: 'flex', justifyContent: 'center', + transform: 'translate3d(8px, -6px, 0)', })); const StyledPopover = styled(Popover)(({ theme }) => ({ diff --git a/frontend/src/component/project/ProjectAccess/ProjectAccessAssign/ProjectAccessAssign.tsx b/frontend/src/component/project/ProjectAccess/ProjectAccessAssign/ProjectAccessAssign.tsx index 4dab92db9e..26e750e103 100644 --- a/frontend/src/component/project/ProjectAccess/ProjectAccessAssign/ProjectAccessAssign.tsx +++ b/frontend/src/component/project/ProjectAccess/ProjectAccessAssign/ProjectAccessAssign.tsx @@ -404,7 +404,7 @@ export const ProjectAccessAssign = ({ color="primary" disabled={!isValid} > - Assign {entityType} + {edit ? 'Save' : `Assign ${entityType}`} navigate(GO_BACK)}> Cancel From de43064f199f8a9cc1248e490172c64bdbe01a9b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Oct 2022 13:26:18 +0000 Subject: [PATCH 24/39] chore(deps): update dependency fast-check to v3.3.0 (#2220) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 01220ea0a2..84b4613193 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "eslint-plugin-import": "2.26.0", "eslint-plugin-prettier": "4.2.1", "faker": "5.5.3", - "fast-check": "3.2.0", + "fast-check": "3.3.0", "fetch-mock": "9.11.0", "husky": "8.0.1", "jest": "29.0.1", diff --git a/yarn.lock b/yarn.lock index cc17bafe57..e778220e08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3434,10 +3434,10 @@ faker@5.5.3: resolved "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz" integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== -fast-check@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.2.0.tgz#a1f2848de45a4ea6b4606993022ffde7003aa296" - integrity sha512-RH1GMdVeN6Le0B4gI7fz5VZnCgrkREqt4SFMGyFe8v9n06ZuFdR2npxJDl8GUvZQZCq0/mo92JYUZInZnUm0nw== +fast-check@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.3.0.tgz#002b7cc53166129545983ab4fe97a80fef6ac8b4" + integrity sha512-Zu6tZ4g0T4H9Tiz3tdNPEHrSbuICj7yhdOM9RCZKNMkpjZ9avDV3ORklXaEmh4zvkX24/bGZ9DxKKqWfXttUqw== dependencies: pure-rand "^5.0.2" From 618159701419d04f2d97a059932ef838a306c9b9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Oct 2022 16:24:24 +0000 Subject: [PATCH 25/39] chore(deps): update dependency @swc/core to v1.3.10 (#2223) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 138 +++++++++++++++++++++++++-------------------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index 84b4613193..a01ce7546f 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "devDependencies": { "@apidevtools/swagger-parser": "10.1.0", "@babel/core": "7.19.6", - "@swc/core": "1.3.9", + "@swc/core": "1.3.10", "@swc/jest": "0.2.23", "@types/bcryptjs": "2.4.2", "@types/cors": "2.8.12", diff --git a/yarn.lock b/yarn.lock index e778220e08..c514f58da3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1224,101 +1224,101 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@swc/core-android-arm-eabi@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.9.tgz#6ab77525f2d22fcd321d0e29704d0820608b9e18" - integrity sha512-+F+sU2l49Po4tJoNtIpFwt0k1sspymvPMM+DCpnkHF1idzRiOU5NGgVzmLDjoO9AnxHa7EBJ3itN+PP2Dd06+A== +"@swc/core-android-arm-eabi@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.10.tgz#1464152270f2d3f24b0731a13669932a24398e5e" + integrity sha512-yeW0dvv7SSmb0Y1Hhr9+QceoDjn2uulcaY+LUZ9Zt2UBHl/95c7QVgjDaE2B/lSlTV5En/81/q58lXoT/IqjGw== dependencies: "@swc/wasm" "1.2.122" -"@swc/core-android-arm64@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.3.9.tgz#d9467488dd9c00d50180f9ccded9eed6f54e4423" - integrity sha512-HSWdex3yd4CRefkM2WVz0nTKjpirNZnwSlghqe4ct9QAYGMiiPesYgWPAnq/PpnYfmjQse4yvEclamGiek6zDA== +"@swc/core-android-arm64@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.3.10.tgz#dff907882b596278bcc0d62acb589eb6eb405654" + integrity sha512-HXkUXP4Lm3Xc9qfd9J/6/YfxknWk0Esqmu6nFRikXDc691aXHDcDZ2D8SqPlhx2CZT1juuRajphOaUXMTaAP3g== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-darwin-arm64@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.9.tgz#60ad2157bfa67038cf94fa0f9169f5d2609f6011" - integrity sha512-E7WJY1LsMJtOtUYc/JXl8qlt6USnzodWmdO1eAAOSAODEdX9AjgG3fRT94o3UcmvMrto7sxBXVExj8wG7Cxeng== +"@swc/core-darwin-arm64@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.10.tgz#65bd6ffe7e5188975b1497e5310a29fa14b58fdb" + integrity sha512-X1eM5LDk24W/pbGamwpMRGkQW1BC+1xYNzS38hiK5YCS20TDZwI5LIg2pTEecKl/SRt1WFMwAThUwKbp4m1HIA== -"@swc/core-darwin-x64@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.9.tgz#947095894b526c90724f273b968e124019a3c267" - integrity sha512-0+dFCAcLEBxwIO+0Nt+OT8mjPpvBMBWIuFWB1DNiUu2K73+OB0i+llzsCJFoasISHR+YJD0bGyv+8AtVuUdFAw== +"@swc/core-darwin-x64@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.10.tgz#3ad9073b6aeede0c147376844fb1381976c0c13c" + integrity sha512-wrsv6upfEzwCGHB7y7IsdrppyywNV7C5TZDXVYv3GCUQZAFlRBar+1yHMojuPxPvyjjfHtTEr68MOhUwq9ti3w== -"@swc/core-freebsd-x64@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.9.tgz#ebcb068df6528f824c803329d43d752889eef46f" - integrity sha512-JbHIeklQPRBEZUfKAKt/IB/ayi7dJZ9tEGu/fDxNfk8Znu1Md+YOKRyN5FPMXfYrL5yFUXnlFOb2LX6wjNhhjQ== +"@swc/core-freebsd-x64@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.10.tgz#1e7033f10f8787d40819051a03fdb761c1bd9525" + integrity sha512-tJ+ncGIZcueU3RVuQtawLvU0zGza4YKH7aD9unaypFE6e0qx34EX7fzObAhTUi881muEFIU/mDKmVpFqdEi7QQ== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-linux-arm-gnueabihf@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.9.tgz#0882d86a301f5eece588ec41fe7f1d0c9629f2c7" - integrity sha512-Yc1G8FGXmq6yGKtu5wYCcvVWBtqU0/3FUk6zJM+7pFiivKsVHJcgWrkgLO1u6h7bgEdQIYwfM3/BbRNE5CtdnA== +"@swc/core-linux-arm-gnueabihf@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.10.tgz#2ee6095adf323ce6aebb651b80c21c476a0ac812" + integrity sha512-4IsAIBk1zdzTINZR5+kPE170yyIQMY76R/yKxtHuzMYxhOaErxsObokttyZ9k9ImlZRujTzEn3A5SsZ/EvibUA== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-linux-arm64-gnu@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.9.tgz#6bcf96a3826b069cb053f4b9b9f9148388d0f067" - integrity sha512-PrBjmPIMhoQLCpfaZl2b1cCXnaNPddQB/ssMVqQ6eXChBJfcv14M5BjxtI2ORi4HoEDlsbX+k50sL666M3lnBw== +"@swc/core-linux-arm64-gnu@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.10.tgz#c0af92499374ea775e8da0e871d0d0e6a74d0643" + integrity sha512-OaOd+wFbcTQwOD9Ce5luUp8qYoEvdX3s00Bby+j7hybu1fVZK4W40cqzVRp/EDElriG0I+tAdFvQW7PCcEzsPQ== -"@swc/core-linux-arm64-musl@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.9.tgz#cac78de3fcdd22417532d95ddc7c229ccfef9920" - integrity sha512-jJT56vt81o2N3O2nXp+MZGM6mbgkNx6lvvRT6yISW29fLM6NHBXmkGcjaWOD9VFJDRmu/MtFxbElPxr6ikrFYQ== +"@swc/core-linux-arm64-musl@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.10.tgz#84c91a35af2353b31461c1bd5aab055158b168e9" + integrity sha512-AUzQ/5T2hoNIgZlnbflDufWDEfJbw+w8FwKoCp7kKyLLAXG8RHgTsx0TazzQ8PVcAQk8lWI2EBrObLL82n91kQ== -"@swc/core-linux-x64-gnu@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.9.tgz#e457e5f50ecc344278f69e90aafdcef4a152bae8" - integrity sha512-60ZreTvrJk3N7xvPzQeQJDePsXUmSUZkKD6lc0xzug4bv53NyUIQ8gH8nzVsV++D9NZeVxXp6WqqFLcgt7yEDQ== +"@swc/core-linux-x64-gnu@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.10.tgz#6f67b3836ee0a72da14155efe700dc706029de5a" + integrity sha512-rjAyQVRkHCWvCA0wyk0nhJdVMfown6wLvDztKZ0wyT6NDDFdvekTMgALQXL5MW4Q0MYBvGMSauoysTZCdZW9aA== -"@swc/core-linux-x64-musl@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.9.tgz#0009205aeb5a42009794d75949f79d622563dac3" - integrity sha512-UBApPfUSP+w6ye6V1oT4EGh3LFCFrZaQsC1CkTuiYXXSmQMzkYE0Jzegn3R7MHWCJSneRwXRTKrkdhrNBUqWKA== +"@swc/core-linux-x64-musl@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.10.tgz#b2035a4af1e6825e30e08e756c45b4a078dfef07" + integrity sha512-X5KFbPTxcXaycGOrKoiPNCBUOjhCf8GpeNFpM7QASEWulWWM7nkMPrNeXKmQgJBlRT2j3iLine4Pkyc2bLPlVg== -"@swc/core-win32-arm64-msvc@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.9.tgz#2f4522c3da4d37dd08c1249a837c4a6643571c0a" - integrity sha512-4FQSalXbbnqTLVGRljRnw/bJ99Jwj1WnXz/aJM/SVL8S9Zbc82+3v+wXL/9NGwaAndu2QUkb2KPYNAHvB7PCdw== +"@swc/core-win32-arm64-msvc@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.10.tgz#40d5be1ff4299c816e11a59579434fc5800ccdba" + integrity sha512-KcQIERfwGyTAcJOnqGsFbRtU6wSm91xwYFVYjeYy2aNU/SKQ5rtwPTW1UAaUDdwDcS1Y49fNWWj+GPtdaZ+WXQ== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-win32-ia32-msvc@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.9.tgz#e5dd2830a103b8fcb89e843cc6cd0587dbd9140a" - integrity sha512-ZkTw1Cm+b2QBf/NjkJJbocvgT0NWdfPQL0OyMkuTAinRzfrMmq/lmshjnqj3ysFVeI4uuJTNemiT6mivpLmuBw== +"@swc/core-win32-ia32-msvc@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.10.tgz#d011aa2a482a71b580d2fb13a256f0fe3775a45c" + integrity sha512-bNpFGZX8tNkwWbQyFRSO+wJ9BgE38ItEodTUXmBsC1xhsHPYLYMlP+6lDKvkO7+jzRMLbyWWUyoWXCEfkvdYWw== dependencies: "@swc/wasm" "1.2.130" -"@swc/core-win32-x64-msvc@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.9.tgz#49462ebcaed4caa5a3f99dcd2a48035b870750ae" - integrity sha512-moKi2prCKzYnXXlrLf5nwAN4uGSm4YpsW2xzYiZWJJDRqu74VoUWoDkG25jalHTfN/PSBQg4dkFWhhUe89JJVw== +"@swc/core-win32-x64-msvc@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.10.tgz#59ee9a8e250ffd431295cb8e142462413f04cd62" + integrity sha512-40yeeov6XcJHm99anMeEn/NwhDcoM2fhBQHWRVZfCa43QC45AUjJ3kWrD76U6MPGnGy7MsCOXdFyu1mJOAHKEw== -"@swc/core@1.3.9": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.9.tgz#9dcc342cbcbe72ba6613a23840a2092c13699881" - integrity sha512-PCRCO9vIoEX3FyS3z/FkWVYJzuspUq0LLaWdK3L30+KQDtH29K+LQdRc2Dzin2MU5MpY4bSHydAwl9M6cmZ9OA== +"@swc/core@1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.10.tgz#32f4d5ac4c7f09e90f421791b0d325d86c46bbbd" + integrity sha512-A5YjYFa45ThHOwftKqIQKNbukxJGTsdBQAqoTr+QD1/L6jbRg3xxhU5UDyVdUIULz40PH6YQiulyUVbyrjl1Iw== optionalDependencies: - "@swc/core-android-arm-eabi" "1.3.9" - "@swc/core-android-arm64" "1.3.9" - "@swc/core-darwin-arm64" "1.3.9" - "@swc/core-darwin-x64" "1.3.9" - "@swc/core-freebsd-x64" "1.3.9" - "@swc/core-linux-arm-gnueabihf" "1.3.9" - "@swc/core-linux-arm64-gnu" "1.3.9" - "@swc/core-linux-arm64-musl" "1.3.9" - "@swc/core-linux-x64-gnu" "1.3.9" - "@swc/core-linux-x64-musl" "1.3.9" - "@swc/core-win32-arm64-msvc" "1.3.9" - "@swc/core-win32-ia32-msvc" "1.3.9" - "@swc/core-win32-x64-msvc" "1.3.9" + "@swc/core-android-arm-eabi" "1.3.10" + "@swc/core-android-arm64" "1.3.10" + "@swc/core-darwin-arm64" "1.3.10" + "@swc/core-darwin-x64" "1.3.10" + "@swc/core-freebsd-x64" "1.3.10" + "@swc/core-linux-arm-gnueabihf" "1.3.10" + "@swc/core-linux-arm64-gnu" "1.3.10" + "@swc/core-linux-arm64-musl" "1.3.10" + "@swc/core-linux-x64-gnu" "1.3.10" + "@swc/core-linux-x64-musl" "1.3.10" + "@swc/core-win32-arm64-msvc" "1.3.10" + "@swc/core-win32-ia32-msvc" "1.3.10" + "@swc/core-win32-x64-msvc" "1.3.10" "@swc/jest@0.2.23": version "0.2.23" From 95293c57696b1a0ffaf7db1776fa682a31a86fc6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Oct 2022 19:38:27 +0000 Subject: [PATCH 26/39] chore(deps): update dependency vite to v3.1.8 (#2221) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 164 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 152 insertions(+), 14 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 0beb0817bc..6316941e66 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -89,7 +89,7 @@ "swr": "1.3.0", "tss-react": "4.0.0", "typescript": "4.8.4", - "vite": "3.0.9", + "vite": "3.1.8", "vite-plugin-env-compatible": "1.1.1", "vite-plugin-svgr": "2.2.2", "vite-tsconfig-paths": "3.5.2", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index c55dedc3d8..f46e993f76 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1740,11 +1740,21 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== +"@esbuild/android-arm@0.15.12": + version "0.15.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769" + integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA== + "@esbuild/linux-loong64@0.14.53": version "0.14.53" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz#251b4cd6760fadb4d68a05815e6dc5e432d69cd6" integrity sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg== +"@esbuild/linux-loong64@0.15.12": + version "0.15.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1" + integrity sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw== + "@eslint/eslintrc@^1.3.3": version "1.3.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" @@ -3898,101 +3908,201 @@ esbuild-android-64@0.14.53: resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.53.tgz#259bc3ef1399a3cad8f4f67c40ee20779c4de675" integrity sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA== +esbuild-android-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc" + integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q== + esbuild-android-arm64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.53.tgz#2158253d4e8f9fdd2a081bbb4f73b8806178841e" integrity sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A== +esbuild-android-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666" + integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA== + esbuild-darwin-64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.53.tgz#b4681831fd8f8d06feb5048acbe90d742074cc2a" integrity sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg== +esbuild-darwin-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25" + integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q== + esbuild-darwin-arm64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.53.tgz#d267d957852d121b261b3f76ead86e5b5463acc9" integrity sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA== +esbuild-darwin-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04" + integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw== + esbuild-freebsd-64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.53.tgz#aca2af6d72b537fe66a38eb8f374fb66d4c98ca0" integrity sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w== +esbuild-freebsd-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0" + integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw== + esbuild-freebsd-arm64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.53.tgz#76282e19312d914c34343c8a7da6cc5f051580b9" integrity sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ== +esbuild-freebsd-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e" + integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g== + esbuild-linux-32@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.53.tgz#1045d34cf7c5faaf2af3b29cc1573b06580c37e5" integrity sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg== +esbuild-linux-32@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4" + integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA== + esbuild-linux-64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.53.tgz#ab3f2ee2ebb5a6930c72d9539cb34b428808cbe4" integrity sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ== +esbuild-linux-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931" + integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA== + esbuild-linux-arm64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.53.tgz#1f5530412f6690949e78297122350488d3266cfe" integrity sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw== +esbuild-linux-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5" + integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ== + esbuild-linux-arm@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.53.tgz#a44ec9b5b42007ab6c0d65a224ccc6bbd97c54cf" integrity sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA== +esbuild-linux-arm@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67" + integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A== + esbuild-linux-mips64le@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.53.tgz#a4d0b6b17cfdeea4e41b0b085a5f73d99311be9f" integrity sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ== +esbuild-linux-mips64le@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2" + integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A== + esbuild-linux-ppc64le@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.53.tgz#8c331822c85465434e086e3e6065863770c38139" integrity sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA== +esbuild-linux-ppc64le@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7" + integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg== + esbuild-linux-riscv64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.53.tgz#36fd75543401304bea8a2d63bf8ea18aaa508e00" integrity sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ== +esbuild-linux-riscv64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693" + integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA== + esbuild-linux-s390x@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.53.tgz#1622677ab6824123f48f75d3afc031cd41936129" integrity sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg== +esbuild-linux-s390x@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f" + integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww== + esbuild-netbsd-64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.53.tgz#e86d0efd0116658be335492ed12e66b26b4baf52" integrity sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ== +esbuild-netbsd-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42" + integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w== + esbuild-openbsd-64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.53.tgz#9bcbbe6f86304872c6e91f64c8eb73fc29c3588b" integrity sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ== +esbuild-openbsd-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae" + integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw== + esbuild-sunos-64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.53.tgz#f7a872f7460bfb7b131f7188a95fbce3d1c577e8" integrity sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g== +esbuild-sunos-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e" + integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg== + esbuild-windows-32@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.53.tgz#c5e3ca50e2d1439cc2c9fe4defa63bcd474ce709" integrity sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg== +esbuild-windows-32@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0" + integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw== + esbuild-windows-64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.53.tgz#ec2ab4a60c5215f092ffe1eab6d01319e88238af" integrity sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ== +esbuild-windows-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6" + integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA== + esbuild-windows-arm64@0.14.53: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.53.tgz#f71d403806bdf9f4a1f9d097db9aec949bd675c8" integrity sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ== +esbuild-windows-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328" + integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA== + esbuild@^0.14.47: version "0.14.53" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.53.tgz#20b1007f686e8584f2a01a1bec5a37aac9498ce4" @@ -4020,6 +4130,34 @@ esbuild@^0.14.47: esbuild-windows-64 "0.14.53" esbuild-windows-arm64 "0.14.53" +esbuild@^0.15.9: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c" + integrity sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng== + optionalDependencies: + "@esbuild/android-arm" "0.15.12" + "@esbuild/linux-loong64" "0.15.12" + esbuild-android-64 "0.15.12" + esbuild-android-arm64 "0.15.12" + esbuild-darwin-64 "0.15.12" + esbuild-darwin-arm64 "0.15.12" + esbuild-freebsd-64 "0.15.12" + esbuild-freebsd-arm64 "0.15.12" + esbuild-linux-32 "0.15.12" + esbuild-linux-64 "0.15.12" + esbuild-linux-arm "0.15.12" + esbuild-linux-arm64 "0.15.12" + esbuild-linux-mips64le "0.15.12" + esbuild-linux-ppc64le "0.15.12" + esbuild-linux-riscv64 "0.15.12" + esbuild-linux-s390x "0.15.12" + esbuild-netbsd-64 "0.15.12" + esbuild-openbsd-64 "0.15.12" + esbuild-sunos-64 "0.15.12" + esbuild-windows-32 "0.15.12" + esbuild-windows-64 "0.15.12" + esbuild-windows-arm64 "0.15.12" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -6330,13 +6468,6 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -"rollup@>=2.75.6 <2.77.0 || ~2.77.0": - version "2.77.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" - integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== - optionalDependencies: - fsevents "~2.3.2" - rollup@^2.75.6: version "2.77.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.2.tgz#6b6075c55f9cc2040a5912e6e062151e42e2c4e3" @@ -6344,6 +6475,13 @@ rollup@^2.75.6: optionalDependencies: fsevents "~2.3.2" +rollup@~2.78.0: + version "2.78.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f" + integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg== + optionalDependencies: + fsevents "~2.3.2" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -7015,15 +7153,15 @@ vite-tsconfig-paths@3.5.2: recrawl-sync "^2.0.3" tsconfig-paths "^4.0.0" -vite@3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.9.tgz#45fac22c2a5290a970f23d66c1aef56a04be8a30" - integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw== +vite@3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/vite/-/vite-3.1.8.tgz#fa29144167d19b773baffd65b3972ea4c12359c9" + integrity sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg== dependencies: - esbuild "^0.14.47" + esbuild "^0.15.9" postcss "^8.4.16" resolve "^1.22.1" - rollup ">=2.75.6 <2.77.0 || ~2.77.0" + rollup "~2.78.0" optionalDependencies: fsevents "~2.3.2" From ab618d307adb904c3a9c933c041ef4074deb2380 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Oct 2022 23:36:46 +0000 Subject: [PATCH 27/39] chore(deps): update dependency vitest to v0.24.3 (#2224) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 196 ++++++------------------------------------ 2 files changed, 26 insertions(+), 172 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 6316941e66..50a8a69c83 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -93,7 +93,7 @@ "vite-plugin-env-compatible": "1.1.1", "vite-plugin-svgr": "2.2.2", "vite-tsconfig-paths": "3.5.2", - "vitest": "0.22.1", + "vitest": "0.24.3", "whatwg-fetch": "3.6.2" }, "resolutions": { diff --git a/frontend/yarn.lock b/frontend/yarn.lock index f46e993f76..a609c6b1e9 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1745,11 +1745,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769" integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA== -"@esbuild/linux-loong64@0.14.53": - version "0.14.53" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz#251b4cd6760fadb4d68a05815e6dc5e432d69cd6" - integrity sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg== - "@esbuild/linux-loong64@0.15.12": version "0.15.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1" @@ -3903,233 +3898,106 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild-android-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.53.tgz#259bc3ef1399a3cad8f4f67c40ee20779c4de675" - integrity sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA== - esbuild-android-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc" integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q== -esbuild-android-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.53.tgz#2158253d4e8f9fdd2a081bbb4f73b8806178841e" - integrity sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A== - esbuild-android-arm64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666" integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA== -esbuild-darwin-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.53.tgz#b4681831fd8f8d06feb5048acbe90d742074cc2a" - integrity sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg== - esbuild-darwin-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25" integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q== -esbuild-darwin-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.53.tgz#d267d957852d121b261b3f76ead86e5b5463acc9" - integrity sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA== - esbuild-darwin-arm64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04" integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw== -esbuild-freebsd-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.53.tgz#aca2af6d72b537fe66a38eb8f374fb66d4c98ca0" - integrity sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w== - esbuild-freebsd-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0" integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw== -esbuild-freebsd-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.53.tgz#76282e19312d914c34343c8a7da6cc5f051580b9" - integrity sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ== - esbuild-freebsd-arm64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e" integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g== -esbuild-linux-32@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.53.tgz#1045d34cf7c5faaf2af3b29cc1573b06580c37e5" - integrity sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg== - esbuild-linux-32@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4" integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA== -esbuild-linux-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.53.tgz#ab3f2ee2ebb5a6930c72d9539cb34b428808cbe4" - integrity sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ== - esbuild-linux-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931" integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA== -esbuild-linux-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.53.tgz#1f5530412f6690949e78297122350488d3266cfe" - integrity sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw== - esbuild-linux-arm64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5" integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ== -esbuild-linux-arm@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.53.tgz#a44ec9b5b42007ab6c0d65a224ccc6bbd97c54cf" - integrity sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA== - esbuild-linux-arm@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67" integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A== -esbuild-linux-mips64le@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.53.tgz#a4d0b6b17cfdeea4e41b0b085a5f73d99311be9f" - integrity sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ== - esbuild-linux-mips64le@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2" integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A== -esbuild-linux-ppc64le@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.53.tgz#8c331822c85465434e086e3e6065863770c38139" - integrity sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA== - esbuild-linux-ppc64le@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7" integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg== -esbuild-linux-riscv64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.53.tgz#36fd75543401304bea8a2d63bf8ea18aaa508e00" - integrity sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ== - esbuild-linux-riscv64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693" integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA== -esbuild-linux-s390x@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.53.tgz#1622677ab6824123f48f75d3afc031cd41936129" - integrity sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg== - esbuild-linux-s390x@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f" integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww== -esbuild-netbsd-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.53.tgz#e86d0efd0116658be335492ed12e66b26b4baf52" - integrity sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ== - esbuild-netbsd-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42" integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w== -esbuild-openbsd-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.53.tgz#9bcbbe6f86304872c6e91f64c8eb73fc29c3588b" - integrity sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ== - esbuild-openbsd-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae" integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw== -esbuild-sunos-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.53.tgz#f7a872f7460bfb7b131f7188a95fbce3d1c577e8" - integrity sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g== - esbuild-sunos-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e" integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg== -esbuild-windows-32@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.53.tgz#c5e3ca50e2d1439cc2c9fe4defa63bcd474ce709" - integrity sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg== - esbuild-windows-32@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0" integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw== -esbuild-windows-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.53.tgz#ec2ab4a60c5215f092ffe1eab6d01319e88238af" - integrity sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ== - esbuild-windows-64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6" integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA== -esbuild-windows-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.53.tgz#f71d403806bdf9f4a1f9d097db9aec949bd675c8" - integrity sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ== - esbuild-windows-arm64@0.15.12: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328" integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA== -esbuild@^0.14.47: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.53.tgz#20b1007f686e8584f2a01a1bec5a37aac9498ce4" - integrity sha512-ohO33pUBQ64q6mmheX1mZ8mIXj8ivQY/L4oVuAshr+aJI+zLl+amrp3EodrUNDNYVrKJXGPfIHFGhO8slGRjuw== - optionalDependencies: - "@esbuild/linux-loong64" "0.14.53" - esbuild-android-64 "0.14.53" - esbuild-android-arm64 "0.14.53" - esbuild-darwin-64 "0.14.53" - esbuild-darwin-arm64 "0.14.53" - esbuild-freebsd-64 "0.14.53" - esbuild-freebsd-arm64 "0.14.53" - esbuild-linux-32 "0.14.53" - esbuild-linux-64 "0.14.53" - esbuild-linux-arm "0.14.53" - esbuild-linux-arm64 "0.14.53" - esbuild-linux-mips64le "0.14.53" - esbuild-linux-ppc64le "0.14.53" - esbuild-linux-riscv64 "0.14.53" - esbuild-linux-s390x "0.14.53" - esbuild-netbsd-64 "0.14.53" - esbuild-openbsd-64 "0.14.53" - esbuild-sunos-64 "0.14.53" - esbuild-windows-32 "0.14.53" - esbuild-windows-64 "0.14.53" - esbuild-windows-arm64 "0.14.53" - esbuild@^0.15.9: version "0.15.12" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c" @@ -6076,15 +5944,6 @@ plausible-tracker@0.3.8: resolved "https://registry.yarnpkg.com/plausible-tracker/-/plausible-tracker-0.3.8.tgz#9b8b322cc41e0e1d6473869ef234deea365a5a40" integrity sha512-lmOWYQ7s9KOUJ1R+YTOR3HrjdbxIS2Z4de0P/Jx2dQPteznJl2eX3tXxKClpvbfyGP59B5bbhW8ftN59HbbFSg== -postcss@^8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@^8.4.16: version "8.4.16" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" @@ -6468,13 +6327,6 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^2.75.6: - version "2.77.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.2.tgz#6b6075c55f9cc2040a5912e6e062151e42e2c4e3" - integrity sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g== - optionalDependencies: - fsevents "~2.3.2" - rollup@~2.78.0: version "2.78.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f" @@ -6780,6 +6632,13 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-literal@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-0.4.2.tgz#4f9fa6c38bb157b924e9ace7155ebf8a2342cbcf" + integrity sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw== + dependencies: + acorn "^8.8.0" + style-mod@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" @@ -6846,10 +6705,15 @@ through@^2.3.6, through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tinypool@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.2.4.tgz#4d2598c4689d1a2ce267ddf3360a9c6b3925a20c" - integrity sha512-Vs3rhkUH6Qq1t5bqtb816oT+HeJTXfwt2cbPH17sWHIYKTotQIFPk3tf2fgqRrVyMDVOc1EnPgzIxfIulXVzwQ== +tinybench@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.3.1.tgz#14f64e6b77d7ef0b1f6ab850c7a808c6760b414d" + integrity sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA== + +tinypool@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.3.0.tgz#c405d8b743509fc28ea4ca358433190be654f819" + integrity sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ== tinyspy@^1.0.2: version "1.0.2" @@ -7153,7 +7017,7 @@ vite-tsconfig-paths@3.5.2: recrawl-sync "^2.0.3" tsconfig-paths "^4.0.0" -vite@3.1.8: +vite@3.1.8, vite@^3.0.0: version "3.1.8" resolved "https://registry.yarnpkg.com/vite/-/vite-3.1.8.tgz#fa29144167d19b773baffd65b3972ea4c12359c9" integrity sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg== @@ -7165,22 +7029,10 @@ vite@3.1.8: optionalDependencies: fsevents "~2.3.2" -"vite@^2.9.12 || ^3.0.0-0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.4.tgz#c61688d6b97573e96cf5ac25f2d68597b5ce68e8" - integrity sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA== - dependencies: - esbuild "^0.14.47" - postcss "^8.4.14" - resolve "^1.22.1" - rollup "^2.75.6" - optionalDependencies: - fsevents "~2.3.2" - -vitest@0.22.1: - version "0.22.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.22.1.tgz#3122e6024bf782ee9aca53034017af7adb009c32" - integrity sha512-+x28YTnSLth4KbXg7MCzoDAzPJlJex7YgiZbUh6YLp0/4PqVZ7q7/zyfdL0OaPtKTpNiQFPpMC8Y2MSzk8F7dw== +vitest@0.24.3: + version "0.24.3" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.24.3.tgz#d91c7e2d557877d5270033efdf18add6063f0c97" + integrity sha512-aM0auuPPgMSstWvr851hB74g/LKaKBzSxcG3da7ejfZbx08Y21JpZmbmDYrMTCGhVZKqTGwzcnLMwyfz2WzkhQ== dependencies: "@types/chai" "^4.3.3" "@types/chai-subset" "^1.3.3" @@ -7188,9 +7040,11 @@ vitest@0.22.1: chai "^4.3.6" debug "^4.3.4" local-pkg "^0.4.2" - tinypool "^0.2.4" + strip-literal "^0.4.2" + tinybench "^2.3.0" + tinypool "^0.3.0" tinyspy "^1.0.2" - vite "^2.9.12 || ^3.0.0-0" + vite "^3.0.0" w3c-keyname@^2.2.4: version "2.2.4" From fc32c0b4d4fed4285be9e8b7d738177db631ed3f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 02:48:59 +0000 Subject: [PATCH 28/39] chore(deps): update dependency eslint to v8.26.0 (#2226) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 31 ++++++++++++++++--------------- package.json | 2 +- yarn.lock | 34 ++++++++++++++++++++-------------- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 50a8a69c83..2cc965e1fb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -62,7 +62,7 @@ "debounce": "1.2.1", "deep-diff": "1.0.2", "dequal": "2.0.3", - "eslint": "8.25.0", + "eslint": "8.26.0", "eslint-config-react-app": "7.0.1", "fast-json-patch": "3.1.1", "http-proxy-middleware": "2.0.6", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index a609c6b1e9..05671e37a5 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1765,10 +1765,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.10.5": - version "0.10.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" - integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== +"@humanwhocodes/config-array@^0.11.6": + version "0.11.6" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.6.tgz#6a51d603a3aaf8d4cf45b42b3f2ac9318a4adc4b" + integrity sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -2046,7 +2046,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -4211,14 +4211,15 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.25.0: - version "8.25.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b" - integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== +eslint@8.26.0: + version "8.26.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.26.0.tgz#2bcc8836e6c424c4ac26a5674a70d44d84f2181d" + integrity sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg== dependencies: "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/config-array" "^0.11.6" "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -4234,14 +4235,14 @@ eslint@8.25.0: fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - glob-parent "^6.0.1" + glob-parent "^6.0.2" globals "^13.15.0" - globby "^11.1.0" grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + is-path-inside "^3.0.3" js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" @@ -4639,7 +4640,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -4682,7 +4683,7 @@ globals@^13.15.0: dependencies: type-fest "^0.20.2" -globby@^11.0.4, globby@^11.1.0: +globby@^11.0.4: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -5058,7 +5059,7 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== diff --git a/package.json b/package.json index a01ce7546f..0c4af31de0 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "copyfiles": "2.4.1", "coveralls": "3.1.1", "del-cli": "5.0.0", - "eslint": "8.25.0", + "eslint": "8.26.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-typescript": "17.0.0", "eslint-config-prettier": "8.5.0", diff --git a/yarn.lock b/yarn.lock index c514f58da3..19ad59c577 100644 --- a/yarn.lock +++ b/yarn.lock @@ -831,10 +831,10 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@humanwhocodes/config-array@^0.10.5": - version "0.10.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" - integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== +"@humanwhocodes/config-array@^0.11.6": + version "0.11.6" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.6.tgz#6a51d603a3aaf8d4cf45b42b3f2ac9318a4adc4b" + integrity sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1164,7 +1164,7 @@ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -3183,14 +3183,15 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.25.0: - version "8.25.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b" - integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== +eslint@8.26.0: + version "8.26.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.26.0.tgz#2bcc8836e6c424c4ac26a5674a70d44d84f2181d" + integrity sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg== dependencies: "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/config-array" "^0.11.6" "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -3206,14 +3207,14 @@ eslint@8.25.0: fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - glob-parent "^6.0.1" + glob-parent "^6.0.2" globals "^13.15.0" - globby "^11.1.0" grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + is-path-inside "^3.0.3" js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" @@ -3762,9 +3763,9 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" @@ -4241,6 +4242,11 @@ is-path-cwd@^3.0.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-3.0.0.tgz#889b41e55c8588b1eb2a96a61d05740a674521c7" integrity sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-path-inside@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" From ca4c030178172e6ec843dca0c09623bd73e1e1c9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 05:24:11 +0000 Subject: [PATCH 29/39] chore(deps): update jest monorepo (#2227) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 703 ++++++++++++++++++++++++++++----------------------- 2 files changed, 394 insertions(+), 313 deletions(-) diff --git a/package.json b/package.json index 0c4af31de0..949c965cbe 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "@types/express": "4.17.14", "@types/express-session": "1.17.5", "@types/faker": "5.5.9", - "@types/jest": "29.0.0", + "@types/jest": "29.2.0", "@types/js-yaml": "4.0.5", "@types/make-fetch-happen": "10.0.0", "@types/memoizee": "0.4.8", @@ -173,7 +173,7 @@ "fast-check": "3.3.0", "fetch-mock": "9.11.0", "husky": "8.0.1", - "jest": "29.0.1", + "jest": "29.2.1", "lint-staged": "13.0.3", "nock": "13.2.9", "openapi-enforcer": "1.22.0", diff --git a/yarn.lock b/yarn.lock index 19ad59c577..061c824332 100644 --- a/yarn.lock +++ b/yarn.lock @@ -866,49 +866,49 @@ resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.0.1.tgz#e0e429cfc89900e3a46ce27f493bf488395ade39" - integrity sha512-SxLvSKf9gk4Rvt3p2KRQWVQ3sVj7S37rjlCHwp2+xNcRO/X+Uw0idbkfOtciUpjghHIxyggqcrrKhThQ+vClLQ== +"@jest/console@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.2.1.tgz#5f2c62dcdd5ce66e94b6d6729e021758bceea090" + integrity sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.2.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.0.1" - jest-util "^29.0.1" + jest-message-util "^29.2.1" + jest-util "^29.2.1" slash "^3.0.0" -"@jest/core@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.0.1.tgz#a49517795f692a510b6fae55a9c09e659826c472" - integrity sha512-EcFrXkYh8I1GYHRH9V4TU7jr4P6ckaPqGo/z4AIJjHDZxicjYgWB6fx1xFb5bhEM87eUjCF4FAY5t+RamLWQmA== +"@jest/core@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.2.1.tgz#30af794ebd73bfb87cd8ba36718738dfe38b772e" + integrity sha512-kuLKYqnqgerXkBUwlHVxeSuhSnd+JMnMCLfU98bpacBSfWEJPegytDh3P2m15/JHzet32hGGld4KR4OzMb6/Tg== dependencies: - "@jest/console" "^29.0.1" - "@jest/reporters" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/console" "^29.2.1" + "@jest/reporters" "^29.2.1" + "@jest/test-result" "^29.2.1" + "@jest/transform" "^29.2.1" + "@jest/types" "^29.2.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.0.0" - jest-config "^29.0.1" - jest-haste-map "^29.0.1" - jest-message-util "^29.0.1" - jest-regex-util "^29.0.0" - jest-resolve "^29.0.1" - jest-resolve-dependencies "^29.0.1" - jest-runner "^29.0.1" - jest-runtime "^29.0.1" - jest-snapshot "^29.0.1" - jest-util "^29.0.1" - jest-validate "^29.0.1" - jest-watcher "^29.0.1" + jest-changed-files "^29.2.0" + jest-config "^29.2.1" + jest-haste-map "^29.2.1" + jest-message-util "^29.2.1" + jest-regex-util "^29.2.0" + jest-resolve "^29.2.1" + jest-resolve-dependencies "^29.2.1" + jest-runner "^29.2.1" + jest-runtime "^29.2.1" + jest-snapshot "^29.2.1" + jest-util "^29.2.1" + jest-validate "^29.2.1" + jest-watcher "^29.2.1" micromatch "^4.0.4" - pretty-format "^29.0.1" + pretty-format "^29.2.1" slash "^3.0.0" strip-ansi "^6.0.0" @@ -919,15 +919,15 @@ dependencies: "@jest/types" "^27.5.1" -"@jest/environment@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.0.1.tgz#d236ce9e906744ac58bfc59ae6f7c9882ace7927" - integrity sha512-iLcFfoq2K6DAB+Mc+2VNLzZVmHdwQFeSqvoM/X8SMON6s/+yEi1iuRX3snx/JfwSnvmiMXjSr0lktxNxOcqXYA== +"@jest/environment@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.2.1.tgz#acb1994fbd5ad02819a1a34a923c531e6923b665" + integrity sha512-EutqA7T/X6zFjw6mAWRHND+ZkTPklmIEWCNbmwX6uCmOrFrWaLbDZjA+gePHJx6fFMMRvNfjXcvzXEtz54KPlg== dependencies: - "@jest/fake-timers" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/fake-timers" "^29.2.1" + "@jest/types" "^29.2.1" "@types/node" "*" - jest-mock "^29.0.1" + jest-mock "^29.2.1" "@jest/expect-utils@^29.0.1": version "29.0.1" @@ -936,46 +936,53 @@ dependencies: jest-get-type "^29.0.0" -"@jest/expect@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.0.1.tgz#0ffde7f5b4c87f1dd6f8664726bd53f6cd1f7014" - integrity sha512-qKB3q52XDV8VUEiqKKLgLrJx7puQ8sYVqIDlul6n7SIXWS97DOK3KqbR2rDDaMtmenRHqEUl2fI+aFzx0oSemA== +"@jest/expect-utils@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.2.1.tgz#eae61c90f2066540f60d23b8f254f03b7869b22f" + integrity sha512-yr4aHNg5Z1CjKby5ozm7sKjgBlCOorlAoFcvrOQ/4rbZRfgZQdnmh7cth192PYIgiPZo2bBXvqdOApnAMWFJZg== dependencies: - expect "^29.0.1" - jest-snapshot "^29.0.1" + jest-get-type "^29.2.0" -"@jest/fake-timers@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.0.1.tgz#51ba7a82431db479d4b828576c139c4c0dc5e409" - integrity sha512-XZ+kAhLChVQ+KJNa5034p7O1Mz3vtWrelxDcMoxhZkgqmWDaEQAW9qJeutaeCfPvwaEwKYVyKDYfWpcyT8RiMw== +"@jest/expect@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.2.1.tgz#8d99be3886ebfcffd6cabb2b46602a301b976ffe" + integrity sha512-o14R2t2tHHHudwji43UKkzmmH49xfF5T++FQBK2tl88qwuBWQOcx7fNUYl+mA/9TPNAN0FkQ3usnpyS8FUwsvQ== dependencies: - "@jest/types" "^29.0.1" + expect "^29.2.1" + jest-snapshot "^29.2.1" + +"@jest/fake-timers@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.2.1.tgz#786d60e8cb60ca70c9f913cb49fcc77610c072bb" + integrity sha512-KWil+8fef7Uj/P/PTZlPKk1Pw117wAmr71VWFV8ZDtRtkwmTG8oY4IRf0Ss44J2y5CYRy8d/zLOhxyoGRENjvA== + dependencies: + "@jest/types" "^29.2.1" "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - jest-message-util "^29.0.1" - jest-mock "^29.0.1" - jest-util "^29.0.1" + jest-message-util "^29.2.1" + jest-mock "^29.2.1" + jest-util "^29.2.1" -"@jest/globals@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.0.1.tgz#764135ad31408fb632b3126793ab3aaed933095f" - integrity sha512-BtZWrVrKRKNUt7T1H2S8Mz31PN7ItROCmH+V5pn10hJDUfjOCTIUwb0WtLZzm0f1tJ3Uvx+5lVZrF/VTKqNaFg== +"@jest/globals@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.2.1.tgz#6933beb8b4e43b990409a19c462fde7b71210e63" + integrity sha512-Z4EejYPP1OPVq2abk1+9urAwJqkgw5jB2UJGlPjb5ZwzPQF8WLMcigKEfFzZb2OHhEVPP0RZD0/DbVTY1R6iQA== dependencies: - "@jest/environment" "^29.0.1" - "@jest/expect" "^29.0.1" - "@jest/types" "^29.0.1" - jest-mock "^29.0.1" + "@jest/environment" "^29.2.1" + "@jest/expect" "^29.2.1" + "@jest/types" "^29.2.1" + jest-mock "^29.2.1" -"@jest/reporters@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.0.1.tgz#82a491657031c1cc278bf659905e5094973309ad" - integrity sha512-dM3L8JmYYOsdeXUUVZClQy67Tz/v1sMo9h4AQv2U+716VLHV0zdA6Hh4FQNAHMhYw/95dbZbPX8Q+TRR7Rw+wA== +"@jest/reporters@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.2.1.tgz#599e4376823751fdda50f2ca97243e013da10c4d" + integrity sha512-sCsfUKM/yIF4nNed3e/rIgVIS58EiASGMDEPWqItfLZ9UO1ALW2ASDNJzdWkxEt0T8o2Ztj619G0KKrvK+McAw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/console" "^29.2.1" + "@jest/test-result" "^29.2.1" + "@jest/transform" "^29.2.1" + "@jest/types" "^29.2.1" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -988,13 +995,12 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.0.1" - jest-util "^29.0.1" - jest-worker "^29.0.1" + jest-message-util "^29.2.1" + jest-util "^29.2.1" + jest-worker "^29.2.1" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" "@jest/schemas@^29.0.0": @@ -1004,51 +1010,51 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/source-map@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.0.0.tgz#f8d1518298089f8ae624e442bbb6eb870ee7783c" - integrity sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ== +"@jest/source-map@^29.2.0": + version "29.2.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" + integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== dependencies: "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.0.1.tgz#97ac334e4c6f7d016c341cdd500aa423a38e4cdd" - integrity sha512-XCA4whh/igxjBaR/Hg8qwFd/uTsauoD7QAdAYUjV2CSGx0+iunhjoCRRWTwqjQrETRqOJABx6kNfw0+C0vMSgQ== +"@jest/test-result@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.2.1.tgz#f42dbf7b9ae465d0a93eee6131473b8bb3bd2edb" + integrity sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA== dependencies: - "@jest/console" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/console" "^29.2.1" + "@jest/types" "^29.2.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.0.1.tgz#7074b5f89ce30941b5b0fb493a19308d441a30b8" - integrity sha512-3GhSBMCRcWXGluP2Dw7CLP6mNke/t+EcftF5YjzhX1BJmqcatMbtZVwjuCfZy0TCME1GevXy3qTyV5PLpwIFKQ== +"@jest/test-sequencer@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.2.1.tgz#cafd2c5f3528c70bd4cc243800459ac366e480cc" + integrity sha512-O/pnk0/xGj3lxPVNwB6HREJ7AYvUdyP2xo/s14/9Dtf091HoOeyIhWLKQE/4HzB8lNQBMo6J5mg0bHz/uCWK7w== dependencies: - "@jest/test-result" "^29.0.1" + "@jest/test-result" "^29.2.1" graceful-fs "^4.2.9" - jest-haste-map "^29.0.1" + jest-haste-map "^29.2.1" slash "^3.0.0" -"@jest/transform@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.0.1.tgz#fdaa5d9e135c9bd7addbe65bedd1f15ad028cc7e" - integrity sha512-6UxXtqrPScFdDhoip8ys60dQAIYppQinyR87n9nlasR/ZnFfJohKToqzM29KK4gb9gHRv5oDFChdqZKE0SIhsg== +"@jest/transform@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.2.1.tgz#f3d8154edd19cdbcaf1d6646bd8f4ff7812318a2" + integrity sha512-xup+iEuaIRSQabQaeqxaQyN0vg1Dctrp9oTObQsNf3sZEowTIa5cANYuoyi8Tqhg4GCqEVLTf18KW7ii0UeFVA== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.0.1" + "@jest/types" "^29.2.1" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.0.1" - jest-regex-util "^29.0.0" - jest-util "^29.0.1" + jest-haste-map "^29.2.1" + jest-regex-util "^29.2.0" + jest-util "^29.2.1" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" @@ -1077,6 +1083,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.2.1.tgz#ec9c683094d4eb754e41e2119d8bdaef01cf6da0" + integrity sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" @@ -1493,10 +1511,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.0.0.tgz#bc66835bf6b09d6a47e22c21d7f5b82692e60e72" - integrity sha512-X6Zjz3WO4cT39Gkl0lZ2baFRaEMqJl5NC1OjElkwtNzAlbkr2K/WJXkBkH5VP0zx4Hgsd2TZYdOEfvp2Dxia+Q== +"@types/jest@29.2.0": + version "29.2.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.0.tgz#fa98e08b46ab119f1a74a9552c48c589f5378a96" + integrity sha512-KO7bPV21d65PKwv3LLsD8Jn3E05pjNjRZvkm+YTacWhVmykAb07wW6IkZUmQAltwQafNcDUEUrMO2h3jeBSisg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2013,15 +2031,15 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -babel-jest@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.0.1.tgz#db50de501fc8727e768f5aa417496cb871ee1ba0" - integrity sha512-wyI9r8tqwsZEMWiIaYjdUJ6ztZIO4DMWpGq7laW34wR71WtRS+D/iBEtXOP5W2aSYCVUQMsypRl/xiJYZznnTg== +babel-jest@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.2.1.tgz#213c47e28072de11bdb98c9d29b89f2ab99664f1" + integrity sha512-gQJwArok0mqoREiCYhXKWOgUhElJj9DpnssW6GL8dG7ARYqHEhrM9fmPHTjdqEGRVXZAd6+imo3/Vwa8TjLcsw== dependencies: - "@jest/transform" "^29.0.1" + "@jest/transform" "^29.2.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.0.0" + babel-preset-jest "^29.2.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -2037,10 +2055,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.0.tgz#ae4873399a199ede93697a15919d3d0f614a2eb1" - integrity sha512-B9oaXrlxXHFWeWqhDPg03iqQd2UN/mg/VdZOsLaqAVBkztru3ctTryAI4zisxLEEgmcUnLTKewqx0gGifoXD3A== +babel-plugin-jest-hoist@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" + integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2065,12 +2083,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.0.0.tgz#52d7f1afe3a15d14a3c5ab4349cbd388d98d330b" - integrity sha512-B5Ke47Xcs8rDF3p1korT3LoilpADCwbG93ALqtvqu6Xpf4d8alKkrCBTExbNzdHJcIuEPpfYvEaFFRGee2kUgQ== +babel-preset-jest@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" + integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== dependencies: - babel-plugin-jest-hoist "^29.0.0" + babel-plugin-jest-hoist "^29.2.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -2874,6 +2892,11 @@ diff-sequences@^29.0.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== +diff-sequences@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.2.0.tgz#4c55b5b40706c7b5d2c5c75999a50c56d214e8f6" + integrity sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw== + diff@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" @@ -3337,7 +3360,7 @@ exit@^0.1.2: resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^29.0.0, expect@^29.0.1: +expect@^29.0.0: version "29.0.1" resolved "https://registry.yarnpkg.com/expect/-/expect-29.0.1.tgz#a2fa64a59cffe4b4007877e730bc82be3d1742bb" integrity sha512-yQgemsjLU+1S8t2A7pXT3Sn/v5/37LY8J+tocWtKEA0iEYYc6gfKbbJJX2fxHZmd7K9WpdbQqXUpmYkq1aewYg== @@ -3348,6 +3371,17 @@ expect@^29.0.0, expect@^29.0.1: jest-message-util "^29.0.1" jest-util "^29.0.1" +expect@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.2.1.tgz#25752d0df92d3daa5188dc8804de1f30759658cf" + integrity sha512-BJtA754Fba0YWRWHgjKUMTA3ltWarKgITXHQnbZ2mTxTXC4yMQlR0FI7HkB3fJYkhWBf4qjNiqvg3LDtXCcVRQ== + dependencies: + "@jest/expect-utils" "^29.2.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.2.1" + jest-message-util "^29.2.1" + jest-util "^29.2.1" + express-rate-limit@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-6.6.0.tgz#3bbc2546540d327b1b0bfa9ab5f1b2c49075af98" @@ -4400,82 +4434,82 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.0.0.tgz#aa238eae42d9372a413dd9a8dadc91ca1806dce0" - integrity sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ== +jest-changed-files@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" + integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.0.1.tgz#7ecb4913e134fb4addc03655fb36c9398014fa07" - integrity sha512-I5J4LyK3qPo8EnqPmxsMAVR+2SFx7JOaZsbqW9xQmk4UDmTCD92EQgS162Ey3Jq6CfpKJKFDhzhG3QqiE0fRbw== +jest-circus@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.2.1.tgz#1385353d9bca6acf58f916068bbeffcfc95bef02" + integrity sha512-W+ZQQ5ln4Db2UZNM4NJIeasnhCdDhSuYW4eLgNAUi0XiSSpF634Kc5wiPvGiHvTgXMFVn1ZgWIijqhi9+kLNLg== dependencies: - "@jest/environment" "^29.0.1" - "@jest/expect" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/environment" "^29.2.1" + "@jest/expect" "^29.2.1" + "@jest/test-result" "^29.2.1" + "@jest/types" "^29.2.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.0.1" - jest-matcher-utils "^29.0.1" - jest-message-util "^29.0.1" - jest-runtime "^29.0.1" - jest-snapshot "^29.0.1" - jest-util "^29.0.1" + jest-each "^29.2.1" + jest-matcher-utils "^29.2.1" + jest-message-util "^29.2.1" + jest-runtime "^29.2.1" + jest-snapshot "^29.2.1" + jest-util "^29.2.1" p-limit "^3.1.0" - pretty-format "^29.0.1" + pretty-format "^29.2.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.0.1.tgz#6633c2ab97337ac5207910bd6b0aba2ef0900110" - integrity sha512-XozBHtoJCS6mnjCxNESyGm47Y4xSWzNlBJj4tix9nGrG6m068B83lrTWKtjYAenYSfOqyYVpQCkyqUp35IT+qA== +jest-cli@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.2.1.tgz#fbfa90b87b27a04e1041cc9d33ee80f32e2f2528" + integrity sha512-UIMD5aNqvPKpdlJSaeUAoLfxsh9TZvOkaMETx5qXnkboc317bcbb0eLHbIj8sFBHdcJAIAM+IRKnIU7Wi61MBw== dependencies: - "@jest/core" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/core" "^29.2.1" + "@jest/test-result" "^29.2.1" + "@jest/types" "^29.2.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.0.1" - jest-util "^29.0.1" - jest-validate "^29.0.1" + jest-config "^29.2.1" + jest-util "^29.2.1" + jest-validate "^29.2.1" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.0.1.tgz#bccc2aedc3bafb6cb08bad23e5f0fcc3b1959268" - integrity sha512-3duIx5ucEPIsUOESDTuasMfqHonD0oZRjqHycIMHSC4JwbvHDjAWNKN/NiM0ZxHXjAYrMTLt2QxSQ+IqlbYE5A== +jest-config@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.2.1.tgz#2182af014d6c73978208626335db5134803dd183" + integrity sha512-EV5F1tQYW/quZV2br2o88hnYEeRzG53Dfi6rSG3TZBuzGQ6luhQBux/RLlU5QrJjCdq3LXxRRM8F1LP6DN1ycA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.0.1" - "@jest/types" "^29.0.1" - babel-jest "^29.0.1" + "@jest/test-sequencer" "^29.2.1" + "@jest/types" "^29.2.1" + babel-jest "^29.2.1" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.0.1" - jest-environment-node "^29.0.1" - jest-get-type "^29.0.0" - jest-regex-util "^29.0.0" - jest-resolve "^29.0.1" - jest-runner "^29.0.1" - jest-util "^29.0.1" - jest-validate "^29.0.1" + jest-circus "^29.2.1" + jest-environment-node "^29.2.1" + jest-get-type "^29.2.0" + jest-regex-util "^29.2.0" + jest-resolve "^29.2.1" + jest-runner "^29.2.1" + jest-util "^29.2.1" + jest-validate "^29.2.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.0.1" + pretty-format "^29.2.1" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -4489,67 +4523,82 @@ jest-diff@^29.0.1: jest-get-type "^29.0.0" pretty-format "^29.0.1" -jest-docblock@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.0.0.tgz#3151bcc45ed7f5a8af4884dcc049aee699b4ceae" - integrity sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw== +jest-diff@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.2.1.tgz#027e42f5a18b693fb2e88f81b0ccab533c08faee" + integrity sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.2.0" + jest-get-type "^29.2.0" + pretty-format "^29.2.1" + +jest-docblock@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" + integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== dependencies: detect-newline "^3.0.0" -jest-each@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.0.1.tgz#c17da68a7073440122dbd47dca3941351ee0cbe5" - integrity sha512-UmCZYU9LPvRfSDoCrKJqrCNmgTYGGb3Ga6IVsnnVjedBTRRR9GJMca7UmDKRrJ1s+U632xrVtiRD27BxaG1aaQ== +jest-each@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.2.1.tgz#6b0a88ee85c2ba27b571a6010c2e0c674f5c9b29" + integrity sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.2.1" chalk "^4.0.0" - jest-get-type "^29.0.0" - jest-util "^29.0.1" - pretty-format "^29.0.1" + jest-get-type "^29.2.0" + jest-util "^29.2.1" + pretty-format "^29.2.1" -jest-environment-node@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.0.1.tgz#b09db2a1b8439aace11a6805719d92498a64987e" - integrity sha512-PcIRBrEBFAPBqkbL53ZpEvTptcAnOW6/lDfqBfACMm3vkVT0N7DcfkH/hqNSbDmSxzGr0FtJI6Ej3TPhveWCMA== +jest-environment-node@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.2.1.tgz#f90311d0f0e8ef720349f83c97a076e403f90665" + integrity sha512-PulFKwEMz6nTAdLUwglFKei3b/LixwlRiqTN6nvPE1JtrLtlnpd6LXnFI1NFHYJGlTmIWilMP2n9jEtPPKX50g== dependencies: - "@jest/environment" "^29.0.1" - "@jest/fake-timers" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/environment" "^29.2.1" + "@jest/fake-timers" "^29.2.1" + "@jest/types" "^29.2.1" "@types/node" "*" - jest-mock "^29.0.1" - jest-util "^29.0.1" + jest-mock "^29.2.1" + jest-util "^29.2.1" jest-get-type@^29.0.0: version "29.0.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== -jest-haste-map@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.0.1.tgz#472212f93ef44309bf97d191f93ddd2e41169615" - integrity sha512-gcKOAydafpGoSBvcj/mGCfhOKO8fRLkAeee1KXGdcJ1Pb9O2nnOl4I8bQSIID2MaZeMHtLLgNboukh/pUGkBtg== +jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== + +jest-haste-map@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.2.1.tgz#f803fec57f8075e6c55fb5cd551f99a72471c699" + integrity sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.2.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.0.0" - jest-util "^29.0.1" - jest-worker "^29.0.1" + jest-regex-util "^29.2.0" + jest-util "^29.2.1" + jest-worker "^29.2.1" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.0.1.tgz#1a7cf8475d85e7b2bd53efa5adc5195828a12c33" - integrity sha512-5tISHJphB+sCmKXtVHJGQGltj7ksrLLb9vkuNWwFR86Of1tfzjskvrrrZU1gSzEfWC+qXIn4tuh8noKHYGMIPA== +jest-leak-detector@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz#ec551686b7d512ec875616c2c3534298b1ffe2fc" + integrity sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug== dependencies: - jest-get-type "^29.0.0" - pretty-format "^29.0.1" + jest-get-type "^29.2.0" + pretty-format "^29.2.1" jest-matcher-utils@^29.0.1: version "29.0.1" @@ -4561,6 +4610,16 @@ jest-matcher-utils@^29.0.1: jest-get-type "^29.0.0" pretty-format "^29.0.1" +jest-matcher-utils@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.2.1.tgz#2bf876c5f891b33786aadf5d65d5da5970744122" + integrity sha512-hUTBh7H/Mnb6GTpihbLh8uF5rjAMdekfW/oZNXUMAXi7bbmym2HiRpzgqf/zzkjgejMrVAkPdVSQj+32enlUww== + dependencies: + chalk "^4.0.0" + jest-diff "^29.2.1" + jest-get-type "^29.2.0" + pretty-format "^29.2.1" + jest-message-util@^29.0.1: version "29.0.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.0.1.tgz#85c4b5b90296c228da158e168eaa5b079f2ab879" @@ -4576,106 +4635,122 @@ jest-message-util@^29.0.1: slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.0.1.tgz#12e1b137035365b022ccdb8fd67d476cd4d4bfad" - integrity sha512-i1yTceg2GKJwUNZFjIzrH7Y74fN1SKJWxQX/Vu3LT4TiJerFARH5l+4URNyapZ+DNpchHYrGOP2deVbn3ma8JA== +jest-message-util@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.2.1.tgz#3a51357fbbe0cc34236f17a90d772746cf8d9193" + integrity sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw== dependencies: - "@jest/types" "^29.0.1" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.2.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.2.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.2.1.tgz#a0d361cffcb28184fa9c5443adbf591fa5759775" + integrity sha512-NDphaY/GqyQpTfnTZiTqqpMaw4Z0I7XnB7yBgrT6IwYrLGxpOhrejYr4ANY4YvO2sEGdd8Tx/6D0+WLQy7/qDA== + dependencies: + "@jest/types" "^29.2.1" "@types/node" "*" + jest-util "^29.2.1" jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.0.0.tgz#b442987f688289df8eb6c16fa8df488b4cd007de" - integrity sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug== +jest-regex-util@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" + integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== -jest-resolve-dependencies@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.0.1.tgz#c41b88380c8ea178ce72a750029b5f3d5f65cb94" - integrity sha512-fUGcYlSc1NzNz+tsHDjjG0rclw6blJcFZsLEsezxm/n54bAm9HFvJxgBuCV1CJQoPtIx6AfR+tXkR9lpWJs2LQ== +jest-resolve-dependencies@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.1.tgz#8d717dd41dc615fef1d412d395ea3deccfb1b9fa" + integrity sha512-o3mUGX2j08usj1jIAIE8KmUVpqVAn54k80kI27ldbZf2oJn6eghhB6DvJxjrcH40va9CQgWTfU5f2Ag/MoUqgQ== dependencies: - jest-regex-util "^29.0.0" - jest-snapshot "^29.0.1" + jest-regex-util "^29.2.0" + jest-snapshot "^29.2.1" -jest-resolve@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.0.1.tgz#4f1338eee2ccc7319ffce850e13eb118a9e93ce5" - integrity sha512-dwb5Z0lLZbptlBtPExqsHfdDamXeiRLv4vdkfPrN84vBwLSWHWcXjlM2JXD/KLSQfljBcXbzI/PDvUJuTQ84Nw== +jest-resolve@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.2.1.tgz#a4d2f76db88aeb6ec5f5453c9a40b52483d17799" + integrity sha512-1dJTW76Z9622Viq4yRcwBuEXuzGtE9B2kdl05RC8Om/lAzac9uEgC+M8Q5osVidbuBPmxm8wSrcItYhca2ZAtQ== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.0.1" + jest-haste-map "^29.2.1" jest-pnp-resolver "^1.2.2" - jest-util "^29.0.1" - jest-validate "^29.0.1" + jest-util "^29.2.1" + jest-validate "^29.2.1" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.0.1.tgz#15bacd13170f3d786168ef8548fdeb96933ea643" - integrity sha512-XeFfPmHtO7HyZyD1uJeO4Oqa8PyTbDHzS1YdGrvsFXk/A5eXinbqA5a42VUEqvsKQgNnKTl5NJD0UtDWg7cQ2A== +jest-runner@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.2.1.tgz#885afe64661cb2f51f84c1b97afb713d1093c124" + integrity sha512-PojFI+uVhQ4u4YZKCN/a3yU0/l/pJJXhq1sW3JpCp8CyvGBYGddRFPKZ1WihApusxqWRTHjBJmGyPWv6Av2lWA== dependencies: - "@jest/console" "^29.0.1" - "@jest/environment" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/console" "^29.2.1" + "@jest/environment" "^29.2.1" + "@jest/test-result" "^29.2.1" + "@jest/transform" "^29.2.1" + "@jest/types" "^29.2.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.10.2" graceful-fs "^4.2.9" - jest-docblock "^29.0.0" - jest-environment-node "^29.0.1" - jest-haste-map "^29.0.1" - jest-leak-detector "^29.0.1" - jest-message-util "^29.0.1" - jest-resolve "^29.0.1" - jest-runtime "^29.0.1" - jest-util "^29.0.1" - jest-watcher "^29.0.1" - jest-worker "^29.0.1" + jest-docblock "^29.2.0" + jest-environment-node "^29.2.1" + jest-haste-map "^29.2.1" + jest-leak-detector "^29.2.1" + jest-message-util "^29.2.1" + jest-resolve "^29.2.1" + jest-runtime "^29.2.1" + jest-util "^29.2.1" + jest-watcher "^29.2.1" + jest-worker "^29.2.1" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.0.1.tgz#cafdc10834c45c50105eecb0ded8677ce741e2af" - integrity sha512-yDgz5OE0Rm44PUAfTqwA6cDFnTYnVcYbRpPECsokSASQ0I5RXpnKPVr2g0CYZWKzbsXqqtmM7TIk7CAutZJ7gQ== +jest-runtime@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.2.1.tgz#62e3a23c33710ae4d9c3304dda851a5fb225b574" + integrity sha512-PSQ880OoIW9y8E6/jjhGn3eQNgNc6ndMzCZaKqy357bv7FqCfSyYepu3yDC6Sp1Vkt+GhP2M/PVgldS2uZSFZg== dependencies: - "@jest/environment" "^29.0.1" - "@jest/fake-timers" "^29.0.1" - "@jest/globals" "^29.0.1" - "@jest/source-map" "^29.0.0" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/environment" "^29.2.1" + "@jest/fake-timers" "^29.2.1" + "@jest/globals" "^29.2.1" + "@jest/source-map" "^29.2.0" + "@jest/test-result" "^29.2.1" + "@jest/transform" "^29.2.1" + "@jest/types" "^29.2.1" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.0.1" - jest-message-util "^29.0.1" - jest-mock "^29.0.1" - jest-regex-util "^29.0.0" - jest-resolve "^29.0.1" - jest-snapshot "^29.0.1" - jest-util "^29.0.1" + jest-haste-map "^29.2.1" + jest-message-util "^29.2.1" + jest-mock "^29.2.1" + jest-regex-util "^29.2.0" + jest-resolve "^29.2.1" + jest-snapshot "^29.2.1" + jest-util "^29.2.1" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.0.1.tgz#ed455cb7e56fb43e2d451edd902d622349d6afed" - integrity sha512-OuYGp+lsh7RhB3DDX36z/pzrGm2F740e5ERG9PQpJyDknCRtWdhaehBQyMqDnsQdKkvC2zOcetcxskiHjO7e8Q== +jest-snapshot@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.2.1.tgz#f3843b3099c8fec7e6218dea18cc506f10ea5d30" + integrity sha512-KZdLD7iEz5M4ZYd+ezZ/kk73z+DtNbk/yJ4Qx7408Vb0CCuclJIZPa/HmIwSsCfIlOBNcYTKufr7x/Yv47oYlg== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -4683,23 +4758,23 @@ jest-snapshot@^29.0.1: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/expect-utils" "^29.2.1" + "@jest/transform" "^29.2.1" + "@jest/types" "^29.2.1" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.0.1" + expect "^29.2.1" graceful-fs "^4.2.9" - jest-diff "^29.0.1" - jest-get-type "^29.0.0" - jest-haste-map "^29.0.1" - jest-matcher-utils "^29.0.1" - jest-message-util "^29.0.1" - jest-util "^29.0.1" + jest-diff "^29.2.1" + jest-get-type "^29.2.0" + jest-haste-map "^29.2.1" + jest-matcher-utils "^29.2.1" + jest-message-util "^29.2.1" + jest-util "^29.2.1" natural-compare "^1.4.0" - pretty-format "^29.0.1" + pretty-format "^29.2.1" semver "^7.3.5" jest-util@^29.0.1: @@ -4714,50 +4789,63 @@ jest-util@^29.0.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.0.1.tgz#8de8ff9d65507c0477964fd39c5b0a1778e3103d" - integrity sha512-mS4q7F738YXZFWBPqE+NjHU/gEOs7IBIFQ8i9zq5EO691cLrUbLhFq4larf8/lNcmauRO71tn/+DTW2y+MrLow== +jest-util@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.2.1.tgz#f26872ba0dc8cbefaba32c34f98935f6cf5fc747" + integrity sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.2.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.2.1.tgz#db814ce12c4c7e4746044922762e56eb177d066c" + integrity sha512-DZVX5msG6J6DL5vUUw+++6LEkXUsPwB5R7fsfM7BXdz2Ipr0Ib046ak+8egrwAR++pvSM/5laxLK977ieIGxkQ== + dependencies: + "@jest/types" "^29.2.1" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.0.0" + jest-get-type "^29.2.0" leven "^3.1.0" - pretty-format "^29.0.1" + pretty-format "^29.2.1" -jest-watcher@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.0.1.tgz#63adeb8887a0562ed8f990f413b830ef48a8db94" - integrity sha512-0LBWDL3sZ+vyHRYxjqm2irhfwhUXHonjLSbd0oDeGq44U1e1uUh3icWNXYF8HO/UEnOoa6+OJDncLUXP2Hdg9A== +jest-watcher@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.2.1.tgz#1cb91f8aa9e77b1332af139944ad65e51430d7c3" + integrity sha512-7jFaHUaRq50l4w/f6RuY713bvI5XskMmjWCE54NGYcY74fLkShS8LucXJke1QfGnwDSCoIqGnGGGKPwdaBYz2Q== dependencies: - "@jest/test-result" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/test-result" "^29.2.1" + "@jest/types" "^29.2.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.10.2" - jest-util "^29.0.1" + jest-util "^29.2.1" string-length "^4.0.1" -jest-worker@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.0.1.tgz#fb42ff7e05e0573f330ec0cf781fc545dcd11a31" - integrity sha512-+B/2/8WW7goit7qVezG9vnI1QP3dlmuzi2W0zxazAQQ8dcDIA63dDn6j4pjOGBARha/ZevcwYQtNIzCySbS7fQ== +jest-worker@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.2.1.tgz#8ba68255438252e1674f990f0180c54dfa26a3b1" + integrity sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg== dependencies: "@types/node" "*" + jest-util "^29.2.1" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.0.1.tgz#4a1c48d79fada0a47c686a111ed9411fd41cd584" - integrity sha512-liHkwzaW6iwQyhRBFj0A4ZYKcsQ7ers1s62CCT95fPeNzoxT/vQRWwjTT4e7jpSCwrvPP2t1VESuy7GrXcr2ug== +jest@29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.2.1.tgz#352ec0b81a0e436691d546d984cd7d8f72ffd26a" + integrity sha512-K0N+7rx+fv3Us3KhuwRSJt55MMpZPs9Q3WSO/spRZSnsalX8yEYOTQ1PiSN7OvqzoRX4JEUXCbOJRlP4n8m5LA== dependencies: - "@jest/core" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/core" "^29.2.1" + "@jest/types" "^29.2.1" import-local "^3.0.2" - jest-cli "^29.0.1" + jest-cli "^29.2.1" joi@^17.3.0: version "17.4.2" @@ -6009,6 +6097,15 @@ pretty-format@^29.0.0, pretty-format@^29.0.1: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.2.1: + version "29.2.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.2.1.tgz#86e7748fe8bbc96a6a4e04fa99172630907a9611" + integrity sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA== + dependencies: + "@jest/schemas" "^29.0.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -6945,7 +7042,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6959,14 +7056,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -7008,14 +7097,6 @@ tdigest@^0.1.1: dependencies: bintrees "1.0.1" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" From 8ba11ed3e504300a16f037a7423e3f3b0a0a130a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 07:54:59 +0000 Subject: [PATCH 30/39] chore(deps): update dpage/pgadmin4 docker tag to v6.15 (#2225) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- scripts/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/docker-compose.yml b/scripts/docker-compose.yml index 6789e18047..29eab776b9 100644 --- a/scripts/docker-compose.yml +++ b/scripts/docker-compose.yml @@ -11,7 +11,7 @@ services: - 5432:5432 pgadmin: - image: dpage/pgadmin4:6.13 + image: dpage/pgadmin4:6.15 environment: PGADMIN_DEFAULT_EMAIL: 'admin@admin.com' PGADMIN_DEFAULT_PASSWORD: 'admin' From 0aea76f9681a128718fde2ef4fa567d1a16e5fc9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 10:24:45 +0000 Subject: [PATCH 31/39] chore(deps): update react-router monorepo to v6.4.2 (#2228) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 36 +++++++++++++++++------------------- website/package.json | 2 +- website/yarn.lock | 22 ++++++++++------------ 4 files changed, 29 insertions(+), 33 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 2cc965e1fb..ec740d0209 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -80,7 +80,7 @@ "react-dom": "17.0.2", "react-error-boundary": "3.1.4", "react-hooks-global-state": "2.0.0", - "react-router-dom": "6.3.0", + "react-router-dom": "6.4.2", "react-table": "7.8.0", "react-test-renderer": "17.0.2", "react-timeago": "7.1.0", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 05671e37a5..493adfa65e 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1299,7 +1299,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== @@ -2094,6 +2094,11 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== +"@remix-run/router@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.2.tgz#1c17eadb2fa77f80a796ad5ea9bf108e6993ef06" + integrity sha512-GRSOFhJzjGN+d4sKHTMSvNeUPoZiDHWmRnXfzaxrqe7dE/Nzlc8BiMSJdLDESZlndM7jIUrZ/F4yWqVYlI0rwQ== + "@rollup/pluginutils@^5.0.0": version "5.0.1" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.1.tgz#63def51f5a76dadd984689d33c7f000164152a97" @@ -4761,13 +4766,6 @@ headers-polyfill@^3.1.0: resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.1.2.tgz#9a4dcb545c5b95d9569592ef7ec0708aab763fbe" integrity sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA== -history@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" - integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== - dependencies: - "@babel/runtime" "^7.7.6" - hoist-non-react-statics@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -6093,20 +6091,20 @@ react-refresh@^0.14.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== -react-router-dom@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d" - integrity sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw== +react-router-dom@6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.2.tgz#115b37d501d6d8ac870683694978c51c43e6c0d2" + integrity sha512-yM1kjoTkpfjgczPrcyWrp+OuQMyB1WleICiiGfstnQYo/S8hPEEnVjr/RdmlH6yKK4Tnj1UGXFSa7uwAtmDoLQ== dependencies: - history "^5.2.0" - react-router "6.3.0" + "@remix-run/router" "1.0.2" + react-router "6.4.2" -react-router@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" - integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== +react-router@6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.2.tgz#300628ee9ed81b8ef1597b5cb98b474efe9779b8" + integrity sha512-Rb0BAX9KHhVzT1OKhMvCDMw776aTYM0DtkxqUBP8dNBom3mPXlfNs76JNGK8wKJ1IZEY1+WGj+cvZxHVk/GiKw== dependencies: - history "^5.2.0" + "@remix-run/router" "1.0.2" react-shallow-renderer@^16.13.1: version "16.15.0" diff --git a/website/package.json b/website/package.json index 3a695cc474..9d86b16670 100644 --- a/website/package.json +++ b/website/package.json @@ -73,7 +73,7 @@ "@tsconfig/docusaurus": "1.0.6", "babel-loader": "8.2.5", "enhanced-resolve": "5.10.0", - "react-router": "6.3.0", + "react-router": "6.4.2", "replace-in-file": "6.3.5", "storybook-addon-root-attribute": "1.0.2", "typescript": "4.8.4" diff --git a/website/yarn.lock b/website/yarn.lock index 2b89fdb2d4..1b9adbe1b7 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2272,6 +2272,11 @@ redux-thunk "^2.4.1" reselect "^4.1.5" +"@remix-run/router@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.2.tgz#1c17eadb2fa77f80a796ad5ea9bf108e6993ef06" + integrity sha512-GRSOFhJzjGN+d4sKHTMSvNeUPoZiDHWmRnXfzaxrqe7dE/Nzlc8BiMSJdLDESZlndM7jIUrZ/F4yWqVYlI0rwQ== + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -8018,13 +8023,6 @@ history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -history@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" - integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== - dependencies: - "@babel/runtime" "^7.7.6" - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -11900,12 +11898,12 @@ react-router@5.3.3, react-router@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" - integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== +react-router@6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.2.tgz#300628ee9ed81b8ef1597b5cb98b474efe9779b8" + integrity sha512-Rb0BAX9KHhVzT1OKhMvCDMw776aTYM0DtkxqUBP8dNBom3mPXlfNs76JNGK8wKJ1IZEY1+WGj+cvZxHVk/GiKw== dependencies: - history "^5.2.0" + "@remix-run/router" "1.0.2" react-syntax-highlighter@^15.4.5: version "15.5.0" From 549d317db7adcc856e8900aafa7ff488d728bf82 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 13:18:52 +0000 Subject: [PATCH 32/39] chore(deps): update typescript-eslint monorepo to v5.40.1 (#2229) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 106 +++++++++++++++++++++++++-------------------------- 2 files changed, 53 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index 949c965cbe..2f8fd0d281 100644 --- a/package.json +++ b/package.json @@ -158,8 +158,8 @@ "@types/supertest": "2.0.12", "@types/type-is": "1.6.3", "@types/uuid": "8.3.4", - "@typescript-eslint/eslint-plugin": "5.36.1", - "@typescript-eslint/parser": "5.36.1", + "@typescript-eslint/eslint-plugin": "5.40.1", + "@typescript-eslint/parser": "5.40.1", "copyfiles": "2.4.1", "coveralls": "3.1.1", "del-cli": "5.0.0", diff --git a/yarn.lock b/yarn.lock index 061c824332..55f86e1c89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1613,7 +1613,7 @@ resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz" integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== -"@types/semver@7.3.12": +"@types/semver@7.3.12", "@types/semver@^7.3.12": version "7.3.12" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c" integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A== @@ -1691,85 +1691,86 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz#471f64dc53600025e470dad2ca4a9f2864139019" - integrity sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA== +"@typescript-eslint/eslint-plugin@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz#3203a6ff396b1194083faaa6e5110c401201d7d5" + integrity sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg== dependencies: - "@typescript-eslint/scope-manager" "5.36.1" - "@typescript-eslint/type-utils" "5.36.1" - "@typescript-eslint/utils" "5.36.1" + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/type-utils" "5.40.1" + "@typescript-eslint/utils" "5.40.1" debug "^4.3.4" - functional-red-black-tree "^1.0.1" ignore "^5.2.0" regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.1.tgz#931c22c7bacefd17e29734628cdec8b2acdcf1ce" - integrity sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A== +"@typescript-eslint/parser@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.40.1.tgz#e7f8295dd8154d0d37d661ddd8e2f0ecfdee28dd" + integrity sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg== dependencies: - "@typescript-eslint/scope-manager" "5.36.1" - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/typescript-estree" "5.36.1" + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz#23c49b7ddbcffbe09082e6694c2524950766513f" - integrity sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w== +"@typescript-eslint/scope-manager@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz#a7a5197dfd234622a2421ea590ee0ccc02e18dfe" + integrity sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg== dependencies: - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/visitor-keys" "5.36.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" -"@typescript-eslint/type-utils@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz#016fc2bff6679f54c0b2df848a493f0ca3d4f625" - integrity sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q== +"@typescript-eslint/type-utils@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz#091e4ce3bebbdb68f4980bae9dee2e4e1725f601" + integrity sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q== dependencies: - "@typescript-eslint/typescript-estree" "5.36.1" - "@typescript-eslint/utils" "5.36.1" + "@typescript-eslint/typescript-estree" "5.40.1" + "@typescript-eslint/utils" "5.40.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.1.tgz#1cf0e28aed1cb3ee676917966eb23c2f8334ce2c" - integrity sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg== +"@typescript-eslint/types@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.40.1.tgz#de37f4f64de731ee454bb2085d71030aa832f749" + integrity sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw== -"@typescript-eslint/typescript-estree@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz#b857f38d6200f7f3f4c65cd0a5afd5ae723f2adb" - integrity sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g== +"@typescript-eslint/typescript-estree@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz#9a7d25492f02c69882ce5e0cd1857b0c55645d72" + integrity sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA== dependencies: - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/visitor-keys" "5.36.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.1.tgz#136d5208cc7a3314b11c646957f8f0b5c01e07ad" - integrity sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg== +"@typescript-eslint/utils@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.40.1.tgz#3204fb73a559d3b7bab7dc9d3c44487c2734a9ca" + integrity sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.36.1" - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/typescript-estree" "5.36.1" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" + semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz#7731175312d65738e501780f923896d200ad1615" - integrity sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ== +"@typescript-eslint/visitor-keys@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz#f3d2bf5af192f4432b84cec6fdcb387193518754" + integrity sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw== dependencies: - "@typescript-eslint/types" "5.36.1" + "@typescript-eslint/types" "5.40.1" eslint-visitor-keys "^3.3.0" "@unleash/express-openapi@^0.2.1-beta.0": @@ -3736,11 +3737,6 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" From d478387bb2ae13c1f2a84e33fa93b04442c8231d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 16:13:34 +0000 Subject: [PATCH 33/39] fix(deps): update dependency @svgr/webpack to v6.5.0 (#2231) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- website/package.json | 2 +- website/yarn.lock | 142 ++++++++++++++++++++++--------------------- 2 files changed, 73 insertions(+), 71 deletions(-) diff --git a/website/package.json b/website/package.json index 9d86b16670..a5322ebc6e 100644 --- a/website/package.json +++ b/website/package.json @@ -26,7 +26,7 @@ "@docusaurus/preset-classic": "2.0.1", "@docusaurus/remark-plugin-npm2yarn": "2.0.1", "@mdx-js/react": "1.6.22", - "@svgr/webpack": "6.3.1", + "@svgr/webpack": "6.5.0", "clsx": "1.2.1", "docusaurus-plugin-openapi-docs": "1.1.9", "docusaurus-theme-openapi-docs": "1.1.9", diff --git a/website/yarn.lock b/website/yarn.lock index 1b9adbe1b7..20eb898a94 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -3281,80 +3281,80 @@ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.0.tgz#eae9f3255da5e6f5d1ec115e4ddcca65709a8611" integrity sha512-3XzJy0dCVEOE2o2Wn8tF9SdQ2na1Q7jJNzIs3+27RHPpEiuqlClBNhIOhPFKr95+bUGtL6nZIgqY8xBhMw0p6g== -"@svgr/babel-plugin-add-jsx-attribute@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz#b9a5d84902be75a05ede92e70b338d28ab63fa74" - integrity sha512-jDBKArXYO1u0B1dmd2Nf8Oy6aTF5vLDfLoO9Oon/GLkqZ/NiggYWZA+a2HpUMH4ITwNqS3z43k8LWApB8S583w== +"@svgr/babel-plugin-add-jsx-attribute@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz#21788f7e982aacafc805ed30a14048a1406fbabc" + integrity sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg== "@svgr/babel-plugin-remove-jsx-attribute@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.0.tgz#b4910cb52a1499f59ab65c6b1483424913e87768" integrity sha512-zD0sTwXpL78pWaxWxCyqimfukPcJfToKuwW1Po00pUeOYT6KuMQrPnG6XIZpLadydOo+fght8SoxwRb5O9TtWA== -"@svgr/babel-plugin-remove-jsx-attribute@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.1.tgz#4877995452efc997b36777abe1fde9705ef78e8b" - integrity sha512-dQzyJ4prwjcFd929T43Z8vSYiTlTu8eafV40Z2gO7zy/SV5GT+ogxRJRBIKWomPBOiaVXFg3jY4S5hyEN3IBjQ== +"@svgr/babel-plugin-remove-jsx-attribute@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e" + integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== "@svgr/babel-plugin-remove-jsx-empty-expression@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.0.tgz#0f8b0969f36096be9f64f2ed052ade314779a3f4" integrity sha512-COsMIL1BRU/ZxFTvd59NFzJPIdvBkV19Jrn7w1NwFmglOUrpchPRSzfW6FzWUh2C8nzJrnjDn6V7i7klVhHZEA== -"@svgr/babel-plugin-remove-jsx-empty-expression@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.1.tgz#2d67a0e92904c9be149a5b22d3a3797ce4d7b514" - integrity sha512-HBOUc1XwSU67fU26V5Sfb8MQsT0HvUyxru7d0oBJ4rA2s4HW3PhyAPC7fV/mdsSGpAvOdd8Wpvkjsr0fWPUO7A== +"@svgr/babel-plugin-remove-jsx-empty-expression@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8" + integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.0.tgz#185b2ff136a703f32a84e16e5bb533ca4d5f42fa" integrity sha512-mKk2uqn1/7dk2I82fYaiLTw12eqmZZ2ZzH3WVhzzLvMXrLIxc9xYFJBNRMrV+77ZDHd791933HWSNChtGeJLQg== -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.1.tgz#306f5247139c53af70d1778f2719647c747998ee" - integrity sha512-C12e6aN4BXAolRrI601gPn5MDFCRHO7C4TM8Kks+rDtl8eEq+NN1sak0eAzJu363x3TmHXdZn7+Efd2nr9I5dA== +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz#ca57c0a62a9c22ff11cdb475dc9a2b35586335d1" + integrity sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA== "@svgr/babel-plugin-svg-dynamic-title@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.0.tgz#e06db7f06eb6be5bd9300a0d964521ef9eee589b" integrity sha512-jdQJa8DZHfo2POTmgl8ZmDEcpTEz4n6RsANle1DbbC8CGq+1k/RV4MkRL1ceqIJCSOW3ypk23gpG5Q4xlSiY7Q== -"@svgr/babel-plugin-svg-dynamic-title@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.1.tgz#6ce26d34cbc93eb81737ef528528907c292e7aa2" - integrity sha512-6NU55Mmh3M5u2CfCCt6TX29/pPneutrkJnnDCHbKZnjukZmmgUAZLtZ2g6ZoSPdarowaQmAiBRgAHqHmG0vuqA== +"@svgr/babel-plugin-svg-dynamic-title@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz#57c0e0409757373d641f115d33cf2559b47bff77" + integrity sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw== "@svgr/babel-plugin-svg-em-dimensions@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.0.tgz#1369f2c7c5c725b532224a7a00e500d267a728aa" integrity sha512-yPogu5hLcF5FXCU3a3sCtsP+lloLBkIxM+xplumKwIdQNN28qb+HmFxVLUkT0+MD3y+77DjTtukJzkEBqL/BsA== -"@svgr/babel-plugin-svg-em-dimensions@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.1.tgz#5ade2a724b290873c30529d1d8cd23523856287a" - integrity sha512-HV1NGHYTTe1vCNKlBgq/gKuCSfaRlKcHIADn7P8w8U3Zvujdw1rmusutghJ1pZJV7pDt3Gt8ws+SVrqHnBO/Qw== +"@svgr/babel-plugin-svg-em-dimensions@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz#dbca40a18c308f135b4b672ea8e410855e8e3352" + integrity sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg== "@svgr/babel-plugin-transform-react-native-svg@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.0.tgz#72cafb778198af1f9f0be6bfaf369f2cd7746ac5" integrity sha512-Eso0uWFLN8kpR/MB+mD6j0WOTSUPWpyXpEkYt6sg4GItEMvScWgZV8H986CU09oXceaG8AovgPvYdygiJuRsRA== -"@svgr/babel-plugin-transform-react-native-svg@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.1.tgz#d654f509d692c3a09dfb475757a44bd9f6ad7ddf" - integrity sha512-2wZhSHvTolFNeKDAN/ZmIeSz2O9JSw72XD+o2bNp2QAaWqa8KGpn5Yk5WHso6xqfSAiRzAE+GXlsrBO4UP9LLw== +"@svgr/babel-plugin-transform-react-native-svg@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz#a5453127365b925a7f766615ef6f5cfd01018f98" + integrity sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw== "@svgr/babel-plugin-transform-svg-component@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.0.tgz#95d91c49127211d790fa08517cb0bf0b3f363565" integrity sha512-e9tSsPAHibGyZDPqQ8a5OIDuuON2YY6+XeCr6WqxVLwj+nIqbUOmNNZpekNsUv/gZ6UbtzEpGfZMiZavpavqDg== -"@svgr/babel-plugin-transform-svg-component@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.1.tgz#21a285dbffdce9567c437ebf0d081bf9210807e6" - integrity sha512-cZ8Tr6ZAWNUFfDeCKn/pGi976iWSkS8ijmEYKosP+6ktdZ7lW9HVLHojyusPw3w0j8PI4VBeWAXAmi/2G7owxw== +"@svgr/babel-plugin-transform-svg-component@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz#ec116e9223a02c6dcd9f8cb2bdbf174a3c2ef2f5" + integrity sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig== "@svgr/babel-preset@^6.3.0": version "6.3.0" @@ -3370,19 +3370,19 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.3.0" "@svgr/babel-plugin-transform-svg-component" "^6.3.0" -"@svgr/babel-preset@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.3.1.tgz#8bd1ead79637d395e9362b01dd37cfd59702e152" - integrity sha512-tQtWtzuMMQ3opH7je+MpwfuRA1Hf3cKdSgTtAYwOBDfmhabP7rcTfBi3E7V3MuwJNy/Y02/7/RutvwS1W4Qv9g== +"@svgr/babel-preset@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.0.tgz#dc14bbe1c74e0c8c4ab77221064645b3399836db" + integrity sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg== dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.3.1" - "@svgr/babel-plugin-remove-jsx-attribute" "^6.3.1" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.3.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.3.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.3.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.3.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.3.1" - "@svgr/babel-plugin-transform-svg-component" "^6.3.1" + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.5.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.5.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.0" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.0" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.0" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.0" + "@svgr/babel-plugin-transform-svg-component" "^6.5.0" "@svgr/core@^6.3.0": version "6.3.0" @@ -3393,12 +3393,14 @@ camelcase "^6.2.0" cosmiconfig "^7.0.1" -"@svgr/core@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.3.1.tgz#752adf49d8d5473b15d76ca741961de093f715bd" - integrity sha512-Sm3/7OdXbQreemf9aO25keerZSbnKMpGEfmH90EyYpj1e8wMD4TuwJIb3THDSgRMWk1kYJfSRulELBy4gVgZUA== +"@svgr/core@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.0.tgz#13af3337b7b66a2b6ebe197b67b62badbe490bf1" + integrity sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w== dependencies: - "@svgr/plugin-jsx" "^6.3.1" + "@babel/core" "^7.18.5" + "@svgr/babel-preset" "^6.5.0" + "@svgr/plugin-jsx" "^6.5.0" camelcase "^6.2.0" cosmiconfig "^7.0.1" @@ -3410,10 +3412,10 @@ "@babel/types" "^7.18.4" entities "^4.3.0" -"@svgr/hast-util-to-babel-ast@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.3.1.tgz#59614e24d2a4a28010e02089213b3448d905769d" - integrity sha512-NgyCbiTQIwe3wHe/VWOUjyxmpUmsrBjdoIxKpXt3Nqc3TN30BpJG22OxBvVzsAh9jqep0w0/h8Ywvdk3D9niNQ== +"@svgr/hast-util-to-babel-ast@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz#0e4aebea26328e22a6fff940711472a47ec24e5c" + integrity sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA== dependencies: "@babel/types" "^7.18.4" entities "^4.3.0" @@ -3428,14 +3430,14 @@ "@svgr/hast-util-to-babel-ast" "^6.3.0" svg-parser "^2.0.4" -"@svgr/plugin-jsx@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.3.1.tgz#de7b2de824296b836d6b874d498377896e367f50" - integrity sha512-r9+0mYG3hD4nNtUgsTXWGYJomv/bNd7kC16zvsM70I/bGeoCi/3lhTmYqeN6ChWX317OtQCSZZbH4wq9WwoXbw== +"@svgr/plugin-jsx@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz#c23ba0048007f1591fe7a9b060be373e4771487b" + integrity sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw== dependencies: "@babel/core" "^7.18.5" - "@svgr/babel-preset" "^6.3.1" - "@svgr/hast-util-to-babel-ast" "^6.3.1" + "@svgr/babel-preset" "^6.5.0" + "@svgr/hast-util-to-babel-ast" "^6.5.0" svg-parser "^2.0.4" "@svgr/plugin-svgo@^6.3.0": @@ -3447,28 +3449,28 @@ deepmerge "^4.2.2" svgo "^2.8.0" -"@svgr/plugin-svgo@^6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.3.1.tgz#3c1ff2efaed10e5c5d35a6cae7bacaedc18b5d4a" - integrity sha512-yJIjTDKPYqzFVjmsbH5EdIwEsmKxjxdXSGJVLeUgwZOZPAkNQmD1v7LDbOdOKbR44FG8465Du+zWPdbYGnbMbw== +"@svgr/plugin-svgo@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz#1d9b7d0909bde9fe7d724569c7f7833f3a7bacd7" + integrity sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw== dependencies: cosmiconfig "^7.0.1" deepmerge "^4.2.2" svgo "^2.8.0" -"@svgr/webpack@6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.3.1.tgz#001d03236ebb03bf47c0a4b92d5423e05095ebe6" - integrity sha512-eODxwIUShLxSMaRjzJtrj9wg89D75JLczvWg9SaB5W+OtVTkiC1vdGd8+t+pf5fTlBOy4RRXAq7x1E3DUl3D0A== +"@svgr/webpack@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.0.tgz#663407b826cb96a3c3394cfe1f9bd107e693770a" + integrity sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ== dependencies: "@babel/core" "^7.18.5" "@babel/plugin-transform-react-constant-elements" "^7.17.12" "@babel/preset-env" "^7.18.2" "@babel/preset-react" "^7.17.12" "@babel/preset-typescript" "^7.17.12" - "@svgr/core" "^6.3.1" - "@svgr/plugin-jsx" "^6.3.1" - "@svgr/plugin-svgo" "^6.3.1" + "@svgr/core" "^6.5.0" + "@svgr/plugin-jsx" "^6.5.0" + "@svgr/plugin-svgo" "^6.5.0" "@svgr/webpack@^6.2.1": version "6.3.0" From 2f822cba2b29af37379e94ee47da28cc0350813c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 19:06:38 +0000 Subject: [PATCH 34/39] chore(deps): update dependency immer to v9.0.16 (#2233) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index ec740d0209..f93938b810 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -66,7 +66,7 @@ "eslint-config-react-app": "7.0.1", "fast-json-patch": "3.1.1", "http-proxy-middleware": "2.0.6", - "immer": "9.0.15", + "immer": "9.0.16", "jsdom": "20.0.1", "lodash.clonedeep": "4.5.0", "millify": "^5.0.1", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 493adfa65e..0a87376076 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4855,10 +4855,10 @@ ignore@^5.1.8, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -immer@9.0.15: - version "9.0.15" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" - integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== +immer@9.0.16: + version "9.0.16" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.16.tgz#8e7caab80118c2b54b37ad43e05758cdefad0198" + integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ== immutable@^4.0.0: version "4.0.0" From d1b754c2a23f719123bc755a6243ca4d8f66dd82 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 21:49:37 +0000 Subject: [PATCH 35/39] fix(deps): update dependency docusaurus-plugin-openapi-docs to v1.3.2 (#2232) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- website/package.json | 2 +- website/yarn.lock | 237 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 237 insertions(+), 2 deletions(-) diff --git a/website/package.json b/website/package.json index a5322ebc6e..d64f7a90d1 100644 --- a/website/package.json +++ b/website/package.json @@ -28,7 +28,7 @@ "@mdx-js/react": "1.6.22", "@svgr/webpack": "6.5.0", "clsx": "1.2.1", - "docusaurus-plugin-openapi-docs": "1.1.9", + "docusaurus-plugin-openapi-docs": "1.3.2", "docusaurus-theme-openapi-docs": "1.1.9", "file-loader": "6.2.0", "react": "18.2.0", diff --git a/website/yarn.lock b/website/yarn.lock index 20eb898a94..2d846cd10d 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1605,6 +1605,83 @@ webpack-merge "^5.8.0" webpackbar "^5.0.2" +"@docusaurus/core@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.1.0.tgz#4aedc306f4c4cd2e0491b641bf78941d4b480ab6" + integrity sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q== + dependencies: + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.7" + babel-loader "^8.2.5" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.23.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^4.0.0" + cssnano "^5.1.12" + del "^6.1.1" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^1.12.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.1" + postcss "^8.4.14" + postcss-loader "^7.0.0" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.3" + react-router-config "^5.1.1" + react-router-dom "^5.3.3" + rtl-detect "^1.0.4" + semver "^7.3.7" + serve-handler "^6.1.3" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.3" + tslib "^2.4.0" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.1" + webpack "^5.73.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.9.3" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + "@docusaurus/cssnano-preset@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.1.tgz#4d0c49338cf3aa88c5bd7cffbf77654db8e1e3b2" @@ -1615,6 +1692,16 @@ postcss-sort-media-queries "^4.2.1" tslib "^2.4.0" +"@docusaurus/cssnano-preset@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz#5b42107769b7cbc61655496090bc262d7788d6ab" + integrity sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ== + dependencies: + cssnano-preset-advanced "^5.3.8" + postcss "^8.4.14" + postcss-sort-media-queries "^4.2.1" + tslib "^2.4.0" + "@docusaurus/logger@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.1.tgz#78a940a333d2f654fd9dea24db2c962034d4b1ff" @@ -1623,6 +1710,14 @@ chalk "^4.1.2" tslib "^2.4.0" +"@docusaurus/logger@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.1.0.tgz#86c97e948f578814d3e61fc2b2ad283043cbe87a" + integrity sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + "@docusaurus/mdx-loader@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.1.tgz#cc73690ca5d356687d9e75740560b4159cd5cdb5" @@ -1646,6 +1741,29 @@ url-loader "^4.1.1" webpack "^5.73.0" +"@docusaurus/mdx-loader@2.1.0", "@docusaurus/mdx-loader@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz#3fca9576cc73a22f8e7d9941985590b9e47a8526" + integrity sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg== + dependencies: + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@mdx-js/mdx" "^1.6.22" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" + stringify-object "^3.3.0" + tslib "^2.4.0" + unified "^9.2.2" + unist-util-visit "^2.0.3" + url-loader "^4.1.1" + webpack "^5.73.0" + "@docusaurus/module-type-aliases@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.1.tgz#44d7132297bedae0890695b0e7ebbe14a73e26d1" @@ -1660,6 +1778,20 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" +"@docusaurus/module-type-aliases@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz#322f8fd5b436af2154c0dddfa173435730e66261" + integrity sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.1.0" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + "@docusaurus/plugin-client-redirects@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.0.1.tgz#3b00cd0a816fe85e6c505651f28b59fff723ac67" @@ -1719,6 +1851,28 @@ utility-types "^3.10.0" webpack "^5.73.0" +"@docusaurus/plugin-content-docs@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz#3fcdf258c13dde27268ce7108a102b74ca4c279b" + integrity sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q== + dependencies: + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/module-type-aliases" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" + "@types/react-router-config" "^5.0.6" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + webpack "^5.73.0" + "@docusaurus/plugin-content-pages@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.1.tgz#013f2e66f80d19b5c95a2d941d67c7cdb67b7191" @@ -1910,6 +2064,20 @@ webpack "^5.73.0" webpack-merge "^5.8.0" +"@docusaurus/types@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.1.0.tgz#01e13cd9adb268fffe87b49eb90302d5dc3edd6b" + integrity sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.73.0" + webpack-merge "^5.8.0" + "@docusaurus/utils-common@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.1.tgz#b6f2b029547f739e1431ec84abd16974edf495e0" @@ -1917,6 +2085,13 @@ dependencies: tslib "^2.4.0" +"@docusaurus/utils-common@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.1.0.tgz#248434751096f8c6c644ed65eed2a5a070a227f8" + integrity sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg== + dependencies: + tslib "^2.4.0" + "@docusaurus/utils-validation@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.1.tgz#69f7d4944288d71f00fdba6dde10f05008f04308" @@ -1928,6 +2103,17 @@ js-yaml "^4.1.0" tslib "^2.4.0" +"@docusaurus/utils-validation@2.1.0", "@docusaurus/utils-validation@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz#c8cf1d8454d924d9a564fefa86436268f43308e3" + integrity sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ== + dependencies: + "@docusaurus/logger" "2.1.0" + "@docusaurus/utils" "2.1.0" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + "@docusaurus/utils@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.1.tgz#37b4b42e29175e5d2d811fcbf9f93bffeca7c353" @@ -1949,6 +2135,27 @@ url-loader "^4.1.1" webpack "^5.73.0" +"@docusaurus/utils@2.1.0", "@docusaurus/utils@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.1.0.tgz#b77b45b22e61eb6c2dcad8a7e96f6db0409b655f" + integrity sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A== + dependencies: + "@docusaurus/logger" "2.1.0" + "@svgr/webpack" "^6.2.1" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.73.0" + "@exodus/schemasafe@^1.0.0-rc.2": version "1.0.0-rc.7" resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.0.0-rc.7.tgz#aded6839c2369883dafa46608a135c82b42ed76b" @@ -6461,7 +6668,35 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -docusaurus-plugin-openapi-docs@1.1.9, docusaurus-plugin-openapi-docs@^1.1.9: +docusaurus-plugin-openapi-docs@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-1.3.2.tgz#286fd4e1cf1ddeab09bf53652dc83aa8e060e469" + integrity sha512-pLjZv8D2xwT/9j1pZz5NsgNu9j+/6q9T/hbpAlvhFW/pggzS2vnqpPEjug2OgVkCmSSKxMFCu4ATBgap0oQLCw== + dependencies: + "@apidevtools/json-schema-ref-parser" "^9.0.9" + "@docusaurus/mdx-loader" "^2.0.1" + "@docusaurus/plugin-content-docs" "^2.0.1" + "@docusaurus/utils" "^2.0.1" + "@docusaurus/utils-validation" "^2.0.1" + "@paloaltonetworks/openapi-to-postmanv2" "3.1.0-hotfix.1" + "@paloaltonetworks/postman-collection" "^4.1.0" + "@redocly/openapi-core" "^1.0.0-beta.103" + chalk "^4.1.2" + clsx "^1.1.1" + fs-extra "^9.0.1" + js-yaml "^4.1.0" + json-pointer "^0.6.2" + json-refs "^3.0.15" + json-schema-merge-allof "^0.8.1" + lodash "^4.17.20" + mustache "^4.2.0" + slugify "^1.6.5" + swagger2openapi "^7.0.8" + url-template "^3.0.0" + webpack "^5.61.0" + xml-formatter "^2.6.1" + +docusaurus-plugin-openapi-docs@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-1.1.9.tgz#3b67b90540e1e1774b54985fa44394228762e7c1" integrity sha512-6SM9WNsT2DJdsd4hnbrkwj9tFFl9fjPZ6DZ6RQQGPxrzhUkhPEnhTsCGZGon9z/k6ZkwgE1I5tEBr6ipBDrh5g== From 384e97da141095230d8edc2cc74ef6983c64dbeb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 23 Oct 2022 00:00:57 +0000 Subject: [PATCH 36/39] fix(deps): update dependency docusaurus-theme-openapi-docs to v1.3.2 (#2234) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- website/package.json | 2 +- website/yarn.lock | 259 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 212 insertions(+), 49 deletions(-) diff --git a/website/package.json b/website/package.json index d64f7a90d1..7091f5a47e 100644 --- a/website/package.json +++ b/website/package.json @@ -29,7 +29,7 @@ "@svgr/webpack": "6.5.0", "clsx": "1.2.1", "docusaurus-plugin-openapi-docs": "1.3.2", - "docusaurus-theme-openapi-docs": "1.1.9", + "docusaurus-theme-openapi-docs": "1.3.2", "file-loader": "6.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/website/yarn.lock b/website/yarn.lock index 2d846cd10d..9df58dfc5d 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1829,6 +1829,28 @@ utility-types "^3.10.0" webpack "^5.73.0" +"@docusaurus/plugin-content-blog@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz#32b1a7cd4b0026f4a76fce4edc5cfdd0edb1ec42" + integrity sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg== + dependencies: + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" + cheerio "^1.0.0-rc.12" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.73.0" + "@docusaurus/plugin-content-docs@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.1.tgz#4059591b4bff617e744e856ca680674b27c0b98a" @@ -1851,7 +1873,7 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-docs@^2.0.1": +"@docusaurus/plugin-content-docs@2.1.0", "@docusaurus/plugin-content-docs@^2.0.1": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz#3fcdf258c13dde27268ce7108a102b74ca4c279b" integrity sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q== @@ -1887,6 +1909,20 @@ tslib "^2.4.0" webpack "^5.73.0" +"@docusaurus/plugin-content-pages@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz#714d24f71d49dbfed888f50c15e975c2154c3ce8" + integrity sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g== + dependencies: + "@docusaurus/core" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" + fs-extra "^10.1.0" + tslib "^2.4.0" + webpack "^5.73.0" + "@docusaurus/plugin-debug@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.1.tgz#2b2a473f8e01fd356e32236f753665b48209bcd4" @@ -2020,6 +2056,26 @@ tslib "^2.4.0" utility-types "^3.10.0" +"@docusaurus/theme-common@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.1.0.tgz#dff4d5d1e29efc06125dc06f7b259f689bb3f24d" + integrity sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag== + dependencies: + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/module-type-aliases" "2.1.0" + "@docusaurus/plugin-content-blog" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/plugin-content-pages" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.5" + tslib "^2.4.0" + utility-types "^3.10.0" + "@docusaurus/theme-search-algolia@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.1.tgz#0aab8407b2163f67eb4c48f1de33944e1695fa74" @@ -2397,15 +2453,15 @@ path-browserify "1.0.1" yaml "1.10.2" -"@paloaltonetworks/postman-code-generators@1.1.5-hotfix.5": - version "1.1.5-hotfix.5" - resolved "https://registry.yarnpkg.com/@paloaltonetworks/postman-code-generators/-/postman-code-generators-1.1.5-hotfix.5.tgz#7ec13583a1668bc92b886db15fcd8b96bfb66e1f" - integrity sha512-UPpA7tgv4BA1K/oc31A/yV+tan82QsvnOXvORHXW11Hr2/syY2uOLWKQJkgFDV9WXFSBu8SMgCEM1mJqldk1Jg== +"@paloaltonetworks/postman-code-generators@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@paloaltonetworks/postman-code-generators/-/postman-code-generators-1.1.12.tgz#04d7f2e4d22acfad3c3f3f115c24a31d80b8a20a" + integrity sha512-IsDqZxzTDVhpezPQV+pqzkq8MTKpcMRlgCiM1rTFqc13+swp3e87eaFUDk4ketbYWOBcN+WhaY2DslikUWtY6A== dependencies: "@paloaltonetworks/postman-collection" "^4.1.0" - async "2.6.3" - path "0.12.7" - shelljs "0.8.4" + async "^3.2.4" + path "^0.12.7" + shelljs "^0.8.5" "@paloaltonetworks/postman-collection@^4.1.0": version "4.1.1" @@ -4006,6 +4062,11 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== +"@types/parse5@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== + "@types/pretty-hrtime@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" @@ -4903,7 +4964,7 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async@2.6.3, async@3.2.1, async@^3.2.4: +async@3.2.1, async@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== @@ -6668,7 +6729,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -docusaurus-plugin-openapi-docs@1.3.2: +docusaurus-plugin-openapi-docs@1.3.2, docusaurus-plugin-openapi-docs@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-1.3.2.tgz#286fd4e1cf1ddeab09bf53652dc83aa8e060e469" integrity sha512-pLjZv8D2xwT/9j1pZz5NsgNu9j+/6q9T/hbpAlvhFW/pggzS2vnqpPEjug2OgVkCmSSKxMFCu4ATBgap0oQLCw== @@ -6696,56 +6757,30 @@ docusaurus-plugin-openapi-docs@1.3.2: webpack "^5.61.0" xml-formatter "^2.6.1" -docusaurus-plugin-openapi-docs@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-1.1.9.tgz#3b67b90540e1e1774b54985fa44394228762e7c1" - integrity sha512-6SM9WNsT2DJdsd4hnbrkwj9tFFl9fjPZ6DZ6RQQGPxrzhUkhPEnhTsCGZGon9z/k6ZkwgE1I5tEBr6ipBDrh5g== +docusaurus-theme-openapi-docs@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-1.3.2.tgz#1620e93680564bad5452daef668658625370261e" + integrity sha512-3lLkQav5egUq/Art0+EwETpOIqcfXU7fZch0o696unwjUCliyG3V3H3TjPmidH3IHRC+KrE0zHKKnl1aexi9WA== dependencies: - "@apidevtools/json-schema-ref-parser" "^9.0.9" - "@docusaurus/mdx-loader" "2.0.1" - "@docusaurus/plugin-content-docs" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" - "@paloaltonetworks/openapi-to-postmanv2" "3.1.0-hotfix.1" - "@paloaltonetworks/postman-collection" "^4.1.0" - "@redocly/openapi-core" "^1.0.0-beta.103" - chalk "^4.1.2" - clsx "^1.1.1" - fs-extra "^9.0.1" - js-yaml "^4.1.0" - json-pointer "^0.6.2" - json-refs "^3.0.15" - json-schema-merge-allof "^0.8.1" - lodash "^4.17.20" - mustache "^4.2.0" - slugify "^1.6.5" - swagger2openapi "^7.0.8" - url-template "^3.0.0" - webpack "^5.61.0" - xml-formatter "^2.6.1" - -docusaurus-theme-openapi-docs@1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-1.1.9.tgz#3d248ab281650b1f3b925123ff1dfa1acbcf2184" - integrity sha512-7bmmYOEycWeDMnAzRDBF7DoZHFulhZCmUnmPCcoY7dTPPlBJO/ay9p6+LqP5rf2Na7IDiyr79uTkk6SLCZluWg== - dependencies: - "@docusaurus/theme-common" "2.0.1" + "@docusaurus/theme-common" "^2.0.1" "@mdx-js/react" "^1.6.21" - "@paloaltonetworks/postman-code-generators" "1.1.5-hotfix.5" + "@paloaltonetworks/postman-code-generators" "^1.1.12" "@paloaltonetworks/postman-collection" "^4.1.0" "@reduxjs/toolkit" "^1.7.1" buffer "^6.0.3" clsx "^1.1.1" crypto-js "^4.1.1" - docusaurus-plugin-openapi-docs "^1.1.9" + docusaurus-plugin-openapi-docs "^1.3.2" immer "^9.0.7" lodash "^4.17.20" process "^0.11.10" react-live "^3.1.1" react-magic-dropzone "^1.0.1" react-markdown "^8.0.1" + react-modal "^3.15.1" react-redux "^7.2.0" redux-devtools-extension "^2.13.8" + rehype-raw "^6.1.1" webpack "^5.61.0" xml-formatter "^2.6.1" @@ -7225,6 +7260,11 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exenv@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -8160,6 +8200,19 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hast-to-hyperscript@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz#3decd7cb4654bca8883f6fcbd4fb3695628c4296" + integrity sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw== + dependencies: + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.3.0" + unist-util-is "^5.0.0" + web-namespaces "^2.0.0" + hast-to-hyperscript@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" @@ -8185,11 +8238,32 @@ hast-util-from-parse5@^6.0.0: vfile-location "^3.2.0" web-namespaces "^1.0.0" +hast-util-from-parse5@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz#c129dd3a24dd8a867ab8a029ca47e27aa54864b7" + integrity sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + "@types/unist" "^2.0.0" + hastscript "^7.0.0" + property-information "^6.0.0" + vfile "^5.0.0" + vfile-location "^4.0.0" + web-namespaces "^2.0.0" + hast-util-parse-selector@^2.0.0: version "2.2.5" resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== +hast-util-parse-selector@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz#a519e27e8b61bd5a98fad494ed06131ce68d9c3f" + integrity sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg== + dependencies: + "@types/hast" "^2.0.0" + hast-util-raw@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" @@ -8206,6 +8280,23 @@ hast-util-raw@6.0.1: xtend "^4.0.0" zwitch "^1.0.0" +hast-util-raw@^7.2.0: + version "7.2.2" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.2.tgz#1974360b2d7f15b5ce26c2a4bac892d5d8185a18" + integrity sha512-0x3BhhdlBcqRIKyc095lBSDvmQNMY3Eulj2PLsT5XCyKYrxssI5yr3P4Kv/PBo1s/DMkZy2voGkMXECnFCZRLQ== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + hast-util-from-parse5 "^7.0.0" + hast-util-to-parse5 "^7.0.0" + html-void-elements "^2.0.0" + parse5 "^6.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + hast-util-to-parse5@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" @@ -8217,6 +8308,18 @@ hast-util-to-parse5@^6.0.0: xtend "^4.0.0" zwitch "^1.0.0" +hast-util-to-parse5@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.0.0.tgz#a39808e69005d10afeed1866029a1fb137df3f7c" + integrity sha512-YHiS6aTaZ3N0Q3nxaY/Tj98D6kM8QX5Q8xqgg8G45zR7PvWnPGPP0vcKCgb/moIydEJ/QWczVrX0JODCVeoV7A== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + hast-to-hyperscript "^10.0.0" + property-information "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + hast-util-whitespace@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c" @@ -8233,6 +8336,17 @@ hastscript@^6.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" +hastscript@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.1.0.tgz#e402ed48f46161cf2f093badbff30583a5c3c315" + integrity sha512-uBjaTTLN0MkCZxY/R2fWUOcu7FRtUVzKRO5P/RAfgsu3yFiMB1JWCO4AjeVkgHxAira1f2UecHK5WfS9QurlWA== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -8337,6 +8451,11 @@ html-void-elements@^1.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== +html-void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== + html-webpack-plugin@^4.0.0: version "4.5.2" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" @@ -11105,7 +11224,7 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -path@0.12.7: +path@^0.12.7: version "0.12.7" resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== @@ -12030,7 +12149,7 @@ react-json-view@^1.21.3: react-lifecycles-compat "^3.0.4" react-textarea-autosize "^8.3.2" -react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -12082,6 +12201,16 @@ react-merge-refs@^1.0.0: resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== +react-modal@^3.15.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" + integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== + dependencies: + exenv "^1.2.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.0" + warning "^4.0.3" + react-redux@^7.2.0: version "7.2.8" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.8.tgz#a894068315e65de5b1b68899f9c6ee0923dd28de" @@ -12380,6 +12509,15 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" +rehype-raw@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-6.1.1.tgz#81bbef3793bd7abacc6bf8335879d1b6c868c9d4" + integrity sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-raw "^7.2.0" + unified "^10.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -13011,7 +13149,7 @@ shell-quote@^1.7.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== -shelljs@0.8.4, shelljs@^0.8.5: +shelljs@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== @@ -14497,6 +14635,14 @@ vfile-location@^3.0.0, vfile-location@^3.2.0: resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== +vfile-location@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.0.1.tgz#06f2b9244a3565bef91f099359486a08b10d3a95" + integrity sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw== + dependencies: + "@types/unist" "^2.0.0" + vfile "^5.0.0" + vfile-message@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" @@ -14556,6 +14702,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.12" +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack-chokidar2@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" @@ -14594,6 +14747,11 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -15081,3 +15239,8 @@ zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== + +zwitch@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1" + integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA== From e62be22daa3cb80e072138f8a41489fd5180d6f7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 23 Oct 2022 01:34:06 +0000 Subject: [PATCH 37/39] fix(deps): update dependency unleash-proxy-client to v2.3.0 (#2236) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- website/package.json | 2 +- website/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/website/package.json b/website/package.json index 7091f5a47e..ef052e1e16 100644 --- a/website/package.json +++ b/website/package.json @@ -33,7 +33,7 @@ "file-loader": "6.2.0", "react": "18.2.0", "react-dom": "18.2.0", - "unleash-proxy-client": "2.1.0", + "unleash-proxy-client": "2.3.0", "url-loader": "4.1.1" }, "resolutions": { diff --git a/website/yarn.lock b/website/yarn.lock index 9df58dfc5d..00f075397e 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -14377,10 +14377,10 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unleash-proxy-client@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unleash-proxy-client/-/unleash-proxy-client-2.1.0.tgz#cae933793d5de3a12fe71bfaf3ead8fe8eaa93db" - integrity sha512-BzpVO8A5nSOBIHpNpCpgYK6kjcsi5XvR1IVj8etl5U8TAhP6E6dr2/o+vJvESEU7+7UJpNYv40D05YH7QANpGQ== +unleash-proxy-client@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/unleash-proxy-client/-/unleash-proxy-client-2.3.0.tgz#30937d782a99ada6b9cb3012e824c232c64dab9c" + integrity sha512-UYDZjjsIF+n01LnijR8t/FXOM5XPnjZkE5K/E+SInFzBfL1SckYZHiuzii1/4QmiRo/x+vjx9LJjAzE8JRas4Q== dependencies: tiny-emitter "^2.1.0" uuid "^8.3.2" From da02a040febfd30e8df489ee28fdcb7f176f533a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 23 Oct 2022 04:07:15 +0000 Subject: [PATCH 38/39] fix(deps): update docusaurus monorepo to v2.1.0 (#2237) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- website/package.json | 12 +- website/yarn.lock | 447 +++++++++---------------------------------- 2 files changed, 98 insertions(+), 361 deletions(-) diff --git a/website/package.json b/website/package.json index ef052e1e16..7a84189d25 100644 --- a/website/package.json +++ b/website/package.json @@ -20,11 +20,11 @@ "build-storybook": "build-storybook" }, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/plugin-client-redirects": "2.0.1", - "@docusaurus/plugin-google-analytics": "2.0.1", - "@docusaurus/preset-classic": "2.0.1", - "@docusaurus/remark-plugin-npm2yarn": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-client-redirects": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/preset-classic": "2.1.0", + "@docusaurus/remark-plugin-npm2yarn": "2.1.0", "@mdx-js/react": "1.6.22", "@svgr/webpack": "6.5.0", "clsx": "1.2.1", @@ -63,7 +63,7 @@ }, "devDependencies": { "@babel/core": "7.19.6", - "@docusaurus/module-type-aliases": "2.0.1", + "@docusaurus/module-type-aliases": "2.1.0", "@storybook/addon-actions": "6.5.12", "@storybook/addon-essentials": "6.5.12", "@storybook/addon-interactions": "6.5.12", diff --git a/website/yarn.lock b/website/yarn.lock index 00f075397e..357921cbd8 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1528,83 +1528,6 @@ "@docsearch/css" "3.1.1" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.1.tgz#a2b0d653e8f18eacddda4778a46b638dd1f0f45c" - integrity sha512-Prd46TtZdiixlTl8a+h9bI5HegkfREjSNkrX2rVEwJZeziSz4ya+l7QDnbnCB2XbxEG8cveFo/F9q5lixolDtQ== - dependencies: - "@babel/core" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.6" - "@babel/preset-env" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@babel/runtime" "^7.18.6" - "@babel/runtime-corejs3" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.0.1" - "@docusaurus/logger" "2.0.1" - "@docusaurus/mdx-loader" "2.0.1" - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-common" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" - babel-plugin-dynamic-import-node "^2.3.3" - boxen "^6.2.1" - chalk "^4.1.2" - chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" - combine-promises "^1.1.0" - commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" - del "^6.1.1" - detect-port "^1.3.0" - escape-html "^1.0.3" - eta "^1.12.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" - leven "^3.1.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" - prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" - react-router-config "^5.1.1" - react-router-dom "^5.3.3" - rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" - url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" - webpackbar "^5.0.2" - "@docusaurus/core@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.1.0.tgz#4aedc306f4c4cd2e0491b641bf78941d4b480ab6" @@ -1682,16 +1605,6 @@ webpack-merge "^5.8.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.1.tgz#4d0c49338cf3aa88c5bd7cffbf77654db8e1e3b2" - integrity sha512-MCJ6rRmlqLmlCsZIoIxOxDb0rYzIPEm9PYpsBW+CGNnbk+x8xK+11hnrxzvXHqDRNpxrq3Kq2jYUmg/DkqE6vg== - dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" - "@docusaurus/cssnano-preset@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz#5b42107769b7cbc61655496090bc262d7788d6ab" @@ -1702,14 +1615,6 @@ postcss-sort-media-queries "^4.2.1" tslib "^2.4.0" -"@docusaurus/logger@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.1.tgz#78a940a333d2f654fd9dea24db2c962034d4b1ff" - integrity sha512-wIWseCKko1w/WARcDjO3N/XoJ0q/VE42AthP0eNAfEazDjJ94NXbaI6wuUsuY/bMg6hTKGVIpphjj2LoX3g6dA== - dependencies: - chalk "^4.1.2" - tslib "^2.4.0" - "@docusaurus/logger@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.1.0.tgz#86c97e948f578814d3e61fc2b2ad283043cbe87a" @@ -1718,29 +1623,6 @@ chalk "^4.1.2" tslib "^2.4.0" -"@docusaurus/mdx-loader@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.1.tgz#cc73690ca5d356687d9e75740560b4159cd5cdb5" - integrity sha512-tdNeljdilXCmhbaEND3SAgsqaw/oh7v9onT5yrIrL26OSk2AFwd+MIi4R8jt8vq33M0R4rz2wpknm0fQIkDdvQ== - dependencies: - "@babel/parser" "^7.18.8" - "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@mdx-js/mdx" "^1.6.22" - escape-html "^1.0.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" - stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" - url-loader "^4.1.1" - webpack "^5.73.0" - "@docusaurus/mdx-loader@2.1.0", "@docusaurus/mdx-loader@^2.0.1": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz#3fca9576cc73a22f8e7d9941985590b9e47a8526" @@ -1764,20 +1646,6 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.1.tgz#44d7132297bedae0890695b0e7ebbe14a73e26d1" - integrity sha512-f888ylnxHAM/3T8p1lx08+lTc6/g7AweSRfRuZvrVhHXj3Tz/nTTxaP6gPTGkJK7WLqTagpar/IGP6/74IBbkg== - dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.0.1" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - "@docusaurus/module-type-aliases@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz#322f8fd5b436af2154c0dddfa173435730e66261" @@ -1792,43 +1660,21 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-client-redirects@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.0.1.tgz#3b00cd0a816fe85e6c505651f28b59fff723ac67" - integrity sha512-A/giM3MIRRyUmxNzLb/jWvmRf0NtPYX4bV04njAnziAdPo4dqT4dZF2Hvy0uUSaF/SXPGLUjrZWWpzTl5mTJtQ== +"@docusaurus/plugin-client-redirects@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.1.0.tgz#4141040552faad48aefc5bc8f3827c3c4eba1ab8" + integrity sha512-3PhzwHSyZWqBAFPJuLJE3dZVuKWQEj9ReQP85Z3/2hpnQoVNBgAqc+64FIko0FvvK1iluLeasO7NWGyuATngvw== dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/logger" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-common" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" eta "^1.12.3" fs-extra "^10.1.0" lodash "^4.17.21" tslib "^2.4.0" -"@docusaurus/plugin-content-blog@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.1.tgz#a37065e18ffd26e022ffb16a21ff28199140729e" - integrity sha512-/4ua3iFYcpwgpeYgHnhVGROB/ybnauLH2+rICb4vz/+Gn1hjAmGXVYq1fk8g49zGs3uxx5nc0H5bL9P0g977IQ== - dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/logger" "2.0.1" - "@docusaurus/mdx-loader" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-common" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" - cheerio "^1.0.0-rc.12" - feed "^4.2.2" - fs-extra "^10.1.0" - lodash "^4.17.21" - reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" - utility-types "^3.10.0" - webpack "^5.73.0" - "@docusaurus/plugin-content-blog@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz#32b1a7cd4b0026f4a76fce4edc5cfdd0edb1ec42" @@ -1851,28 +1697,6 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-docs@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.1.tgz#4059591b4bff617e744e856ca680674b27c0b98a" - integrity sha512-2qeBWRy1EjgnXdwAO6/csDIS1UVNmhmtk/bQ2s9jqjpwM8YVgZ8QVdkxFAMWXgZWDQdwWwdP1rnmoEelE4HknQ== - dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/logger" "2.0.1" - "@docusaurus/mdx-loader" "2.0.1" - "@docusaurus/module-type-aliases" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" - "@types/react-router-config" "^5.0.6" - combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - webpack "^5.73.0" - "@docusaurus/plugin-content-docs@2.1.0", "@docusaurus/plugin-content-docs@^2.0.1": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz#3fcdf258c13dde27268ce7108a102b74ca4c279b" @@ -1895,20 +1719,6 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-pages@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.1.tgz#013f2e66f80d19b5c95a2d941d67c7cdb67b7191" - integrity sha512-6apSVeJENnNecAH5cm5VnRqR103M6qSI6IuiP7tVfD5H4AWrfDNkvJQV2+R2PIq3bGrwmX4fcXl1x4g0oo7iwA== - dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/mdx-loader" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" - "@docusaurus/plugin-content-pages@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz#714d24f71d49dbfed888f50c15e975c2154c3ce8" @@ -1923,70 +1733,70 @@ tslib "^2.4.0" webpack "^5.73.0" -"@docusaurus/plugin-debug@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.1.tgz#2b2a473f8e01fd356e32236f753665b48209bcd4" - integrity sha512-jpZBT5HK7SWx1LRQyv9d14i44vSsKXGZsSPA2ndth5HykHJsiAj9Fwl1AtzmtGYuBmI+iXQyOd4MAMHd4ZZ1tg== +"@docusaurus/plugin-debug@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz#b3145affb40e25cf342174638952a5928ddaf7dc" + integrity sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw== dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" fs-extra "^10.1.0" react-json-view "^1.21.3" tslib "^2.4.0" -"@docusaurus/plugin-google-analytics@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.1.tgz#e3b84237aad2e94dcd1cf1810c1c9bc3d94f186d" - integrity sha512-d5qb+ZeQcg1Czoxc+RacETjLdp2sN/TAd7PGN/GrvtijCdgNmvVAtZ9QgajBTG0YbJFVPTeZ39ad2bpoOexX0w== +"@docusaurus/plugin-google-analytics@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz#c9a7269817b38e43484d38fad9996e39aac4196c" + integrity sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg== dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.1.tgz#4cbcf9d520f7ec8124679fbe00867f2299a2f6bb" - integrity sha512-qiRufJe2FvIyzICbkjm4VbVCI1hyEju/CebfDKkKh2ZtV4q6DM1WZG7D6VoQSXL8MrMFB895gipOM4BwdM8VsQ== +"@docusaurus/plugin-google-gtag@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz#e4f351dcd98b933538d55bb742650a2a36ca9a32" + integrity sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA== dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" tslib "^2.4.0" -"@docusaurus/plugin-sitemap@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.1.tgz#6f8edb82b745b040d6b1495e2798396f63e50289" - integrity sha512-KcYuIUIp2JPzUf+Xa7W2BSsjLgN1/0h+VAz7D/C3RYjAgC5ApPX8wO+TECmGfunl/m7WKGUmLabfOon/as64kQ== +"@docusaurus/plugin-sitemap@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz#b316bb9a42a1717845e26bd4e2d3071748a54b47" + integrity sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw== dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/logger" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-common" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" fs-extra "^10.1.0" sitemap "^7.1.1" tslib "^2.4.0" -"@docusaurus/preset-classic@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.1.tgz#21a806e16b61026d2a0efa6ca97e17397065d894" - integrity sha512-nOoniTg46My1qdDlLWeFs55uEmxOJ+9WMF8KKG8KMCu5LAvpemMi7rQd4x8Tw+xiPHZ/sQzH9JmPTMPRE4QGPw== +"@docusaurus/preset-classic@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz#45b23c8ec10c96ded9ece128fac3a39b10bcbc56" + integrity sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w== dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/plugin-content-blog" "2.0.1" - "@docusaurus/plugin-content-docs" "2.0.1" - "@docusaurus/plugin-content-pages" "2.0.1" - "@docusaurus/plugin-debug" "2.0.1" - "@docusaurus/plugin-google-analytics" "2.0.1" - "@docusaurus/plugin-google-gtag" "2.0.1" - "@docusaurus/plugin-sitemap" "2.0.1" - "@docusaurus/theme-classic" "2.0.1" - "@docusaurus/theme-common" "2.0.1" - "@docusaurus/theme-search-algolia" "2.0.1" - "@docusaurus/types" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/plugin-content-blog" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/plugin-content-pages" "2.1.0" + "@docusaurus/plugin-debug" "2.1.0" + "@docusaurus/plugin-google-analytics" "2.1.0" + "@docusaurus/plugin-google-gtag" "2.1.0" + "@docusaurus/plugin-sitemap" "2.1.0" + "@docusaurus/theme-classic" "2.1.0" + "@docusaurus/theme-common" "2.1.0" + "@docusaurus/theme-search-algolia" "2.1.0" + "@docusaurus/types" "2.1.0" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1996,32 +1806,32 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/remark-plugin-npm2yarn@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/remark-plugin-npm2yarn/-/remark-plugin-npm2yarn-2.0.1.tgz#9d49181e1711d8564e0304fc5b3cae21c47fc180" - integrity sha512-qTFTb4UG2gO1WcCmrRkE9ipGqzH+KTKicJbOxTNVNMcLne6qwiBPUiBg6UfqaMEho0aILyn+Vh1FFBONkEnAtg== +"@docusaurus/remark-plugin-npm2yarn@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/remark-plugin-npm2yarn/-/remark-plugin-npm2yarn-2.1.0.tgz#45d933002880e55ac70ac33a21894243e8af7643" + integrity sha512-crlbE7XN4m6f5PMW+1K0w1/r6YsJPBHPAnxBu+dwcObBYFKeNnmtci8mBOX/Ey1eeV9wO1yFwaSWKEn1EAbcbQ== dependencies: npm-to-yarn "^1.0.1" tslib "^2.4.0" unist-util-visit "^2.0.3" -"@docusaurus/theme-classic@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.1.tgz#043b6fcd2ecb2aecd134419b198c9f519029d5e7" - integrity sha512-0jfigiqkUwIuKOw7Me5tqUM9BBvoQX7qqeevx7v4tkYQexPhk3VYSZo7aRuoJ9oyW5makCTPX551PMJzmq7+sw== +"@docusaurus/theme-classic@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz#d957a907ea8dd035c1cf911d0fbe91d8f24aef3f" + integrity sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng== dependencies: - "@docusaurus/core" "2.0.1" - "@docusaurus/mdx-loader" "2.0.1" - "@docusaurus/module-type-aliases" "2.0.1" - "@docusaurus/plugin-content-blog" "2.0.1" - "@docusaurus/plugin-content-docs" "2.0.1" - "@docusaurus/plugin-content-pages" "2.0.1" - "@docusaurus/theme-common" "2.0.1" - "@docusaurus/theme-translations" "2.0.1" - "@docusaurus/types" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-common" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/module-type-aliases" "2.1.0" + "@docusaurus/plugin-content-blog" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/plugin-content-pages" "2.1.0" + "@docusaurus/theme-common" "2.1.0" + "@docusaurus/theme-translations" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" "@mdx-js/react" "^1.6.22" clsx "^1.2.1" copy-text-to-clipboard "^3.0.1" @@ -2036,27 +1846,7 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-common@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.1.tgz#9594d58fbef11fe480967b5ce4cdbb3cd78d9ca3" - integrity sha512-I3b6e/ryiTQMsbES40cP0DRGnfr0E2qghVq+XecyMKjBPejISoSFEDn0MsnbW8Q26k1Dh/0qDH8QKDqaZZgLhA== - dependencies: - "@docusaurus/mdx-loader" "2.0.1" - "@docusaurus/module-type-aliases" "2.0.1" - "@docusaurus/plugin-content-blog" "2.0.1" - "@docusaurus/plugin-content-docs" "2.0.1" - "@docusaurus/plugin-content-pages" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - clsx "^1.2.1" - parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-common@^2.0.1": +"@docusaurus/theme-common@2.1.0", "@docusaurus/theme-common@^2.0.1": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.1.0.tgz#dff4d5d1e29efc06125dc06f7b259f689bb3f24d" integrity sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag== @@ -2076,19 +1866,19 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.1.tgz#0aab8407b2163f67eb4c48f1de33944e1695fa74" - integrity sha512-cw3NaOSKbYlsY6uNj4PgO+5mwyQ3aEWre5RlmvjStaz2cbD15Nr69VG8Rd/F6Q5VsCT8BvSdkPDdDG5d/ACexg== +"@docusaurus/theme-search-algolia@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz#e7cdf64b6f7a15b07c6dcf652fd308cfdaabb0ee" + integrity sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg== dependencies: "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.0.1" - "@docusaurus/logger" "2.0.1" - "@docusaurus/plugin-content-docs" "2.0.1" - "@docusaurus/theme-common" "2.0.1" - "@docusaurus/theme-translations" "2.0.1" - "@docusaurus/utils" "2.0.1" - "@docusaurus/utils-validation" "2.0.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/theme-common" "2.1.0" + "@docusaurus/theme-translations" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" algoliasearch "^4.13.1" algoliasearch-helper "^3.10.0" clsx "^1.2.1" @@ -2098,28 +1888,14 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.0.1.tgz#955a687c974265a811bfc743d98ef3eab0379100" - integrity sha512-v1MYYlbsdX+rtKnXFcIAn9ar0Z6K0yjqnCYS0p/KLCLrfJwfJ8A3oRJw2HiaIb8jQfk1WMY2h5Qi1p4vHOekQw== +"@docusaurus/theme-translations@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz#ce9a2955afd49bff364cfdfd4492b226f6dd3b6e" + integrity sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg== dependencies: fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.1.tgz#8696a70e85c4b9be80b38ac592d520f6fe72618b" - integrity sha512-o+4hAFWkj3sBszVnRTAnNqtAIuIW0bNaYyDwQhQ6bdz3RAPEq9cDKZxMpajsj4z2nRty8XjzhyufAAjxFTyrfg== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - commander "^5.1.0" - joi "^17.6.0" - react-helmet-async "^1.3.0" - utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" - "@docusaurus/types@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.1.0.tgz#01e13cd9adb268fffe87b49eb90302d5dc3edd6b" @@ -2134,13 +1910,6 @@ webpack "^5.73.0" webpack-merge "^5.8.0" -"@docusaurus/utils-common@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.1.tgz#b6f2b029547f739e1431ec84abd16974edf495e0" - integrity sha512-kajCCDCXRd1HFH5EUW31MPaQcsyNlGakpkDoTBtBvpa4EIPvWaSKy7TIqYKHrZjX4tnJ0YbEJvaXfjjgdq5xSg== - dependencies: - tslib "^2.4.0" - "@docusaurus/utils-common@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.1.0.tgz#248434751096f8c6c644ed65eed2a5a070a227f8" @@ -2148,17 +1917,6 @@ dependencies: tslib "^2.4.0" -"@docusaurus/utils-validation@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.1.tgz#69f7d4944288d71f00fdba6dde10f05008f04308" - integrity sha512-f14AnwFBy4/1A19zWthK+Ii80YDz+4qt8oPpK3julywXsheSxPBqgsND3LVBBvB2p3rJHvbo2m3HyB9Tco1JRw== - dependencies: - "@docusaurus/logger" "2.0.1" - "@docusaurus/utils" "2.0.1" - joi "^17.6.0" - js-yaml "^4.1.0" - tslib "^2.4.0" - "@docusaurus/utils-validation@2.1.0", "@docusaurus/utils-validation@^2.0.1": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz#c8cf1d8454d924d9a564fefa86436268f43308e3" @@ -2170,27 +1928,6 @@ js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.1.tgz#37b4b42e29175e5d2d811fcbf9f93bffeca7c353" - integrity sha512-u2Vdl/eoVwMfUjDCkg7FjxoiwFs/XhVVtNxQEw8cvB+qaw6QWyT73m96VZzWtUb1fDOefHoZ+bZ0ObFeKk9lMQ== - dependencies: - "@docusaurus/logger" "2.0.1" - "@svgr/webpack" "^6.2.1" - file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" - globby "^11.1.0" - gray-matter "^4.0.3" - js-yaml "^4.1.0" - lodash "^4.17.21" - micromatch "^4.0.5" - resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.4.0" - url-loader "^4.1.1" - webpack "^5.73.0" - "@docusaurus/utils@2.1.0", "@docusaurus/utils@^2.0.1": version "2.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.1.0.tgz#b77b45b22e61eb6c2dcad8a7e96f6db0409b655f" From 56e9af3434639b1effff425f0cfd86243fb8c0a7 Mon Sep 17 00:00:00 2001 From: sjaanus Date: Mon, 24 Oct 2022 10:42:33 +0300 Subject: [PATCH 39/39] 4.17.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f8fd0d281..32cc06db5c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "unleash-server", "description": "Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.", - "version": "4.17.0-beta.1", + "version": "4.17.0-beta.2", "keywords": [ "unleash", "feature toggle",

CGR6T22>!Z;f~)LY_|~D&g5rNC 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 literal 0 HcmV?d00001 diff --git a/website/static/img/anatomy-of-unleash-segments.png b/website/static/img/anatomy-of-unleash-segments.png new file mode 100644 index 0000000000000000000000000000000000000000..d7be434b236cf6c63840f9e32b305c3308027604 GIT binary patch literal 38678 zcmcG#_ghm<)Gi#PDbf_MfD|ht0@9^70Y!Q*0;2RTkkAPhK&6RFFQG^ay+a_NAkupe zBp@9^h?E2&BstsXz257b?+^HX2>W7Y&#aj>YwoqyJ+nU;>T9zwaWjEHAeJYO9~px{ zXLf*J`dJ2`WMw2G0eGDAeQf0q0-fjh_oD%2WL*IYY5a|~)j^fR*S3Iv=v>tF)Igw` z#Pg>P^dL}5*^@_Vra?3~^!co>U^JDA-w~}o+j{>V)A_s4U%X*F!(||pn^ss#RxCsZ zZ?Y2F2c-JOCqdmB=|yg2GsHxBx#H?|VS{T@CPw0lpbvd&&((~qAg^to2W~)-RoQsI zp$7kj>@I1^Dwo6$+36mY6LGD0tRxH@8pRCCy*rq#5SVr_lGZ3AdH)(K+xaMUvikLc z9`}IrG4oXEy9|WkP#gSdYiF=MHv1^lDLB|QXV)O>;j26vLsNAIkfHC5-(l(=9znWR zR-3MZ^;^mg*YY29j2`Qr7L^YU`ky&vqRq{{FiVpQdPsx(Rhk9cI1S46SLkLRPRf5A z)RFy%l~eSL0*KD^+sBAXj>bEi&XK#VBjkWn==q<^}CPRzsJ5GbqSNP_+KN;C#)0@F$5mQuPMV z37_K8!h%Uw|N3n@Fx}ZHh(PYy9ndEYtI87DugS^b>`cibqGDn;Qw7?`@Y-5F9%13o za-hIxl&(N4-rC9V&-V5>c@D>M4yRhp zK1(COn3b#i>)e*gfTLkx=P~@_$B)HX&)ZAj@NK8ghn%Z3M5?>;Te(}+I#R|#9s|>0bK+OVACn?KxgwSmMnDk12jS#abeJHmAWM_b3^NlPf zXr($jT2FGEW%nIK;L1N~4(TQE)YQ}tQzIkd;h*1K)JL~@(=V1b8-U-CMosNCTp9Nh z0gYe%W(O85QE^9DnkAY}xESeaHj+kw>N)D_u_>WnJY1)*De0OWtNd zh7b^I?{BhZIz>hr+LOi$sljQZtaKdzURY|`SkJl0)S@9X{p}>9wzjrdJK=QjcHGGu zfg6CRe*>11OD6bd_n(BjwSCJA#A8(CcdGZ;xCOqS#i>5{r%;xy1UeJ*OV*|~3Y$Dx zrXSVSTp8cQ06G!Uku5*kne(4c(&keh0?|hUQqKcYjX!zw=vLVwi(b7DV!E2gdzKZj z?^_q-ejJW*3i`|jZ)8mTio1G{K*MwmsATw8$$r&^Y=0+e?0J8GzxmWOt73cvn3Drg z7SxFW#QtR?|M5HU*ZV9Q@_wr>`u@r*Lg5~(r?QghW1kp**+}O6PF9fk!`B6OjIH=n zJgqzBb!d_y0?-n`@IB$|tWRYwIPey}(E)UCI!p6iaOyYDIqY3cQ`GB)o7J?D+TVP_ zgPFd_FkdxRNUu&Xe&ovN7n^bg^yht+W5(BL?_1>srel1xtCxVe-MI1kg=OtlfYGgA zR@$XE>uFmwo-%{dCT$!-h&yuF-kWTK0iX-@J)k-5C|;1Rd&L9!zOU7+j|#?F9r<7L zs`fpt;VM$Q*?9$&&5nA#18mK^Zb{~8TYW{?sj?Z7EJvoF+OCYXfO>PkH8e&S3uYGO z=P&=bnefmvh2|4`9&az8%*fAcbW!4YhMNnwzDP6wvoHo#9bmcEf#v#I?mK&We@?2t z6SM^kFTJ}u0i^SpgZ0iWo~v2~ow{khlR>n(Pp|A>=w-gQ15}yV8dwjNRqm2*(&i47 z04>y>GaCAt+6JB>y?ZpV`Dmi%WskBKDBye^@22uU*%K)4cBwh3ELSE+R-laUUs?XE z8I8Qrz7Iu4;A{@P*Mop@*=hs*7#m*=%-)v&#QP4C>v4}6^p(9B5fPBTF)%P-pO3Ih za~@0+cj}6cH|hHA3x+9&JEMKObl=#4gz6QjSt;9_;z^_4SCkkE-jm#VcMlZGnAABvVL^#9M1dQAm$29=)66)8#{DBv72Zry= z)`;%YV5U6ukKnD0qCmXeZ6jMM=13G8L?Whi zap)DiP2JzGHB$;DTGuZ|FjBU6>I~QdG7U#^l+0zNHC2iTvh>fV%R{xHe}ALK!b#>8 zh{N&Nr`wT9#47^QfVq8r=jdR2a)dVkD|MbT(BRshvX+2So*q=S+?mDQw*T8%107e3 zMlMpk`mQfZ(=VX|FOOJuM3B8aW-8?-z6#vKsrmtkar=6(g6{D|mM6EpMpsd(NpS=| z9ZETXP2Gu1c)0vN8b;np*?Y?{m80_fd*o9C1sqk6^`z;{{-_2UiyqNSTS%au_QTjk z+T2Y!=&Z-*rmn-&RyB1IkqQ!-Pz8l;zgzjvP$*p4+?HFZPddR;mw(QlMZJvt3t;3& zJCCyTCDU0BZux*slcGm%XCDztL-|RY1z?ToO50Fpe}9w751H;s>Czt4Z%vAHtsIRV z%l6@KiY0LU$zbxKzo_sko8q5QLy~`BO6G9br1R=xM`6M!>rVjd49|2HU*S-x@z^0e zHoW^J&#>gWR`Vn|)n&Nt_ichjD9o~E`Rz(JRQ?QUFkNz_q-t^Yf@0vj*Y~P+DjBZ= zp7#p8*62RPC~0kNy|A?QZqH})6?LC$92T-&DwHYXC8vQrAnqL>*h?sdn6{akOyGZ% zRkfd}alEwyW{^mhpZ13+>0Wc!KA!2ooUW&c*bLWqsr3WzER2>}j1;pf`Ywo+z6)%n z#K&hA2W=D(s>*i=&&!YRmX{6nl4cvd=Gi9B{lN4@oJ?dINZtleFyP;`4*UDn8Kb-Q zV8H9gxoWx=_T( z6B=7A=iHr{*m$s#sDhNioXj6TT(r!BUw9ty=>e2drV`sQEN{8TSN&B&U4cFRi#`pf zG|R^3JA(L!qB*zXY-4ZyT}>{owOHg)*Y8I7qY0nI_V5z*@+azf!DvK7N5W+Ya#Dqg z@~BeW@siuRXV!$gY^C#PVk`5F<%k;@Z1}l9jGJ2qfkiqGA+7`P$*up09wGpsoO?yZ zhb}}kbskD3pW8WCVsJnZI^oV^n`X{=Q_`-}fegm=>xOHO##7*{e)wKvod83S3!I5~O`F*+JQ0 zWaDc_00VE@ENbMz`wzb!Qy|KPO5O$xuD;+lgQ}6Ruq4ODhOUPfJZjXQ!Ecb}r9udB zUAMLq43ad+{m}QQ7&7m*!HiNq_BfP?tUo3{DHOkMAThdave6xbXVxOUQR?9Qf`yOLGyYK7$K zl}6J0(76gY z(6Nut9+ci0lcHs0{RUOiOio7f>)uWy;ulqZOW8EZ#1k=r?Q4(!^0@|ZQD48a_KYib zhkYz6Dk_1b6EC<<7YCdvX%d9aH{vwfMoN>r1q9FH?wVxC?x_z8s2a%P#gBWaZl$07X+j^aIB$pf9xR7@T%HCz5Q0e zZ1n|$si_M2u!HrX7`f!9O&QPZ?Aj4<_(|ahj>L$2$z@-Q?s39>iKOWSQbk3D#znoV zoL3WW*}@Zcu>JjyB{PRRa|c@yD**l|I4k>?Wyi1xJxi-y_j>sCu`azUJ-H8B3fyTD&(sK%;fVSg;;u zY+l5g{y~`8P}TJVjbXido+B4=)ctLi!r!Hu*i)~E=PwOXJ1j428nY9Dn7Ga*QI!5A z)eoGT8+*4q(@u>XqtX@<9UX9}T={(09vVNzhtJnXMceowmE5YrYJIpztq?fz1PA?w z@XCXn9GA#5>QTI^;`5SYUz9@4zk$bZNN7xL7sDcUFBPNEuWsZbKW}CFhz41CJ*=ph zCrQhApS*$oePlMnrs(@DRm<^1!!usyXOOw0ghj6=G!!u)DqTi8EOi?_R{;y#AN&0e zzBe5wfCy6`Nt&7>=dTykpf*OJZtZmxw%vLYyyn`PlFat4nF^aswh5V?+5yq*_1|7~ z7xap2R*~~6ke%y`dVx||#uHIGqz4<2Dh^a41dfv|X)Is|(w?v7`}=+&vj?jvkK&<| zA8Zj15iKpH1!&DYi_6OH-gf+fC7Obk23Y;b_=aZ<_2srUfmQz4>9C(xRLLwGorAxp z8*I?yycj;WKMAT6loNswi}VLx1UqU?u^6TN14sxHnfn6UG**Uw~r69)i_V{+=zjp~g#J=vkGB7sWt)SwAdb7IJ!Pa3S5 zS^eko=PY-fQf)6DxHmH`s2uktb|kqf<6d{1q~M{{P;re_0Gnv%ThdP#6sn5Mn9uN_$nw?F~yASr;D$GFhq z7a(MiKS_;Y<9~HeLnNiK@M$V*MVU=;J29^aYo12@L*dz2jM9&+l2uK3H7*3oT^dRg zfB8|ie89Vv#c_7{qO9NQ;|9*`MsKvXN%n}gg~2+nGs?hF$slljFunD`HHgOPf&TlM z4yHf59q)o2&;NssSf)_7G&%qEtNhT@tp?1PdB|Z&&{nYu@>q)Y(I8BP8dp?QVbW^l zrOo0hOvW4MiZIF{}s!K>P8EJI96xRyR~P)Q;{Ead z_X!}7bRD~Ba!NTKftsrvj^3<7LDC|~?nPVqS`3e0>+9TZzTD80HNT=C3A5O=sJ{(_ z0M>NGao;Jk8C@WfIIcz>VO&n4E=L^j(tdmLBfKk`C1z~JZjx`}v5LMgbdXa3$Sd-J z1oczpe`z}qxo2(B9d(_>Yq~{oEO4QG#J<55{y797huTbNT8sz{(9r1mEh6G&@9O0> zRh>7*(7mcG*fw(a-I6{4m-Rp-EAfP;y(O6R3E1IB9$sbyCB<8Qlt(J?J$jKpKeB-x z;0l;W?w|X1Z9ydm@md5TZobUMMvu_wr5F0HEARU7%K~uZ>a}Y)m)e`v|F^;4$*C!` zDw`(n027mmi20@_-u18varv%AUpmodj{gi!0rZt&@t7edbJym7nHgOWfEs`;0#$qp zx-R|)jgk`V81VI?s?}E1|Bl!Y#fecl*<6tfcvZezKlCs!9KnHdNmB%fAwZuHP^2`J zaw?gT(HK!zCRh=z?wsSVpu#^zl%NHOHqMs4l^&Ic4xL6lQv zq_>PH$sTcjc?t9Z0)34GlDzh?!!ekO-VbDXxo7f|kq5>7l+A?}|Kjv(`9RP#2K)hi z(*0)U?0z|9fnQkI-^OuUFU81#5d>20GcFtKO@gH_)VYk<=!WRKc}PWPZ1r~*5=OR{u}Ri7b^M49v~$C)JsK2miL*v3ReG{uy~24mWFE4 z*o`mAqksm1l8c7102QHR%o~bk!KEu+NCtQd5a`ycpBJZB6w$=FSe_AllhT@U!Nu9olZcYDNR8mplRZ_W|S-*B0J$>bW zCUjl?oOE&oWCFweW!%j0+#)y=703+_`@zVzWMfCiMTus;opQGOX+Fm3l1HwNf)`y-M+(_v$Vi- zsfFgT0n*=Q^Yrp@^SSh%!Q?KBD*}s+5zo9D!voUhP>2}uih}IL0}b6~uM*O;S!QX_ zCtjAK`-iW^^B6c-DurjLUf|yOnR;9nNwkf)zE+460+#hNMY*)>pfufMdwPo)a%!uUc`(}dW2GZ}qpl;RVqv?vKbT59T9ZG_*A-opgu_}gs4$|R1JX6BrydJERVy4s1 ztMuT51Tqg7=LQP`y*oIV^gL92=r*Gb7UjC6D#KE80YGl~fj;Iv+T%GuF9y?VS*VJL zi9v<>98-UWjHZkhD>P+PC2Y4A>@y0KiJm@7J|4GI*y_pXeS%Rv;Z9+bhMi&^nofRx z_y*E>UC|6Zt+LOIo}wp&ibdTE)hoZwH*n)-XGtHr^yI?y>t`p&uUgY0a1|~b3l65Q z1Hw+%IqL`$F4=fPHd&CNd#6`VW(B{p&EqME*<6>y7vICoUiL(z{;ZFKLMLidV6E3Q zeor09x*Huz7Hk?~3dSo$xLB4$r--~mI`J~7upCv<2t6_X!Mya3S9oWk0zN}dYw_RE z;@a!iy&F&)@pst{$r8Ds@Zzx(iOngmfaO!1^>c0uWnjUIuYgorr*S5OfDT6QBVcbmVUyw&!v*^#H2-*;CP|Jp!CXaJu5abZ*^5o%N$d$*x694>Zf`ymeoEZkRd0kQIBQ3L>$OBpM7=w z%$*&i0|?0d`**06`S)3n)weu8*{XAc=SsK}k>&U6@AWx${hL0W{MckY-FBHZ=&nwM zh{+pMC$^~m&xD%9e9@Le*+*-q5rjbdT^O# zR1b^Ea!DCEeoHz?F__K>q=qEYd{R9qQZ=0mJ={#H24Gks)EqD<%I42vUtz&ahDkxZ z$b+XaU6H@$Y`kt-u#}GBB0gjp^S;5N=VoN-;-{pd7lN2Cs^^;kWwGuyc)aZ^Xb&e< zR#q7_GfC4CnJpXg=EzNmz^E;Y^srQKPj7J+J(1lJ4Uz>n=yv(mifY*H*x8J%B|_gg zeG&VPgkRQG<*oZo{dTx_-QoJp-vy2?VN|-vgSr{Vbgz~E!iUxqSpojpQ})(_xRj^x}(L@NiMHI2?8Y zjd3JB87Z#QN6#gg+LgK4QLZk!b7nO*u4GeT&SylcZtpS_pH%7`sHFNlNDTMCpT{eA z@FUv!fJ3kv3f>W*U5%gb7~Xskbt`+cC2W^}aDR@iStU{aC49@s%IT6)Sgf06gOo&- znlqk5OiF`Isb)pm2cv>4P`6QXe2Cq=h(h8u7oyznPW`HbUBQZ(@ea&NWm5^4 z>!94kLimN)^@1&AGTxG8R}Za+?X)ZX?Svr&@s$y4eF9!r73cluVPs`R$bXzBSirUPJ?G<&LRN>Q2H@?J=@GrTa1l6mJ8Go;%@g_Vq zK)jxQI)XgT-12rZM{Y>0j*4ZPiK)!(g_Um~F&Vr!2NA_QdiG^C(M^IH{V_hucvhOL zu_?zW^kVEB>UVUQOE!;r$NU!Ed`giX@4;g8w(XIlEsr0LxGA1}&7*0Clr>3a#&E&~^2j9n9 zHhS^sfcZkmQ&3w}P57Q&6}f=?e8yzHUSdK|e>kzZUW2l)2coiSa5~X}3l4y1Z!zgfD#76Ez zVdUL_(sAymn)r6-rPmzG?bFdUj7=HuZ#mt&c;?skpp z3!xjgC7gV z&@#vOPAtnkp2JLTns*`>FS^1)n@sSDcE#r0tr2DRlvss~SSsj65274AQ`l6;);2KF z0Y419=E^%wQQlPT<@@Fu%%#vk_1Zy7F0M0J&lA5xC(>tD^R_o48qD@eM!$`AR5KW8o@=@`FY_&UkW9RO&Ym9|MnejTdes_+qg7fj^qO2bnVFxc z(5Z*E9$M4ek|w7&c9tssPjRyDu{!8WYAwGomh^4j|3@(qPg9ExU)%LPYa$st9X9OKWWI;zkm&WMsvrSW{ zmqsOeoU@vOZ&8uOaNPMB7+Tyu>hZjHft#nH*#ja2gkJY4?q*}Y;^etFL}`QLz<@!< zxB2CF{TGJ)qUB`Geu?n12Wiv>W_R1vOe0E%G#Hs`;uQDZB!Ddjde6&d;Y2OwNqeE^ zmv^gzsyL!H-in^O^++JG2fsTvvf*P1$M=bJVN^(5S^%VnVo&b3f58A5Q|tP@h-_V1 zQpZU^sGb4sPSrcF--uc|&44GjQt8(f>2F< zxWhfx+<>Jb!erY~Y@18Qi2Y4GvT-ikK#vr5s2915g{V972eCPGjyCW&ByI+3|4NRE zzVh|m@186!E+#HIGh9Q4qS-5YD_+q1&I*?Ilnaj$lAZ04B8Ib7^U;C+p}f+DZF?ZOzUqFq;PbNI?Oh$g9F~~abe#3517lK*IQycr#glW++SM_TYEw%MwaiKcTB`ySKx#yWGyS}e)d`ix%7Y`9?|HD#vtwIml4xuy|c z+3VNlrHbn5IIbcOxm1Sd6`ZMD3u5y%&1-b9nlF7&?haO@kekHEMQ?S0F&4bDy?n!@ z-0)jI3VF6>{=99oP97xO33gFIpJ&aygK+iz6i<~CDz|d0L2vvOyG)5sG2w8RzqK;O z+INAxdAbws^Lp^C84o8jee;;hPj4Edr@A-fUrSA&E??a>jr2PI{$6iPeA|2*X@>Xa z`#*x`H07Xv8hoNZRMQ(+db9_ zF*TSn&%?OU+t|oWDawYN)RQaN`t*Yis}grTD8yCNqe~U&$r@IU8#L3kIAxzIFWrZ1 zxPj0cT%KOA&Z5RHo2z!5a~)#xi=MN4D;2)0i-9+=`7&Hay#$~6h_@HnJ`|?h##8FJ zypCK(+S+JPyP*wKOZc~*vZ5-u&vu(#j*mJ*ez+r0B}Wl!FMf3M(*>`J&@2CxbX{Ca zyN^MnC*fVbZ~3K+sT}jvT|3S`qPgI5g=L^iMwqLc4*u3it~cZJHK}U*B~vf6+l^ii z$x>~sq@7vqLDMMo?IUUVz3ZW@~?%f1)y`FZ+KJZ0XX zpx|MXW0zf{MQ)%c3_gkw`U6+zlld^Wb{Jdk-<7iJB{o+r-se}R^dgp6VEr7`F|^gj zzvZCKVC0~!3%|w&3o_S+HZ}#ew@wirN!i;-�-FEBpK4A$Z$2R=t1BJEuE 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%0Ddw%*^&xtj)bD1Zs=q{k3D+&j}i=RLdU{? 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 literal 0 HcmV?d00001 diff --git a/website/static/img/anatomy-of-unleash-strategy.png b/website/static/img/anatomy-of-unleash-strategy.png new file mode 100644 index 0000000000000000000000000000000000000000..8a45aab01931f95b95b57d85f88b58cf7adca9b8 GIT binary patch literal 21222 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