1
0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-02-17 03:19:36 +01:00

fix: disable info registry section with pkg manager config (#2298)

This commit is contained in:
Juan Picado 2021-06-13 16:23:48 +02:00 committed by GitHub
parent 73d34bf9c4
commit 8ca5fe6d26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 167 additions and 209 deletions

@ -1,6 +0,0 @@
module.exports = {
extend: require('@htmllinter/basic-config'),
rules: {
'long-line-content': ['on', { maxLen: 120 }],
},
};

@ -15,6 +15,8 @@
"header": {
"documentation": "Documentation",
"registry-info": "Registry Information",
"registry-info-link": "Learn more",
"registry-no-conf": "No configurations available",
"greetings": "Hi "
},
"search": {

@ -21,9 +21,7 @@
"@emotion/jest": "^11.3.0",
"@emotion/styled": "10.0.27",
"@emotion/styled-base": "^10.0.31",
"@htmllinter/basic-config": "^0.5.1",
"@htmllinter/core": "^0.5.1",
"@material-ui/core": "4.11.2",
"@material-ui/core": "4.11.4",
"@material-ui/icons": "4.11.2",
"@material-ui/styles": "^4.11.4",
"@testing-library/dom": "7.31.2",
@ -135,7 +133,6 @@
"test:size": "bundlesize",
"lint": "pnpm lint:js && pnpm lint:css",
"lint:css": "yarn stylelint \"src/**/styles.ts\"",
"lint:html": "yarn htmllinter src/template/index.html",
"verdaccio:server": "node tools/verdaccio.js",
"build": "webpack --config tools/webpack.prod.config.babel.js",
"build:stats": "webpack --config tools/webpack.prod.config.babel.js --json > stats.json",

@ -1,6 +1,6 @@
import React from 'react';
import { render, cleanup, fireEvent } from 'verdaccio-ui/utils/test-react-testing-library';
import { screen, render, cleanup } from 'verdaccio-ui/utils/test-react-testing-library';
import RegistryInfoContent from './RegistryInfoContent';
@ -10,27 +10,19 @@ describe('<RegistryInfoContent /> component', () => {
});
test('should load the component with no data', () => {
const { getByTestId } = render(<RegistryInfoContent registryUrl={''} scope={''} />);
const unorderedListOfTodos = getByTestId('tabs-el');
expect(unorderedListOfTodos.children.length).toBe(1);
render(<RegistryInfoContent registryUrl={''} scope={''} />);
expect(screen.getByText('No configurations available')).toBeInTheDocument();
});
test('should load the appropiate tab content when the tab is clicked', () => {
const props = { registryUrl: 'http://localhost:4872', scope: '@' };
const pnpmTabTextContent = `pnpm adduser --registry ${props.registryUrl}`;
render(<RegistryInfoContent registryUrl={props.registryUrl} scope={props.scope} />);
// Render the component.
const { container, getByTestId } = render(
<RegistryInfoContent registryUrl={props.registryUrl} scope={props.scope} />
);
// Assert the text content for pnpm tab is not present intially
expect(container.textContent).not.toContain(pnpmTabTextContent);
const pnpmTab = getByTestId('pnpm-tab');
fireEvent.click(pnpmTab);
// Assert the text content is correct after clicking on the tab.
expect(container.textContent).toContain(pnpmTabTextContent);
screen.debug();
expect(screen.getByText('pnpm set @:registry http://localhost:4872')).toBeInTheDocument();
expect(screen.getByText('pnpm adduser --registry http://localhost:4872')).toBeInTheDocument();
expect(
screen.getByText('pnpm profile set password --registry http://localhost:4872')
).toBeInTheDocument();
});
});

@ -1,9 +1,17 @@
import React, { useState } from 'react';
import styled from '@emotion/styled';
import Accordion from '@material-ui/core/Accordion';
import AccordionDetails from '@material-ui/core/AccordionDetails';
import AccordionSummary from '@material-ui/core/AccordionSummary';
import Box from '@material-ui/core/Box';
import Link from '@material-ui/core/Link';
import { makeStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
import React, { FC } from 'react';
import { useTranslation } from 'react-i18next';
import CopyToClipBoard from 'verdaccio-ui/components/CopyToClipBoard';
import { default as Typography } from 'verdaccio-ui/components/Heading';
import Tab from 'verdaccio-ui/components/Tab';
import Tabs from 'verdaccio-ui/components/Tabs';
import { useConfig } from 'verdaccio-ui/providers/config';
import {
getCLISetRegistry,
getCLIChangePassword,
@ -11,81 +19,137 @@ import {
} from 'verdaccio-ui/utils/cli-utils';
import { NODE_MANAGER } from 'verdaccio-ui/utils/constants';
import { CommandContainer } from './styles';
import { Props, State } from './types';
const renderNpmTab = (scope: string, registryUrl: string): JSX.Element => {
return (
<Box display="flex" flexDirection="column" p={1}>
<CopyToClipBoard
text={getCLISetConfigRegistry(`${NODE_MANAGER.npm} set`, scope, registryUrl)}
/>
<CopyToClipBoard text={getCLISetRegistry(`${NODE_MANAGER.npm} adduser`, registryUrl)} />
<CopyToClipBoard text={getCLIChangePassword(NODE_MANAGER.npm, registryUrl)} />
</Box>
);
};
const RegistryInfoContent: React.FC<Props> = (props) => {
const [tabPosition, setTabPosition] = useState<State['tabPosition']>(0);
const handleChange = (event: React.ChangeEvent<{}>, tabPosition: number): void => {
event.preventDefault();
setTabPosition(tabPosition);
};
const renderPnpmTab = (scope: string, registryUrl: string): JSX.Element => {
return (
<Box display="flex" flexDirection="column" p={1}>
<CopyToClipBoard
text={getCLISetConfigRegistry(`${NODE_MANAGER.pnpm} set`, scope, registryUrl)}
/>
<CopyToClipBoard text={getCLISetRegistry(`${NODE_MANAGER.pnpm} adduser`, registryUrl)} />
<CopyToClipBoard text={getCLIChangePassword(NODE_MANAGER.pnpm, registryUrl)} />
</Box>
);
};
const renderNpmTab = (scope: string, registryUrl: string): JSX.Element => {
return (
<>
<CopyToClipBoard
text={getCLISetConfigRegistry(`${NODE_MANAGER.npm} set`, scope, registryUrl)}
/>
<CopyToClipBoard text={getCLISetRegistry(`${NODE_MANAGER.npm} adduser`, registryUrl)} />
<CopyToClipBoard text={getCLIChangePassword(NODE_MANAGER.npm, registryUrl)} />
</>
);
};
const renderPnpmTab = (scope: string, registryUrl: string): JSX.Element => {
return (
<>
<CopyToClipBoard
text={getCLISetConfigRegistry(`${NODE_MANAGER.pnpm} set`, scope, registryUrl)}
/>
<CopyToClipBoard text={getCLISetRegistry(`${NODE_MANAGER.pnpm} adduser`, registryUrl)} />
<CopyToClipBoard text={getCLIChangePassword(NODE_MANAGER.pnpm, registryUrl)} />
</>
);
};
const renderYarnTab = (scope: string, registryUrl: string): JSX.Element => {
return (
const renderYarnTab = (scope: string, registryUrl: string): JSX.Element => {
return (
<Box display="flex" flexDirection="column" p={1}>
<CopyToClipBoard
text={getCLISetConfigRegistry(`${NODE_MANAGER.yarn} config set`, scope, registryUrl)}
/>
);
};
</Box>
);
};
const renderTabs = (): JSX.Element => {
const { scope, registryUrl } = props;
const useStyles = makeStyles((theme) => ({
root: {
width: '100%',
},
heading: {
fontSize: theme.typography.pxToRem(15),
fontWeight: theme.typography.fontWeightBold,
},
}));
return (
<>
<Tabs
color={'primary'}
data-testid={'tabs-el'}
indicatorColor={'primary'}
onChange={handleChange}
value={tabPosition}
variant="fullWidth">
<Tab data-testid={'npm-tab'} label={NODE_MANAGER.npm} />
<Tab data-testid={'pnpm-tab'} label={NODE_MANAGER.pnpm} />
<Tab data-testid={'yarn-tab'} label={NODE_MANAGER.yarn} />
</Tabs>
{tabPosition === 0 && <TabContainer>{renderNpmTab(scope, registryUrl)}</TabContainer>}
{tabPosition === 1 && <TabContainer>{renderPnpmTab(scope, registryUrl)}</TabContainer>}
{tabPosition === 2 && <TabContainer>{renderYarnTab(scope, registryUrl)}</TabContainer>}
</>
);
};
export const AccordionContainer = styled('div')({
padding: 30,
paddingLeft: 0,
paddingRight: 0,
});
/* eslint react/prop-types:0 */
const TabContainer: React.FC = ({ children }): JSX.Element => {
return (
<CommandContainer data-testid={'tab-content'}>
<Typography>{children}</Typography>
</CommandContainer>
);
};
export const CommandContainer = styled('div')({
padding: 5,
});
return <div>{renderTabs()}</div>;
export const LinkContainer = styled('div')({
margin: 10,
marginLeft: 0,
});
export type Props = {
registryUrl: string;
scope: string;
};
const RegistryInfoContent: FC<Props> = ({ scope, registryUrl }) => {
const { t } = useTranslation();
const classes = useStyles();
const { configOptions } = useConfig();
const hasNpm = configOptions?.pkgManagers?.includes('npm');
const hasYarn = configOptions?.pkgManagers?.includes('yarn');
const hasPnpm = configOptions?.pkgManagers?.includes('pnpm');
const hasPkgManagers = hasNpm | hasPnpm | hasYarn;
if (!hasPkgManagers || !scope || !registryUrl) {
return <AccordionContainer>{t('header.registry-no-conf')}</AccordionContainer>;
}
return hasPkgManagers ? (
<AccordionContainer>
{hasNpm && (
<Accordion>
<AccordionSummary
aria-controls="panel1a-content"
expandIcon={<ExpandMoreIcon />}
id="panel1a-header">
<Typography className={classes.heading}>{'npm'}</Typography>
</AccordionSummary>
<AccordionDetails>
<CommandContainer data-testid={'tab-content'}>
{renderNpmTab(scope, registryUrl)}
</CommandContainer>
</AccordionDetails>
</Accordion>
)}
{hasYarn && (
<Accordion>
<AccordionSummary
aria-controls="panel2a-content"
expandIcon={<ExpandMoreIcon />}
id="panel2a-header">
<Typography className={classes.heading}>{'yarn'}</Typography>
</AccordionSummary>
<AccordionDetails>
<CommandContainer data-testid={'tab-content'}>
{renderYarnTab(scope, registryUrl)}
</CommandContainer>
</AccordionDetails>
</Accordion>
)}
{hasPnpm && (
<Accordion>
<AccordionSummary
aria-controls="panel3a-content"
expandIcon={<ExpandMoreIcon />}
id="panel3a-header">
{'pnpm'}
</AccordionSummary>
<AccordionDetails>
<CommandContainer data-testid={'tab-content'}>
{renderPnpmTab(scope, registryUrl)}
</CommandContainer>
</AccordionDetails>
</Accordion>
)}
<LinkContainer>
<Link href="https://verdaccio.org/docs/en/cli-registry" target="_blank">
<Typography>{t('header.registry-info-link')}</Typography>
</Link>
</LinkContainer>
</AccordionContainer>
) : null;
};
export default RegistryInfoContent;

@ -1,5 +0,0 @@
import styled from '@emotion/styled';
export const CommandContainer = styled('div')({
paddingTop: 20,
});

@ -1,8 +0,0 @@
export interface Props {
scope: string;
registryUrl: string;
}
export interface State {
tabPosition: number;
}

@ -28,8 +28,7 @@ export default function renderHTML(config, manifest, manifestFiles, req, res) {
const title = config?.web?.title ?? WEB_TITLE;
const login = hasLogin(config);
const scope = config?.web?.scope ?? '';
// FIXME: logo URI is incomplete
let logoURI = config?.web?.logo ?? '';
const logoURI = config?.web?.logo ?? '';
const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm'];
const version = pkgJSON.version;
const primaryColor = validatePrimaryColor(config?.web?.primary_color) ?? '#4b5e40';

115
pnpm-lock.yaml generated

@ -744,9 +744,7 @@ importers:
'@emotion/jest': ^11.3.0
'@emotion/styled': 10.0.27
'@emotion/styled-base': ^10.0.31
'@htmllinter/basic-config': ^0.5.1
'@htmllinter/core': ^0.5.1
'@material-ui/core': 4.11.2
'@material-ui/core': 4.11.4
'@material-ui/icons': 4.11.2
'@material-ui/styles': ^4.11.4
'@testing-library/dom': 7.31.2
@ -820,10 +818,8 @@ importers:
'@emotion/jest': 11.3.0
'@emotion/styled': 10.0.27_33bb31e1d857102242df3642b32eda18
'@emotion/styled-base': 10.0.31_33bb31e1d857102242df3642b32eda18
'@htmllinter/basic-config': 0.5.1
'@htmllinter/core': 0.5.1
'@material-ui/core': 4.11.2_react-dom@17.0.2+react@17.0.2
'@material-ui/icons': 4.11.2_00fcc96c46389b3398eebc2d751ab6a0
'@material-ui/core': 4.11.4_react-dom@17.0.2+react@17.0.2
'@material-ui/icons': 4.11.2_f543984b3e6c18c2e2e104a9ecbda934
'@material-ui/styles': 4.11.4_react-dom@17.0.2+react@17.0.2
'@testing-library/dom': 7.31.2
'@testing-library/jest-dom': 5.14.1
@ -3569,32 +3565,6 @@ packages:
'@hapi/hoek': 9.1.0
dev: true
/@htmllinter/basic-config/0.5.1:
resolution: {integrity: sha512-IrzjDoQXNL5Db5vS5jUBk2fcYiCLVyeHNRK4ZmMUSoehesfaMLZy755VAn+iVdZyV01KaSYVMKB7rIH1CTm0Ig==}
dependencies:
'@htmllinter/basic-rules': 0.5.1
'@htmllinter/core': 0.5.1
dev: true
/@htmllinter/basic-rules/0.5.1:
resolution: {integrity: sha512-bZyGTJkP+e0w+VA+Jk1SEKlGhypRKxXoOSSE42WrTvukMM4/4WNQKgU8QrXOiBOVs0ckKo1/W6nEevtl7PjNyw==}
dependencies:
'@htmllinter/core': 0.5.1
dev: true
/@htmllinter/core/0.5.1:
resolution: {integrity: sha512-OoJMqlQd0w12i1UqKCSBo5ZRjz7P96ODmUjVsMfxCZZKYncDQvwtuhLXp8tSQ4WAcCP1ACLtEtjM+vHv7yxCvA==}
hasBin: true
dependencies:
ajv: 6.12.4
chalk: 3.0.0
glob: 7.1.6
posthtml: 0.13.4
reshape-parser: 1.0.0
strip-ansi: 6.0.0
text-table: 0.2.0
dev: true
/@istanbuljs/load-nyc-config/1.1.0:
resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
engines: {node: '>=8'}
@ -3840,8 +3810,8 @@ packages:
rimraf: 2.7.1
dev: true
/@material-ui/core/4.11.2_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-/D1+AQQeYX/WhT/FUk78UCRj8ch/RCglsQLYujYTIqPSJlwZHKcvHidNeVhODXeApojeXjkl0tWdk5C9ofwOkQ==}
/@material-ui/core/4.11.4_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-oqb+lJ2Dl9HXI9orc6/aN8ZIAMkeThufA5iZELf2LQeBn2NtjVilF5D2w7e9RpntAzDb4jK5DsVhkfOvFY/8fg==}
engines: {node: '>=8.0.0'}
peerDependencies:
'@types/react': ^16.8.6 || ^17.0.0
@ -3851,9 +3821,9 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.12.5
'@babel/runtime': 7.14.5
'@material-ui/styles': 4.11.4_react-dom@17.0.2+react@17.0.2
'@material-ui/system': 4.11.2_react-dom@17.0.2+react@17.0.2
'@material-ui/system': 4.11.3_react-dom@17.0.2+react@17.0.2
'@material-ui/types': 5.1.0
'@material-ui/utils': 4.11.2_react-dom@17.0.2+react@17.0.2
'@types/react-transition-group': 4.4.0
@ -3863,11 +3833,11 @@ packages:
prop-types: 15.7.2
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
react-is: 16.13.1
react-is: 17.0.2
react-transition-group: 4.4.1_react-dom@17.0.2+react@17.0.2
dev: true
/@material-ui/icons/4.11.2_00fcc96c46389b3398eebc2d751ab6a0:
/@material-ui/icons/4.11.2_f543984b3e6c18c2e2e104a9ecbda934:
resolution: {integrity: sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==}
engines: {node: '>=8.0.0'}
peerDependencies:
@ -3880,7 +3850,7 @@ packages:
optional: true
dependencies:
'@babel/runtime': 7.12.5
'@material-ui/core': 4.11.2_react-dom@17.0.2+react@17.0.2
'@material-ui/core': 4.11.4_react-dom@17.0.2+react@17.0.2
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
dev: true
@ -3916,8 +3886,8 @@ packages:
react-dom: 17.0.2_react@17.0.2
dev: true
/@material-ui/system/4.11.2_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-BELFJEel5E+5DMiZb6XXT3peWRn6UixRvBtKwSxqntmD0+zwbbfCij6jtGwwdJhN1qX/aXrKu10zX31GBaeR7A==}
/@material-ui/system/4.11.3_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw==}
engines: {node: '>=8.0.0'}
peerDependencies:
'@types/react': ^16.8.6 || ^17.0.0
@ -3927,7 +3897,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.12.5
'@babel/runtime': 7.14.5
'@material-ui/utils': 4.11.2_react-dom@17.0.2+react@17.0.2
csstype: 2.6.13
prop-types: 15.7.2
@ -3951,11 +3921,11 @@ packages:
react: ^16.8.0 || ^17.0.0
react-dom: ^16.8.0 || ^17.0.0
dependencies:
'@babel/runtime': 7.12.5
'@babel/runtime': 7.14.5
prop-types: 15.7.2
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
react-is: 16.13.1
react-is: 17.0.2
dev: true
/@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents:
@ -4561,7 +4531,7 @@ packages:
/@types/react-transition-group/4.4.0:
resolution: {integrity: sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==}
dependencies:
'@types/react': 16.9.48
'@types/react': 16.14.2
dev: true
/@types/react-virtualized/9.21.10:
@ -4578,13 +4548,6 @@ packages:
csstype: 3.0.3
dev: true
/@types/react/16.9.48:
resolution: {integrity: sha512-4ykBVswgYitPGMXFRxJCHkxJDU2rjfU3/zw67f8+dB7sNdVJXsrwqoYxz/stkAucymnEEbRPFmX7Ce5Mc/kJCw==}
dependencies:
'@types/prop-types': 15.7.3
csstype: 3.0.3
dev: true
/@types/request/2.48.5:
resolution: {integrity: sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==}
dependencies:
@ -8120,13 +8083,6 @@ packages:
utila: 0.4.0
dev: true
/dom-helpers/5.2.0:
resolution: {integrity: sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==}
dependencies:
'@babel/runtime': 7.11.2
csstype: 3.0.3
dev: true
/dom-helpers/5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
dependencies:
@ -9535,7 +9491,7 @@ packages:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.30
mime-types: 2.1.31
/form-data/3.0.0:
resolution: {integrity: sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==}
@ -13305,7 +13261,6 @@ packages:
/mime-db/1.48.0:
resolution: {integrity: sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==}
engines: {node: '>= 0.6'}
dev: true
/mime-types/2.1.27:
resolution: {integrity: sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==}
@ -13331,7 +13286,6 @@ packages:
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.48.0
dev: true
/mime/1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
@ -14390,10 +14344,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/parse5/4.0.0:
resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==}
dev: true
/parse5/5.1.0:
resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==}
@ -15155,26 +15105,6 @@ packages:
source-map: 0.6.1
dev: true
/posthtml-parser/0.5.3:
resolution: {integrity: sha512-uHosRn0y+1wbnlYKrqMjBPoo/kK5LPYImLtiETszNFYfFwAD3cQdD1R2E13Mh5icBxkHj+yKtlIHozCsmVWD/Q==}
engines: {node: '>=10.0.0'}
dependencies:
htmlparser2: 3.10.1
dev: true
/posthtml-render/1.4.0:
resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
engines: {node: '>=10'}
dev: true
/posthtml/0.13.4:
resolution: {integrity: sha512-i2oTo/+dwXGC6zaAQSF6WZEQSbEqu10hsvg01DWzGAfZmy31Iiy9ktPh9nnXDfZiYytjxTIvxoK4TI0uk4QWpw==}
engines: {node: '>=10.0.0'}
dependencies:
posthtml-parser: 0.5.3
posthtml-render: 1.4.0
dev: true
/prebuild-install/5.3.5:
resolution: {integrity: sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==}
engines: {node: '>=6'}
@ -15640,8 +15570,8 @@ packages:
react: '>=16.6.0'
react-dom: '>=16.6.0'
dependencies:
'@babel/runtime': 7.11.2
dom-helpers: 5.2.0
'@babel/runtime': 7.14.5
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.7.2
react: 17.0.2
@ -16102,13 +16032,6 @@ packages:
resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=}
dev: true
/reshape-parser/1.0.0:
resolution: {integrity: sha1-RtIE+yD2i8hwvsZwljBSGcAXOHQ=}
engines: {node: '>= 6.0.0'}
dependencies:
parse5: 4.0.0
dev: true
/resolve-cwd/2.0.0:
resolution: {integrity: sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=}
engines: {node: '>=4'}