mirror of
https://git.netzspielplatz.de/docker-multiarch/openwrt-firmware-selector.git
synced 2025-11-08 18:59:27 +00:00
Add prettier support
Add prettier and bind it with eslint. Also add pre-commit hook to prettify before commit Signed-off-by: Sudhanshu Gautam <me@sudhanshug.com>
This commit is contained in:
parent
3f46d13ccf
commit
ce4d2e1436
13 changed files with 776 additions and 468 deletions
|
|
@ -16,10 +16,13 @@ parserOptions:
|
|||
sourceType: module
|
||||
plugins:
|
||||
- react
|
||||
- prettier
|
||||
settings:
|
||||
react:
|
||||
version: 'detect'
|
||||
rules:
|
||||
prettier/prettier:
|
||||
- error
|
||||
indent:
|
||||
- error
|
||||
- 2
|
||||
|
|
|
|||
4
.prettierrc
Normal file
4
.prettierrc
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"singleQuote": true,
|
||||
"trailingComma": "es5"
|
||||
}
|
||||
12
package.json
12
package.json
|
|
@ -25,7 +25,8 @@
|
|||
"eject": "react-scripts eject",
|
||||
"predeploy": "yarn run build",
|
||||
"deploy": "gh-pages -d build",
|
||||
"lint": "eslint src/ --ext .js --fix"
|
||||
"lint": "eslint src/ --ext .js --fix",
|
||||
"pretty": "prettier --single-quote --trailing-comma es5 --write \"src/**/*.js\""
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
|
|
@ -42,8 +43,17 @@
|
|||
"devDependencies": {
|
||||
"babel-eslint": "^10.0.2",
|
||||
"eslint": "^6.1.0",
|
||||
"eslint-plugin-prettier": "^3.1.0",
|
||||
"eslint-plugin-react": "^7.14.2",
|
||||
"husky": "^3.0.5",
|
||||
"prettier": "1.18.2",
|
||||
"pretty-quick": "^1.11.1",
|
||||
"prop-types": "latest",
|
||||
"typescript": "^3.5.3"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "pretty-quick --staged"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
15
src/App.js
15
src/App.js
|
|
@ -24,9 +24,7 @@ const theme = createMuiTheme({
|
|||
function App() {
|
||||
return (
|
||||
<ThemeProvider theme={theme}>
|
||||
<Suspense fallback={
|
||||
<LinearProgress/>
|
||||
}>
|
||||
<Suspense fallback={<LinearProgress />}>
|
||||
<div className="App">
|
||||
<Header />
|
||||
<Router>
|
||||
|
|
@ -37,10 +35,17 @@ function App() {
|
|||
</Router>
|
||||
<Paper elevation={4} className="report-problem-container">
|
||||
<span>
|
||||
If you come across any issue, feel free to report <a href="https://github.com/aparcar/attendedsysupgrade-server/issues">here</a>.
|
||||
If you come across any issue, feel free to report{' '}
|
||||
<a href="https://github.com/aparcar/attendedsysupgrade-server/issues">
|
||||
here
|
||||
</a>
|
||||
.
|
||||
</span>
|
||||
<span className="report-link">
|
||||
For contributions, go to <a href="https://github.com/sudhanshu16/openwrt-firmware-selector/">Github</a>
|
||||
For contributions, go to{' '}
|
||||
<a href="https://github.com/sudhanshu16/openwrt-firmware-selector/">
|
||||
Github
|
||||
</a>
|
||||
</span>
|
||||
</Paper>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,15 @@ import {
|
|||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
function AlertDialog({open, cancelHandler, acceptHandler, body, title, cancelComponent, acceptComponent}) {
|
||||
function AlertDialog({
|
||||
open,
|
||||
cancelHandler,
|
||||
acceptHandler,
|
||||
body,
|
||||
title,
|
||||
cancelComponent,
|
||||
acceptComponent,
|
||||
}) {
|
||||
return (
|
||||
<Dialog
|
||||
open={open}
|
||||
|
|
@ -17,28 +25,28 @@ function AlertDialog({open, cancelHandler, acceptHandler, body, title, cancelCom
|
|||
aria-labelledby="alert-dialog-title"
|
||||
aria-describedby="alert-dialog-description"
|
||||
>
|
||||
<DialogTitle
|
||||
id="alert-dialog-title">{title}</DialogTitle>
|
||||
<DialogTitle id="alert-dialog-title">{title}</DialogTitle>
|
||||
<DialogContent>
|
||||
<DialogContentText id="alert-dialog-description">
|
||||
{body}
|
||||
</DialogContentText>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
{
|
||||
acceptHandler && (
|
||||
{acceptHandler && (
|
||||
<Button onClick={acceptHandler} color="primary">
|
||||
{acceptComponent}
|
||||
</Button>
|
||||
)
|
||||
}
|
||||
{
|
||||
cancelHandler && (
|
||||
<Button onClick={cancelHandler} color="secondary" variant="contained" autoFocus>
|
||||
)}
|
||||
{cancelHandler && (
|
||||
<Button
|
||||
onClick={cancelHandler}
|
||||
color="secondary"
|
||||
variant="contained"
|
||||
autoFocus
|
||||
>
|
||||
{cancelComponent}
|
||||
</Button>
|
||||
)
|
||||
}
|
||||
)}
|
||||
</DialogActions>
|
||||
</Dialog>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -29,22 +29,18 @@ function SearchTextField(props) {
|
|||
return (
|
||||
<TextField
|
||||
variant="outlined"
|
||||
label={
|
||||
<div className="search-label">
|
||||
{props.labeltext}
|
||||
</div>
|
||||
}
|
||||
label={<div className="search-label">{props.labeltext}</div>}
|
||||
disabled={props.disabled}
|
||||
InputProps={
|
||||
{
|
||||
InputProps={{
|
||||
classes,
|
||||
endAdornment: (
|
||||
<InputAdornment position="start">
|
||||
<SearchIcon className={classes.label} />
|
||||
</InputAdornment>
|
||||
),
|
||||
}
|
||||
} {...props} />
|
||||
}}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,13 +44,16 @@ function ErrorSnackBar({open, closeHandle, errorMessage}) {
|
|||
message={
|
||||
<span id="client-snackbar" className={classes.message}>
|
||||
<ErrorIcon className={classes.icon} />
|
||||
{errorMessage ||
|
||||
'An unexpected error occurred. Please try again'}
|
||||
{errorMessage || 'An unexpected error occurred. Please try again'}
|
||||
</span>
|
||||
}
|
||||
action={[
|
||||
<IconButton key="close" aria-label="Close" color="inherit"
|
||||
onClick={closeHandle}>
|
||||
<IconButton
|
||||
key="close"
|
||||
aria-label="Close"
|
||||
color="inherit"
|
||||
onClick={closeHandle}
|
||||
>
|
||||
<CloseIcon />
|
||||
</IconButton>,
|
||||
]}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ import {useTranslation} from 'react-i18next';
|
|||
import i18next from 'i18next';
|
||||
|
||||
export default function Header() {
|
||||
|
||||
const { t, i18n } = useTranslation();
|
||||
|
||||
const [value, setValue] = React.useState('en');
|
||||
|
|
@ -41,11 +40,17 @@ export default function Header() {
|
|||
return (
|
||||
<AppBar position="static">
|
||||
<Toolbar>
|
||||
<Typography edge="start" variant="h6">{t(
|
||||
'OpenWrt Firmware Selector Wizard')}</Typography>
|
||||
<Typography edge="start" variant="h6">
|
||||
{t('OpenWrt Firmware Selector Wizard')}
|
||||
</Typography>
|
||||
<div style={{ flexGrow: 1 }} />
|
||||
<Button aria-describedby={id} color="secondary" variant="contained"
|
||||
onClick={openChangeLanguagePopper} href="#">
|
||||
<Button
|
||||
aria-describedby={id}
|
||||
color="secondary"
|
||||
variant="contained"
|
||||
onClick={openChangeLanguagePopper}
|
||||
href="#"
|
||||
>
|
||||
{t('Change Language')}
|
||||
<LanguageIcon />
|
||||
</Button>
|
||||
|
|
@ -68,10 +73,16 @@ export default function Header() {
|
|||
value={value}
|
||||
onChange={changeLanguage}
|
||||
>
|
||||
<FormControlLabel value="en" control={<Radio/>}
|
||||
label={t('English')}/>
|
||||
<FormControlLabel value="de" control={<Radio/>}
|
||||
label={t('German')}/>
|
||||
<FormControlLabel
|
||||
value="en"
|
||||
control={<Radio />}
|
||||
label={t('English')}
|
||||
/>
|
||||
<FormControlLabel
|
||||
value="de"
|
||||
control={<Radio />}
|
||||
label={t('German')}
|
||||
/>
|
||||
</RadioGroup>
|
||||
</FormControl>
|
||||
</Paper>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import {
|
|||
Typography,
|
||||
ExpansionPanel,
|
||||
ExpansionPanelSummary,
|
||||
ExpansionPanelDetails
|
||||
ExpansionPanelDetails,
|
||||
} from '@material-ui/core';
|
||||
import CloudDownloadIcon from '@material-ui/icons/CloudDownload';
|
||||
import WarningIcon from '@material-ui/icons/Warning';
|
||||
|
|
@ -58,7 +58,8 @@ TabContainer.propTypes = {
|
|||
|
||||
const sleep = m => new Promise(r => setTimeout(r, m));
|
||||
const asu = 'https://aparcar.stephen304.com';
|
||||
const asu_download = 'https://aparcar.stephen304.com/download/json-demo/openwrt/';
|
||||
const asu_download =
|
||||
'https://aparcar.stephen304.com/download/json-demo/openwrt/';
|
||||
|
||||
class Home extends React.Component {
|
||||
state = {
|
||||
|
|
@ -99,7 +100,9 @@ class Home extends React.Component {
|
|||
const versionsResponse = await this.dataService.getVersions();
|
||||
let data = versionsResponse.data.versions;
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
const overviewResponse = await this.dataService.getOverview(data[i].path);
|
||||
const overviewResponse = await this.dataService.getOverview(
|
||||
data[i].path
|
||||
);
|
||||
data[i].devices = overviewResponse.data.devices;
|
||||
}
|
||||
this.generateFuzzySet(data[0].devices);
|
||||
|
|
@ -124,9 +127,9 @@ class Home extends React.Component {
|
|||
});
|
||||
};
|
||||
|
||||
generateFuzzySet = (data) => {
|
||||
generateFuzzySet = data => {
|
||||
let deviceNames = [];
|
||||
Object.keys(data).forEach((deviceName) => {
|
||||
Object.keys(data).forEach(deviceName => {
|
||||
deviceNames.push(deviceName);
|
||||
});
|
||||
this.setState({
|
||||
|
|
@ -134,7 +137,7 @@ class Home extends React.Component {
|
|||
});
|
||||
};
|
||||
|
||||
setRelease = (event) => {
|
||||
setRelease = event => {
|
||||
this.generateFuzzySet(this.state.data[event.target.value].devices);
|
||||
this.setState({
|
||||
selection: {
|
||||
|
|
@ -146,7 +149,7 @@ class Home extends React.Component {
|
|||
});
|
||||
};
|
||||
|
||||
selectDevice = async (device_name) => {
|
||||
selectDevice = async device_name => {
|
||||
const version = this.state.data[this.state.selection.version];
|
||||
let selection;
|
||||
try {
|
||||
|
|
@ -179,7 +182,11 @@ class Home extends React.Component {
|
|||
}
|
||||
const noPackageFoundError = { error: 'no-packages-found' };
|
||||
try {
|
||||
let devicePackagesResponse = await this.dataService.getDevicePackages(version.name, selection.device.target, selection.device.id);
|
||||
let devicePackagesResponse = await this.dataService.getDevicePackages(
|
||||
version.name,
|
||||
selection.device.target,
|
||||
selection.device.id
|
||||
);
|
||||
if (devicePackagesResponse.data.length === 0) {
|
||||
throw noPackageFoundError;
|
||||
}
|
||||
|
|
@ -200,7 +207,7 @@ class Home extends React.Component {
|
|||
});
|
||||
};
|
||||
|
||||
search = (event) => {
|
||||
search = event => {
|
||||
const query = event.target.value;
|
||||
this.setState({
|
||||
query,
|
||||
|
|
@ -243,26 +250,26 @@ class Home extends React.Component {
|
|||
}, 2000);
|
||||
};
|
||||
|
||||
changeAddPackageInput = (event) => {
|
||||
changeAddPackageInput = event => {
|
||||
this.setState({
|
||||
packageName: event.target.value,
|
||||
});
|
||||
};
|
||||
|
||||
deletePackage = (i) => {
|
||||
deletePackage = i => {
|
||||
let packages = this.state.packages;
|
||||
packages.splice(i, 1);
|
||||
this.setState({
|
||||
packages,
|
||||
configChanged: true
|
||||
configChanged: true,
|
||||
});
|
||||
};
|
||||
|
||||
addPackage = (event) => {
|
||||
addPackage = event => {
|
||||
if ((event.which || event.keyCode) === 13 && !event.shiftKey) {
|
||||
let packages = this.state.packages;
|
||||
const packageArray = this.state.packageName.split(/[,\n]+/);
|
||||
packageArray.forEach((package_name) => {
|
||||
packageArray.forEach(package_name => {
|
||||
package_name = package_name.replace(' ', '');
|
||||
if (package_name !== '' && packages.indexOf(package_name) === -1) {
|
||||
packages.push(package_name);
|
||||
|
|
@ -271,7 +278,7 @@ class Home extends React.Component {
|
|||
this.setState({
|
||||
packages,
|
||||
packageName: '',
|
||||
configChanged: true
|
||||
configChanged: true,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -284,18 +291,20 @@ class Home extends React.Component {
|
|||
this.confirmingBuild = true;
|
||||
};
|
||||
|
||||
displayBuiltImageData = async (buildStatusResponse) => {
|
||||
displayBuiltImageData = async buildStatusResponse => {
|
||||
const manifestResponse = await this.dataService.getDeviceManifest(
|
||||
buildStatusResponse.data.image_folder + '/' + buildStatusResponse.data.image_prefix + '.manifest'
|
||||
buildStatusResponse.data.image_folder +
|
||||
'/' +
|
||||
buildStatusResponse.data.image_prefix +
|
||||
'.manifest'
|
||||
);
|
||||
|
||||
const builtDeviceManifest = manifestResponse.data.split('\n');
|
||||
|
||||
let builtImages = [];
|
||||
buildStatusResponse.data.images.forEach((image) => {
|
||||
buildStatusResponse.data.images.forEach(image => {
|
||||
builtImages.push({
|
||||
url: asu +
|
||||
buildStatusResponse.data.image_folder + '/' + image.name,
|
||||
url: asu + buildStatusResponse.data.image_folder + '/' + image.name,
|
||||
type: image.type,
|
||||
});
|
||||
});
|
||||
|
|
@ -309,16 +318,21 @@ class Home extends React.Component {
|
|||
}
|
||||
};
|
||||
|
||||
buildImageCheck = async (request_hash) => {
|
||||
buildImageCheck = async request_hash => {
|
||||
try {
|
||||
if (!this.state.isBuilding) {
|
||||
return;
|
||||
}
|
||||
const buildStatusResponse = await this.dataService.buildStatusCheck(request_hash);
|
||||
const buildStatusResponse = await this.dataService.buildStatusCheck(
|
||||
request_hash
|
||||
);
|
||||
if (buildStatusResponse.status === 202) {
|
||||
if (buildStatusResponse.headers['X-Build-Queue-Position'] !== undefined) {
|
||||
if (
|
||||
buildStatusResponse.headers['X-Build-Queue-Position'] !== undefined
|
||||
) {
|
||||
this.setState({
|
||||
queuePosition: buildStatusResponse.headers['X-Build-Queue-Position'],
|
||||
queuePosition:
|
||||
buildStatusResponse.headers['X-Build-Queue-Position'],
|
||||
});
|
||||
}
|
||||
await sleep(buildStatusCheckInterval);
|
||||
|
|
@ -346,7 +360,13 @@ class Home extends React.Component {
|
|||
errorDialogMessage: (
|
||||
<>
|
||||
{e.response.data.error} <br />
|
||||
<a href={asu + e.response.data.log} target="_blank" rel="noopener noreferrer">Build logs</a>
|
||||
<a
|
||||
href={asu + e.response.data.log}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Build logs
|
||||
</a>
|
||||
</>
|
||||
),
|
||||
});
|
||||
|
|
@ -354,11 +374,7 @@ class Home extends React.Component {
|
|||
this.setState({
|
||||
isBuilding: false,
|
||||
openErrorDialog: true,
|
||||
errorDialogMessage: (
|
||||
<>
|
||||
{e.response.data.error}
|
||||
</>
|
||||
),
|
||||
errorDialogMessage: <>{e.response.data.error}</>,
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
|
|
@ -375,13 +391,23 @@ class Home extends React.Component {
|
|||
const board = this.state.selection.device.id;
|
||||
const packages = this.state.packages;
|
||||
const target = this.state.selection.device['target'];
|
||||
const version = this.state.data[this.state.selection.version].name.toLowerCase();
|
||||
const version = this.state.data[
|
||||
this.state.selection.version
|
||||
].name.toLowerCase();
|
||||
this.setState({
|
||||
isBuilding: true,
|
||||
builtImages: [],
|
||||
});
|
||||
let buildResponse = await this.dataService.buildImage(board, packages, target, version);
|
||||
if (buildResponse.status === 202 && buildResponse.data['request_hash'] !== undefined) {
|
||||
let buildResponse = await this.dataService.buildImage(
|
||||
board,
|
||||
packages,
|
||||
target,
|
||||
version
|
||||
);
|
||||
if (
|
||||
buildResponse.status === 202 &&
|
||||
buildResponse.data['request_hash'] !== undefined
|
||||
) {
|
||||
const request_hash = buildResponse.data['request_hash'];
|
||||
await sleep(buildStatusCheckInterval);
|
||||
await this.buildImageCheck(request_hash);
|
||||
|
|
@ -398,7 +424,13 @@ class Home extends React.Component {
|
|||
errorDialogMessage: (
|
||||
<>
|
||||
{e.response.data.error} <br />
|
||||
<a href={asu + e.response.data.log} target="_blank" rel="noopener noreferrer">Build logs</a>
|
||||
<a
|
||||
href={asu + e.response.data.log}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Build logs
|
||||
</a>
|
||||
</>
|
||||
),
|
||||
});
|
||||
|
|
@ -406,11 +438,7 @@ class Home extends React.Component {
|
|||
this.setState({
|
||||
isBuilding: false,
|
||||
openErrorDialog: true,
|
||||
errorDialogMessage: (
|
||||
<>
|
||||
{e.response.data.error}
|
||||
</>
|
||||
),
|
||||
errorDialogMessage: <>{e.response.data.error}</>,
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
|
|
@ -426,25 +454,22 @@ class Home extends React.Component {
|
|||
isBuilding: false,
|
||||
configChanged: true,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
closeErrorDialog = () => {
|
||||
this.setState({
|
||||
openErrorDialog: false,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const warning432 = this.state.showDeviceData && this.state.deviceLoaded &&
|
||||
const warning432 = this.state.showDeviceData &&
|
||||
this.state.deviceLoaded &&
|
||||
parseInt(
|
||||
(this.state.selection.device['image_size'] || '').slice(0, -1)) <= 4000 && (
|
||||
(this.state.selection.device['image_size'] || '').slice(0, -1)
|
||||
) <= 4000 && (
|
||||
<Paper className="warning-432" elevation={0}>
|
||||
<Grid
|
||||
container
|
||||
direction="row"
|
||||
justify="center"
|
||||
alignItems="center"
|
||||
>
|
||||
<Grid container direction="row" justify="center" alignItems="center">
|
||||
<Grid item>
|
||||
<WarningIcon className="icon" />
|
||||
</Grid>
|
||||
|
|
@ -454,9 +479,7 @@ class Home extends React.Component {
|
|||
</Grid>
|
||||
</Paper>
|
||||
);
|
||||
const notLoaded = (
|
||||
<CircularProgress/>
|
||||
);
|
||||
const notLoaded = <CircularProgress />;
|
||||
const onLoad = (
|
||||
<>
|
||||
<Typography variant="h5">
|
||||
|
|
@ -464,7 +487,8 @@ class Home extends React.Component {
|
|||
</Typography>
|
||||
<Typography>
|
||||
{this.props.t(
|
||||
'Please use the input below to download firmware for your device!')}
|
||||
'Please use the input below to download firmware for your device!'
|
||||
)}
|
||||
</Typography>
|
||||
<br />
|
||||
<ClickAwayListener onClickAway={this.hideSearchResults}>
|
||||
|
|
@ -478,16 +502,18 @@ class Home extends React.Component {
|
|||
onChange={this.setRelease}
|
||||
disabled={this.state.isBuilding}
|
||||
input={
|
||||
<OutlinedInput name="version"id="version-select" labelWidth={60}/>
|
||||
<OutlinedInput
|
||||
name="version"
|
||||
id="version-select"
|
||||
labelWidth={60}
|
||||
/>
|
||||
}
|
||||
>
|
||||
{
|
||||
this.state.data.map((version, i) => (
|
||||
{this.state.data.map((version, i) => (
|
||||
<MenuItem value={i} key={version.revision}>
|
||||
<em>{version.name}</em>
|
||||
</MenuItem>
|
||||
))
|
||||
}
|
||||
))}
|
||||
</Select>
|
||||
</FormControl>
|
||||
<FormControl className="search-field">
|
||||
|
|
@ -499,106 +525,108 @@ class Home extends React.Component {
|
|||
onClick={this.search}
|
||||
disabled={this.state.isBuilding}
|
||||
/>
|
||||
{
|
||||
this.state.showSearch && this.state.searchResults.length !==
|
||||
0 && (
|
||||
{this.state.showSearch && this.state.searchResults.length !== 0 && (
|
||||
<Paper elevation={4} className="search-results">
|
||||
<List>
|
||||
{
|
||||
this.state.searchResults.map((res) => {
|
||||
{this.state.searchResults.map(res => {
|
||||
return (
|
||||
<ListItem
|
||||
key={res}
|
||||
button
|
||||
onClick={() => this.selectDevice(res)}
|
||||
>
|
||||
<ListItemText primary={
|
||||
<div>
|
||||
{res}
|
||||
</div>
|
||||
}/>
|
||||
<ListItemText primary={<div>{res}</div>} />
|
||||
</ListItem>
|
||||
);
|
||||
})
|
||||
}
|
||||
})}
|
||||
</List>
|
||||
</Paper>
|
||||
)
|
||||
}
|
||||
{
|
||||
(this.state.searchResults.length === 0 &&
|
||||
this.state.showSearch) && (
|
||||
)}
|
||||
{this.state.searchResults.length === 0 && this.state.showSearch && (
|
||||
<Paper elevation={4} className="search-results">
|
||||
<ListItem>
|
||||
<ListItemText
|
||||
primary={this.props.t('No results')}/>
|
||||
<ListItemText primary={this.props.t('No results')} />
|
||||
</ListItem>
|
||||
</Paper>
|
||||
)
|
||||
}
|
||||
)}
|
||||
</FormControl>
|
||||
</div>
|
||||
</ClickAwayListener>
|
||||
{
|
||||
this.state.showDeviceData && !this.state.deviceLoaded && (
|
||||
{this.state.showDeviceData && !this.state.deviceLoaded && (
|
||||
<>
|
||||
<br />
|
||||
{notLoaded}
|
||||
</>
|
||||
)
|
||||
}
|
||||
{
|
||||
this.state.showDeviceData && this.state.deviceLoaded && (
|
||||
)}
|
||||
{this.state.showDeviceData && this.state.deviceLoaded && (
|
||||
<>
|
||||
{warning432}
|
||||
<br />
|
||||
{
|
||||
this.state.showAdvanced && (
|
||||
<AppBar className="interface-switch-bar" position="relative" elevation={0}>
|
||||
<Tabs value={this.state.basicInterface}onChange={this.changeInterface}>
|
||||
<Tab className="interface-switch" label={this.props.t('Basic')} disabled={this.state.isBuilding}/>
|
||||
<Tab className="interface-switch" label={this.props.t('Advanced')} disabled={this.state.isBuilding}/>
|
||||
{this.state.showAdvanced && (
|
||||
<AppBar
|
||||
className="interface-switch-bar"
|
||||
position="relative"
|
||||
elevation={0}
|
||||
>
|
||||
<Tabs
|
||||
value={this.state.basicInterface}
|
||||
onChange={this.changeInterface}
|
||||
>
|
||||
<Tab
|
||||
className="interface-switch"
|
||||
label={this.props.t('Basic')}
|
||||
disabled={this.state.isBuilding}
|
||||
/>
|
||||
<Tab
|
||||
className="interface-switch"
|
||||
label={this.props.t('Advanced')}
|
||||
disabled={this.state.isBuilding}
|
||||
/>
|
||||
</Tabs>
|
||||
</AppBar>
|
||||
)
|
||||
}
|
||||
{
|
||||
this.state.basicInterface === 0 ? (
|
||||
)}
|
||||
{this.state.basicInterface === 0 ? (
|
||||
<TabContainer>
|
||||
<Grid container className="device-info">
|
||||
<Grid item xs>
|
||||
{this.props.t('Model')}: <b> {this.state.selection.device['title']} </b> <br />
|
||||
{this.props.t('Target')}: {this.state.selection.device['target']} <br />
|
||||
{this.props.t('Version')}: {this.state.data[this.state.selection.version].name} ({this.state.data[this.state.selection.version].revision})
|
||||
{this.props.t('Model')}:{' '}
|
||||
<b> {this.state.selection.device['title']} </b> <br />
|
||||
{this.props.t('Target')}:{' '}
|
||||
{this.state.selection.device['target']} <br />
|
||||
{this.props.t('Version')}:{' '}
|
||||
{this.state.data[this.state.selection.version].name} (
|
||||
{this.state.data[this.state.selection.version].revision})
|
||||
</Grid>
|
||||
<Grid item xs>
|
||||
<b>{this.props.t('Downloads')}: </b>
|
||||
{
|
||||
this.state.selection.device.images.map((image) =>
|
||||
{this.state.selection.device.images.map(image => (
|
||||
<div key={image.name}>
|
||||
<Button
|
||||
className="download-button"
|
||||
href={asu_download +
|
||||
this.state.data[this.state.selection.version].path + '/targets/' +
|
||||
this.state.selection.device.target + '/' +
|
||||
image.name}
|
||||
href={
|
||||
asu_download +
|
||||
this.state.data[this.state.selection.version].path +
|
||||
'/targets/' +
|
||||
this.state.selection.device.target +
|
||||
'/' +
|
||||
image.name
|
||||
}
|
||||
color="primary"
|
||||
variant="contained"
|
||||
onClick={() => this.downloadingImageIndicatorShow()}
|
||||
>
|
||||
<CloudDownloadIcon
|
||||
className="download-icon"/>
|
||||
{image.name.split('-').reverse()[0].split('.')[0]}
|
||||
<CloudDownloadIcon className="download-icon" />
|
||||
{
|
||||
image.name
|
||||
.split('-')
|
||||
.reverse()[0]
|
||||
.split('.')[0]
|
||||
}
|
||||
</Button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
))}
|
||||
|
||||
{
|
||||
this.state.downloading && (
|
||||
<CircularProgress size={20}/>
|
||||
)
|
||||
}
|
||||
{this.state.downloading && <CircularProgress size={20} />}
|
||||
</Grid>
|
||||
</Grid>
|
||||
</TabContainer>
|
||||
|
|
@ -606,19 +634,23 @@ class Home extends React.Component {
|
|||
<TabContainer>
|
||||
<Paper elevation={0} className="package-list-input">
|
||||
<div>
|
||||
{
|
||||
this.state.packages.map((package_name, i) =>
|
||||
<Chip className="package"
|
||||
{this.state.packages.map((package_name, i) => (
|
||||
<Chip
|
||||
className="package"
|
||||
key={package_name + i}
|
||||
size="small"
|
||||
onDelete={() => this.deletePackage(
|
||||
i)}
|
||||
onDelete={() => this.deletePackage(i)}
|
||||
label={package_name}
|
||||
/>
|
||||
)
|
||||
}
|
||||
))}
|
||||
<Tooltip
|
||||
title={<span>Use comma or new line separated array. <br/>Press enter to apply.</span>}>
|
||||
title={
|
||||
<span>
|
||||
Use comma or new line separated array. <br />
|
||||
Press enter to apply.
|
||||
</span>
|
||||
}
|
||||
>
|
||||
<Input
|
||||
multiline
|
||||
value={this.state.packageName}
|
||||
|
|
@ -629,103 +661,115 @@ class Home extends React.Component {
|
|||
</Tooltip>
|
||||
</div>
|
||||
<br />
|
||||
{
|
||||
this.state.configChanged && !this.state.isBuilding && (
|
||||
<Button variant="outlined" color="primary"
|
||||
onClick={confirmationPopupOnBuildResquest ? this.openConfirmBuildDialog : this.buildImage}>
|
||||
{this.state.configChanged && !this.state.isBuilding && (
|
||||
<Button
|
||||
variant="outlined"
|
||||
color="primary"
|
||||
onClick={
|
||||
confirmationPopupOnBuildResquest
|
||||
? this.openConfirmBuildDialog
|
||||
: this.buildImage
|
||||
}
|
||||
>
|
||||
<BuildIcon />
|
||||
|
||||
{this.props.t('Build')}
|
||||
</Button>
|
||||
)
|
||||
}
|
||||
{
|
||||
this.state.isBuilding && (
|
||||
)}
|
||||
{this.state.isBuilding && (
|
||||
<>
|
||||
<Button variant="outlined" size="small"
|
||||
onClick={this.cancelBuild}>
|
||||
<Button
|
||||
variant="outlined"
|
||||
size="small"
|
||||
onClick={this.cancelBuild}
|
||||
>
|
||||
|
||||
{this.props.t('Cancel')}
|
||||
</Button>
|
||||
|
||||
|
||||
<CircularProgress size={20} style={{verticalAlign: 'middle'}}/>
|
||||
|
||||
Building image
|
||||
|
||||
{
|
||||
this.state.queuePosition !== -1 && (
|
||||
<span> (Position in queue: {this.state.queuePosition}) </span>
|
||||
)
|
||||
}
|
||||
|
||||
<CircularProgress
|
||||
size={20}
|
||||
style={{ verticalAlign: 'middle' }}
|
||||
/>
|
||||
Building image
|
||||
{this.state.queuePosition !== -1 && (
|
||||
<span>
|
||||
{' '}
|
||||
(Position in queue: {this.state.queuePosition}){' '}
|
||||
</span>
|
||||
)}
|
||||
...
|
||||
|
||||
</>
|
||||
)
|
||||
}
|
||||
{
|
||||
this.state.builtImages.length > 0 && !this.state.configChanged && (
|
||||
)}
|
||||
{this.state.builtImages.length > 0 &&
|
||||
!this.state.configChanged && (
|
||||
<Grid container className="device-info">
|
||||
<Grid item xs>
|
||||
{this.props.t('Model')}: <b> {this.state.selection.device['title']} </b> <br />
|
||||
{this.props.t('Target')}: {this.state.selection.device['target']} <br />
|
||||
{this.props.t('Version')}: {this.state.data[this.state.selection.version].name} ({this.state.data[this.state.selection.version].revision})
|
||||
<ExpansionPanel className="installed-packages" elevation={0}>
|
||||
{this.props.t('Model')}:{' '}
|
||||
<b> {this.state.selection.device['title']} </b> <br />
|
||||
{this.props.t('Target')}:{' '}
|
||||
{this.state.selection.device['target']} <br />
|
||||
{this.props.t('Version')}:{' '}
|
||||
{this.state.data[this.state.selection.version].name} (
|
||||
{
|
||||
this.state.data[this.state.selection.version]
|
||||
.revision
|
||||
}
|
||||
)
|
||||
<ExpansionPanel
|
||||
className="installed-packages"
|
||||
elevation={0}
|
||||
>
|
||||
<ExpansionPanelSummary
|
||||
expandIcon={<ExpandMoreIcon />}
|
||||
id="packages-manifest"
|
||||
>
|
||||
<Typography className="installed-packages-title">Installed Packages ({this.state.builtDeviceManifest.length})</Typography>
|
||||
<Typography className="installed-packages-title">
|
||||
Installed Packages (
|
||||
{this.state.builtDeviceManifest.length})
|
||||
</Typography>
|
||||
</ExpansionPanelSummary>
|
||||
<ExpansionPanelDetails>
|
||||
<div>
|
||||
{
|
||||
this.state.builtDeviceManifest.map(
|
||||
(package_name) => <div key={package_name}>
|
||||
{package_name}
|
||||
</div>
|
||||
{this.state.builtDeviceManifest.map(
|
||||
package_name => (
|
||||
<div key={package_name}>{package_name}</div>
|
||||
)
|
||||
}
|
||||
)}
|
||||
</div>
|
||||
</ExpansionPanelDetails>
|
||||
</ExpansionPanel>
|
||||
</Grid>
|
||||
<Grid item xs>
|
||||
<b>{this.props.t('Downloads')}: </b>
|
||||
{
|
||||
this.state.builtImages.map((image) =>
|
||||
{this.state.builtImages.map(image => (
|
||||
<div key={image.url}>
|
||||
<Button
|
||||
className="download-button"
|
||||
href={image.url}
|
||||
color="primary"
|
||||
variant="contained"
|
||||
onClick={() => this.downloadingImageIndicatorShow()}
|
||||
onClick={() =>
|
||||
this.downloadingImageIndicatorShow()
|
||||
}
|
||||
>
|
||||
<CloudDownloadIcon
|
||||
className="download-icon"/>
|
||||
<CloudDownloadIcon className="download-icon" />
|
||||
{image.type}
|
||||
</Button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
))}
|
||||
|
||||
{
|
||||
this.state.downloading && (
|
||||
{this.state.downloading && (
|
||||
<CircularProgress size={20} />
|
||||
)
|
||||
}
|
||||
)}
|
||||
</Grid>
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
)}
|
||||
</Paper>
|
||||
</TabContainer>
|
||||
)
|
||||
}
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
)}
|
||||
</>
|
||||
);
|
||||
return (
|
||||
|
|
@ -740,11 +784,14 @@ class Home extends React.Component {
|
|||
open={this.confirmingBuild}
|
||||
body={
|
||||
<>
|
||||
{this.props.t('Building image requires computation resources, so we would request you to check if this selection is what you want')}
|
||||
{this.props.t(
|
||||
'Building image requires computation resources, so we would request you to check if this selection is what you want'
|
||||
)}
|
||||
</>
|
||||
}
|
||||
title={this.props.t(
|
||||
'Please confirm that you want to perform this action')}
|
||||
'Please confirm that you want to perform this action'
|
||||
)}
|
||||
cancelComponent={this.props.t('Cancel')}
|
||||
acceptComponent={
|
||||
<>
|
||||
|
|
@ -756,7 +803,9 @@ class Home extends React.Component {
|
|||
cancelHandler={this.closeErrorDialog}
|
||||
open={this.state.openErrorDialog}
|
||||
body={this.state.errorDialogMessage}
|
||||
title={this.props.t('There is an error with the packages you selected')}
|
||||
title={this.props.t(
|
||||
'There is an error with the packages you selected'
|
||||
)}
|
||||
cancelComponent={this.props.t('Dismiss')}
|
||||
/>
|
||||
<Container className="home-container">
|
||||
|
|
@ -770,7 +819,7 @@ class Home extends React.Component {
|
|||
}
|
||||
|
||||
Home.propTypes = {
|
||||
t: PropTypes.func
|
||||
t: PropTypes.func,
|
||||
};
|
||||
|
||||
export default withTranslation()(Home);
|
||||
|
|
|
|||
|
|
@ -16,9 +16,7 @@ export default function NotFound() {
|
|||
<Typography variant="h5" component="h3">
|
||||
404 Page Not Found
|
||||
</Typography>
|
||||
<Typography component="p">
|
||||
Please head to the home.
|
||||
</Typography>
|
||||
<Typography component="p">Please head to the home.</Typography>
|
||||
</Paper>
|
||||
</Container>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ const resources = {
|
|||
},
|
||||
};
|
||||
|
||||
i18n.use(LanguageDetector)
|
||||
i18n
|
||||
.use(LanguageDetector)
|
||||
.use(initReactI18next)
|
||||
.init({
|
||||
resources,
|
||||
|
|
|
|||
|
|
@ -1,19 +1,30 @@
|
|||
import axios from 'axios';
|
||||
|
||||
const base_downloads = 'https://cors-anywhere.herokuapp.com/https://aparcar.stephen304.com/download/json-demo/openwrt/';
|
||||
const base_api = 'https://cors-anywhere.herokuapp.com/https://aparcar.stephen304.com/api/';
|
||||
const base_downloads =
|
||||
'https://cors-anywhere.herokuapp.com/https://aparcar.stephen304.com/download/json-demo/openwrt/';
|
||||
const base_api =
|
||||
'https://cors-anywhere.herokuapp.com/https://aparcar.stephen304.com/api/';
|
||||
|
||||
class DataService {
|
||||
|
||||
getVersions = () => axios.get(base_downloads + 'versions.json');
|
||||
|
||||
getOverview = (path) => axios.get(base_downloads + path + '/overview.json');
|
||||
getOverview = path => axios.get(base_downloads + path + '/overview.json');
|
||||
|
||||
getDeviceData = (device_path) => axios.get(base_downloads + device_path);
|
||||
getDeviceData = device_path => axios.get(base_downloads + device_path);
|
||||
|
||||
getDevicePackages = (version, target, profile) => axios.get(base_api + 'packages_image?distro=openwrt&version=' + version.toLowerCase() + '&target=' + target + '&profile=' + profile.toLowerCase());
|
||||
getDevicePackages = (version, target, profile) =>
|
||||
axios.get(
|
||||
base_api +
|
||||
'packages_image?distro=openwrt&version=' +
|
||||
version.toLowerCase() +
|
||||
'&target=' +
|
||||
target +
|
||||
'&profile=' +
|
||||
profile.toLowerCase()
|
||||
);
|
||||
|
||||
buildImage = (board, packages, target, version) => axios.post(base_api + 'build-request', {
|
||||
buildImage = (board, packages, target, version) =>
|
||||
axios.post(base_api + 'build-request', {
|
||||
profile: board,
|
||||
board,
|
||||
defaults: '',
|
||||
|
|
@ -23,10 +34,11 @@ class DataService {
|
|||
version,
|
||||
});
|
||||
|
||||
buildStatusCheck = (request_hash) => axios.get(base_api + 'build-request/' + request_hash);
|
||||
|
||||
getFiles = (files_url) => axios.get('https://chef.libremesh.org' + files_url).then(res => res.data);
|
||||
buildStatusCheck = request_hash =>
|
||||
axios.get(base_api + 'build-request/' + request_hash);
|
||||
|
||||
getFiles = files_url =>
|
||||
axios.get('https://chef.libremesh.org' + files_url).then(res => res.data);
|
||||
}
|
||||
|
||||
export default DataService;
|
||||
|
|
|
|||
216
yarn.lock
216
yarn.lock
|
|
@ -1375,6 +1375,11 @@
|
|||
"@types/istanbul-lib-coverage" "*"
|
||||
"@types/istanbul-lib-report" "*"
|
||||
|
||||
"@types/normalize-package-data@^2.4.0":
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
|
||||
integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
|
||||
|
||||
"@types/prop-types@*":
|
||||
version "15.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6"
|
||||
|
|
@ -1777,6 +1782,11 @@ arr-union@^3.1.0:
|
|||
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
|
||||
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
|
||||
|
||||
array-differ@^2.0.3:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1"
|
||||
integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==
|
||||
|
||||
array-equal@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
||||
|
|
@ -1820,7 +1830,7 @@ array-reduce@~0.0.0:
|
|||
resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
|
||||
integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=
|
||||
|
||||
array-union@^1.0.1:
|
||||
array-union@^1.0.1, array-union@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
|
||||
integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
|
||||
|
|
@ -2528,7 +2538,7 @@ caseless@~0.12.0:
|
|||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
|
||||
|
||||
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
|
||||
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||
|
|
@ -2974,6 +2984,15 @@ cross-spawn@^3.0.0:
|
|||
lru-cache "^4.0.1"
|
||||
which "^1.2.9"
|
||||
|
||||
cross-spawn@^5.0.1:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
|
||||
integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
|
||||
dependencies:
|
||||
lru-cache "^4.0.1"
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
crypto-browserify@^3.11.0:
|
||||
version "3.12.0"
|
||||
resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
|
||||
|
|
@ -3770,6 +3789,13 @@ eslint-plugin-jsx-a11y@6.2.1:
|
|||
has "^1.0.3"
|
||||
jsx-ast-utils "^2.0.1"
|
||||
|
||||
eslint-plugin-prettier@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz#8695188f95daa93b0dc54b249347ca3b79c4686d"
|
||||
integrity sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==
|
||||
dependencies:
|
||||
prettier-linter-helpers "^1.0.0"
|
||||
|
||||
eslint-plugin-react-hooks@^1.5.0:
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz#3c66a5515ea3e0a221ffc5d4e75c971c217b1a4c"
|
||||
|
|
@ -4011,6 +4037,19 @@ exec-sh@^0.3.2:
|
|||
resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b"
|
||||
integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==
|
||||
|
||||
execa@^0.8.0:
|
||||
version "0.8.0"
|
||||
resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
|
||||
integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=
|
||||
dependencies:
|
||||
cross-spawn "^5.0.1"
|
||||
get-stream "^3.0.0"
|
||||
is-stream "^1.1.0"
|
||||
npm-run-path "^2.0.0"
|
||||
p-finally "^1.0.0"
|
||||
signal-exit "^3.0.0"
|
||||
strip-eof "^1.0.0"
|
||||
|
||||
execa@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
|
||||
|
|
@ -4148,6 +4187,11 @@ fast-deep-equal@^2.0.1:
|
|||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
|
||||
integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
|
||||
|
||||
fast-diff@^1.1.2:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
|
||||
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
|
||||
|
||||
fast-glob@^2.0.2:
|
||||
version "2.2.7"
|
||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
|
||||
|
|
@ -4308,6 +4352,14 @@ find-up@^2.0.0, find-up@^2.1.0:
|
|||
dependencies:
|
||||
locate-path "^2.0.0"
|
||||
|
||||
find-up@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
|
||||
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
|
||||
dependencies:
|
||||
locate-path "^5.0.0"
|
||||
path-exists "^4.0.0"
|
||||
|
||||
flat-cache@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
|
||||
|
|
@ -4540,6 +4592,16 @@ get-stdin@^4.0.1:
|
|||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
|
||||
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
|
||||
|
||||
get-stdin@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6"
|
||||
integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==
|
||||
|
||||
get-stream@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
||||
integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
|
||||
|
||||
get-stream@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
|
||||
|
|
@ -4999,6 +5061,23 @@ humanize-url@^1.0.0:
|
|||
normalize-url "^1.0.0"
|
||||
strip-url-auth "^1.0.0"
|
||||
|
||||
husky@^3.0.5:
|
||||
version "3.0.5"
|
||||
resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.5.tgz#d7db27c346645a8dc52df02aa534a377ad7925e0"
|
||||
integrity sha512-cKd09Jy9cDyNIvAdN2QQAP/oA21sle4FWXjIMDttailpLAYZuBE7WaPmhrkj+afS8Sj9isghAtFvWSQ0JiwOHg==
|
||||
dependencies:
|
||||
chalk "^2.4.2"
|
||||
cosmiconfig "^5.2.1"
|
||||
execa "^1.0.0"
|
||||
get-stdin "^7.0.0"
|
||||
is-ci "^2.0.0"
|
||||
opencollective-postinstall "^2.0.2"
|
||||
pkg-dir "^4.2.0"
|
||||
please-upgrade-node "^3.2.0"
|
||||
read-pkg "^5.1.1"
|
||||
run-node "^1.0.0"
|
||||
slash "^3.0.0"
|
||||
|
||||
hyphenate-style-name@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48"
|
||||
|
|
@ -5059,7 +5138,7 @@ ignore-walk@^3.0.1:
|
|||
dependencies:
|
||||
minimatch "^3.0.4"
|
||||
|
||||
ignore@^3.3.5:
|
||||
ignore@^3.3.5, ignore@^3.3.7:
|
||||
version "3.3.10"
|
||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
|
||||
integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
|
||||
|
|
@ -6346,6 +6425,11 @@ levn@^0.3.0, levn@~0.3.0:
|
|||
prelude-ls "~1.1.2"
|
||||
type-check "~0.3.2"
|
||||
|
||||
lines-and-columns@^1.1.6:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
|
||||
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
|
||||
|
||||
load-json-file@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
|
||||
|
|
@ -6415,6 +6499,13 @@ locate-path@^3.0.0:
|
|||
p-locate "^3.0.0"
|
||||
path-exists "^3.0.0"
|
||||
|
||||
locate-path@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
|
||||
integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
|
||||
dependencies:
|
||||
p-locate "^4.1.0"
|
||||
|
||||
lodash._reinterpolate@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
|
||||
|
|
@ -6817,6 +6908,11 @@ move-concurrently@^1.0.1:
|
|||
rimraf "^2.5.4"
|
||||
run-queue "^1.0.3"
|
||||
|
||||
mri@^1.1.0:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a"
|
||||
integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
|
|
@ -6845,6 +6941,16 @@ multicast-dns@^6.0.1:
|
|||
dns-packet "^1.3.1"
|
||||
thunky "^1.0.2"
|
||||
|
||||
multimatch@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b"
|
||||
integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==
|
||||
dependencies:
|
||||
array-differ "^2.0.3"
|
||||
array-union "^1.0.2"
|
||||
arrify "^1.0.1"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
mute-stream@0.0.7:
|
||||
version "0.0.7"
|
||||
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
|
||||
|
|
@ -7042,7 +7148,7 @@ nopt@^4.0.1:
|
|||
abbrev "1"
|
||||
osenv "^0.1.4"
|
||||
|
||||
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
|
||||
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
|
||||
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
|
||||
|
|
@ -7263,6 +7369,11 @@ onetime@^2.0.0:
|
|||
dependencies:
|
||||
mimic-fn "^1.0.0"
|
||||
|
||||
opencollective-postinstall@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89"
|
||||
integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==
|
||||
|
||||
opn@5.4.0:
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035"
|
||||
|
|
@ -7387,6 +7498,13 @@ p-limit@^2.0.0:
|
|||
dependencies:
|
||||
p-try "^2.0.0"
|
||||
|
||||
p-limit@^2.2.0:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
|
||||
integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==
|
||||
dependencies:
|
||||
p-try "^2.0.0"
|
||||
|
||||
p-locate@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
|
||||
|
|
@ -7401,6 +7519,13 @@ p-locate@^3.0.0:
|
|||
dependencies:
|
||||
p-limit "^2.0.0"
|
||||
|
||||
p-locate@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
|
||||
integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
|
||||
dependencies:
|
||||
p-limit "^2.2.0"
|
||||
|
||||
p-map@^1.1.1:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
|
||||
|
|
@ -7476,6 +7601,16 @@ parse-json@^4.0.0:
|
|||
error-ex "^1.3.1"
|
||||
json-parse-better-errors "^1.0.1"
|
||||
|
||||
parse-json@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f"
|
||||
integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.0.0"
|
||||
error-ex "^1.3.1"
|
||||
json-parse-better-errors "^1.0.1"
|
||||
lines-and-columns "^1.1.6"
|
||||
|
||||
parse5@4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
|
||||
|
|
@ -7518,6 +7653,11 @@ path-exists@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
|
||||
integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
|
||||
|
||||
path-exists@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
|
||||
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
|
||||
|
||||
path-is-absolute@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
|
|
@ -7644,6 +7784,13 @@ pkg-dir@^3.0.0:
|
|||
dependencies:
|
||||
find-up "^3.0.0"
|
||||
|
||||
pkg-dir@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
|
||||
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
|
||||
dependencies:
|
||||
find-up "^4.0.0"
|
||||
|
||||
pkg-up@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
|
||||
|
|
@ -7651,6 +7798,13 @@ pkg-up@2.0.0:
|
|||
dependencies:
|
||||
find-up "^2.1.0"
|
||||
|
||||
please-upgrade-node@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
|
||||
integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==
|
||||
dependencies:
|
||||
semver-compare "^1.0.0"
|
||||
|
||||
pn@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
|
||||
|
|
@ -8343,6 +8497,18 @@ prepend-http@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
|
||||
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
|
||||
|
||||
prettier-linter-helpers@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
|
||||
integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
|
||||
dependencies:
|
||||
fast-diff "^1.1.2"
|
||||
|
||||
prettier@1.18.2:
|
||||
version "1.18.2"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
|
||||
integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
|
||||
|
||||
pretty-bytes@^5.1.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.2.0.tgz#96c92c6e95a0b35059253fb33c03e260d40f5a1f"
|
||||
|
|
@ -8366,6 +8532,18 @@ pretty-format@^24.8.0:
|
|||
ansi-styles "^3.2.0"
|
||||
react-is "^16.8.4"
|
||||
|
||||
pretty-quick@^1.11.1:
|
||||
version "1.11.1"
|
||||
resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.11.1.tgz#462ffa2b93d24c05b7a0c3a001e08601a0c55ee4"
|
||||
integrity sha512-kSXCkcETfak7EQXz6WOkCeCqpbC4GIzrN/vaneTGMP/fAtD8NerA9bPhCUqHAks1geo7biZNl5uEMPceeneLuA==
|
||||
dependencies:
|
||||
chalk "^2.3.0"
|
||||
execa "^0.8.0"
|
||||
find-up "^2.1.0"
|
||||
ignore "^3.3.7"
|
||||
mri "^1.1.0"
|
||||
multimatch "^3.0.0"
|
||||
|
||||
private@^0.1.6:
|
||||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
|
||||
|
|
@ -8806,6 +8984,16 @@ read-pkg@^3.0.0:
|
|||
normalize-package-data "^2.3.2"
|
||||
path-type "^3.0.0"
|
||||
|
||||
read-pkg@^5.1.1:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
|
||||
integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
|
||||
dependencies:
|
||||
"@types/normalize-package-data" "^2.4.0"
|
||||
normalize-package-data "^2.5.0"
|
||||
parse-json "^5.0.0"
|
||||
type-fest "^0.6.0"
|
||||
|
||||
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
|
||||
version "2.3.6"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
||||
|
|
@ -9136,6 +9324,11 @@ run-async@^2.2.0:
|
|||
dependencies:
|
||||
is-promise "^2.1.0"
|
||||
|
||||
run-node@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e"
|
||||
integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==
|
||||
|
||||
run-queue@^1.0.0, run-queue@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
|
||||
|
|
@ -9258,6 +9451,11 @@ selfsigned@^1.9.1:
|
|||
dependencies:
|
||||
node-forge "0.7.5"
|
||||
|
||||
semver-compare@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
|
||||
integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
|
||||
|
||||
"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
|
||||
version "5.7.0"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
|
||||
|
|
@ -9441,6 +9639,11 @@ slash@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
|
||||
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
|
||||
|
||||
slash@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
|
||||
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
|
||||
|
||||
slice-ansi@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
|
||||
|
|
@ -10190,6 +10393,11 @@ type-check@~0.3.2:
|
|||
dependencies:
|
||||
prelude-ls "~1.1.2"
|
||||
|
||||
type-fest@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
|
||||
integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
|
||||
|
||||
type-is@~1.6.17, type-is@~1.6.18:
|
||||
version "1.6.18"
|
||||
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue