Merge branch 'main' into feature/relations-reordering

This commit is contained in:
Josh 2022-11-15 08:22:58 +00:00
commit f4b0bd90f9
28 changed files with 200 additions and 296 deletions

View File

@ -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 its 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 fields 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)

View File

@ -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_

View File

@ -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' }],

View File

@ -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",

View File

@ -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');
});
});

View File

@ -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;

View File

@ -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 = ({
)}
</ActionStack>
}
title={friendlyName}
title={`${friendlyName}${mainValue}`}
togglePosition="left"
/>
<AccordionContent>
@ -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);

View File

@ -0,0 +1,11 @@
import React from 'react';
function connect(WrappedComponent, select) {
return (props) => {
const selectors = select(props);
return <WrappedComponent {...props} {...selectors} />;
};
}
export default connect;

View File

@ -0,0 +1,2 @@
export { default as connect } from './connect';
export { default as select } from './select';

View File

@ -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;

View File

@ -1,22 +0,0 @@
import React from 'react';
const Bold = () => {
return (
<svg width="9" height="10" xmlns="http://www.w3.org/2000/svg">
<text
transform="translate(-12 -10)"
fill="#333740"
fillRule="evenodd"
fontSize="13"
fontFamily="Baskerville-SemiBold, Baskerville"
fontWeight="500"
>
<tspan x="12" y="20">
B
</tspan>
</text>
</svg>
);
};
export default Bold;

View File

@ -1,13 +0,0 @@
import React from 'react';
const Code = () => {
return (
<svg width="12" height="8" xmlns="http://www.w3.org/2000/svg">
<g fill="#333740" fillRule="evenodd">
<path d="M3.653 7.385a.632.632 0 0 1-.452-.191L.214 4.154a.66.66 0 0 1 0-.922L3.201.19a.632.632 0 0 1 .905 0 .66.66 0 0 1 0 .921l-2.534 2.58 2.534 2.58a.66.66 0 0 1 0 .922.632.632 0 0 1-.453.19zM8.347 7.385a.632.632 0 0 0 .452-.191l2.987-3.04a.66.66 0 0 0 0-.922L8.799.19a.632.632 0 0 0-.905 0 .66.66 0 0 0 0 .921l2.534 2.58-2.534 2.58a.66.66 0 0 0 0 .922c.125.127.289.19.453.19z" />
</g>
</svg>
);
};
export default Code;

View File

@ -1,28 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
const Cross = ({ fill, height, width, ...rest }) => {
return (
<svg {...rest} width={width} height={height} xmlns="http://www.w3.org/2000/svg">
<path
d="M7.78 6.72L5.06 4l2.72-2.72a.748.748 0 0 0 0-1.06.748.748 0 0 0-1.06 0L4 2.94 1.28.22a.748.748 0 0 0-1.06 0 .748.748 0 0 0 0 1.06L2.94 4 .22 6.72a.748.748 0 0 0 0 1.06.748.748 0 0 0 1.06 0L4 5.06l2.72 2.72a.748.748 0 0 0 1.06 0 .752.752 0 0 0 0-1.06z"
fill={fill}
fillRule="evenodd"
/>
</svg>
);
};
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;

View File

@ -1,23 +0,0 @@
import React from 'react';
const Italic = () => {
return (
<svg width="6" height="9" xmlns="http://www.w3.org/2000/svg">
<text
transform="translate(-13 -11)"
fill="#333740"
fillRule="evenodd"
fontWeight="500"
fontSize="13"
fontFamily="Baskerville-SemiBoldItalic, Baskerville"
fontStyle="italic"
>
<tspan x="13" y="20">
I
</tspan>
</text>
</svg>
);
};
export default Italic;

View File

@ -1,21 +0,0 @@
import React from 'react';
const Link = () => {
return (
<svg width="12" height="6" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fillRule="evenodd">
<path d="M6.063 1.5H6h.063z" fill="#000" />
<path
d="M9.516 0H8s.813.531.988 1.5h.528c.55 0 .984.434.984.984v1c0 .55-.434 1.016-.984 1.016h-3.5A1.03 1.03 0 0 1 5 3.484V2.5H3.5v.984A2.518 2.518 0 0 0 6.016 6h3.5C10.896 6 12 4.866 12 3.484v-1A2.473 2.473 0 0 0 9.516 0z"
fill="#333740"
/>
<path
d="M8.3 1.5A2.473 2.473 0 0 0 6.016 0h-3.5C1.134 0 0 1.103 0 2.484v1A2.526 2.526 0 0 0 2.516 6H4s-.806-.531-1.003-1.5h-.481A1.03 1.03 0 0 1 1.5 3.484v-1c0-.55.466-.984 1.016-.984h3.5c.55 0 .984.434.984.984V3.5h1.5V2.484c0-.35-.072-.684-.2-.984z"
fill="#333740"
/>
</g>
</svg>
);
};
export default Link;

View File

@ -1,14 +0,0 @@
import React from 'react';
const Media = () => {
return (
<svg width="12" height="11" xmlns="http://www.w3.org/2000/svg">
<g fill="#333740" fillRule="evenodd">
<path d="M9 4.286a1.286 1.286 0 1 0 0-2.572 1.286 1.286 0 0 0 0 2.572z" />
<path d="M11.25 0H.75C.332 0 0 .34 0 .758v8.77c0 .418.332.758.75.758h10.5c.418 0 .75-.34.75-.758V.758A.752.752 0 0 0 11.25 0zM8.488 5.296a.46.46 0 0 0-.342-.167c-.137 0-.234.065-.343.153l-.501.423c-.105.075-.188.126-.308.126a.443.443 0 0 1-.295-.11 3.5 3.5 0 0 1-.115-.11L5.143 4.054a.59.59 0 0 0-.897.008L.857 8.148V1.171a.353.353 0 0 1 .351-.314h9.581a.34.34 0 0 1 .346.322l.008 6.975-2.655-2.858z" />
</g>
</svg>
);
};
export default Media;

View File

@ -1,39 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
const Na = ({ fill, fontFamily, fontSize, fontWeight, height, textFill, width, ...rest }) => {
return (
<svg {...rest} width={width} height={height} xmlns="http://www.w3.org/2000/svg">
<g fill="none" fillRule="evenodd">
<rect fill={fill} width={width} height={height} rx="17.5" />
<text fontFamily={fontFamily} fontSize={fontSize} fontWeight={fontWeight} fill={textFill}>
<tspan x="6" y="22">
N/A
</tspan>
</text>
</g>
</svg>
);
};
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;

View File

@ -1,13 +0,0 @@
import React from 'react';
const Ol = () => {
return (
<svg width="12" height="8" xmlns="http://www.w3.org/2000/svg">
<g fill="#333740" fillRule="evenodd">
<path d="M2.4 3H.594v-.214h.137c.123 0 .212-.01.266-.032.053-.022.086-.052.1-.092a.67.67 0 0 0 .018-.188V.74a.46.46 0 0 0-.03-.194C1.064.504 1.021.476.955.46A1.437 1.437 0 0 0 .643.435H.539V.23c.332-.035.565-.067.7-.096.135-.03.258-.075.37-.134h.275v2.507c0 .104.023.177.07.218.047.04.14.061.278.061H2.4V3zM2.736 6.695l-.132.528h-.246a.261.261 0 0 0 .015-.074c0-.058-.049-.087-.146-.087H.293v-.198c.258-.173.511-.367.76-.581.25-.215.457-.437.623-.667.166-.23.249-.447.249-.653a.49.49 0 0 0-.321-.478.794.794 0 0 0-.582-.006.482.482 0 0 0-.196.138.284.284 0 0 0-.07.182c0 .074.04.17.12.289.006.008.009.015.009.02 0 .012-.041.03-.123.053l-.19.057a.693.693 0 0 1-.115.03c-.031 0-.067-.038-.108-.114a.516.516 0 0 1 .071-.586.899.899 0 0 1 .405-.238c.18-.058.4-.087.657-.087.317 0 .566.044.749.132.183.087.306.187.37.3a.64.64 0 0 1 .094.312c0 .197-.089.389-.266.575a5.296 5.296 0 0 1-.916.74 62.947 62.947 0 0 1-.62.413h1.843zM4 0h8v1H4zM4 2h8v1H4zM4 4h8v1H4zM4 6h8v1H4z" />
</g>
</svg>
);
};
export default Ol;

View File

@ -1,13 +0,0 @@
import React from 'react';
const Quote = () => {
return (
<svg width="9" height="9" xmlns="http://www.w3.org/2000/svg">
<g fill="#333740" fillRule="evenodd">
<path d="M3 0C2.047 0 1.301.263.782.782.263 1.302 0 2.047 0 3v6h3.75V3H1.5c0-.54.115-.93.343-1.157C2.07 1.615 2.46 1.5 3 1.5M8.25 0c-.953 0-1.699.263-2.218.782-.519.52-.782 1.265-.782 2.218v6H9V3H6.75c0-.54.115-.93.343-1.157.227-.228.617-.343 1.157-.343" />
</g>
</svg>
);
};
export default Quote;

View File

@ -1,24 +0,0 @@
import React from 'react';
const Striked = () => {
return (
<svg width="19" height="10" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fillRule="evenodd">
<text
fontFamily="Lato-Semibold, Lato"
fontSize="11"
fontWeight="500"
fill="#41464E"
transform="translate(0 -2)"
>
<tspan x="1" y="11">
abc
</tspan>
</text>
<path d="M.5 6.5h18" stroke="#2C3039" strokeLinecap="square" />
</g>
</svg>
);
};
export default Striked;

View File

@ -1,15 +0,0 @@
import React from 'react';
const Ul = () => {
return (
<svg width="13" height="7" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fillRule="evenodd">
<path fill="#333740" d="M5 0h8v1H5zM5 2h8v1H5zM5 4h8v1H5zM5 6h8v1H5z" />
<rect stroke="#333740" x=".5" y=".5" width="2" height="2" rx="1" />
<rect stroke="#333740" x=".5" y="4.5" width="2" height="2" rx="1" />
</g>
</svg>
);
};
export default Ul;

View File

@ -1,22 +0,0 @@
import React from 'react';
const Underline = () => {
return (
<svg width="10" height="10" xmlns="http://www.w3.org/2000/svg">
<text
transform="translate(-10 -11)"
fill="#101622"
fillRule="evenodd"
fontSize="13"
fontFamily="Baskerville-SemiBold, Baskerville"
fontWeight="500"
>
<tspan x="10" y="20">
U
</tspan>
</text>
</svg>
);
};
export default Underline;

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -18,8 +18,8 @@ const uploadAsset = (asset, folderId, cancelToken, onProgress) => {
'fileInfo',
JSON.stringify({
name,
caption: caption || name,
alternativeText: alternativeText || name,
caption,
alternativeText,
folder: folderId,
})
);

View File

@ -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"