From 58510dc11cf82bb5aaa229eca9f5005c3c6714be Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Fri, 11 Aug 2023 16:46:35 +0200 Subject: [PATCH 01/15] Feature preview --- .storybook/helpers/MockedUserProvider.tsx | 1 + locale/defaultMessages.json | 10 + package-lock.json | 2404 ++++++++++++++++- package.json | 7 +- scripts/build-flags.js | 77 + src/components/Sidebar/user/Controls.tsx | 14 + .../user/FeatureFlagsModal/Content.tsx | 41 + .../user/FeatureFlagsModal/FlagList.tsx | 44 + .../Sidebar/user/FeatureFlagsModal/Header.tsx | 16 + .../user/FeatureFlagsModal/NoFlags.tsx | 23 + .../user/FeatureFlagsModal/ToggleButton.tsx | 35 + .../Sidebar/user/FeatureFlagsModal/index.tsx | 69 + .../user/FeatureFlagsModal/useFlagsState.ts | 30 + .../user/FeatureFlagsModal/usePersistance.ts | 26 + .../ConfigurationPage.stories.tsx | 1 + src/featureFlags/FeatureFlagsProvider.tsx | 31 +- src/featureFlags/availableFlags.ts | 36 +- .../strategies/MetadataStrategy.ts | 41 + src/featureFlags/strategies/index.ts | 8 +- src/fragments/auth.ts | 4 + src/fragments/staff.ts | 4 + src/graphql/hooks.generated.ts | 8 + src/graphql/types.generated.ts | 12 +- src/index.tsx | 337 ++- src/staff/fixtures.ts | 1 + 25 files changed, 2937 insertions(+), 343 deletions(-) create mode 100644 scripts/build-flags.js create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/Content.tsx create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/Header.tsx create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/NoFlags.tsx create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/index.tsx create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts create mode 100644 src/components/Sidebar/user/FeatureFlagsModal/usePersistance.ts create mode 100644 src/featureFlags/strategies/MetadataStrategy.ts diff --git a/.storybook/helpers/MockedUserProvider.tsx b/.storybook/helpers/MockedUserProvider.tsx index f201b88e32c..dd4e07865c7 100644 --- a/.storybook/helpers/MockedUserProvider.tsx +++ b/.storybook/helpers/MockedUserProvider.tsx @@ -27,6 +27,7 @@ export const MockedUserProvider: React.FC<{ __typename: "User", accessibleChannels: [], restrictedAccessToChannels: false, + metadata: [] }, errors: [], }} diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index 64d87347ba3..9f304b8ca9e 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -758,6 +758,10 @@ "context": "code ending with label", "string": "Code ending with {last4CodeChars}" }, + "38dc43": { + "context": "Features preview", + "string": "Features preview" + }, "39yi8w": { "context": "selected currency", "string": "Selected currency" @@ -6844,6 +6848,9 @@ "context": "Require email confirmation link", "string": "Require email confirmation link" }, + "krer6Z": { + "string": "Features preview" + }, "kuo4fW": { "context": "dialog title", "string": "Capture manual transaction" @@ -7408,6 +7415,9 @@ "context": "gift card history message", "string": "Gift card was activated" }, + "pEf/m+": { + "string": "There are no previews at the moment. Stay tuned!" + }, "pFVX6g": { "string": "Variant with these attributes already exists" }, diff --git a/package-lock.json b/package-lock.json index 74fbe27a9cc..bff17c770d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "@material-ui/lab": "^4.0.0-alpha.61", "@material-ui/styles": "^4.11.4", "@reach/auto-id": "^0.16.0", - "@saleor/macaw-ui": "0.8.0-pre.113", + "@saleor/macaw-ui": "0.8.0-pre.118", "@saleor/sdk": "0.6.0", "@sentry/react": "^6.0.0", "@types/faker": "^5.1.6", @@ -41,13 +41,13 @@ "crc-32": "^1.2.2", "currency-codes": "^2.1.0", "currency.js": "^2.0.4", - "cypress-mochawesome-reporter": "^3.5.1", "debug": "^4.3.4", "downshift": "^6.1.7", "editorjs-inline-tool": "^0.4.0", "faker": "^5.1.0", "fast-array-diff": "^0.2.0", "find-test-names": "^1.17.1", + "front-matter": "^4.0.2", "fuse.js": "^6.6.2", "fuzzaldrin": "^2.1.0", "graphiql": "^2.2.0", @@ -77,12 +77,14 @@ "react-inlinesvg": "^3.0.2", "react-intl": "^5.21.2", "react-jss": "^10.0.0", + "react-markdown": "^8.0.7", "react-moment": "^1.0.0", "react-responsive-carousel": "^3.2.23", "react-router": "^5.0.1", "react-router-dom": "^5.0.1", "react-sortable-hoc": "^1.10.1", "react-sortable-tree": "^2.6.2", + "remark-gfm": "^3.0.1", "slugify": "^1.4.6", "tslib": "^2.4.1", "url-join": "^4.0.1", @@ -166,6 +168,7 @@ "eslint-plugin-react-refresh": "^0.3.1", "eslint-plugin-simple-import-sort": "^10.0.0", "graphql-request": "^3.7.0", + "html-to-react": "^1.6.0", "identity-obj-proxy": "^3.0.0", "is-ci": "^3.0.1", "jscodeshift": "^0.13.0", @@ -3507,25 +3510,28 @@ "optional": true }, "node_modules/@floating-ui/core": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", - "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } }, "node_modules/@floating-ui/dom": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", - "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", "dependencies": { - "@floating-ui/core": "^0.7.3" + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" } }, "node_modules/@floating-ui/react-dom": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", - "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", "dependencies": { - "@floating-ui/dom": "^0.5.3", - "use-isomorphic-layout-effect": "^1.1.1" + "@floating-ui/dom": "^1.3.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -3543,6 +3549,37 @@ "use-isomorphic-layout-effect": "^1.1.1" } }, + "node_modules/@floating-ui/react-dom-interactions/node_modules/@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "node_modules/@floating-ui/react-dom-interactions/node_modules/@floating-ui/dom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "dependencies": { + "@floating-ui/core": "^0.7.3" + } + }, + "node_modules/@floating-ui/react-dom-interactions/node_modules/@floating-ui/react-dom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "dependencies": { + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + }, "node_modules/@formatjs/cli": { "version": "4.8.3", "dev": true, @@ -7458,31 +7495,6 @@ } } }, - "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", - "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" - }, - "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/dom": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", - "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", - "dependencies": { - "@floating-ui/core": "^1.3.1" - } - }, - "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", - "dependencies": { - "@floating-ui/dom": "^1.3.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, "node_modules/@radix-ui/react-portal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", @@ -8496,9 +8508,9 @@ } }, "node_modules/@saleor/macaw-ui": { - "version": "0.8.0-pre.113", - "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.113.tgz", - "integrity": "sha512-DJOOUIT9oaH4F/i+f37kdzoVcFggqx2JaXmUWYtx8CYMJyJpJPQuLPe734FDA9On3HnRlNs54NHDW3m7VLJM/A==", + "version": "0.8.0-pre.118", + "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.118.tgz", + "integrity": "sha512-874riwHhbjrr0h3OlCxz9qlAq/sERQZYBnhtnlS4uGofJmJse+8leENasHgyrZe8Zyn9eV//X5NJId/qAHmF6g==", "dependencies": { "@dessert-box/react": "^0.4.0", "@floating-ui/react-dom-interactions": "^0.5.0", @@ -8516,15 +8528,16 @@ "clsx": "^1.2.1", "downshift": "^6.1.12", "downshift7": "npm:downshift@7.6.0", - "lodash": "^4.17.21", "lodash-es": "^4.17.21", "react-inlinesvg": "^3.0.2" }, "engines": { - "node": ">=16 <19", + "node": "16 || 18 || 20", "pnpm": ">=8" }, "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "@types/react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -11991,7 +12004,6 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, "dependencies": { "@types/ms": "*" } @@ -12111,6 +12123,14 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", + "dependencies": { + "@types/unist": "^2" + } + }, "node_modules/@types/history": { "version": "4.7.8", "dev": true, @@ -12323,6 +12343,14 @@ "@types/lodash": "*" } }, + "node_modules/@types/mdast": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "dependencies": { + "@types/unist": "^2" + } + }, "node_modules/@types/mdx": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz", @@ -12356,8 +12384,7 @@ "node_modules/@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, "node_modules/@types/node": { "version": "14.14.37", @@ -12647,8 +12674,7 @@ "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "optional": true + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@types/url-join": { "version": "4.0.1", @@ -14566,6 +14592,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "devOptional": true, @@ -15407,6 +15442,15 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "optional": true }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "2.4.2", "license": "MIT", @@ -15511,6 +15555,15 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/charcodes": { "version": "0.2.0", "dev": true, @@ -15912,6 +15965,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "4.1.1", "dev": true, @@ -16912,6 +16974,18 @@ "license": "MIT", "optional": true }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -17393,7 +17467,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "optional": true, "engines": { "node": ">=6" } @@ -17590,15 +17663,16 @@ } }, "node_modules/domelementtype": { - "version": "2.2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domexception": { "version": "2.0.1", @@ -17619,6 +17693,21 @@ "node": ">=8" } }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, "node_modules/dompurify": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", @@ -20317,7 +20406,6 @@ }, "node_modules/extend": { "version": "3.0.2", - "devOptional": true, "license": "MIT" }, "node_modules/extend-shallow": { @@ -21128,6 +21216,14 @@ "dev": true, "license": "MIT" }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, "node_modules/frontend-collective-react-dnd-scrollzone": { "version": "1.0.2", "license": "MIT", @@ -22031,6 +22127,15 @@ "node": ">=0.10.0" } }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/he": { "version": "1.2.0", "dev": true, @@ -22108,6 +22213,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/html-to-react": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.6.0.tgz", + "integrity": "sha512-W7HvCu2fipgz3F7fpEtIt2Ty6XcqFGQXOorR4+HQAk72y9mTtUH3BmJ43BEvXQHO+bt//z1Hbfe6JzojpSC/9w==", + "dev": true, + "dependencies": { + "domhandler": "^5.0", + "htmlparser2": "^8.0", + "lodash.camelcase": "^4.3.0" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || >=15" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -22433,6 +22611,11 @@ "devOptional": true, "license": "ISC" }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -24725,7 +24908,6 @@ }, "node_modules/js-yaml": { "version": "3.14.1", - "devOptional": true, "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -25814,6 +25996,12 @@ "version": "4.17.21", "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "node_modules/lodash.clone": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", @@ -26084,6 +26272,15 @@ "node": ">=8" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "license": "MIT", @@ -26257,6 +26454,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/markdown-to-jsx": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.0.tgz", @@ -26270,8 +26476,9 @@ } }, "node_modules/marked": { - "version": "4.0.17", - "license": "MIT", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "bin": { "marked": "bin/marked.js" }, @@ -26341,6 +26548,232 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-string": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", @@ -26469,6 +26902,541 @@ "node": ">= 0.6" } }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.5", "license": "MIT", @@ -27106,7 +28074,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "optional": true, "engines": { "node": ">=4" } @@ -28360,6 +29327,15 @@ "version": "16.13.1", "license": "MIT" }, + "node_modules/property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/prosemirror-commands": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.12.tgz", @@ -29101,6 +30077,50 @@ "version": "3.0.4", "license": "MIT" }, + "node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-markdown/node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/react-moment": { "version": "1.1.1", "license": "MIT", @@ -29274,19 +30294,6 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, - "node_modules/react-select/node_modules/@floating-ui/core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.2.tgz", - "integrity": "sha512-FaO9KVLFnxknZaGWGmNtjD2CVFuc0u4yeGEofoyXO2wgRA7fLtkngT6UB0vtWQWuhH3iMTZZ/Y89CMeyGfn8pA==" - }, - "node_modules/react-select/node_modules/@floating-ui/dom": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.3.tgz", - "integrity": "sha512-lK9cZUrHSJLMVAdCvDqs6Ug8gr0wmqksYiaoj/bxj2gweRQkSuhg2/V6Jswz2KiQ0RAULbqw1oQDJIMpQ5GfGA==", - "dependencies": { - "@floating-ui/core": "^1.2.2" - } - }, "node_modules/react-sortable-hoc": { "version": "1.11.0", "license": "MIT", @@ -29930,6 +30937,50 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-slug": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", @@ -30362,6 +31413,17 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "devOptional": true }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "devOptional": true, @@ -31751,6 +32813,14 @@ "dev": true, "license": "MIT" }, + "node_modules/style-to-object": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", + "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -32255,6 +33325,15 @@ "node": ">=0.6" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -32264,6 +33343,15 @@ "node": ">=8" } }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -32903,6 +33991,57 @@ "node": ">=4" } }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/union-value": { "version": "1.0.1", "dev": true, @@ -32928,6 +34067,78 @@ "node": ">=8" } }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "0.1.2", "devOptional": true, @@ -33267,6 +34478,39 @@ "uuid": "bin/uuid" } }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -33346,6 +34590,56 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/vite": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", @@ -34513,6 +35807,15 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } }, "dependencies": { @@ -36841,25 +38144,28 @@ "optional": true }, "@floating-ui/core": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", - "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "requires": { + "@floating-ui/utils": "^0.1.1" + } }, "@floating-ui/dom": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", - "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", "requires": { - "@floating-ui/core": "^0.7.3" + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" } }, "@floating-ui/react-dom": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", - "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", "requires": { - "@floating-ui/dom": "^0.5.3", - "use-isomorphic-layout-effect": "^1.1.1" + "@floating-ui/dom": "^1.3.0" } }, "@floating-ui/react-dom-interactions": { @@ -36870,8 +38176,37 @@ "@floating-ui/react-dom": "^0.7.0", "aria-hidden": "^1.1.3", "use-isomorphic-layout-effect": "^1.1.1" + }, + "dependencies": { + "@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "@floating-ui/dom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "requires": { + "@floating-ui/core": "^0.7.3" + } + }, + "@floating-ui/react-dom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "requires": { + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" + } + } } }, + "@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + }, "@formatjs/cli": { "version": "4.8.3", "dev": true, @@ -39677,29 +41012,6 @@ "@radix-ui/react-use-rect": "1.0.1", "@radix-ui/react-use-size": "1.0.1", "@radix-ui/rect": "1.0.1" - }, - "dependencies": { - "@floating-ui/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", - "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" - }, - "@floating-ui/dom": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", - "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", - "requires": { - "@floating-ui/core": "^1.3.1" - } - }, - "@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", - "requires": { - "@floating-ui/dom": "^1.3.0" - } - } } }, "@radix-ui/react-portal": { @@ -40303,9 +41615,9 @@ } }, "@saleor/macaw-ui": { - "version": "0.8.0-pre.113", - "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.113.tgz", - "integrity": "sha512-DJOOUIT9oaH4F/i+f37kdzoVcFggqx2JaXmUWYtx8CYMJyJpJPQuLPe734FDA9On3HnRlNs54NHDW3m7VLJM/A==", + "version": "0.8.0-pre.118", + "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.118.tgz", + "integrity": "sha512-874riwHhbjrr0h3OlCxz9qlAq/sERQZYBnhtnlS4uGofJmJse+8leENasHgyrZe8Zyn9eV//X5NJId/qAHmF6g==", "requires": { "@dessert-box/react": "^0.4.0", "@floating-ui/react-dom-interactions": "^0.5.0", @@ -40323,7 +41635,6 @@ "clsx": "^1.2.1", "downshift": "^6.1.12", "downshift7": "npm:downshift@7.6.0", - "lodash": "^4.17.21", "lodash-es": "^4.17.21", "react-inlinesvg": "^3.0.2" } @@ -42800,7 +44111,6 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, "requires": { "@types/ms": "*" } @@ -42914,6 +44224,14 @@ "@types/node": "*" } }, + "@types/hast": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", + "requires": { + "@types/unist": "^2" + } + }, "@types/history": { "version": "4.7.8", "dev": true @@ -43081,6 +44399,14 @@ "@types/lodash": "*" } }, + "@types/mdast": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "requires": { + "@types/unist": "^2" + } + }, "@types/mdx": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz", @@ -43114,8 +44440,7 @@ "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, "@types/node": { "version": "14.14.37" @@ -43378,8 +44703,7 @@ "@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "optional": true + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "@types/url-join": { "version": "4.0.1", @@ -44753,6 +46077,11 @@ "babel-preset-current-node-syntax": "^1.0.0" } }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, "balanced-match": { "version": "1.0.2", "devOptional": true @@ -45343,6 +46672,11 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "optional": true }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + }, "chalk": { "version": "2.4.2", "requires": { @@ -45432,6 +46766,11 @@ "version": "1.0.2", "optional": true }, + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" + }, "charcodes": { "version": "0.2.0", "dev": true @@ -45684,6 +47023,11 @@ "delayed-stream": "~1.0.0" } }, + "comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + }, "commander": { "version": "4.1.1", "dev": true @@ -46408,6 +47752,14 @@ "version": "10.4.3", "optional": true }, + "decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "requires": { + "character-entities": "^2.0.0" + } + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -46744,8 +48096,7 @@ "dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "optional": true + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" }, "destroy": { "version": "1.2.0", @@ -46880,7 +48231,9 @@ } }, "domelementtype": { - "version": "2.2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domexception": { @@ -46896,6 +48249,15 @@ } } }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, "dompurify": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", @@ -48667,8 +50029,7 @@ } }, "extend": { - "version": "3.0.2", - "devOptional": true + "version": "3.0.2" }, "extend-shallow": { "version": "3.0.2", @@ -49256,6 +50617,14 @@ "version": "0.1.7", "dev": true }, + "front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "requires": { + "js-yaml": "^3.13.1" + } + }, "frontend-collective-react-dnd-scrollzone": { "version": "1.0.2", "requires": { @@ -49870,6 +51239,11 @@ } } }, + "hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==" + }, "he": { "version": "1.2.0", "dev": true @@ -49928,6 +51302,59 @@ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "optional": true }, + "html-to-react": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.6.0.tgz", + "integrity": "sha512-W7HvCu2fipgz3F7fpEtIt2Ty6XcqFGQXOorR4+HQAk72y9mTtUH3BmJ43BEvXQHO+bt//z1Hbfe6JzojpSC/9w==", + "dev": true, + "requires": { + "domhandler": "^5.0", + "htmlparser2": "^8.0", + "lodash.camelcase": "^4.3.0" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + } + } + }, "http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -50137,6 +51564,11 @@ "version": "2.0.4", "devOptional": true }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -51636,7 +53068,6 @@ }, "js-yaml": { "version": "3.14.1", - "devOptional": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -52452,6 +53883,12 @@ "lodash-es": { "version": "4.17.21" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "lodash.clone": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", @@ -52680,6 +54117,11 @@ } } }, + "longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" + }, "loose-envify": { "version": "1.4.0", "requires": { @@ -52803,6 +54245,11 @@ } } }, + "markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" + }, "markdown-to-jsx": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.0.tgz", @@ -52810,7 +54257,9 @@ "optional": true }, "marked": { - "version": "4.0.17" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" }, "md5": { "version": "2.3.0", @@ -52859,6 +54308,178 @@ } } }, + "mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "requires": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, + "mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "requires": { + "@types/mdast": "^3.0.0" + } + } + } + }, + "mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "requires": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + } + }, + "mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "requires": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + } + }, + "mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + } + }, + "mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "requires": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "requires": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + } + }, + "mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "dependencies": { + "mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + } + } + } + }, + "mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "requires": { + "@types/mdast": "^3.0.0" + } + } + } + }, "mdast-util-to-string": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", @@ -52945,6 +54566,303 @@ "version": "1.1.2", "optional": true }, + "micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "requires": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "requires": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "requires": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" + }, + "micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==" + }, + "micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" + }, + "micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" + }, "micromatch": { "version": "4.0.5", "requires": { @@ -53396,8 +55314,7 @@ "mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "optional": true + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" }, "ms": { "version": "2.1.2" @@ -54253,6 +56170,11 @@ } } }, + "property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==" + }, "prosemirror-commands": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.12.tgz", @@ -54804,6 +56726,40 @@ "react-lifecycles-compat": { "version": "3.0.4" }, + "react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + } + } + }, "react-moment": { "version": "1.1.1" }, @@ -54925,19 +56881,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" - }, - "@floating-ui/core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.2.tgz", - "integrity": "sha512-FaO9KVLFnxknZaGWGmNtjD2CVFuc0u4yeGEofoyXO2wgRA7fLtkngT6UB0vtWQWuhH3iMTZZ/Y89CMeyGfn8pA==" - }, - "@floating-ui/dom": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.3.tgz", - "integrity": "sha512-lK9cZUrHSJLMVAdCvDqs6Ug8gr0wmqksYiaoj/bxj2gweRQkSuhg2/V6Jswz2KiQ0RAULbqw1oQDJIMpQ5GfGA==", - "requires": { - "@floating-ui/core": "^1.2.2" - } } } }, @@ -55399,6 +57342,38 @@ } } }, + "remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + } + }, + "remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + } + }, "remark-slug": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", @@ -55679,6 +57654,14 @@ } } }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "requires": { + "mri": "^1.1.0" + } + }, "safe-buffer": { "version": "5.2.1", "devOptional": true @@ -56746,6 +58729,14 @@ "version": "3.0.0", "dev": true }, + "style-to-object": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", + "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, "stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -57122,12 +59113,22 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "optional": true }, + "trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==" + }, "ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -57566,6 +59567,32 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "devOptional": true }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + } + } + }, "union-value": { "version": "1.0.1", "dev": true, @@ -57583,6 +59610,54 @@ "crypto-random-string": "^2.0.0" } }, + "unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==" + }, + "unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, "universalify": { "version": "0.1.2", "devOptional": true @@ -57801,6 +59876,29 @@ "version": "3.4.0", "dev": true }, + "uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "dependencies": { + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + } + } + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -57858,6 +59956,33 @@ "extsprintf": "^1.2.0" } }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, "vite": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", @@ -58670,6 +60795,11 @@ "zod": { "version": "3.19.1", "dev": true + }, + "zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } } diff --git a/package.json b/package.json index 2cb2de7eec2..aa44956e192 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@material-ui/lab": "^4.0.0-alpha.61", "@material-ui/styles": "^4.11.4", "@reach/auto-id": "^0.16.0", - "@saleor/macaw-ui": "0.8.0-pre.113", + "@saleor/macaw-ui": "0.8.0-pre.118", "@saleor/sdk": "0.6.0", "@sentry/react": "^6.0.0", "@types/faker": "^5.1.6", @@ -54,6 +54,7 @@ "faker": "^5.1.0", "fast-array-diff": "^0.2.0", "find-test-names": "^1.17.1", + "front-matter": "^4.0.2", "fuse.js": "^6.6.2", "fuzzaldrin": "^2.1.0", "graphiql": "^2.2.0", @@ -83,12 +84,14 @@ "react-inlinesvg": "^3.0.2", "react-intl": "^5.21.2", "react-jss": "^10.0.0", + "react-markdown": "^8.0.7", "react-moment": "^1.0.0", "react-responsive-carousel": "^3.2.23", "react-router": "^5.0.1", "react-router-dom": "^5.0.1", "react-sortable-hoc": "^1.10.1", "react-sortable-tree": "^2.6.2", + "remark-gfm": "^3.0.1", "slugify": "^1.4.6", "tslib": "^2.4.1", "url-join": "^4.0.1", @@ -172,6 +175,7 @@ "eslint-plugin-react-refresh": "^0.3.1", "eslint-plugin-simple-import-sort": "^10.0.0", "graphql-request": "^3.7.0", + "html-to-react": "^1.6.0", "identity-obj-proxy": "^3.0.0", "is-ci": "^3.0.1", "jscodeshift": "^0.13.0", @@ -296,6 +300,7 @@ "preview": "vite preview", "build-storybook": "cross-env NODE_OPTIONS=--max-old-space-size=6144 storybook build -o build/storybook", "build-types": "node scripts/build-types.js", + "build-flags": "node scripts/build-flags.js", "prebuild": "npm run build-types", "check-strict-null-errors": "tsc --noEmit --strictNullChecks | node scripts/count-strict-null-check-errors.js", "check-types": "tsc --noEmit && tsc-strict", diff --git a/scripts/build-flags.js b/scripts/build-flags.js new file mode 100644 index 00000000000..cc4691ab3cc --- /dev/null +++ b/scripts/build-flags.js @@ -0,0 +1,77 @@ +const marked = require("marked") +const fs = require("fs") +const path = require("path") +const fm = require("front-matter") +const HtmlToReactParser = require('html-to-react').Parser; +const htmlToReactParser = new HtmlToReactParser(); +const ReactDOMServer = require('react-dom/server'); + +const imageImports = [] + +const generateImageComponentName = () => { + const letter = String.fromCharCode(Math.floor(Math.random() * 26 + 97)).toUpperCase() + const name = String(Math.random()).substring(2, 7) + + return `${letter}${name}` +} + +const renderer = { + image(href, _, text) { + const componentName = generateImageComponentName() + imageImports.push({ componentName, href }) + + return `${text}`; + } +}; + +marked.use({ renderer }); + + +const mdParsed = fs + .readdirSync(path.resolve(__dirname, "./../.featureFlags")) + .filter(f => f.endsWith(".md")) + .map(file => fs.readFileSync(path.resolve(__dirname, "./../.featureFlags/", file))) + .map(binary => binary.toString()) + .map(fm) + .map(({ body, attributes }) => ({ + component: htmlToReactParser.parse(marked.parse(body)), + attributes + })) + .map(({ component, attributes }) => ({ + component: ReactDOMServer.renderToStaticMarkup(component), + ...attributes + })) + + +const availableFilters = mdParsed + .reduce((prev, content) => prev.concat(content), []) + .map(el => + `{ + name: "${el.name}", + displayName: "${el.displayName}", + component: ${el.name}, + content: { + enabled: ${el.content.enabled}, + value: "${el.content.value}", + } +}` + ) + +const componentsAsTemplate = mdParsed.reduce( + (prev, { name, component }) => `${prev}\nconst ${name} = () => (<>${component})`, + "") + +const components = imageImports.reduce((p, c) => { + return p.replace(`"${c.componentName}"`, `{${c.componentName}}`) +}, componentsAsTemplate) + +const imports = imageImports.reduce((p, c) => `${p}\nimport ${c.componentName} from "${c.href}"`, "") + +const template = ` +// @ts-nocheck +${imports} +${components} +export const AVAILABLE_FLAGS = [${availableFilters}] +` + +fs.writeFileSync(path.resolve(__dirname, "./../.featureFlags/generated.tsx"), template) diff --git a/src/components/Sidebar/user/Controls.tsx b/src/components/Sidebar/user/Controls.tsx index 063b91a79f2..2bf2d0e8581 100644 --- a/src/components/Sidebar/user/Controls.tsx +++ b/src/components/Sidebar/user/Controls.tsx @@ -16,6 +16,7 @@ import React, { useEffect, useState } from "react"; import { FormattedMessage } from "react-intl"; import { Link } from "react-router-dom"; +import { FeatureFlagsModal } from "./FeatureFlagsModal"; import { ThemeSwitcher } from "./ThemeSwitcher"; export const useLegacyThemeHandler = () => { @@ -98,6 +99,19 @@ export const UserControls = () => { + + + + + + + + + JSX.Element; + isEnabled: boolean; +} + +export const Content = ({ + flagName, + flagSlug, + component, + isEnabled, +}: ContentProps) => { + const TabComponent = component; + + return ( + + + {flagName} + + + + + + + ); +}; diff --git a/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx b/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx new file mode 100644 index 00000000000..b8f6a585818 --- /dev/null +++ b/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx @@ -0,0 +1,44 @@ +import { Name } from "@dashboard/featureFlags/availableFlags"; +import { useFlagsInfo } from "@dashboard/featureFlags/useFlagsInfo"; +import { List, Text } from "@saleor/macaw-ui/next"; +import React from "react"; + +interface FlagListProps { + selectedName: string; + onItemClick: (name: Name) => void; +} + +export const FlagList = ({ selectedName, onItemClick }: FlagListProps) => { + const flags = useFlagsInfo(); + + return ( + + {flags.map(flag => ( + onItemClick(flag.name)} + > + {flag.displayName} + + ))} + + ); +}; diff --git a/src/components/Sidebar/user/FeatureFlagsModal/Header.tsx b/src/components/Sidebar/user/FeatureFlagsModal/Header.tsx new file mode 100644 index 00000000000..bea183571dd --- /dev/null +++ b/src/components/Sidebar/user/FeatureFlagsModal/Header.tsx @@ -0,0 +1,16 @@ +import { Box, Text } from "@saleor/macaw-ui/next"; +import React, { ReactNode } from "react"; +import { FormattedMessage } from "react-intl"; + +interface HeaderProps { + children: ReactNode; +} + +export const Header = ({ children }: HeaderProps) => ( + + + + + {children} + +); diff --git a/src/components/Sidebar/user/FeatureFlagsModal/NoFlags.tsx b/src/components/Sidebar/user/FeatureFlagsModal/NoFlags.tsx new file mode 100644 index 00000000000..644bdcd1958 --- /dev/null +++ b/src/components/Sidebar/user/FeatureFlagsModal/NoFlags.tsx @@ -0,0 +1,23 @@ +import { Box, Text } from "@saleor/macaw-ui/next"; +import React from "react"; +import { FormattedMessage } from "react-intl"; + +export const NoFlags = () => ( + + + + + +); diff --git a/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx new file mode 100644 index 00000000000..c5da16df221 --- /dev/null +++ b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx @@ -0,0 +1,35 @@ +import { Button, Spinner } from "@saleor/macaw-ui/next"; +import React, { useState } from "react"; + +import { usePersistance } from "./usePersistance"; + +interface ToggleButtonProps { + isEnabled: boolean; + flagSlug: string; +} + +export const ToggleButton = ({ isEnabled, flagSlug }: ToggleButtonProps) => { + const { toggleFlag } = usePersistance(); + const [loading, setLoading] = useState(false); + + const handleToggleClick = async () => { + setLoading(true); + await toggleFlag(flagSlug); + + window.location.reload(); + }; + + if (loading) { + return ( + + ); + } + + return ( + + ); +}; diff --git a/src/components/Sidebar/user/FeatureFlagsModal/index.tsx b/src/components/Sidebar/user/FeatureFlagsModal/index.tsx new file mode 100644 index 00000000000..76b39cf773f --- /dev/null +++ b/src/components/Sidebar/user/FeatureFlagsModal/index.tsx @@ -0,0 +1,69 @@ +import { Name } from "@dashboard/featureFlags/availableFlags"; +import { Box, Button, CloseIcon, Modal } from "@saleor/macaw-ui/next"; +import React, { ReactNode } from "react"; + +import { Content } from "./Content"; +import { FlagList } from "./FlagList"; +import { Header } from "./Header"; +import { NoFlags } from "./NoFlags"; +import { useFlagsState } from "./useFlagsState"; + +interface FeatureFlagsModalProps { + children: ReactNode; +} + +export const FeatureFlagsModal = ({ children }: FeatureFlagsModalProps) => { + const { selectedFlag, hasNoFlags, changeTab } = useFlagsState(); + + const handleTabClick = (tabName: Name) => { + changeTab(tabName); + }; + + return ( + + {children} + + +
+ +
+ + {hasNoFlags ? ( + + ) : ( + <> + + + + )} + +
+
+
+ ); +}; diff --git a/src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts b/src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts new file mode 100644 index 00000000000..d15c2550b2c --- /dev/null +++ b/src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts @@ -0,0 +1,30 @@ +import { FlagDefinition, Name } from "@dashboard/featureFlags/availableFlags"; +import { useFlagsInfo } from "@dashboard/featureFlags/useFlagsInfo"; +import { useState } from "react"; + +type changeTab = (name: Name) => void; + +type FlagsState = + | { hasNoFlags: false; selectedFlag: FlagDefinition; changeTab: changeTab } + | { hasNoFlags: true; selectedFlag: undefined; changeTab: changeTab }; + +export const useFlagsState = (): FlagsState => { + const flags = useFlagsInfo(); + const firstFlag = flags.length > 0 ? flags[0].name : null; + const [tab, changeTab] = useState(firstFlag); + const selectedFlag = flags.find(f => f.name === tab); + + if (!selectedFlag) { + return { + hasNoFlags: true, + selectedFlag: undefined, + changeTab, + }; + } + + return { + hasNoFlags: false, + selectedFlag, + changeTab, + }; +}; diff --git a/src/components/Sidebar/user/FeatureFlagsModal/usePersistance.ts b/src/components/Sidebar/user/FeatureFlagsModal/usePersistance.ts new file mode 100644 index 00000000000..a7e3075d2fa --- /dev/null +++ b/src/components/Sidebar/user/FeatureFlagsModal/usePersistance.ts @@ -0,0 +1,26 @@ +import { + flagInfoToFlagList, + Name, +} from "@dashboard/featureFlags/availableFlags"; +import { flagListToMetadata } from "@dashboard/featureFlags/strategies/MetadataStrategy"; +import { useFlagsInfo } from "@dashboard/featureFlags/useFlagsInfo"; +import { useUserAccountUpdateMutation } from "@dashboard/graphql"; + +export const usePersistance = () => { + const flags = useFlagsInfo(); + const [updateAccount] = useUserAccountUpdateMutation(); + + const toggleFlag = async (flagName: Name) => { + const flagList = flagInfoToFlagList(flags); + flagList[flagName].enabled = !flagList[flagName].enabled; + const metadata = flagListToMetadata(flagList); + + await updateAccount({ + variables: { input: { metadata } }, + }); + }; + + return { + toggleFlag, + }; +}; diff --git a/src/configuration/ConfigurationPage.stories.tsx b/src/configuration/ConfigurationPage.stories.tsx index d89fc156e6a..14b640dfdfe 100644 --- a/src/configuration/ConfigurationPage.stories.tsx +++ b/src/configuration/ConfigurationPage.stories.tsx @@ -26,6 +26,7 @@ const user = { userPermissions: staffMember.userPermissions, restrictedAccessToChannels: false, accessibleChannels: [], + metadata: [], }; const versions = { diff --git a/src/featureFlags/FeatureFlagsProvider.tsx b/src/featureFlags/FeatureFlagsProvider.tsx index 40eee629df5..9b20ba95c57 100644 --- a/src/featureFlags/FeatureFlagsProvider.tsx +++ b/src/featureFlags/FeatureFlagsProvider.tsx @@ -1,14 +1,21 @@ +import { useUser } from "@dashboard/auth"; import LoginLoading from "@dashboard/auth/components/LoginLoading/LoginLoading"; import React, { ReactNode, useEffect, useState } from "react"; import { FlagList } from "./availableFlags"; import { Provider } from "./context"; import { useFlagsResolver } from "./FlagsResolver"; -import { AvailableStrategies } from "./strategies"; +import { + AvailableStrategies, + EnvVarsStrategy, + LocalStorageStrategy, +} from "./strategies"; +import { MetadataStrategy } from "./strategies/MetadataStrategy"; interface FeatureFlagsProviderProps { children: ReactNode; strategies: AvailableStrategies[]; + deps?: unknown[]; } export const FeatureFlagsProvider = ({ @@ -33,3 +40,25 @@ export const FeatureFlagsProvider = ({ {loading ? : children} ); }; + +interface FeatureFlagsProviderWithUserProps { + children: ReactNode; +} + +export const FeatureFlagsProviderWithUser = ({ + children, +}: FeatureFlagsProviderWithUserProps) => { + const user = useUser(); + + return ( + + {children} + + ); +}; diff --git a/src/featureFlags/availableFlags.ts b/src/featureFlags/availableFlags.ts index 892916dd263..a15e57b0324 100644 --- a/src/featureFlags/availableFlags.ts +++ b/src/featureFlags/availableFlags.ts @@ -1,35 +1,17 @@ +import { AVAILABLE_FLAGS as GENERATED_FLAGS } from "./../../.featureFlags/generated"; import { FlagValue } from "./FlagContent"; -interface FlagDefinition { +export interface FlagDefinition { name: string; displayName: string; - description: string; + component: () => JSX.Element; content: { enabled: boolean; payload?: string; }; } -const AVAILABLE_FLAGS = [ - /* - Before use any flag pleease an entry within this array, - so the TS will infer the types, example: - - { - name: "flag1", - displayName: "Flag 1", - description: "some description", - content: { enabled: false, value: "default" }, - } as const, - */ - - { - name: "product_filters", - displayName: "Product filters", - description: "New filters on product listing page", - content: { enabled: false, payload: "" }, - } as const, -] satisfies FlagDefinition[]; +export const AVAILABLE_FLAGS = GENERATED_FLAGS as FlagDefinition[]; type TypedEntry = (typeof AVAILABLE_FLAGS)[number]; type GeneralEntry = TypedEntry extends never ? FlagDefinition : TypedEntry; @@ -53,8 +35,16 @@ export const isSupported = (name: string): name is Name => export const asFlagValue = () => AVAILABLE_FLAGS.reduce(toFlagValue, {} as FlagList); -export const asFlagInfoArray = (list: GeneralFlagList) => +export const asFlagInfoArray = (list: GeneralFlagList): FlagDefinition[] => AVAILABLE_FLAGS.map((el: GeneralEntry) => ({ ...el, content: list[el.name], })); + +export const flagInfoToFlagList = (flagInfos: FlagDefinition[]): FlagList => { + return flagInfos.reduce((prev, curr) => { + prev[curr.name] = new FlagValue(curr.content.enabled, curr.content.payload); + + return prev; + }, {} as FlagList); +}; diff --git a/src/featureFlags/strategies/MetadataStrategy.ts b/src/featureFlags/strategies/MetadataStrategy.ts new file mode 100644 index 00000000000..5142ba5b363 --- /dev/null +++ b/src/featureFlags/strategies/MetadataStrategy.ts @@ -0,0 +1,41 @@ +import { MetadataItemFragment } from "@dashboard/graphql"; + +import { asFlagValue, FlagList } from "../availableFlags"; +import * as AvailableFlags from "../availableFlags"; +import { Strategy } from "../Strategy"; + +const METADATA_KEY = "feature_flags"; + +export const flagListToMetadata = ( + list: FlagList, +): Array> => { + return [{ key: METADATA_KEY, value: JSON.stringify(list) }]; +}; + +export const flagListFromMetadata = ( + metadata: Array>, +): FlagList => { + const defaultsList = asFlagValue(); + const rawFlags = metadata.find(x => x.key === METADATA_KEY); + const flagList = rawFlags + ? JSON.parse(rawFlags.value) + : (defaultsList as FlagList); + + return Object.keys(defaultsList).reduce((list: FlagList, key: string) => { + list[key] = defaultsList[key]; + + if (flagList[key]) { + list[key] = flagList[key]; + } + + return list; + }, {} as FlagList); +}; + +export class MetadataStrategy implements Strategy { + constructor(public metadata: MetadataItemFragment[]) {} + + fetchAll(): Promise { + return Promise.resolve(flagListFromMetadata(this.metadata)); + } +} diff --git a/src/featureFlags/strategies/index.ts b/src/featureFlags/strategies/index.ts index f9bfe317051..e3795ac20c8 100644 --- a/src/featureFlags/strategies/index.ts +++ b/src/featureFlags/strategies/index.ts @@ -1,6 +1,10 @@ import { EnvVarsStrategy } from "./EnvVarsStrategy"; import { LocalStorageStrategy } from "./LocalStorageStrategy"; +import { MetadataStrategy } from "./MetadataStrategy"; -export { EnvVarsStrategy, LocalStorageStrategy }; +export { EnvVarsStrategy, LocalStorageStrategy, MetadataStrategy }; -export type AvailableStrategies = EnvVarsStrategy | LocalStorageStrategy; +export type AvailableStrategies = + | EnvVarsStrategy + | LocalStorageStrategy + | MetadataStrategy; diff --git a/src/fragments/auth.ts b/src/fragments/auth.ts index 0b0f7c522be..f1a816066f6 100644 --- a/src/fragments/auth.ts +++ b/src/fragments/auth.ts @@ -23,6 +23,10 @@ export const fragmentUser = gql` firstName lastName isStaff + metadata { + key + value + } userPermissions { ...UserPermission } diff --git a/src/fragments/staff.ts b/src/fragments/staff.ts index 7c45ddd61ec..44d5c13aeb7 100644 --- a/src/fragments/staff.ts +++ b/src/fragments/staff.ts @@ -24,6 +24,10 @@ export const staffMemberDetailsFragment = gql` avatar(size: 512) { url } + metadata { + key + value + } } `; diff --git a/src/graphql/hooks.generated.ts b/src/graphql/hooks.generated.ts index b16a1eb3b17..e622fcc1fef 100644 --- a/src/graphql/hooks.generated.ts +++ b/src/graphql/hooks.generated.ts @@ -202,6 +202,10 @@ export const UserFragmentDoc = gql` firstName lastName isStaff + metadata { + key + value + } userPermissions { ...UserPermission } @@ -2758,6 +2762,10 @@ export const StaffMemberDetailsFragmentDoc = gql` avatar(size: 512) { url } + metadata { + key + value + } } ${StaffMemberFragmentDoc}`; export const CountryFragmentDoc = gql` diff --git a/src/graphql/types.generated.ts b/src/graphql/types.generated.ts index 6d3cef870e3..c08f26c1149 100644 --- a/src/graphql/types.generated.ts +++ b/src/graphql/types.generated.ts @@ -8375,7 +8375,7 @@ export type AvailableExternalAuthenticationsQuery = { __typename: 'Query', shop: export type UserDetailsQueryVariables = Exact<{ [key: string]: never; }>; -export type UserDetailsQuery = { __typename: 'Query', me: { __typename: 'User', id: string, email: string, firstName: string, lastName: string, isStaff: boolean, restrictedAccessToChannels: boolean, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, accessibleChannels: Array<{ __typename: 'Channel', id: string, isActive: boolean, name: string, slug: string, currencyCode: string, defaultCountry: { __typename: 'CountryDisplay', code: string, country: string }, stockSettings: { __typename: 'StockSettings', allocationStrategy: AllocationStrategyEnum } }> | null } | null }; +export type UserDetailsQuery = { __typename: 'Query', me: { __typename: 'User', id: string, email: string, firstName: string, lastName: string, isStaff: boolean, restrictedAccessToChannels: boolean, metadata: Array<{ __typename: 'MetadataItem', key: string, value: string }>, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, accessibleChannels: Array<{ __typename: 'Channel', id: string, isActive: boolean, name: string, slug: string, currencyCode: string, defaultCountry: { __typename: 'CountryDisplay', code: string, country: string }, stockSettings: { __typename: 'StockSettings', allocationStrategy: AllocationStrategyEnum } }> | null } | null }; export type CategoryDeleteMutationVariables = Exact<{ id: Scalars['ID']; @@ -9092,7 +9092,7 @@ export type UserPermissionFragment = { __typename: 'UserPermission', code: Permi export type UserUserPermissionWithSourcePermissionGroupsFragment = { __typename: 'UserPermission', code: PermissionEnum, name: string, sourcePermissionGroups: Array<{ __typename: 'Group', id: string }> | null }; -export type UserFragment = { __typename: 'User', id: string, email: string, firstName: string, lastName: string, isStaff: boolean, restrictedAccessToChannels: boolean, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, accessibleChannels: Array<{ __typename: 'Channel', id: string, isActive: boolean, name: string, slug: string, currencyCode: string, defaultCountry: { __typename: 'CountryDisplay', code: string, country: string }, stockSettings: { __typename: 'StockSettings', allocationStrategy: AllocationStrategyEnum } }> | null }; +export type UserFragment = { __typename: 'User', id: string, email: string, firstName: string, lastName: string, isStaff: boolean, restrictedAccessToChannels: boolean, metadata: Array<{ __typename: 'MetadataItem', key: string, value: string }>, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, accessibleChannels: Array<{ __typename: 'Channel', id: string, isActive: boolean, name: string, slug: string, currencyCode: string, defaultCountry: { __typename: 'CountryDisplay', code: string, country: string }, stockSettings: { __typename: 'StockSettings', allocationStrategy: AllocationStrategyEnum } }> | null }; export type UserBaseFragment = { __typename: 'User', id: string, firstName: string, lastName: string }; @@ -9488,7 +9488,7 @@ export type ShopFragment = { __typename: 'Shop', customerSetPasswordUrl: string export type StaffMemberFragment = { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string }; -export type StaffMemberDetailsFragment = { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null }; +export type StaffMemberDetailsFragment = { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, metadata: Array<{ __typename: 'MetadataItem', key: string, value: string }> }; export type StaffMemberAvatarFragment = { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, avatar: { __typename: 'Image', url: string } | null }; @@ -11095,7 +11095,7 @@ export type StaffMemberAddMutationVariables = Exact<{ }>; -export type StaffMemberAddMutation = { __typename: 'Mutation', staffCreate: { __typename: 'StaffCreate', errors: Array<{ __typename: 'StaffError', code: AccountErrorCode, field: string | null, message: string | null }>, user: { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null } | null } | null }; +export type StaffMemberAddMutation = { __typename: 'Mutation', staffCreate: { __typename: 'StaffCreate', errors: Array<{ __typename: 'StaffError', code: AccountErrorCode, field: string | null, message: string | null }>, user: { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, metadata: Array<{ __typename: 'MetadataItem', key: string, value: string }> } | null } | null }; export type StaffMemberUpdateMutationVariables = Exact<{ id: Scalars['ID']; @@ -11103,7 +11103,7 @@ export type StaffMemberUpdateMutationVariables = Exact<{ }>; -export type StaffMemberUpdateMutation = { __typename: 'Mutation', staffUpdate: { __typename: 'StaffUpdate', errors: Array<{ __typename: 'StaffError', code: AccountErrorCode, field: string | null, message: string | null }>, user: { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null } | null } | null }; +export type StaffMemberUpdateMutation = { __typename: 'Mutation', staffUpdate: { __typename: 'StaffUpdate', errors: Array<{ __typename: 'StaffError', code: AccountErrorCode, field: string | null, message: string | null }>, user: { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, metadata: Array<{ __typename: 'MetadataItem', key: string, value: string }> } | null } | null }; export type UserPassowrdChangeMutationVariables = Exact<{ newPassword: Scalars['String']; @@ -11164,7 +11164,7 @@ export type StaffMemberDetailsQueryVariables = Exact<{ }>; -export type StaffMemberDetailsQuery = { __typename: 'Query', user: { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null } | null }; +export type StaffMemberDetailsQuery = { __typename: 'Query', user: { __typename: 'User', id: string, email: string, firstName: string, isActive: boolean, lastName: string, permissionGroups: Array<{ __typename: 'Group', id: string, name: string, userCanManage: boolean }> | null, userPermissions: Array<{ __typename: 'UserPermission', code: PermissionEnum, name: string }> | null, avatar: { __typename: 'Image', url: string } | null, metadata: Array<{ __typename: 'MetadataItem', key: string, value: string }> } | null }; export type TaxConfigurationUpdateMutationVariables = Exact<{ id: Scalars['ID']; diff --git a/src/index.tsx b/src/index.tsx index 986fbe9631e..75232d2405a 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -52,11 +52,7 @@ import CustomAppsSection from "./custom-apps"; import { CustomAppSections } from "./custom-apps/urls"; import { CustomerSection } from "./customers"; import DiscountSection from "./discounts"; -import { - EnvVarsStrategy, - FeatureFlagsProvider, - LocalStorageStrategy, -} from "./featureFlags"; +import { FeatureFlagsProviderWithUser } from "./featureFlags/FeatureFlagsProvider"; import GiftCardSection from "./giftCards"; import { giftCardsSectionUrlName } from "./giftCards/urls"; import { apolloClient, saleorClient } from "./graphql/client"; @@ -121,26 +117,19 @@ const App: React.FC = () => ( - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -173,155 +162,157 @@ const Routes: React.FC = () => { {DEMO_MODE && } {homePageLoaded ? ( - - { - const errorId = errorTracker.captureException(e); + + + { + const errorId = errorTracker.captureException(e); - dispatchAppState({ - payload: { - error: "unhandled", - errorId, - }, - type: "displayError", - }); - }} - fallbackRender={({ resetErrorBoundary }) => ( - window.location.reload()} - /> - )} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + dispatchAppState({ + payload: { + error: "unhandled", + errorId, + }, + type: "displayError", + }); + }} + fallbackRender={({ resetErrorBoundary }) => ( + window.location.reload()} + /> + )} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) : homePageLoading ? ( ) : ( diff --git a/src/staff/fixtures.ts b/src/staff/fixtures.ts index f60aec13efa..833b3bc7a53 100644 --- a/src/staff/fixtures.ts +++ b/src/staff/fixtures.ts @@ -155,6 +155,7 @@ export const staffMember: StaffMemberDetailsFragment = { ...p, __typename: "UserPermission", })), + metadata: [], }; export const staffMemberAvatar: StaffMemberAvatarFragment = { From 37026aa33edb608b969c46ad1aa1e5c6c690e470 Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Fri, 11 Aug 2023 16:48:40 +0200 Subject: [PATCH 02/15] Feature preview --- .featureFlags/generated.tsx | 5 + .featureFlags/images/filters.png | Bin 0 -> 73027 bytes .featureFlags/product-filters.md | 10 + .gitignore | 1 + package-lock.json | 321 ------------------------------- package.json | 1 - 6 files changed, 16 insertions(+), 322 deletions(-) create mode 100644 .featureFlags/generated.tsx create mode 100644 .featureFlags/images/filters.png create mode 100644 .featureFlags/product-filters.md diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx new file mode 100644 index 00000000000..db4adaad7e0 --- /dev/null +++ b/.featureFlags/generated.tsx @@ -0,0 +1,5 @@ + +// @ts-nocheck + + +export const AVAILABLE_FLAGS = [] diff --git a/.featureFlags/images/filters.png b/.featureFlags/images/filters.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1ff0780a3cf677ec6a5c2ce7537a38609254e3 GIT binary patch literal 73027 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 0.8" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/commander": { "version": "4.1.1", "dev": true, @@ -22127,15 +22109,6 @@ "node": ">=0.10.0" } }, - "node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/he": { "version": "1.2.0", "dev": true, @@ -22611,11 +22584,6 @@ "devOptional": true, "license": "ISC" }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -26710,39 +26678,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast/node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-to-markdown": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", @@ -29327,15 +29262,6 @@ "version": "16.13.1", "license": "MIT" }, - "node_modules/property-information": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", - "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/prosemirror-commands": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.12.tgz", @@ -30077,50 +30003,6 @@ "version": "3.0.4", "license": "MIT" }, - "node_modules/react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/react-markdown/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-markdown/node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/react-moment": { "version": "1.1.1", "license": "MIT", @@ -30952,35 +30834,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-slug": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", @@ -32813,14 +32666,6 @@ "dev": true, "license": "MIT" }, - "node_modules/style-to-object": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", - "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, "node_modules/stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -33325,15 +33170,6 @@ "node": ">=0.6" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -34067,15 +33903,6 @@ "node": ">=8" } }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-is": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", @@ -34088,18 +33915,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", @@ -44224,14 +44039,6 @@ "@types/node": "*" } }, - "@types/hast": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", - "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", - "requires": { - "@types/unist": "^2" - } - }, "@types/history": { "version": "4.7.8", "dev": true @@ -47023,11 +46830,6 @@ "delayed-stream": "~1.0.0" } }, - "comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" - }, "commander": { "version": "4.1.1", "dev": true @@ -51239,11 +51041,6 @@ } } }, - "hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==" - }, "he": { "version": "1.2.0", "dev": true @@ -51564,11 +51361,6 @@ "version": "2.0.4", "devOptional": true }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, "inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -54428,33 +54220,6 @@ "unist-util-is": "^5.0.0" } }, - "mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "dependencies": { - "mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - } - } - } - }, "mdast-util-to-markdown": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", @@ -56170,11 +55935,6 @@ } } }, - "property-information": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", - "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==" - }, "prosemirror-commands": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.12.tgz", @@ -56726,40 +56486,6 @@ "react-lifecycles-compat": { "version": "3.0.4" }, - "react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", - "requires": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "dependencies": { - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" - } - } - }, "react-moment": { "version": "1.1.1" }, @@ -57353,27 +57079,6 @@ "unified": "^10.0.0" } }, - "remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, - "remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - } - }, "remark-slug": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", @@ -58729,14 +58434,6 @@ "version": "3.0.0", "dev": true }, - "style-to-object": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", - "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, "stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -59113,11 +58810,6 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "optional": true }, - "trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" - }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -59610,11 +59302,6 @@ "crypto-random-string": "^2.0.0" } }, - "unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==" - }, "unist-util-is": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", @@ -59623,14 +59310,6 @@ "@types/unist": "^2.0.0" } }, - "unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "requires": { - "@types/unist": "^2.0.0" - } - }, "unist-util-stringify-position": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", diff --git a/package.json b/package.json index aa44956e192..5a187b3299a 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,6 @@ "react-inlinesvg": "^3.0.2", "react-intl": "^5.21.2", "react-jss": "^10.0.0", - "react-markdown": "^8.0.7", "react-moment": "^1.0.0", "react-responsive-carousel": "^3.2.23", "react-router": "^5.0.1", From 7e88595ae3b0f44424dd5eed563cf4036467dcc6 Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Fri, 11 Aug 2023 16:57:49 +0200 Subject: [PATCH 03/15] Feature preview --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5a187b3299a..64b5aa27fc4 100644 --- a/package.json +++ b/package.json @@ -279,7 +279,7 @@ "^@material-ui/core$": "/node_modules/@material-ui/core", "^@material-ui/icons$": "/node_modules/@material-ui/icons", "^@material-ui/styles$": "/node_modules/@material-ui/styles", - "^@saleor/macaw-ui/next$": "/node_modules/@saleor/macaw-ui/dist/macaw-ui.js", + "^@saleor/macaw-ui/next$": "/node_modules/@saleor/macaw-ui/dist/index.js", "^react$": "/node_modules/react", "^react-dom$": "/node_modules/react-dom" } From 2f04c72b0961101be0e1b1d7d6368ca48c5d825e Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Mon, 14 Aug 2023 10:35:16 +0200 Subject: [PATCH 04/15] Feature preview --- .featureFlags/generated.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx index db4adaad7e0..a84217786da 100644 --- a/.featureFlags/generated.tsx +++ b/.featureFlags/generated.tsx @@ -1,5 +1,18 @@ // @ts-nocheck +import W89937 from "./images/filters.png" -export const AVAILABLE_FLAGS = [] +const product_filters = () => (<>

new filters

+

Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.

+) +export const AVAILABLE_FLAGS = [{ + name: "product_filters", + displayName: "Products filtering", + component: product_filters, + content: { + enabled: false, + value: "undefined", + } +}] From 0a47adbbcc2098f53788fbe72f9aac0cd9bb3be4 Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Mon, 14 Aug 2023 10:36:44 +0200 Subject: [PATCH 05/15] Feature preview --- .featureFlags/generated.tsx | 6 +++--- scripts/build-flags.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx index a84217786da..d5925c75eed 100644 --- a/.featureFlags/generated.tsx +++ b/.featureFlags/generated.tsx @@ -1,12 +1,12 @@ - // @ts-nocheck -import W89937 from "./images/filters.png" +import V54646 from "./images/filters.png" -const product_filters = () => (<>

new filters

+const product_filters = () => (<>

new filters

Experience the new look and enhanced abilities of new fitering mechanism. Easily combine any criteria you want, and quickly browse their values.

) + export const AVAILABLE_FLAGS = [{ name: "product_filters", displayName: "Products filtering", diff --git a/scripts/build-flags.js b/scripts/build-flags.js index cc4691ab3cc..c15926e4100 100644 --- a/scripts/build-flags.js +++ b/scripts/build-flags.js @@ -67,10 +67,10 @@ const components = imageImports.reduce((p, c) => { const imports = imageImports.reduce((p, c) => `${p}\nimport ${c.componentName} from "${c.href}"`, "") -const template = ` -// @ts-nocheck +const template = `// @ts-nocheck ${imports} ${components} + export const AVAILABLE_FLAGS = [${availableFilters}] ` From 401230c9a02f9ec45b40dd0928207437049c681a Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 09:34:51 +0200 Subject: [PATCH 06/15] Add visible flag --- .featureFlags/generated.tsx | 5 +++-- .featureFlags/product-filters.md | 4 +++- scripts/build-flags.js | 5 +++-- .../Sidebar/user/FeatureFlagsModal/useFlagsState.ts | 3 ++- src/featureFlags/availableFlags.ts | 1 + 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx index d5925c75eed..2b90ffa8820 100644 --- a/.featureFlags/generated.tsx +++ b/.featureFlags/generated.tsx @@ -1,8 +1,8 @@ // @ts-nocheck -import V54646 from "./images/filters.png" +import K00120 from "./images/filters.png" -const product_filters = () => (<>

new filters

+const product_filters = () => (<>

new filters

Experience the new look and enhanced abilities of new fitering mechanism. Easily combine any criteria you want, and quickly browse their values.

) @@ -11,6 +11,7 @@ export const AVAILABLE_FLAGS = [{ name: "product_filters", displayName: "Products filtering", component: product_filters, + visible: true, content: { enabled: false, value: "undefined", diff --git a/.featureFlags/product-filters.md b/.featureFlags/product-filters.md index 50e66c3ca84..7b785872f19 100644 --- a/.featureFlags/product-filters.md +++ b/.featureFlags/product-filters.md @@ -1,7 +1,9 @@ --- name: product_filters displayName: Products filtering -content: { enabled: false, payload: "default" } +enabled: false +payload: "default" +visible: true --- ![new filters](./images/filters.png) diff --git a/scripts/build-flags.js b/scripts/build-flags.js index c15926e4100..918f5661d85 100644 --- a/scripts/build-flags.js +++ b/scripts/build-flags.js @@ -50,9 +50,10 @@ const availableFilters = mdParsed name: "${el.name}", displayName: "${el.displayName}", component: ${el.name}, + visible: ${el.visible}, content: { - enabled: ${el.content.enabled}, - value: "${el.content.value}", + enabled: ${el.enabled}, + value: "${el.value}", } }` ) diff --git a/src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts b/src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts index d15c2550b2c..7101ca2d8f0 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts +++ b/src/components/Sidebar/user/FeatureFlagsModal/useFlagsState.ts @@ -9,7 +9,8 @@ type FlagsState = | { hasNoFlags: true; selectedFlag: undefined; changeTab: changeTab }; export const useFlagsState = (): FlagsState => { - const flags = useFlagsInfo(); + const flagsInfo = useFlagsInfo(); + const flags = flagsInfo.filter(f => f.visible); const firstFlag = flags.length > 0 ? flags[0].name : null; const [tab, changeTab] = useState(firstFlag); const selectedFlag = flags.find(f => f.name === tab); diff --git a/src/featureFlags/availableFlags.ts b/src/featureFlags/availableFlags.ts index a15e57b0324..82041a2517e 100644 --- a/src/featureFlags/availableFlags.ts +++ b/src/featureFlags/availableFlags.ts @@ -5,6 +5,7 @@ export interface FlagDefinition { name: string; displayName: string; component: () => JSX.Element; + visible: boolean; content: { enabled: boolean; payload?: string; From 4bc462e63499c1264238046648c3753ca779f89d Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 09:44:56 +0200 Subject: [PATCH 07/15] Typo --- .../Sidebar/user/FeatureFlagsModal/ToggleButton.tsx | 4 ++-- .../{usePersistance.ts => usePersistence.ts} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/components/Sidebar/user/FeatureFlagsModal/{usePersistance.ts => usePersistence.ts} (95%) diff --git a/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx index c5da16df221..7eb8c1767d8 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx @@ -1,7 +1,7 @@ import { Button, Spinner } from "@saleor/macaw-ui/next"; import React, { useState } from "react"; -import { usePersistance } from "./usePersistance"; +import { usePersistence } from "./usePersistance"; interface ToggleButtonProps { isEnabled: boolean; @@ -9,7 +9,7 @@ interface ToggleButtonProps { } export const ToggleButton = ({ isEnabled, flagSlug }: ToggleButtonProps) => { - const { toggleFlag } = usePersistance(); + const { toggleFlag } = usePersistence(); const [loading, setLoading] = useState(false); const handleToggleClick = async () => { diff --git a/src/components/Sidebar/user/FeatureFlagsModal/usePersistance.ts b/src/components/Sidebar/user/FeatureFlagsModal/usePersistence.ts similarity index 95% rename from src/components/Sidebar/user/FeatureFlagsModal/usePersistance.ts rename to src/components/Sidebar/user/FeatureFlagsModal/usePersistence.ts index a7e3075d2fa..232e93ef7b2 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/usePersistance.ts +++ b/src/components/Sidebar/user/FeatureFlagsModal/usePersistence.ts @@ -6,7 +6,7 @@ import { flagListToMetadata } from "@dashboard/featureFlags/strategies/MetadataS import { useFlagsInfo } from "@dashboard/featureFlags/useFlagsInfo"; import { useUserAccountUpdateMutation } from "@dashboard/graphql"; -export const usePersistance = () => { +export const usePersistence = () => { const flags = useFlagsInfo(); const [updateAccount] = useUserAccountUpdateMutation(); From 4df856d4418732451756f443e0a8d7734340fdff Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 09:47:25 +0200 Subject: [PATCH 08/15] Typo --- src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx index 7eb8c1767d8..537e5e4b29e 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx @@ -1,7 +1,7 @@ import { Button, Spinner } from "@saleor/macaw-ui/next"; import React, { useState } from "react"; -import { usePersistence } from "./usePersistance"; +import { usePersistence } from "./usePersistence"; interface ToggleButtonProps { isEnabled: boolean; From 5a099f5cf8f11ef14ceee6f233756e114d9c2f4f Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 12:34:31 +0200 Subject: [PATCH 09/15] Fix re-login --- src/featureFlags/FeatureFlagsProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/featureFlags/FeatureFlagsProvider.tsx b/src/featureFlags/FeatureFlagsProvider.tsx index 9b20ba95c57..1e144b1cd3c 100644 --- a/src/featureFlags/FeatureFlagsProvider.tsx +++ b/src/featureFlags/FeatureFlagsProvider.tsx @@ -34,7 +34,7 @@ export const FeatureFlagsProvider = ({ .combineWithPriorities() .then(setFlags) .finally(disableLoading); - }, []); + }, [strategies]); return ( {loading ? : children} From a7a3a22a802d5f641f16d6ccc8b191fc01756ed5 Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 13:19:19 +0200 Subject: [PATCH 10/15] Fix re-login --- src/featureFlags/FeatureFlagsProvider.tsx | 5 +++-- src/featureFlags/FlagsResolver/index.ts | 9 --------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/featureFlags/FeatureFlagsProvider.tsx b/src/featureFlags/FeatureFlagsProvider.tsx index 1e144b1cd3c..be86495b08d 100644 --- a/src/featureFlags/FeatureFlagsProvider.tsx +++ b/src/featureFlags/FeatureFlagsProvider.tsx @@ -4,7 +4,7 @@ import React, { ReactNode, useEffect, useState } from "react"; import { FlagList } from "./availableFlags"; import { Provider } from "./context"; -import { useFlagsResolver } from "./FlagsResolver"; +import { FlagsResolver } from "./FlagsResolver"; import { AvailableStrategies, EnvVarsStrategy, @@ -22,13 +22,14 @@ export const FeatureFlagsProvider = ({ children, strategies, }: FeatureFlagsProviderProps) => { - const resolver = useFlagsResolver(strategies); const [flags, setFlags] = useState(undefined); const [loading, setLoading] = useState(true); const disableLoading = () => setLoading(false); useEffect(() => { + const resolver = new FlagsResolver(strategies); + resolver .fetchAll() .combineWithPriorities() diff --git a/src/featureFlags/FlagsResolver/index.ts b/src/featureFlags/FlagsResolver/index.ts index 1f6a4bd960f..a971af3c797 100644 --- a/src/featureFlags/FlagsResolver/index.ts +++ b/src/featureFlags/FlagsResolver/index.ts @@ -1,7 +1,4 @@ -import { useRef } from "react"; - import * as AvailableFlags from "./../availableFlags"; -import { AvailableStrategies } from "./../strategies"; import { DefaultsStrategy } from "./../strategies/DefaultsStrategy"; import { Strategy } from "./../Strategy"; import { reduceFlagListArray } from "./reduceFlagListArray"; @@ -35,9 +32,3 @@ export class FlagsResolver { return this.results; } } - -export const useFlagsResolver = (strategies: AvailableStrategies[]) => { - const resolver = useRef(new FlagsResolver(strategies)); - - return resolver.current; -}; From e4658d9d3945c043291647a740a4b59f103f6ce7 Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 16:48:22 +0200 Subject: [PATCH 11/15] Fix enable --- .featureFlags/generated.tsx | 6 +-- scripts/build-flags.js | 2 +- .../user/FeatureFlagsModal/FlagList.tsx | 42 ++++++++++--------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx index 2b90ffa8820..80b42633e6b 100644 --- a/.featureFlags/generated.tsx +++ b/.featureFlags/generated.tsx @@ -1,8 +1,8 @@ // @ts-nocheck -import K00120 from "./images/filters.png" +import D64395 from "./images/filters.png" -const product_filters = () => (<>

new filters

+const product_filters = () => (<>

new filters

Experience the new look and enhanced abilities of new fitering mechanism. Easily combine any criteria you want, and quickly browse their values.

) @@ -14,6 +14,6 @@ export const AVAILABLE_FLAGS = [{ visible: true, content: { enabled: false, - value: "undefined", + payload: "default", } }] diff --git a/scripts/build-flags.js b/scripts/build-flags.js index 918f5661d85..8dd923a648e 100644 --- a/scripts/build-flags.js +++ b/scripts/build-flags.js @@ -53,7 +53,7 @@ const availableFilters = mdParsed visible: ${el.visible}, content: { enabled: ${el.enabled}, - value: "${el.value}", + payload: "${el.payload}", } }` ) diff --git a/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx b/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx index b8f6a585818..6c0ba27a65b 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx @@ -19,26 +19,28 @@ export const FlagList = ({ selectedName, onItemClick }: FlagListProps) => { borderBottomWidth={0} borderColor="neutralHighlight" > - {flags.map(flag => ( - onItemClick(flag.name)} - > - {flag.displayName} - - ))} + {flags + .filter(flag => flag.visible) + .map(flag => ( + onItemClick(flag.name)} + > + {flag.displayName} + + ))} ); }; From cbaab20fa569689bb46464cc902c5977bb84011e Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 16:51:06 +0200 Subject: [PATCH 12/15] Fix enable --- .featureFlags/generated.tsx | 28 +++++++++++++++++-- .../user/FeatureFlagsModal/Content.tsx | 2 +- .../user/FeatureFlagsModal/FlagList.tsx | 1 + 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx index 80b42633e6b..95b5c69a686 100644 --- a/.featureFlags/generated.tsx +++ b/.featureFlags/generated.tsx @@ -1,10 +1,32 @@ // @ts-nocheck -import D64395 from "./images/filters.png" +import W76547 from "./images/filters.png" -const product_filters = () => (<>

new filters

+const product_filters = () => (<>

new filters

Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.

+Easily combine any criteria you want, and quickly browse their values. +Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values. +Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. +Easily combine any criteria you want, and quickly browse their values. +asd

) export const AVAILABLE_FLAGS = [{ diff --git a/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx b/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx index f57645cb79a..406fc5a03e7 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx @@ -26,7 +26,7 @@ export const Content = ({ backgroundColor="surfaceNeutralPlain" borderColor="neutralHighlight" width="100%" - overflow="scroll" + overflowY="scroll" padding={3} > diff --git a/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx b/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx index 6c0ba27a65b..1f3353c6312 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/FlagList.tsx @@ -18,6 +18,7 @@ export const FlagList = ({ selectedName, onItemClick }: FlagListProps) => { borderStyle="solid" borderBottomWidth={0} borderColor="neutralHighlight" + overflowY="scroll" > {flags .filter(flag => flag.visible) From 1289b458b5a5e78388a287cde9d64b1cc4083cd7 Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Wed, 16 Aug 2023 16:51:24 +0200 Subject: [PATCH 13/15] content --- .featureFlags/generated.tsx | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx index 95b5c69a686..720e992b7c5 100644 --- a/.featureFlags/generated.tsx +++ b/.featureFlags/generated.tsx @@ -1,32 +1,10 @@ // @ts-nocheck -import W76547 from "./images/filters.png" +import F41947 from "./images/filters.png" -const product_filters = () => (<>

new filters

+const product_filters = () => (<>

new filters

Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values. -Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values. -Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values.Experience the new look and enhanced abilities of new fitering mechanism. -Easily combine any criteria you want, and quickly browse their values. -asd

+Easily combine any criteria you want, and quickly browse their values.

) export const AVAILABLE_FLAGS = [{ From 65a15a1dc564500c134008ecfcd4ea71c07ccb7a Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Thu, 17 Aug 2023 09:53:04 +0200 Subject: [PATCH 14/15] Fix types, overflow content --- .featureFlags/generated.tsx | 6 +++--- scripts/build-flags.js | 2 +- .../Sidebar/user/FeatureFlagsModal/Content.tsx | 5 +++-- .../Sidebar/user/FeatureFlagsModal/ToggleButton.tsx | 3 ++- src/components/Sidebar/user/FeatureFlagsModal/index.tsx | 2 +- src/featureFlags/availableFlags.ts | 9 ++++++--- src/featureFlags/strategies/MetadataStrategy.ts | 4 ++-- 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.featureFlags/generated.tsx b/.featureFlags/generated.tsx index 720e992b7c5..796942f1267 100644 --- a/.featureFlags/generated.tsx +++ b/.featureFlags/generated.tsx @@ -1,8 +1,8 @@ // @ts-nocheck -import F41947 from "./images/filters.png" +import K35081 from "./images/filters.png" -const product_filters = () => (<>

new filters

+const product_filters = () => (<>

new filters

Experience the new look and enhanced abilities of new fitering mechanism. Easily combine any criteria you want, and quickly browse their values.

) @@ -16,4 +16,4 @@ export const AVAILABLE_FLAGS = [{ enabled: false, payload: "default", } -}] +}] as const; diff --git a/scripts/build-flags.js b/scripts/build-flags.js index 8dd923a648e..6161b84f28d 100644 --- a/scripts/build-flags.js +++ b/scripts/build-flags.js @@ -72,7 +72,7 @@ const template = `// @ts-nocheck ${imports} ${components} -export const AVAILABLE_FLAGS = [${availableFilters}] +export const AVAILABLE_FLAGS = [${availableFilters}] as const; ` fs.writeFileSync(path.resolve(__dirname, "./../.featureFlags/generated.tsx"), template) diff --git a/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx b/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx index 406fc5a03e7..baad18d594d 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/Content.tsx @@ -1,3 +1,4 @@ +import { Name } from "@dashboard/featureFlags/availableFlags"; import { Box, Text } from "@saleor/macaw-ui/next"; import React from "react"; @@ -5,7 +6,7 @@ import { ToggleButton } from "./ToggleButton"; interface ContentProps { flagName: string; - flagSlug: string; + flagSlug: Name; component: () => JSX.Element; isEnabled: boolean; } @@ -33,7 +34,7 @@ export const Content = ({ {flagName}
- + diff --git a/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx index 537e5e4b29e..82c407e4826 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/ToggleButton.tsx @@ -1,3 +1,4 @@ +import { Name } from "@dashboard/featureFlags/availableFlags"; import { Button, Spinner } from "@saleor/macaw-ui/next"; import React, { useState } from "react"; @@ -5,7 +6,7 @@ import { usePersistence } from "./usePersistence"; interface ToggleButtonProps { isEnabled: boolean; - flagSlug: string; + flagSlug: Name; } export const ToggleButton = ({ isEnabled, flagSlug }: ToggleButtonProps) => { diff --git a/src/components/Sidebar/user/FeatureFlagsModal/index.tsx b/src/components/Sidebar/user/FeatureFlagsModal/index.tsx index 76b39cf773f..b49461c79c7 100644 --- a/src/components/Sidebar/user/FeatureFlagsModal/index.tsx +++ b/src/components/Sidebar/user/FeatureFlagsModal/index.tsx @@ -55,7 +55,7 @@ export const FeatureFlagsModal = ({ children }: FeatureFlagsModalProps) => { /> diff --git a/src/featureFlags/availableFlags.ts b/src/featureFlags/availableFlags.ts index 82041a2517e..920c642f06e 100644 --- a/src/featureFlags/availableFlags.ts +++ b/src/featureFlags/availableFlags.ts @@ -12,7 +12,7 @@ export interface FlagDefinition { }; } -export const AVAILABLE_FLAGS = GENERATED_FLAGS as FlagDefinition[]; +export const AVAILABLE_FLAGS = GENERATED_FLAGS; type TypedEntry = (typeof AVAILABLE_FLAGS)[number]; type GeneralEntry = TypedEntry extends never ? FlagDefinition : TypedEntry; @@ -36,7 +36,7 @@ export const isSupported = (name: string): name is Name => export const asFlagValue = () => AVAILABLE_FLAGS.reduce(toFlagValue, {} as FlagList); -export const asFlagInfoArray = (list: GeneralFlagList): FlagDefinition[] => +export const asFlagInfoArray = (list: GeneralFlagList) => AVAILABLE_FLAGS.map((el: GeneralEntry) => ({ ...el, content: list[el.name], @@ -44,7 +44,10 @@ export const asFlagInfoArray = (list: GeneralFlagList): FlagDefinition[] => export const flagInfoToFlagList = (flagInfos: FlagDefinition[]): FlagList => { return flagInfos.reduce((prev, curr) => { - prev[curr.name] = new FlagValue(curr.content.enabled, curr.content.payload); + prev[curr.name as Name] = new FlagValue( + curr.content.enabled, + curr.content.payload, + ); return prev; }, {} as FlagList); diff --git a/src/featureFlags/strategies/MetadataStrategy.ts b/src/featureFlags/strategies/MetadataStrategy.ts index 5142ba5b363..dcf4d48bed3 100644 --- a/src/featureFlags/strategies/MetadataStrategy.ts +++ b/src/featureFlags/strategies/MetadataStrategy.ts @@ -22,10 +22,10 @@ export const flagListFromMetadata = ( : (defaultsList as FlagList); return Object.keys(defaultsList).reduce((list: FlagList, key: string) => { - list[key] = defaultsList[key]; + list[key as AvailableFlags.Name] = defaultsList[key as AvailableFlags.Name]; if (flagList[key]) { - list[key] = flagList[key]; + list[key as AvailableFlags.Name] = flagList[key]; } return list; From fa82773f021115f7e20aa01ac23f2ed965055119 Mon Sep 17 00:00:00 2001 From: andrzejewsky Date: Thu, 17 Aug 2023 10:58:41 +0200 Subject: [PATCH 15/15] Fix user menu --- package-lock.json | 14 +- package.json | 2 +- src/components/Sidebar/user/Controls.tsx | 178 +++++++++--------- .../Sidebar/user/FeatureFlagsModal/index.tsx | 13 +- 4 files changed, 107 insertions(+), 100 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5325e9117ea..1af2d8b8ca1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "@material-ui/lab": "^4.0.0-alpha.61", "@material-ui/styles": "^4.11.4", "@reach/auto-id": "^0.16.0", - "@saleor/macaw-ui": "0.8.0-pre.118", + "@saleor/macaw-ui": "0.8.0-pre.119", "@saleor/sdk": "0.6.0", "@sentry/react": "^6.0.0", "@types/faker": "^5.1.6", @@ -8507,9 +8507,9 @@ } }, "node_modules/@saleor/macaw-ui": { - "version": "0.8.0-pre.118", - "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.118.tgz", - "integrity": "sha512-874riwHhbjrr0h3OlCxz9qlAq/sERQZYBnhtnlS4uGofJmJse+8leENasHgyrZe8Zyn9eV//X5NJId/qAHmF6g==", + "version": "0.8.0-pre.119", + "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.119.tgz", + "integrity": "sha512-A9Pj91KTV7zynWby52kG+9KIx9eWTU9+l4Rw1TCfkKmwf9a5iZdve4TAbp2SXibyNATYxrPsbpa4oXcxQd98Wg==", "dependencies": { "@dessert-box/react": "^0.4.0", "@floating-ui/react-dom-interactions": "^0.5.0", @@ -41430,9 +41430,9 @@ } }, "@saleor/macaw-ui": { - "version": "0.8.0-pre.118", - "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.118.tgz", - "integrity": "sha512-874riwHhbjrr0h3OlCxz9qlAq/sERQZYBnhtnlS4uGofJmJse+8leENasHgyrZe8Zyn9eV//X5NJId/qAHmF6g==", + "version": "0.8.0-pre.119", + "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.8.0-pre.119.tgz", + "integrity": "sha512-A9Pj91KTV7zynWby52kG+9KIx9eWTU9+l4Rw1TCfkKmwf9a5iZdve4TAbp2SXibyNATYxrPsbpa4oXcxQd98Wg==", "requires": { "@dessert-box/react": "^0.4.0", "@floating-ui/react-dom-interactions": "^0.5.0", diff --git a/package.json b/package.json index 64b5aa27fc4..b1d3bd763fb 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@material-ui/lab": "^4.0.0-alpha.61", "@material-ui/styles": "^4.11.4", "@reach/auto-id": "^0.16.0", - "@saleor/macaw-ui": "0.8.0-pre.118", + "@saleor/macaw-ui": "0.8.0-pre.119", "@saleor/sdk": "0.6.0", "@sentry/react": "^6.0.0", "@types/faker": "^5.1.6", diff --git a/src/components/Sidebar/user/Controls.tsx b/src/components/Sidebar/user/Controls.tsx index 2bf2d0e8581..6989f05766a 100644 --- a/src/components/Sidebar/user/Controls.tsx +++ b/src/components/Sidebar/user/Controls.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { useUser } from "@dashboard/auth"; import { staffMemberDetailsUrl } from "@dashboard/staff/urls"; import { useTheme } from "@dashboard/theme"; @@ -29,11 +28,11 @@ export const useLegacyThemeHandler = () => { }; const handleStorage = (event: StorageEvent) => { - if (!["macaw-ui-theme", "activeMacawUITheme"].includes(event.key)) { + if (!["macaw-ui-theme", "activeMacawUITheme"].includes(event.key || "")) { return; } - const isDark = event.newValue.toLowerCase().includes("dark"); + const isDark = event.newValue?.toLowerCase().includes("dark"); setLegacyTheme(isDark ? "dark" : "light"); setTheme(isDark ? "defaultDark" : "defaultLight"); }; @@ -51,102 +50,107 @@ export const UserControls = () => { const { user, logout } = useUser(); const { changeTheme, theme } = useLegacyThemeHandler(); const [open, setOpen] = useState(false); + const [flagsModalOpen, setFlagsModalOpen] = useState(false); return ( - { - setOpen(value); - }} - > - -