diff --git a/docs/docs/custom-fields.md b/docs/docs/custom-fields.md new file mode 100644 index 0000000000..49ebe3933e --- /dev/null +++ b/docs/docs/custom-fields.md @@ -0,0 +1,61 @@ +--- +title: Custom fields +slug: /custom-fields +tags: + - content-type-builder + - plugins +--- + +# Custom fields + +## Summary + +Custom fields provide a way to replace the inputs of existing Strapi types to improve the content editing experience. + +## Detailed design + +A custom field needs to be registered in both the admin and server. + +### Server + +To register a custom field on the server, see [documentation](https://docs.strapi.io/developer-docs/latest/development/custom-fields.html#registering-a-custom-field-on-the-server). + +The custom field will be added to Strapi during the server [register lifecycle](https://docs.strapi.io/developer-docs/latest/developer-resources/plugin-api-reference/server.html#register). + +The `type: customField` saved on the schema.json for a content-type or component is converted to the underlying Strapi data type by calling the [convertCustomFieldType function](https://github.com/strapi/strapi/blob/a8f807d27ebc9c8b9b335e885154a06c60a896ae/packages/core/strapi/lib/Strapi.js#L395) as soon as the app starts during the `register` lifecycle, right after all custom fields have been loaded. + +### Admin + +To register a custom field to the admin panel, see [documentation](https://docs.strapi.io/developer-docs/latest/development/custom-fields.html#registering-a-custom-field-in-the-admin-panel). + +A custom field being saved on a content-type or component will have it’s underlying data type converted from the underlying data type to `type: customField` just before save in the [formatAttributes function](https://github.com/strapi/strapi/blob/33debd57010667a3fc5dfa343a673206cfb956e1/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/cleanData.js#L97-L100) of the `cleanData` util + +### Packaging + +A custom field can be registered in either a Strapi application or Strapi plugin. However, they can only be shared through plugins by publishing the package on npm. + +### Example + +- [Color Picker](https://github.com/strapi/strapi/blob/main/packages/plugins/color-picker/) +- [Shopify plugin](https://github.com/WalkingPizza/strapi-plugin-shopify-fields/) + +## Tradeoffs + +- We do not yet offer the ability to create a custom database type in Strapi. +- When extending a custom field’s base and advanced forms in the Content-type Builder, it is not yet possible to import custom input components. +- We do not allow custom fields to use the relation, component, dynamic zone and media types. + +## Alternatives + +We consider making special packages for Custom fields but : + +- Custom fields would not have been able to access other features from the plugin API. While that is not always required, it also enables custom fields that do need it to implement more advanced behaviors. For example, a custom field can also use injection zones if needed. +- Introducing a new custom field type of package would have required a new loader in Strapi, and a new section and review processes on the marketplace, which would have made the feature more complex to ship. +- The overkill aspect of the plugin API for a simple custom field could be mitigated by adding a new plugin generator that only created the files required for a custom field. + +## Resources + +- [Custom Fields page](https://strapi.io/custom-fields) +- [Docs](https://docs.strapi.io/developer-docs/latest/development/custom-fields.html) +- [non-technical RFC](https://github.com/strapi/rfcs/pull/40) +- [technical RFC](https://github.com/strapi/rfcs/pull/42) diff --git a/docs/docs/example.md b/docs/docs/example.md index 7e2bec6b39..a181f03512 100644 --- a/docs/docs/example.md +++ b/docs/docs/example.md @@ -8,7 +8,7 @@ tags: ## Summary -_Description of the sofware system / component._ +_Description of the software system / component._ ## Detailed design @@ -34,4 +34,4 @@ _What other approaches did we consider?_ - _Link to product documents._ - _Link to user documentation._ -- _Any usefull research used for it_ +- _Any useful research used for it_ diff --git a/docs/sidebars.js b/docs/sidebars.js index 01bc7cbc4d..24047f984b 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -44,6 +44,15 @@ const sidebars = { }, ], }, + { + type: 'category', + label: 'Custom Fields', + link: { + type: 'doc', + id: 'custom-fields', + }, + items: [], + }, ], api: [{ type: 'autogenerated', dirName: 'api' }], community: [{ type: 'autogenerated', dirName: 'community' }], diff --git a/packages/cli/create-strapi-starter/package.json b/packages/cli/create-strapi-starter/package.json index 2ce7394c70..c15b57e374 100644 --- a/packages/cli/create-strapi-starter/package.json +++ b/packages/cli/create-strapi-starter/package.json @@ -40,7 +40,7 @@ "dependencies": { "@strapi/generate-new": "4.5.0", "chalk": "4.1.1", - "ci-info": "3.3.2", + "ci-info": "3.5.0", "commander": "7.1.0", "execa": "5.1.1", "fs-extra": "10.0.0", diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/hooks/tests/getDisplayedValue.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/hooks/tests/getDisplayedValue.test.js new file mode 100644 index 0000000000..956fcbfe4c --- /dev/null +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/hooks/tests/getDisplayedValue.test.js @@ -0,0 +1,19 @@ +import { getDisplayedValue } from '../useMainValue'; + +describe('getDisplayedValue', () => { + it('returns the mainField value', () => { + const modifiedData = { + DeepComplex: [ + { + Title: 'File', + }, + ], + }; + const componentFieldPath = ['DeepComplex', 0]; + const mainField = 'Title'; + + const normalizedContent = getDisplayedValue(modifiedData, componentFieldPath, mainField); + + expect(normalizedContent).toEqual('File'); + }); +}); diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/hooks/useMainValue.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/hooks/useMainValue.js new file mode 100644 index 0000000000..547e418794 --- /dev/null +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/hooks/useMainValue.js @@ -0,0 +1,21 @@ +import { useMemo } from 'react'; +import get from 'lodash/get'; +import toString from 'lodash/toString'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; + +export function getDisplayedValue(modifiedData, componentFieldPath, mainField) { + return toString(get(modifiedData, [...componentFieldPath, mainField], '')); +} + +function useMainValue(schema, componentFieldPath) { + const { modifiedData } = useCMEditViewDataManager(); + + const mainField = useMemo(() => get(schema, ['settings', 'mainField'], 'id'), [schema]); + + const displayedValue = + mainField === 'id' ? '' : getDisplayedValue(modifiedData, componentFieldPath, mainField); + + return displayedValue.trim().length < 1 ? '' : ` - ${displayedValue}`; +} + +export default useMainValue; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js index 599d01a1e4..37d47e897c 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js @@ -18,6 +18,7 @@ import { useContentTypeLayout } from '../../../../hooks'; import { getTrad } from '../../../../utils'; import FieldComponent from '../../../FieldComponent'; import Rectangle from './Rectangle'; +import { connect, select } from './utils'; const ActionStack = styled(Stack)` svg { @@ -55,6 +56,8 @@ const Component = ({ removeComponentFromDynamicZone, showDownIcon, showUpIcon, + // Passed with the select function + mainValue, }) => { const { formatMessage } = useIntl(); const { getComponentLayout } = useContentTypeLayout(); @@ -144,7 +147,7 @@ const Component = ({ )} } - title={friendlyName} + title={`${friendlyName}${mainValue}`} togglePosition="left" /> @@ -186,6 +189,9 @@ Component.propTypes = { removeComponentFromDynamicZone: PropTypes.func.isRequired, showDownIcon: PropTypes.bool.isRequired, showUpIcon: PropTypes.bool.isRequired, + mainValue: PropTypes.string.isRequired, }; -export default memo(Component, isEqual); +const Memoized = memo(Component, isEqual); + +export default connect(Memoized, select); diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/connect.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/connect.js new file mode 100644 index 0000000000..f763338c32 --- /dev/null +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/connect.js @@ -0,0 +1,11 @@ +import React from 'react'; + +function connect(WrappedComponent, select) { + return (props) => { + const selectors = select(props); + + return ; + }; +} + +export default connect; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/index.js new file mode 100644 index 0000000000..ba5c550759 --- /dev/null +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/index.js @@ -0,0 +1,2 @@ +export { default as connect } from './connect'; +export { default as select } from './select'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/select.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/select.js new file mode 100644 index 0000000000..d42ecee470 --- /dev/null +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/utils/select.js @@ -0,0 +1,19 @@ +import { useMemo } from 'react'; +import useMainValue from '../hooks/useMainValue'; +import { useContentTypeLayout } from '../../../../../hooks'; + +function useSelect({ componentUid, name, index }) { + const { getComponentLayout } = useContentTypeLayout(); + const componentLayoutData = useMemo(() => { + const layout = getComponentLayout(componentUid); + + return layout; + }, [componentUid, getComponentLayout]); + const mainValue = useMainValue(componentLayoutData, [name, index]); + + return { + mainValue, + }; +} + +export default useSelect; diff --git a/packages/core/admin/admin/src/content-manager/icons/Bold/index.js b/packages/core/admin/admin/src/content-manager/icons/Bold/index.js deleted file mode 100644 index b55992e6e2..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Bold/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -const Bold = () => { - return ( - - - - B - - - - ); -}; - -export default Bold; diff --git a/packages/core/admin/admin/src/content-manager/icons/Code/index.js b/packages/core/admin/admin/src/content-manager/icons/Code/index.js deleted file mode 100644 index 4837b6fd2a..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Code/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -const Code = () => { - return ( - - - - - - ); -}; - -export default Code; diff --git a/packages/core/admin/admin/src/content-manager/icons/Cross/index.js b/packages/core/admin/admin/src/content-manager/icons/Cross/index.js deleted file mode 100644 index 72e5c9fdd7..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Cross/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -const Cross = ({ fill, height, width, ...rest }) => { - return ( - - - - ); -}; - -Cross.defaultProps = { - fill: '#b3b5b9', - height: '8', - width: '8', -}; - -Cross.propTypes = { - fill: PropTypes.string, - height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), -}; - -export default Cross; diff --git a/packages/core/admin/admin/src/content-manager/icons/Italic/index.js b/packages/core/admin/admin/src/content-manager/icons/Italic/index.js deleted file mode 100644 index 9295a7f5ab..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Italic/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; - -const Italic = () => { - return ( - - - - I - - - - ); -}; - -export default Italic; diff --git a/packages/core/admin/admin/src/content-manager/icons/Link/index.js b/packages/core/admin/admin/src/content-manager/icons/Link/index.js deleted file mode 100644 index 79b461a819..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Link/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; - -const Link = () => { - return ( - - - - - - - - ); -}; - -export default Link; diff --git a/packages/core/admin/admin/src/content-manager/icons/Media/index.js b/packages/core/admin/admin/src/content-manager/icons/Media/index.js deleted file mode 100644 index 80841145a7..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Media/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -const Media = () => { - return ( - - - - - - - ); -}; - -export default Media; diff --git a/packages/core/admin/admin/src/content-manager/icons/Na/index.js b/packages/core/admin/admin/src/content-manager/icons/Na/index.js deleted file mode 100644 index 90157de9e2..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Na/index.js +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -const Na = ({ fill, fontFamily, fontSize, fontWeight, height, textFill, width, ...rest }) => { - return ( - - - - - - N/A - - - - - ); -}; - -Na.defaultProps = { - fill: '#fafafb', - fontFamily: 'Lato-Medium, Lato', - fontSize: '12', - fontWeight: '400', - height: '35', - textFill: '#838383', - width: '35', -}; - -Na.propTypes = { - fill: PropTypes.string, - fontFamily: PropTypes.string, - fontSize: PropTypes.string, - fontWeight: PropTypes.string, - height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - textFill: PropTypes.string, - width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), -}; - -export default Na; diff --git a/packages/core/admin/admin/src/content-manager/icons/Ol/index.js b/packages/core/admin/admin/src/content-manager/icons/Ol/index.js deleted file mode 100644 index 1fe01741ae..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Ol/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -const Ol = () => { - return ( - - - - - - ); -}; - -export default Ol; diff --git a/packages/core/admin/admin/src/content-manager/icons/Quote/index.js b/packages/core/admin/admin/src/content-manager/icons/Quote/index.js deleted file mode 100644 index 830f5a75c6..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Quote/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -const Quote = () => { - return ( - - - - - - ); -}; - -export default Quote; diff --git a/packages/core/admin/admin/src/content-manager/icons/Striked/index.js b/packages/core/admin/admin/src/content-manager/icons/Striked/index.js deleted file mode 100644 index 534e61cfc9..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Striked/index.js +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; - -const Striked = () => { - return ( - - - - - abc - - - - - - ); -}; - -export default Striked; diff --git a/packages/core/admin/admin/src/content-manager/icons/Ul/index.js b/packages/core/admin/admin/src/content-manager/icons/Ul/index.js deleted file mode 100644 index 6a3284b2a2..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Ul/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; - -const Ul = () => { - return ( - - - - - - - - ); -}; - -export default Ul; diff --git a/packages/core/admin/admin/src/content-manager/icons/Underline/index.js b/packages/core/admin/admin/src/content-manager/icons/Underline/index.js deleted file mode 100644 index ac02a6306e..0000000000 --- a/packages/core/admin/admin/src/content-manager/icons/Underline/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -const Underline = () => { - return ( - - - - U - - - - ); -}; - -export default Underline; diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index 9f5c37f3f3..06099a5aa8 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -46,7 +46,7 @@ "@casl/ability": "^5.4.3", "@fingerprintjs/fingerprintjs": "3.3.3", "@fortawesome/fontawesome-free": "^5.15.3", - "@fortawesome/fontawesome-svg-core": "6.1.2", + "@fortawesome/fontawesome-svg-core": "6.2.0", "@fortawesome/free-brands-svg-icons": "^5.15.3", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.2.0", @@ -66,7 +66,7 @@ "chokidar": "^3.5.1", "codemirror": "^5.65.8", "cross-env": "^7.0.3", - "css-loader": "6.7.1", + "css-loader": "6.7.2", "date-fns": "2.29.2", "dotenv": "8.5.1", "esbuild-loader": "^2.20.0", diff --git a/packages/core/email/admin/src/translations/en.json b/packages/core/email/admin/src/translations/en.json index c490a9ef8d..fa7e87a87b 100644 --- a/packages/core/email/admin/src/translations/en.json +++ b/packages/core/email/admin/src/translations/en.json @@ -2,7 +2,7 @@ "link": "Link", "Settings.email.plugin.button.test-email": "Send test email", "Settings.email.plugin.label.defaultFrom": "Default sender email", - "Settings.email.plugin.label.defaultReplyTo": "Default response email", + "Settings.email.plugin.label.defaultReplyTo": "Default response email", "Settings.email.plugin.label.provider": "Email provider", "Settings.email.plugin.label.testAddress": "Recipient email", "Settings.email.plugin.notification.config.error": "Failed to retrieve the email config", diff --git a/packages/core/helper-plugin/package.json b/packages/core/helper-plugin/package.json index 3e7af16c2e..66fce75676 100644 --- a/packages/core/helper-plugin/package.json +++ b/packages/core/helper-plugin/package.json @@ -40,7 +40,7 @@ }, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.2", - "@fortawesome/fontawesome-svg-core": "6.1.2", + "@fortawesome/fontawesome-svg-core": "6.2.0", "@fortawesome/free-brands-svg-icons": "^5.15.2", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.2.0", diff --git a/packages/core/strapi/package.json b/packages/core/strapi/package.json index ba31fa8e50..cc497ac85b 100644 --- a/packages/core/strapi/package.json +++ b/packages/core/strapi/package.json @@ -96,7 +96,7 @@ "boxen": "5.1.2", "chalk": "4.1.2", "chokidar": "3.5.2", - "ci-info": "3.3.2", + "ci-info": "3.5.0", "cli-table3": "0.6.2", "commander": "8.2.0", "configstore": "5.0.1", diff --git a/packages/core/upload/admin/src/hooks/useUpload.js b/packages/core/upload/admin/src/hooks/useUpload.js index d05f80e3df..de05d5d3f9 100644 --- a/packages/core/upload/admin/src/hooks/useUpload.js +++ b/packages/core/upload/admin/src/hooks/useUpload.js @@ -18,8 +18,8 @@ const uploadAsset = (asset, folderId, cancelToken, onProgress) => { 'fileInfo', JSON.stringify({ name, - caption: caption || name, - alternativeText: alternativeText || name, + caption, + alternativeText, folder: folderId, }) ); diff --git a/yarn.lock b/yarn.lock index b6ae692d92..a16bcf0923 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2135,10 +2135,10 @@ intl-messageformat "9.13.0" tslib "^2.1.0" -"@fortawesome/fontawesome-common-types@6.1.2": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.2.tgz#c1095b1bbabf19f37f9ff0719db38d92a410bcfe" - integrity sha512-wBaAPGz1Awxg05e0PBRkDRuTsy4B3dpBm+zreTTyd9TH4uUM27cAL4xWyWR0rLJCrRwzVsQ4hF3FvM6rqydKPA== +"@fortawesome/fontawesome-common-types@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" + integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== "@fortawesome/fontawesome-common-types@^0.2.36": version "0.2.36" @@ -2150,12 +2150,12 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== -"@fortawesome/fontawesome-svg-core@6.1.2": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.2.tgz#11e2e8583a7dea75d734e4d0e53d91c63fae7511" - integrity sha512-853G/Htp0BOdXnPoeCPTjFrVwyrJHpe8MhjB/DYE9XjwhnNDfuBCd3aKc2YUYbEfHEcBws4UAA0kA9dymZKGjA== +"@fortawesome/fontawesome-svg-core@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" + integrity sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw== dependencies: - "@fortawesome/fontawesome-common-types" "6.1.2" + "@fortawesome/fontawesome-common-types" "6.2.0" "@fortawesome/free-brands-svg-icons@^5.15.2", "@fortawesome/free-brands-svg-icons@^5.15.3": version "5.15.4" @@ -9160,10 +9160,10 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -ci-info@3.3.2, ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== +ci-info@3.5.0, ci-info@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" + integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== ci-info@^2.0.0: version "2.0.0" @@ -10049,19 +10049,19 @@ css-color-keywords@^1.0.0: resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== -css-loader@6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== +css-loader@6.7.2: + version "6.7.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.2.tgz#26bc22401b5921686a10fbeba75d124228302304" + integrity sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" + postcss "^8.4.18" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.3.8" css-loader@^3.6.0: version "3.6.0" @@ -15871,9 +15871,9 @@ loader-runner@^4.2.0: integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^1.2.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.1.tgz#278ad7006660bccc4d2c0c1578e17c5c78d5c0e0" + integrity sha512-1Qo97Y2oKaU+Ro2xnDMR26g1BwMT29jNbem1EvcujW2jqt+j5COXyscjM7bLQkM9HaxI7pkWeW7gnI072yMI9Q== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -16731,11 +16731,16 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -18832,19 +18837,10 @@ postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0. picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.15: - version "8.4.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.3.11, postcss@^8.4.7: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== +postcss@^8.2.15, postcss@^8.3.11, postcss@^8.4.18: + version "8.4.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" + integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -20584,7 +20580,7 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" -semver@7.3.7, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: +semver@7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -20596,6 +20592,13 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"