mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-14 17:47:40 +02:00
Integrate eslint & precommit to codebase (#815)
* add eslint, precommit & refactor * fix exit code 127 * modify contributing.md & add package-lock * use .eslintrc.js
This commit is contained in:
parent
97eaaad744
commit
21dcea2a31
20 changed files with 4836 additions and 2139 deletions
|
@ -40,7 +40,7 @@ jobs:
|
||||||
- run: *yarn
|
- run: *yarn
|
||||||
- save-cache: *save-yarn-cache
|
- save-cache: *save-yarn-cache
|
||||||
- run:
|
- run:
|
||||||
name: Check Prettier
|
name: Check Prettier & ESLint
|
||||||
command: yarn ci-check
|
command: yarn ci-check
|
||||||
- run:
|
- run:
|
||||||
name: Run Test Suites
|
name: Run Test Suites
|
||||||
|
|
31
.eslintrc.js
Normal file
31
.eslintrc.js
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
const OFF = 0;
|
||||||
|
const WARNING = 1;
|
||||||
|
const ERROR = 2;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
extends: [
|
||||||
|
'fbjs', // eslint-config-fbjs
|
||||||
|
'prettier' // eslint-config-prettier
|
||||||
|
],
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ['lib/**/*.js'],
|
||||||
|
rules: {
|
||||||
|
// allow console
|
||||||
|
'no-console': OFF,
|
||||||
|
// require radix argument in parseInt
|
||||||
|
'radix': ERROR,
|
||||||
|
// disallow unused vars
|
||||||
|
'no-unused-vars': ERROR,
|
||||||
|
// almost certainly a bug
|
||||||
|
'no-duplicate-case': ERROR,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: ['examples/**/*.js'],
|
||||||
|
rules: {
|
||||||
|
'no-unused-vars': OFF
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
|
|
||||||
|
.eslintcache
|
||||||
lib/core/metadata.js
|
lib/core/metadata.js
|
||||||
lib/core/MetadataBlog.js
|
lib/core/MetadataBlog.js
|
||||||
lib/pages/
|
lib/pages/
|
||||||
|
|
|
@ -93,7 +93,7 @@ Please make sure the following is done when submitting a pull request:
|
||||||
1. Fork [the repository](https://github.com/facebook/docusaurus) and create your branch from `master`.
|
1. Fork [the repository](https://github.com/facebook/docusaurus) and create your branch from `master`.
|
||||||
1. Add the copyright notice to the top of any code new files you've added.
|
1. Add the copyright notice to the top of any code new files you've added.
|
||||||
1. Describe your [**test plan**](#test-plan) in your pull request description. Make sure to [test your changes](https://github.com/facebook/Docusaurus/blob/master/admin/testing-changes-on-Docusaurus-itself.md)!
|
1. Describe your [**test plan**](#test-plan) in your pull request description. Make sure to [test your changes](https://github.com/facebook/Docusaurus/blob/master/admin/testing-changes-on-Docusaurus-itself.md)!
|
||||||
1. Make sure your code lints (`npm run prettier`).
|
1. Make sure your code lints (`npm run prettier && npm run lint`).
|
||||||
1. Make sure our Jest tests pass (`npm run test`).
|
1. Make sure our Jest tests pass (`npm run test`).
|
||||||
1. If you haven't already, [sign the CLA](https://code.facebook.com/cla).
|
1. If you haven't already, [sign the CLA](https://code.facebook.com/cla).
|
||||||
|
|
||||||
|
|
|
@ -56,9 +56,9 @@ beforeAll(() => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function afterAll() {
|
afterAll(() => {
|
||||||
clearBuildFolder();
|
clearBuildFolder();
|
||||||
}
|
});
|
||||||
|
|
||||||
test('Build folder exists', function() {
|
test('Build folder exists', function() {
|
||||||
return fs.stat(buildDir).then(function(status) {
|
return fs.stat(buildDir).then(function(status) {
|
||||||
|
@ -73,7 +73,6 @@ test('Generated HTML for each Markdown resource', function() {
|
||||||
metadata.push(path.basename());
|
metadata.push(path.basename());
|
||||||
});
|
});
|
||||||
inputMarkdownFiles.forEach(function(file) {
|
inputMarkdownFiles.forEach(function(file) {
|
||||||
const path = filepath.create(file);
|
|
||||||
const data = fs.readFileSync(file, 'utf8');
|
const data = fs.readFileSync(file, 'utf8');
|
||||||
const frontmatter = fm(data);
|
const frontmatter = fm(data);
|
||||||
expect(metadata).toContain(frontmatter.attributes.id + '.html');
|
expect(metadata).toContain(frontmatter.attributes.id + '.html');
|
||||||
|
|
|
@ -5,11 +5,9 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const Metadata = require('./metadata.js');
|
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const Container = require('./Container.js');
|
const Container = require('./Container.js');
|
||||||
const SideNav = require('./nav/SideNav.js');
|
const SideNav = require('./nav/SideNav.js');
|
||||||
const siteConfig = require(process.cwd() + '/siteConfig.js');
|
|
||||||
const readCategories = require('../server/readCategories.js');
|
const readCategories = require('../server/readCategories.js');
|
||||||
|
|
||||||
class DocsSidebar extends React.Component {
|
class DocsSidebar extends React.Component {
|
||||||
|
|
|
@ -6,12 +6,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const fs = require('fs');
|
|
||||||
const Head = require('./Head.js');
|
const Head = require('./Head.js');
|
||||||
const translation = require('../server/translation.js');
|
const translation = require('../server/translation.js');
|
||||||
|
|
||||||
const CWD = process.cwd();
|
|
||||||
|
|
||||||
// Component used to provide same head, header, footer, other scripts to all pages
|
// Component used to provide same head, header, footer, other scripts to all pages
|
||||||
class Redirect extends React.Component {
|
class Redirect extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
@ -28,13 +25,9 @@ class Redirect extends React.Component {
|
||||||
this.props.config.url +
|
this.props.config.url +
|
||||||
this.props.config.baseUrl +
|
this.props.config.baseUrl +
|
||||||
(this.props.url || 'index.html');
|
(this.props.url || 'index.html');
|
||||||
let latestVersion;
|
|
||||||
|
|
||||||
const redirect = this.props.redirect || false;
|
const redirect = this.props.redirect || false;
|
||||||
|
|
||||||
if (fs.existsSync(CWD + '/versions.json')) {
|
|
||||||
latestVersion = require(CWD + '/versions.json')[0];
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<html>
|
<html>
|
||||||
<Head
|
<Head
|
||||||
|
|
|
@ -10,8 +10,6 @@
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const renderMarkdown = require('./renderMarkdown.js');
|
const renderMarkdown = require('./renderMarkdown.js');
|
||||||
|
|
||||||
const CWD = process.cwd();
|
|
||||||
|
|
||||||
class Remarkable extends React.Component {
|
class Remarkable extends React.Component {
|
||||||
content() {
|
content() {
|
||||||
if (this.props.source) {
|
if (this.props.source) {
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
|
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const classNames = require('classnames');
|
|
||||||
|
|
||||||
const HeaderNav = require('./nav/HeaderNav.js');
|
const HeaderNav = require('./nav/HeaderNav.js');
|
||||||
const Head = require('./Head.js');
|
const Head = require('./Head.js');
|
||||||
|
|
|
@ -125,11 +125,11 @@ shell.exec('git rm -rf .');
|
||||||
|
|
||||||
shell.cd('../..');
|
shell.cd('../..');
|
||||||
|
|
||||||
fromPath = path.join('build', `${PROJECT_NAME}`);
|
const fromPath = path.join('build', `${PROJECT_NAME}`);
|
||||||
toPath = path.join('build', `${PROJECT_NAME}-${DEPLOYMENT_BRANCH}`);
|
const toPath = path.join('build', `${PROJECT_NAME}-${DEPLOYMENT_BRANCH}`);
|
||||||
// In github.io case, project is deployed to root. Need to not recursively
|
// In github.io case, project is deployed to root. Need to not recursively
|
||||||
// copy the deployment-branch to be.
|
// copy the deployment-branch to be.
|
||||||
excludePath = `${PROJECT_NAME}-${DEPLOYMENT_BRANCH}`;
|
const excludePath = `${PROJECT_NAME}-${DEPLOYMENT_BRANCH}`;
|
||||||
|
|
||||||
// cannot use shell.cp because it doesn't support copying dotfiles and we
|
// cannot use shell.cp because it doesn't support copying dotfiles and we
|
||||||
// need to copy directories like .circleci, for example
|
// need to copy directories like .circleci, for example
|
||||||
|
|
|
@ -11,7 +11,6 @@ const chalk = require('chalk');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const glob = require('glob');
|
const glob = require('glob');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const readMetadata = require('./server/readMetadata.js');
|
|
||||||
const metadataUtils = require('./server/metadataUtils.js');
|
const metadataUtils = require('./server/metadataUtils.js');
|
||||||
|
|
||||||
const CWD = process.cwd();
|
const CWD = process.cwd();
|
||||||
|
|
|
@ -5,17 +5,10 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs-extra');
|
|
||||||
const path = require('path');
|
|
||||||
const os = require('os');
|
|
||||||
const Feed = require('feed');
|
const Feed = require('feed');
|
||||||
|
|
||||||
const chalk = require('chalk');
|
|
||||||
const CWD = process.cwd();
|
const CWD = process.cwd();
|
||||||
|
|
||||||
const siteConfig = require(CWD + '/siteConfig.js');
|
const siteConfig = require(CWD + '/siteConfig.js');
|
||||||
|
const readMetadata = require('./readMetadata.js');
|
||||||
const blogFolder = path.resolve('../blog/');
|
|
||||||
const blogRootURL = siteConfig.url + siteConfig.baseUrl + 'blog';
|
const blogRootURL = siteConfig.url + siteConfig.baseUrl + 'blog';
|
||||||
const siteImageURL =
|
const siteImageURL =
|
||||||
siteConfig.url + siteConfig.baseUrl + siteConfig.headerIcon;
|
siteConfig.url + siteConfig.baseUrl + siteConfig.headerIcon;
|
||||||
|
@ -23,17 +16,6 @@ const utils = require('../core/utils');
|
||||||
|
|
||||||
const renderMarkdown = require('../core/renderMarkdown.js');
|
const renderMarkdown = require('../core/renderMarkdown.js');
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
let readMetadata;
|
|
||||||
let Metadata;
|
|
||||||
|
|
||||||
readMetadata = require('./readMetadata.js');
|
|
||||||
readMetadata.generateMetadataDocs();
|
|
||||||
Metadata = require('../core/metadata.js');
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
module.exports = function(type) {
|
module.exports = function(type) {
|
||||||
console.log('feed.js triggered...');
|
console.log('feed.js triggered...');
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
async function execute() {
|
async function execute() {
|
||||||
const extractTranslations = require('../write-translations.js');
|
require('../write-translations.js');
|
||||||
|
|
||||||
const metadataUtils = require('./metadataUtils');
|
const metadataUtils = require('./metadataUtils');
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ async function execute() {
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const readMetadata = require('./readMetadata.js');
|
const readMetadata = require('./readMetadata.js');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const color = require('color');
|
|
||||||
const getTOC = require('../core/getTOC.js');
|
const getTOC = require('../core/getTOC.js');
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const mkdirp = require('mkdirp');
|
const mkdirp = require('mkdirp');
|
||||||
|
@ -321,9 +320,11 @@ async function execute() {
|
||||||
|
|
||||||
// create sitemap
|
// create sitemap
|
||||||
if (MetadataBlog.length > 0 || Object.keys(Metadata).length > 0) {
|
if (MetadataBlog.length > 0 || Object.keys(Metadata).length > 0) {
|
||||||
let targetFile = join(buildDir, 'sitemap.xml');
|
sitemap((err, xml) => {
|
||||||
sitemap(xml => {
|
if (!err) {
|
||||||
|
const targetFile = join(buildDir, 'sitemap.xml');
|
||||||
writeFileAndCreateFolder(targetFile, xml);
|
writeFileAndCreateFolder(targetFile, xml);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,7 +455,6 @@ async function execute() {
|
||||||
fs.writeFileSync(mainCss, css);
|
fs.writeFileSync(mainCss, css);
|
||||||
|
|
||||||
// compile/copy pages from user
|
// compile/copy pages from user
|
||||||
let pagesArr = [];
|
|
||||||
files = glob.sync(join(CWD, 'pages', '**'));
|
files = glob.sync(join(CWD, 'pages', '**'));
|
||||||
files.forEach(file => {
|
files.forEach(file => {
|
||||||
// Why normalize? In case we are on Windows.
|
// Why normalize? In case we are on Windows.
|
||||||
|
|
|
@ -10,7 +10,6 @@ const CWD = process.cwd();
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const glob = require('glob');
|
const glob = require('glob');
|
||||||
const chalk = require('chalk');
|
|
||||||
|
|
||||||
const metadataUtils = require('./metadataUtils');
|
const metadataUtils = require('./metadataUtils');
|
||||||
|
|
||||||
|
@ -180,8 +179,6 @@ function generateMetadataDocs() {
|
||||||
const docsDir = path.join(CWD, '../', getDocsPath());
|
const docsDir = path.join(CWD, '../', getDocsPath());
|
||||||
let files = glob.sync(CWD + '/../' + getDocsPath() + '/**');
|
let files = glob.sync(CWD + '/../' + getDocsPath() + '/**');
|
||||||
files.forEach(file => {
|
files.forEach(file => {
|
||||||
let language = 'en';
|
|
||||||
|
|
||||||
const extension = path.extname(file);
|
const extension = path.extname(file);
|
||||||
|
|
||||||
if (extension === '.md' || extension === '.markdown') {
|
if (extension === '.md' || extension === '.markdown') {
|
||||||
|
@ -359,7 +356,7 @@ function generateMetadataBlog() {
|
||||||
});
|
});
|
||||||
|
|
||||||
const sortedMetadatas = metadatas.sort(
|
const sortedMetadatas = metadatas.sort(
|
||||||
(a, b) => parseInt(b.seconds) - parseInt(a.seconds)
|
(a, b) => parseInt(b.seconds, 10) - parseInt(a.seconds, 10)
|
||||||
);
|
);
|
||||||
|
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
|
|
|
@ -11,14 +11,11 @@ function execute(port, options) {
|
||||||
const metadataUtils = require('./metadataUtils');
|
const metadataUtils = require('./metadataUtils');
|
||||||
|
|
||||||
const env = require('./env.js');
|
const env = require('./env.js');
|
||||||
const translation = require('./translation');
|
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const request = require('request');
|
const request = require('request');
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const os = require('os');
|
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const color = require('color');
|
|
||||||
const getTOC = require('../core/getTOC');
|
const getTOC = require('../core/getTOC');
|
||||||
const {
|
const {
|
||||||
blogRouting,
|
blogRouting,
|
||||||
|
@ -284,10 +281,13 @@ function execute(port, options) {
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get(sitemapRouting(siteConfig.baseUrl), (req, res) => {
|
app.get(sitemapRouting(siteConfig.baseUrl), (req, res) => {
|
||||||
|
sitemap((err, xml) => {
|
||||||
|
if (err) {
|
||||||
|
res.status(500).send('Sitemap error');
|
||||||
|
} else {
|
||||||
res.set('Content-Type', 'application/xml');
|
res.set('Content-Type', 'application/xml');
|
||||||
|
|
||||||
sitemap(xml => {
|
|
||||||
res.send(xml);
|
res.send(xml);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const path = require('path');
|
|
||||||
const os = require('os');
|
|
||||||
const Feed = require('feed');
|
|
||||||
|
|
||||||
const chalk = require('chalk');
|
|
||||||
const glob = require('glob');
|
const glob = require('glob');
|
||||||
const CWD = process.cwd();
|
const CWD = process.cwd();
|
||||||
|
|
||||||
|
@ -104,9 +100,6 @@ module.exports = function(callback) {
|
||||||
});
|
});
|
||||||
|
|
||||||
sm.toXML((err, xml) => {
|
sm.toXML((err, xml) => {
|
||||||
if (err) {
|
callback(err, xml);
|
||||||
return 'An error has occurred.';
|
|
||||||
}
|
|
||||||
callback(xml);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,7 +9,6 @@ const CWD = process.cwd();
|
||||||
const glob = require('glob');
|
const glob = require('glob');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
const metadataUtils = require('./metadataUtils');
|
const metadataUtils = require('./metadataUtils');
|
||||||
|
|
||||||
|
|
5822
package-lock.json
generated
5822
package-lock.json
generated
File diff suppressed because it is too large
Load diff
28
package.json
28
package.json
|
@ -14,15 +14,26 @@
|
||||||
"url": "https://github.com/facebook/Docusaurus.git"
|
"url": "https://github.com/facebook/Docusaurus.git"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ci-check": "yarn prettier:diff",
|
"ci-check": "yarn lint && yarn prettier:diff",
|
||||||
"format:source": "prettier --config .prettierrc --write \"lib/**/*.js\"",
|
"format:source": "prettier --config .prettierrc --write \"lib/**/*.js\"",
|
||||||
"format:examples": "prettier --config .prettierrc --write \"examples/**/*.js\"",
|
"format:examples": "prettier --config .prettierrc --write \"examples/**/*.js\"",
|
||||||
|
"lint": "eslint --cache \"lib/**/*.js\" \"examples/**/*.js\"",
|
||||||
"nit:source": "prettier --config .prettierrc --list-different \"lib/**/*.js\"",
|
"nit:source": "prettier --config .prettierrc --list-different \"lib/**/*.js\"",
|
||||||
"nit:examples": "prettier --config .prettierrc --list-different \"examples/**/*.js\"",
|
"nit:examples": "prettier --config .prettierrc --list-different \"examples/**/*.js\"",
|
||||||
|
"precommit": "lint-staged",
|
||||||
"prettier": "yarn format:source && yarn format:examples",
|
"prettier": "yarn format:source && yarn format:examples",
|
||||||
"prettier:diff": "yarn nit:source && yarn nit:examples",
|
"prettier:diff": "yarn nit:source && yarn nit:examples",
|
||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"linters": {
|
||||||
|
"{lib,examples}/**/*.js": [
|
||||||
|
"yarn lint --fix",
|
||||||
|
"yarn prettier",
|
||||||
|
"git add"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"babel-plugin-transform-class-properties": "^6.24.1",
|
"babel-plugin-transform-class-properties": "^6.24.1",
|
||||||
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||||
|
@ -35,7 +46,7 @@
|
||||||
"chalk": "^2.1.0",
|
"chalk": "^2.1.0",
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
"color": "^2.0.1",
|
"color": "^2.0.1",
|
||||||
"commander": "^2.11.0",
|
"commander": "^2.16.0",
|
||||||
"crowdin-cli": "^0.3.0",
|
"crowdin-cli": "^0.3.0",
|
||||||
"cssnano": "^3.10.0",
|
"cssnano": "^3.10.0",
|
||||||
"escape-string-regexp": "^1.0.5",
|
"escape-string-regexp": "^1.0.5",
|
||||||
|
@ -75,11 +86,22 @@
|
||||||
"docusaurus-feed": "./lib/generate-feed.js"
|
"docusaurus-feed": "./lib/generate-feed.js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"babel-eslint": "^8.2.5",
|
||||||
|
"eslint": "^5.0.1",
|
||||||
|
"eslint-config-fbjs": "^2.0.1",
|
||||||
|
"eslint-config-prettier": "^2.9.0",
|
||||||
|
"eslint-plugin-babel": "^5.1.0",
|
||||||
|
"eslint-plugin-flowtype": "^2.49.3",
|
||||||
|
"eslint-plugin-jsx-a11y": "^6.0.3",
|
||||||
|
"eslint-plugin-react": "^7.10.0",
|
||||||
|
"eslint-plugin-relay": "^0.0.23",
|
||||||
"filepath": "^1.1.0",
|
"filepath": "^1.1.0",
|
||||||
"front-matter": "^2.3.0",
|
"front-matter": "^2.3.0",
|
||||||
"glob-promise": "^3.3.0",
|
"glob-promise": "^3.3.0",
|
||||||
|
"husky": "^0.14.3",
|
||||||
"jest": "^21.2.1",
|
"jest": "^21.2.1",
|
||||||
"prettier": "^1.13.5",
|
"lint-staged": "^7.2.0",
|
||||||
|
"prettier": "^1.13.7",
|
||||||
"rimraf": "^2.6.2"
|
"rimraf": "^2.6.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue