diff --git a/.eslintignore b/.eslintignore index 41d132a329..bff77d5bf4 100644 --- a/.eslintignore +++ b/.eslintignore @@ -10,3 +10,4 @@ scripts packages/docusaurus-1.x/lib/core/metadata.js packages/docusaurus-1.x/lib/core/MetadataBlog.js packages/docusaurus-1.x/lib/core/__tests__/split-tab.test.js +packages/docusaurus-utils/lib/ diff --git a/.gitignore b/.gitignore index 633e2eb7cd..e9dc44e638 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ yarn-error.log build .docusaurus .cache-loader +types +packages/docusaurus-utils/lib/ diff --git a/.prettierignore b/.prettierignore index 6b9e084ea3..e762e56673 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ dist node_modules build .docusaurus +packages/docusaurus-utils/lib/ diff --git a/babel.config.js b/babel.config.js index 2798f4892e..49dba51c32 100644 --- a/babel.config.js +++ b/babel.config.js @@ -16,6 +16,7 @@ module.exports = { }, ], '@babel/react', + '@babel/preset-typescript', ], plugins: [ '@babel/plugin-proposal-class-properties', diff --git a/jest.config.js b/jest.config.js index 8aa1e24ac0..d2efb0acaa 100644 --- a/jest.config.js +++ b/jest.config.js @@ -12,8 +12,12 @@ module.exports = { verbose: true, testURL: 'http://localhost/', testEnvironment: 'node', - testPathIgnorePatterns: ['/node_modules/', '__fixtures__'], + testPathIgnorePatterns: [ + '/node_modules/', + '__fixtures__', + '/packages/.*/lib', + ], transform: { - '^.+\\.js$': 'babel-jest', + '^.+\\.[jt]sx?$': 'babel-jest', }, }; diff --git a/package.json b/package.json index 883201ff4c..dd6a31481b 100644 --- a/package.json +++ b/package.json @@ -6,14 +6,28 @@ "website-1.x" ], "scripts": { + "start": "yarn tsc && yarn start:v2", + "start:v1": "yarn workspace docusaurus-1-website start", + "start:v2": "yarn workspace docusaurus-2-website start", + "build": "yarn tsc && yarn build:v2", + "build:v1": "yarn workspace docusaurus-1-website build", + "build:v2": "yarn workspace docusaurus-2-website build", + "postinstall": "yarn tsc", "prettier": "prettier --config .prettierrc --write \"**/*.js\"", "prettier:diff": "prettier --config .prettierrc --list-different \"**/*.js\"", "lint": "eslint --cache \"**/*.js\"", "lerna": "lerna", - "test": "jest" + "test": "jest", + "tsc": "lerna run --parallel tsc --no-private" }, "devDependencies": { "@babel/core": "^7.4.4", + "@babel/preset-typescript": "^7.3.3", + "@types/escape-string-regexp": "^1.0.0", + "@types/fs-extra": "7.0.0", + "@types/jest": "^24.0.13", + "@types/lodash": "^4.14.129", + "@types/node": "^12.0.2", "babel-eslint": "8", "enzyme": "^3.9.0", "enzyme-adapter-react-16": "^1.12.1", @@ -35,7 +49,8 @@ "prettier": "^1.13.7", "react": "^16.8.4", "react-dom": "^16.8.4", - "rimraf": "^2.6.3" + "rimraf": "^2.6.3", + "typescript": "^3.4.5" }, "lint-staged": { "linters": { diff --git a/packages/docusaurus-utils/package.json b/packages/docusaurus-utils/package.json index 4fcfa68803..d00e14b1dd 100644 --- a/packages/docusaurus-utils/package.json +++ b/packages/docusaurus-utils/package.json @@ -2,7 +2,11 @@ "name": "@docusaurus/utils", "version": "2.0.0-alpha.16", "description": "Node utility functions for Docusaurus packages", - "main": "src/index.js", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "scripts": { + "tsc": "tsc" + }, "publishConfig": { "access": "public" }, diff --git a/packages/docusaurus-utils/src/__tests__/index.test.js b/packages/docusaurus-utils/src/__tests__/index.test.ts similarity index 94% rename from packages/docusaurus-utils/src/__tests__/index.test.js rename to packages/docusaurus-utils/src/__tests__/index.test.ts index 193709b63e..464b6587bc 100644 --- a/packages/docusaurus-utils/src/__tests__/index.test.js +++ b/packages/docusaurus-utils/src/__tests__/index.test.ts @@ -81,7 +81,7 @@ describe('load utils', () => { }); test('genChunkName', () => { - let asserts = { + const firstAssert = { '/docs/adding-blog': 'docs-adding-blog-062', '/docs/versioning': 'docs-versioning-8a8', '/': 'index', @@ -91,8 +91,8 @@ describe('load utils', () => { '/users/en/': 'users-en-f7a', '/blog': 'blog-c06', }; - Object.keys(asserts).forEach(str => { - expect(genChunkName(str)).toBe(asserts[str]); + Object.keys(firstAssert).forEach(str => { + expect(genChunkName(str)).toBe(firstAssert[str]); }); // Don't allow different chunk name for same path. @@ -101,12 +101,12 @@ describe('load utils', () => { ); // Even with same preferred name, still different chunk name for different path - asserts = { + const secondAssert = { '/blog/1': 'blog-85-f-089', '/blog/2': 'blog-353-489', }; - Object.keys(asserts).forEach(str => { - expect(genChunkName(str, undefined, 'blog')).toBe(asserts[str]); + Object.keys(secondAssert).forEach(str => { + expect(genChunkName(str, undefined, 'blog')).toBe(secondAssert[str]); }); }); @@ -136,7 +136,7 @@ describe('load utils', () => { }; const test = {arr: [1, 2, 3]}; const variable = 'enabledLanguages'; - expect(idx(a, [('b', 'c')])).toBeUndefined(); + expect(idx(a, ['b', 'c'])).toBeUndefined(); expect(idx(b, ['hello'])).toEqual('world'); expect(idx(b, 'hello')).toEqual('world'); expect(idx(obj, 'typo')).toBeUndefined(); diff --git a/packages/docusaurus-utils/src/index.js b/packages/docusaurus-utils/src/index.ts similarity index 73% rename from packages/docusaurus-utils/src/index.js rename to packages/docusaurus-utils/src/index.ts index 0b85f4bcc3..099bdb7a5f 100644 --- a/packages/docusaurus-utils/src/index.js +++ b/packages/docusaurus-utils/src/index.ts @@ -5,22 +5,19 @@ * LICENSE file in the root directory of this source tree. */ -const path = require('path'); -const matter = require('gray-matter'); -const {createHash} = require('crypto'); - -const _ = require(`lodash`); -const escapeStringRegexp = require('escape-string-regexp'); -const fs = require('fs-extra'); +import path from 'path'; +import matter from 'gray-matter'; +import {createHash} from 'crypto'; +import _ from 'lodash'; +import escapeStringRegexp from 'escape-string-regexp'; +import fs from 'fs-extra'; const fileHash = new Map(); -/** - * @param {string} generatedFilesDir - * @param {string} file - * @param {*} content - * @returns {Promise} - */ -async function generate(generatedFilesDir, file, content) { +export async function generate( + generatedFilesDir: string, + file: string, + content: any, +): Promise { const filepath = path.join(generatedFilesDir, file); const lastHash = fileHash.get(filepath); const currentHash = createHash('md5') @@ -38,21 +35,16 @@ const indexRE = /(^|.*\/)index\.(md|js)$/i; const extRE = /\.(md|js)$/; /** - * @param {string} file - * @returns {string} + * Convert filepath to url path. Example: 'index.md' -> '/', 'foo/bar.js' -> '/foo/bar', */ -function fileToPath(file) { +export function fileToPath(file: string): string { if (indexRE.test(file)) { return file.replace(indexRE, '/$1'); } return `/${file.replace(extRE, '').replace(/\\/g, '/')}`; } -/** - * @param {string} userpath - * @returns {string} - */ -function encodePath(userpath) { +export function encodePath(userpath: string): string { return userpath .split('/') .map(item => encodeURIComponent(item)) @@ -61,10 +53,8 @@ function encodePath(userpath) { /** * Given an input string, convert to kebab-case and append a hash. Avoid str collision - * @param {string} str input string - * @returns {string} */ -function docuHash(str) { +export function docuHash(str: string): string { if (str === '/') { return 'index'; } @@ -77,10 +67,8 @@ function docuHash(str) { /** * Generate unique React Component Name. E.g: /foo-bar -> FooBar096 - * @param {string} pagePath - * @returns {string} unique react component name */ -function genComponentName(pagePath) { +export function genComponentName(pagePath: string): string { if (pagePath === '/') { return 'index'; } @@ -94,10 +82,8 @@ function genComponentName(pagePath) { /** * Convert Windows backslash paths to posix style paths. E.g: endi\\lie -> endi/lie - * @param {string} str windows backslash paths - * @returns {string} posix-style path */ -function posixPath(str) { +export function posixPath(str: string): string { const isExtendedLengthPath = /^\\\\\?\\/.test(str); const hasNonAscii = /[^\u0000-\u0080]+/.test(str); // eslint-disable-line @@ -110,12 +96,12 @@ function posixPath(str) { const chunkNameCache = new Map(); /** * Generate unique chunk name given a module path - * @param {string} modulePath - * @param {string=} prefix - * @param {string=} preferredName - * @returns {string} */ -function genChunkName(modulePath, prefix, preferredName) { +export function genChunkName( + modulePath: string, + prefix?: string, + preferredName?: string, +): string { let chunkName = chunkNameCache.get(modulePath); if (!chunkName) { let str = modulePath; @@ -132,14 +118,11 @@ function genChunkName(modulePath, prefix, preferredName) { } return chunkName; } -/** - * @param {*} target - * @param {string|string[]} keyPaths - * @returns {*} - */ -function idx(target, keyPaths) { + +export function idx(target: any, keyPaths?: string | (string | number)[]): any { return ( target && + keyPaths && (Array.isArray(keyPaths) ? keyPaths.reduce((obj, key) => obj && obj[key], target) : target[keyPaths]) @@ -147,11 +130,9 @@ function idx(target, keyPaths) { } /** - * @param {string} file - * @param {string} refDir - * @returns {string} + * Given a filepath and dirpath, get the first directory */ -function getSubFolder(file, refDir) { +export function getSubFolder(file: string, refDir: string): string | null { const separator = escapeStringRegexp(path.sep); const baseDir = escapeStringRegexp(path.basename(refDir)); const regexSubFolder = new RegExp( @@ -161,28 +142,28 @@ function getSubFolder(file, refDir) { return match && match[1]; } -/** - * @param {string} fileString - * @returns {Object} - */ -function parse(fileString) { - const {data: frontMatter, content, excerpt} = matter(fileString, { - excerpt(file) { - // eslint-disable-next-line no-param-reassign +export function parse( + fileString: string, +): { + frontMatter: { + [key: string]: any, + }, + content: string, + excerpt: string | undefined, +} { + const options: {} = { + excerpt: (file: matter.GrayMatterFile): void => { file.excerpt = file.content .trim() .split('\n', 1) .shift(); }, - }); + }; + const {data: frontMatter, content, excerpt} = matter(fileString, options); return {frontMatter, content, excerpt}; } -/** - * @param {string[]} rawUrls - * @returns {string} - */ -function normalizeUrl(rawUrls) { +export function normalizeUrl(rawUrls: string[]): string { const urls = rawUrls; const resultArray = []; @@ -242,17 +223,3 @@ function normalizeUrl(rawUrls) { return str; } - -module.exports = { - encodePath, - docuHash, - generate, - fileToPath, - genComponentName, - genChunkName, - getSubFolder, - idx, - normalizeUrl, - parse, - posixPath, -}; diff --git a/packages/docusaurus-utils/tsconfig.json b/packages/docusaurus-utils/tsconfig.json new file mode 100644 index 0000000000..e8a156c7c6 --- /dev/null +++ b/packages/docusaurus-utils/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + } +} diff --git a/packages/docusaurus/package.json b/packages/docusaurus/package.json index 80eb736909..4690b646a0 100644 --- a/packages/docusaurus/package.json +++ b/packages/docusaurus/package.json @@ -70,7 +70,7 @@ "wait-on": "endiliey/wait-on#master", "webpack": "^4.30.0", "webpack-bundle-analyzer": "^3.1.0", - "webpack-dev-server": "^3.2.1", + "webpack-dev-server": "^3.4.1", "webpack-merge": "^4.1.4", "webpack-nicelog": "^2.3.1" }, diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..13e74202f8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "lib": ["es6"], + "declaration": true, + + /* Strict Type-Checking Options */ + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + + /* Additional Checks */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + + /* Module Resolution Options */ + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + + /* Advanced Options */ + "resolveJsonModule": true + }, + "exclude": [ + "node_modules", + "**/__tests__/**/*", + "**/lib/**/*", + ] +} diff --git a/yarn.lock b/yarn.lock index 58ef816d2b..42a669aa53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -380,6 +380,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" + integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -646,6 +653,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-typescript@^7.3.2": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.4.tgz#93e9c3f2a546e6d3da1e9cc990e30791b807aa9f" + integrity sha512-rwDvjaMTx09WC0rXGBRlYSSkEHOKRrecY6hEr3SVIPKII8DVWXtapNAfAyMC0dovuO+zYArcAuKeu3q9DNRfzA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + "@babel/plugin-transform-unicode-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" @@ -728,6 +743,14 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" +"@babel/preset-typescript@^7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz#88669911053fa16b2b276ea2ede2ca603b3f307a" + integrity sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.3.2" + "@babel/register@^7.0.0": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.4.4.tgz#370a68ba36f08f015a8b35d4864176c6b65d7a23" @@ -1807,11 +1830,23 @@ dependencies: "@types/node" "*" +"@types/escape-string-regexp@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/escape-string-regexp/-/escape-string-regexp-1.0.0.tgz#052d16d87db583b72daceae4eaabddb66954424c" + integrity sha512-KAruqgk9/340M4MYYasdBET+lyYN8KMXUuRKWO72f4SbmIMMFp9nnJiXUkJS0HC2SFe4x0R/fLozXIzqoUfSjA== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/fs-extra@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-7.0.0.tgz#9c4ad9e1339e7448a76698829def1f159c1b636c" + integrity sha512-ndoMMbGyuToTy4qB6Lex/inR98nPiNHacsgMPvy+zqMLgSxbt8VtWpDArpGp69h1fEDQHn1KB+9DWD++wgbwYA== + dependencies: + "@types/node" "*" + "@types/glob@*", "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -1841,6 +1876,23 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest-diff@*": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" + integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== + +"@types/jest@^24.0.13": + version "24.0.13" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.13.tgz#10f50b64cb05fb02411fbba49e9042a3a11da3f9" + integrity sha512-3m6RPnO35r7Dg+uMLj1+xfZaOgIHHHut61djNjzwExXN4/Pm9has9C6I1KMYSfz7mahDhWUOVg4HW/nZdv5Pww== + dependencies: + "@types/jest-diff" "*" + +"@types/lodash@^4.14.129": + version "4.14.129" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.129.tgz#9aaca391db126802482655c48dd79a814488202f" + integrity sha512-oYaV0eSlnOacOr7i4X1FFdH8ttSlb57gu3I9MuStIv2CYkISEY84dNHYsC3bF6sNH7qYcu1BtVrCtQ8Q4KPTfQ== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1851,6 +1903,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.0.tgz#d11813b9c0ff8aaca29f04cbc12817f4c7d656e5" integrity sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg== +"@types/node@^12.0.2": + version "12.0.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40" + integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" @@ -2062,7 +2119,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.4, accepts@~1.3.5: +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -2853,6 +2910,22 @@ body-parser@1.18.3: raw-body "2.3.3" type-is "~1.6.16" +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" @@ -3110,6 +3183,11 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + cacache@^11.0.1, cacache@^11.0.2, cacache@^11.3.2: version "11.3.2" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" @@ -3410,7 +3488,7 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.5: +chokidar@^2.0.2, chokidar@^2.0.4: version "2.1.5" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== @@ -3429,6 +3507,25 @@ chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.5: optionalDependencies: fsevents "^1.2.7" +chokidar@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chokidar@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.0.tgz#6b538f0fd6d5d31d5dd2b59e05426bec0f49aa40" @@ -3849,7 +3946,7 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-disposition@^0.5.2: +content-disposition@0.5.3, content-disposition@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== @@ -3966,6 +4063,11 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -4526,7 +4628,7 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -del@^4.0.0, del@^4.1.0: +del@^4.0.0, del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== @@ -5508,6 +5610,42 @@ express@^4.15.3, express@^4.16.3, express@^4.16.4: utils-merge "1.0.1" vary "~1.1.2" +express@^4.17.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.0.tgz#288af62228a73f4c8ea2990ba3b791bb87cd4438" + integrity sha512-1Z7/t3Z5ZnBG252gKUPyItc4xdeaA0X934ca2ewckAsVsw9EG71i++ZHZPYnus8g/s5Bty8IMpSVEuRkmwwPRQ== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + ext-list@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" @@ -5800,6 +5938,19 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -6798,6 +6949,17 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@1.7.2, http-errors@~1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-parser-js@>=0.4.0: version "0.5.0" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" @@ -7144,7 +7306,7 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" -internal-ip@^4.2.0: +internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== @@ -9112,10 +9274,15 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^2.3.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" - integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.3.tgz#229687331e86f68924e6cb59e1cdd937f18275fe" + integrity sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw== mimic-fn@^1.0.0: version "1.2.0" @@ -9273,7 +9440,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.0.0, ms@^2.1.1: +ms@2.1.1, ms@^2.0.0, ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== @@ -10241,7 +10408,7 @@ parse5@^5.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== -parseurl@~1.3.2: +parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -10908,7 +11075,7 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" -proxy-addr@~2.0.4: +proxy-addr@~2.0.4, proxy-addr@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== @@ -10998,7 +11165,7 @@ qs@6.5.2, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -qs@^6.4.0: +qs@6.7.0, qs@^6.4.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== @@ -11084,7 +11251,12 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.0.3, range-parser@~1.2.0: +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= @@ -11099,6 +11271,16 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" @@ -12120,6 +12302,25 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + sentence-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" @@ -12156,6 +12357,16 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -12198,6 +12409,11 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -12622,7 +12838,7 @@ static-site-generator-webpack-plugin@^3.4.2: url "^0.11.0" webpack-sources "^0.2.0" -"statuses@>= 1.4.0 < 2": +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -13251,6 +13467,11 @@ to-vfile@^5.0.2: is-buffer "^2.0.0" vfile "^3.0.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + toml@^2.3.2: version "2.3.6" resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b" @@ -13375,7 +13596,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.16: +type-is@~1.6.16, 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" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -13388,6 +13609,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^3.4.5: + version "3.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" + integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== + ua-parser-js@^0.7.18: version "0.7.19" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" @@ -13876,33 +14102,33 @@ webpack-bundle-analyzer@^3.1.0: opener "^1.5.1" ws "^6.0.0" -webpack-dev-middleware@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz#f37a27ad7c09cd7dc67cd97655413abaa1f55942" - integrity sha512-A47I5SX60IkHrMmZUlB0ZKSWi29TZTcPz7cha1Z75yYOsgWh/1AcPmQEbC8ZIbU3A1ytSv1PMU0PyPz2Lmz2jg== +webpack-dev-middleware@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" + integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA== dependencies: memory-fs "^0.4.1" - mime "^2.3.1" - range-parser "^1.0.3" + mime "^2.4.2" + range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.3.1.tgz#7046e49ded5c1255a82c5d942bcdda552b72a62d" - integrity sha512-jY09LikOyGZrxVTXK0mgIq9y2IhCoJ05848dKZqX1gAGLU1YDqgpOT71+W53JH/wI4v6ky4hm+KvSyW14JEs5A== +webpack-dev-server@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.4.1.tgz#a5fd8dec95dec410098e7d9a037ff9405395d51a" + integrity sha512-CRqZQX2ryMtrg0r3TXQPpNh76eM1HD3Wmu6zDBxIKi/d2y+4aa28Ia8weNT0bfgWpY6Vs3Oq/K8+DjfbR+tWYw== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" - chokidar "^2.1.5" + chokidar "^2.1.6" compression "^1.7.4" connect-history-api-fallback "^1.6.0" debug "^4.1.1" - del "^4.1.0" - express "^4.16.4" + del "^4.1.1" + express "^4.17.0" html-entities "^1.2.1" http-proxy-middleware "^0.19.1" import-local "^2.0.0" - internal-ip "^4.2.0" + internal-ip "^4.3.0" ip "^1.1.5" killable "^1.0.1" loglevel "^1.6.1" @@ -13918,7 +14144,7 @@ webpack-dev-server@^3.2.1: strip-ansi "^3.0.1" supports-color "^6.1.0" url "^0.11.0" - webpack-dev-middleware "^3.6.2" + webpack-dev-middleware "^3.7.0" webpack-log "^2.0.0" yargs "12.0.5"