diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 2436f9983..950e5ae43 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -23,6 +23,8 @@ "@types/browser-sync": "^0.0.42", "@types/node": "^10.11.3", "@types/webpack": "^4.4.13", + "@types/webpack-dev-middleware": "^2.0.2", + "@types/webpack-hot-middleware": "^2.16.4", "autoprefixer": "^9.1.5", "babel-loader": "^8.0.2", "browser-sync": "^2.24.7", @@ -34,9 +36,11 @@ "optimize-css-assets-webpack-plugin": "^5.0.1", "postcss-loader": "^3.0.0", "sass-loader": "^7.1.0", + "slugify": "^1.3.1", "style-loader": "^0.23.0", "uglifyjs-webpack-plugin": "^2.0.1", "webpack": "^4.20.2", + "webpack-dashboard": "^2.0.0", "webpack-dev-middleware": "^3.4.0", "webpack-hot-middleware": "^2.24.0", "webpack-merge": "^4.1.4" @@ -58,5 +62,8 @@ }, "publishConfig": { "access": "public" + }, + "devDependencies": { + "dts-gen": "^0.5.7" } } diff --git a/packages/scripts/src/@types/webpack-dashboard/index.d.ts b/packages/scripts/src/@types/webpack-dashboard/index.d.ts new file mode 100644 index 000000000..41d67784e --- /dev/null +++ b/packages/scripts/src/@types/webpack-dashboard/index.d.ts @@ -0,0 +1,44 @@ +/** Declaration file generated by dts-gen */ + +export = webpack_dashboard; + +declare namespace webpack_dashboard { + namespace prototype { + function clear(...args: any[]): void; + + function layoutAssets(...args: any[]): void; + + function layoutLog(...args: any[]): void; + + function layoutModules(...args: any[]): void; + + function layoutProblems(...args: any[]): void; + + function layoutStatus(...args: any[]): void; + + function mapNavigationKeysToScrollLog(...args: any[]): void; + + function setData(...args: any[]): void; + + function setLog(...args: any[]): void; + + function setOperations(...args: any[]): void; + + function setProblems(...args: any[]): void; + + function setProblemsError(...args: any[]): void; + + function setProgress(...args: any[]): void; + + function setSizes(...args: any[]): void; + + function setSizesError(...args: any[]): void; + + function setStats(...args: any[]): void; + + function setStatus(...args: any[]): void; + + } + +} + diff --git a/packages/scripts/src/@types/webpack-dashboard/plugin.d.ts b/packages/scripts/src/@types/webpack-dashboard/plugin.d.ts new file mode 100644 index 000000000..4eb68f50c --- /dev/null +++ b/packages/scripts/src/@types/webpack-dashboard/plugin.d.ts @@ -0,0 +1,5 @@ +declare module 'webpack-dashboard/plugin' { + import * as Tapable from 'tapable'; + export default class DashboardPlugin extends Tapable.Tapable{} +} + diff --git a/packages/scripts/src/config/CreateWebpackConfig.ts b/packages/scripts/src/config/CreateWebpackConfig.ts index 67d375a2a..40f01358d 100644 --- a/packages/scripts/src/config/CreateWebpackConfig.ts +++ b/packages/scripts/src/config/CreateWebpackConfig.ts @@ -87,6 +87,7 @@ export class CreateWebpackConfig { bannerConfig, alias, optimizeSplitChunks, + outputPath, } = this.projectConfig; const { host, port } = this.serverConfig; const helper: WebpackConfigHelper = new WebpackConfigHelper( @@ -101,6 +102,7 @@ export class CreateWebpackConfig { bannerConfig, alias, optimizeSplitChunks, + outputPath, }, this.isDev ); diff --git a/packages/scripts/src/config/WebpackConfigHelper.ts b/packages/scripts/src/config/WebpackConfigHelper.ts index 96e28db03..3b78d03c1 100644 --- a/packages/scripts/src/config/WebpackConfigHelper.ts +++ b/packages/scripts/src/config/WebpackConfigHelper.ts @@ -1,5 +1,7 @@ import cleanWebpackPlugin from 'clean-webpack-plugin'; import miniCssExtractPlugin from 'mini-css-extract-plugin'; +import path from 'path'; +import slugify from 'slugify'; import webpack from 'webpack'; import { BannerConfig, @@ -17,6 +19,7 @@ interface Config { slug: ProjectConfig['slug']; host: ServerConfig['host']; port: ServerConfig['port']; + outputPath: ProjectConfig['outputPath']; hasReact: ProjectConfig['hasReact']; hasSass: ProjectConfig['hasSass']; bannerConfig: BannerConfig; @@ -120,12 +123,18 @@ export class WebpackConfigHelper { public getOutput(): webpack.Output { // Now use the config to create a output // Destucture stuff we need from config - const { type, slug, host, port } = this.config; + const { type, slug, host, port, outputPath } = this.config; // and file - const { path, filename } = this.file; + const { name, filename } = this.file; + const outputInnerDir: string = slugify(name, { lower: true }); // Assuming it is production const output: webpack.Output = { - path, + // Here we create a directory inside the user provided outputPath + // The name of the directory is the sluggified verion of `name` + // of this configuration object. + // Also here we assume, user has passed in the correct `relative` + // path for `outputPath`. Otherwise this will break. + path: path.join(process.cwd(), outputPath, outputInnerDir), filename, // leave blank because we would handle with free variable // __webpack_public_path__ in runtime. @@ -139,7 +148,7 @@ export class WebpackConfigHelper { // Maybe we can have a `prefix` in Config, but let's not do that // right now. output.publicPath = `//${host || - 'localhost'}:${port}/wp-content/${contentDir}/${slug}/`; + 'localhost'}:${port}/wp-content/${contentDir}/${slug}/${outputPath}/${outputInnerDir}`; } return output; diff --git a/packages/scripts/src/config/project.config.default.ts b/packages/scripts/src/config/project.config.default.ts index 13dad4eff..45a76d6c0 100644 --- a/packages/scripts/src/config/project.config.default.ts +++ b/packages/scripts/src/config/project.config.default.ts @@ -1,3 +1,4 @@ +import path from 'path'; import webpack from 'webpack'; // Export common interfaces @@ -28,7 +29,6 @@ export interface EntryConfig { export interface FileConfig { name: string; entry: EntryConfig; - path: string; filename: string; webpackConfig?: webpack.Configuration; } @@ -41,12 +41,24 @@ export interface ProjectConfig { slug: string; bannerConfig: BannerConfig; files: FileConfig[]; + /** + * The relative path of the output directory, w.r.t the directory + * from where the script has been called. + * + * It has to be relative, otherwise we possibly can not make + * hot-reload work. + * + * The script should be called from the root of your project. Otherwise + * we can not know how to create the URL of assets. + */ + outputPath: string; hasReact: boolean; hasSass: boolean; externals?: webpack.Configuration['externals']; alias?: webpack.Resolve['alias']; errorOverlay?: boolean; optimizeSplitChunks: boolean; + watch?: string; } /** @@ -78,12 +90,12 @@ export const projectConfigDefault: ProjectConfig = { // main: ['src/mobile.js'], // }, // filename: '[name].js', - // path: path.resolve(process.cwd(), 'dist'), // // Extra webpack config to be passed directly // webpackConfig: undefined, // }, // If has more length, then multi-compiler ], + outputPath: 'dist', // Project specific config // Needs react? hasReact: true, @@ -102,4 +114,6 @@ export const projectConfigDefault: ProjectConfig = { // // Won't hurt because we use PHP to automate loading optimizeSplitChunks: true, + // Usually PHP and other files to watch and reload when changed + watch: 'inc/**/*.php', }; diff --git a/packages/scripts/src/scripts/Build.ts b/packages/scripts/src/scripts/Build.ts new file mode 100644 index 000000000..0fb94b5d3 --- /dev/null +++ b/packages/scripts/src/scripts/Build.ts @@ -0,0 +1,42 @@ +import webpack from 'webpack'; +import { CreateWebpackConfig } from '../config/CreateWebpackConfig'; +import { ProjectConfig } from '../config/project.config.default'; +import { ServerConfig } from '../config/server.config.default'; + +export class Build { + private projectConfig: ProjectConfig; + private serverConfig: ServerConfig; + + constructor(projectConfig: ProjectConfig, serverConfig: ServerConfig) { + this.projectConfig = projectConfig; + this.serverConfig = serverConfig; + } + + /** + * Build the files. + */ + public build(): Promise { + return new Promise((resolve, reject) => { + const config = new CreateWebpackConfig( + this.projectConfig, + this.serverConfig, + false + ); + const compiler = webpack( + config.getConfig() as webpack.Configuration + ); + compiler.run((err, stats) => { + if (err || stats.hasErrors()) { + reject(stats.toString({ colors: true })); + } + resolve( + stats.toString({ + colors: true, + assets: true, + chunks: true, + }) + ); + }); + }); + } +} diff --git a/packages/scripts/src/scripts/Server.ts b/packages/scripts/src/scripts/Server.ts new file mode 100644 index 000000000..3edbcd9c4 --- /dev/null +++ b/packages/scripts/src/scripts/Server.ts @@ -0,0 +1,173 @@ +import browserSync from 'browser-sync'; +import webpack from 'webpack'; +import DashboardPlugin from 'webpack-dashboard/plugin'; +import webpackDevMiddleware from 'webpack-dev-middleware'; +import webpackHotMiddleware from 'webpack-hot-middleware'; + +import { CreateWebpackConfig } from '../config/CreateWebpackConfig'; +import { ProjectConfig } from '../config/project.config.default'; +import { ServerConfig } from '../config/server.config.default'; + +export class Server { + private projectConfig: ProjectConfig; + private serverConfig: ServerConfig; + + private isServing: boolean = false; + + private bs?: browserSync.BrowserSyncInstance; + private devMiddlewares?: webpackDevMiddleware.WebpackDevMiddleware[]; + + /** + * Create an instance. + * + * @param projectConfig Project configuration as recovered from user directory. + * @param serverConfig Server configuration as recovered from user directory. + */ + constructor(projectConfig: ProjectConfig, serverConfig: ServerConfig) { + this.projectConfig = projectConfig; + this.serverConfig = serverConfig; + } + + /** + * Serve the webpack/browserSync hybrid server. + */ + public serve(): void { + // If server is already running, then throw + if (this.isServing) { + throw new Error( + 'Can not serve while the server is already running.' + ); + } + // Init browserSync + const bs = browserSync.init(); + // Create configuration + const webpackConfig = new CreateWebpackConfig( + this.projectConfig, + this.serverConfig, + true + ).getConfig(); + // Init middleware and stuff + const middlewares: browserSync.MiddlewareHandler[] = []; + const devMiddlewares: webpackDevMiddleware.WebpackDevMiddleware[] = []; + + // If we are doing multi-compiler mode, then spin up webpack compiler + // For each of the config. This is a hack that at-least makes hot reload + // work fast for now. Otherwise, webpack-dev-middlewares will compile everything, + // regardless of which entries are changed. + // see: https://github.com/webpack/webpack-dev-middleware/issues/338 + // Create webpack compiler + // Put them together + if (Array.isArray(webpackConfig)) { + webpackConfig.forEach((config: webpack.Configuration) => { + const compiler = webpack(config); + // We can not have dashboard plugin for webpack multi + // compiler right now. + // compiler.apply(new DashboardPlugin()); + const devMiddleware = webpackDevMiddleware(compiler, { + stats: { colors: true }, + publicPath: + config.output && config.output.publicPath + ? config.output.publicPath + : '', + }); + const hotMiddleware = webpackHotMiddleware(compiler); + // Push them + middlewares.push(devMiddleware); + devMiddlewares.push(devMiddleware); + middlewares.push(hotMiddleware); + }); + } else { + const compiler = webpack(webpackConfig); + compiler.apply(new DashboardPlugin()); + const devMiddleware = webpackDevMiddleware(compiler, { + stats: { colors: true }, + publicPath: + webpackConfig.output && webpackConfig.output.publicPath + ? webpackConfig.output.publicPath + : '', + }); + const hotMiddleware = webpackHotMiddleware(compiler); + // Push them + middlewares.push(devMiddleware); + devMiddlewares.push(devMiddleware); + middlewares.push(hotMiddleware); + } + + // Init browsersync + bs.init({ + // We need to silent browserSync, otherwise might conflict with + // webpack-dashboard + logLevel: 'silent', + port: this.serverConfig.port, + ui: this.serverConfig.ui, + proxy: { + target: this.serverConfig.proxy, + }, + // Middleware for webpack hot reload + middleware: middlewares, + host: this.serverConfig.host, + open: this.serverConfig.open, + notify: this.serverConfig.notify, + }); + + // Watch for user defined files, when it changes, reload + // When that change, reload + if (this.projectConfig.watch) { + bs.watch(this.projectConfig.watch).on('change', bs.reload); + } + // Watch for our own manifest file + bs.watch(`${this.projectConfig.outputPath}/manifest.json`).on( + 'change', + bs.reload + ); + + // Mark server is running + this.isServing = true; + + // Store the instances + this.bs = bs; + this.devMiddlewares = devMiddlewares; + } + + /** + * Stop the server and clean up all processes. + */ + public stop(): void { + // throw if server is not running + if (!this.isServing) { + throw new Error( + 'Can not stop if the server is not running already. Call server.serve() first.' + ); + } + // First stop browserSync + if (this.bs) { + this.bs.exit(); + } + // Now stop all webpack compiler + if (this.devMiddlewares) { + this.devMiddlewares.forEach(devMiddleware => { + devMiddleware.close(); + }); + } + // All good + } + + /** + * Recompile everything through webpack. + */ + public refresh(): void { + // throw if server is not running + if (!this.isServing) { + throw new Error( + 'Can not refresh if the server is not running already. Call server.serve() first.' + ); + } + // Refresh all devMiddlewares + if (this.devMiddlewares) { + this.devMiddlewares.forEach(devMiddleware => { + devMiddleware.invalidate(); + }); + } + // We probably? don't need anything with browserSync? + } +} diff --git a/packages/scripts/src/scripts/serve.ts b/packages/scripts/src/scripts/serve.ts deleted file mode 100644 index 499f5ae43..000000000 --- a/packages/scripts/src/scripts/serve.ts +++ /dev/null @@ -1 +0,0 @@ -import webpack from 'webpack'; diff --git a/packages/scripts/tsconfig.json b/packages/scripts/tsconfig.json index 9811f5c0d..7ef8a2e5e 100644 --- a/packages/scripts/tsconfig.json +++ b/packages/scripts/tsconfig.json @@ -42,7 +42,10 @@ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ + // "typeRoots": [ + // "./node_modules/@types", + // "./src/@types" + // ], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ diff --git a/packages/scripts/tslint.json b/packages/scripts/tslint.json index 16046a8d3..08e965738 100644 --- a/packages/scripts/tslint.json +++ b/packages/scripts/tslint.json @@ -11,10 +11,7 @@ "missing-jsdoc": false, "export-name": false, "no-relative-imports": false, - "no-console": { - "severity": "warning", - "options": ["debug", "info", "log", "time", "timeEnd", "trace"] - }, + "no-console": false, "strict-boolean-expressions": false, "interface-name": [true, "never-prefix"], "prettier": { @@ -22,7 +19,10 @@ }, "prefer-type-cast": false, "no-angle-bracket-type-assertion": true, - "no-reserved-keywords": false + "no-reserved-keywords": false, + "typedef": [true, "call-signature", "parameter", "property-declaration", "member-variable-declaration"], + "import-name": false, + "no-submodule-imports": false }, "linterOptions": { "exclude": ["lib/**/*", "**/node_modules/**"] diff --git a/yarn.lock b/yarn.lock index 29a3fcf07..95ed6882d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1146,6 +1146,16 @@ npmlog "^4.1.2" write-file-atomic "^2.3.0" +"@most/multicast@^1.2.5": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@most/multicast/-/multicast-1.3.0.tgz#e01574840df634478ac3fabd164c6e830fb3b966" + dependencies: + "@most/prelude" "^1.4.0" + +"@most/prelude@^1.4.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@most/prelude/-/prelude-1.7.2.tgz#be4ed406518d4c8c220e45c39fa7251365425b73" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1173,6 +1183,12 @@ "@types/events" "*" "@types/node" "*" +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + dependencies: + "@types/node" "*" + "@types/events@*": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" @@ -1189,6 +1205,16 @@ version "23.3.2" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.2.tgz#07b90f6adf75d42c34230c026a2529e56c249dbb" +"@types/loglevel@*": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/loglevel/-/loglevel-1.5.3.tgz#adfce55383edc5998a2170ad581b3e23d6adb5b8" + +"@types/memory-fs@*": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@types/memory-fs/-/memory-fs-0.3.2.tgz#5d4753f9b390cb077c8c8af97bc96463399ceccd" + dependencies: + "@types/node" "*" + "@types/micromatch@^2": version "2.3.30" resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-2.3.30.tgz#c2a143675f200fbcebe57fb0dab0cbf58093d4b0" @@ -1228,7 +1254,23 @@ dependencies: source-map "^0.6.1" -"@types/webpack@^4.4.13": +"@types/webpack-dev-middleware@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/webpack-dev-middleware/-/webpack-dev-middleware-2.0.2.tgz#33934f15de582f1a6c21ea21c42f69282e328c76" + dependencies: + "@types/connect" "*" + "@types/loglevel" "*" + "@types/memory-fs" "*" + "@types/webpack" "*" + +"@types/webpack-hot-middleware@^2.16.4": + version "2.16.4" + resolved "https://registry.yarnpkg.com/@types/webpack-hot-middleware/-/webpack-hot-middleware-2.16.4.tgz#258ecf2ae0ee80a988cc65547b24608fe10be440" + dependencies: + "@types/connect" "*" + "@types/webpack" "*" + +"@types/webpack@*", "@types/webpack@^4.4.13": version "4.4.13" resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.13.tgz#828d3a8f7743a12692aa0f65d083f30d25bf34eb" dependencies: @@ -1979,6 +2021,10 @@ binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" +blessed@^0.1.81: + version "0.1.81" + resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129" + blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" @@ -2358,7 +2404,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.0, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: @@ -2589,7 +2635,7 @@ combined-stream@~1.0.5, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.11.0, commander@^2.12.1, commander@^2.2.0, commander@^2.8.1: +commander@^2.11.0, commander@^2.12.1, commander@^2.15.1, commander@^2.2.0, commander@^2.8.1: version "2.18.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" @@ -3342,6 +3388,19 @@ dot-prop@^4.1.1, dot-prop@^4.2.0: dependencies: is-obj "^1.0.0" +dts-dom@latest: + version "3.1.0" + resolved "https://registry.yarnpkg.com/dts-dom/-/dts-dom-3.1.0.tgz#7f53cf58305180bfd9475d294ea028136162626c" + +dts-gen@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/dts-gen/-/dts-gen-0.5.7.tgz#122063dd662b5db4c9e799af7433ef59f9e5e133" + dependencies: + dts-dom latest + parse-git-config "^1.1.1" + typescript "^2.2.0" + yargs "^4.8.1" + duplexer@^0.1.1: version "0.1.1" resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -3969,6 +4028,10 @@ fileset@^2.0.2: glob "^7.0.3" minimatch "^3.0.3" +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" @@ -4116,6 +4179,10 @@ form-data@~2.3.1, form-data@~2.3.2: combined-stream "1.0.6" mime-types "^2.1.12" +fp-ts@^1.0.0, fp-ts@^1.0.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.9.0.tgz#52acf85692025b34285ff4014f39af72d1107e0b" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -4133,6 +4200,10 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + fs-extra@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" @@ -4265,6 +4336,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-config-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-1.0.1.tgz#6d33f7ed63db0d0e118131503bab3aca47d54664" + dependencies: + extend-shallow "^2.0.1" + fs-exists-sync "^0.1.0" + homedir-polyfill "^1.0.0" + git-raw-commits@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff" @@ -4405,7 +4484,7 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.5: +handlebars@^4.0.11, handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.5: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" dependencies: @@ -4538,7 +4617,7 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" dependencies: @@ -4765,6 +4844,16 @@ inquirer@^6.0.0, inquirer@^6.1.0, inquirer@^6.2.0: strip-ansi "^4.0.0" through "^2.3.6" +inspectpack@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/inspectpack/-/inspectpack-3.0.2.tgz#a2b17a1c09c236cc8d453388b814972d2ae8e349" + dependencies: + chalk "^2.4.0" + io-ts "^1.0.5" + io-ts-reporters "^0.0.20" + pify "^3.0.0" + yargs "^11.0.0" + interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -4783,6 +4872,19 @@ invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" +io-ts-reporters@^0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/io-ts-reporters/-/io-ts-reporters-0.0.20.tgz#2b8cbb6a2bc4562dae6917a3a413fa2c9851a644" + dependencies: + fp-ts "^1.0.1" + io-ts "^1.0.2" + +io-ts@^1.0.2, io-ts@^1.0.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.3.0.tgz#72a5e7dbbb650b9c26030bac0c22d9b18c321f54" + dependencies: + fp-ts "^1.0.0" + ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -5786,7 +5888,7 @@ lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" -lodash.assign@^4.2.0: +lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -6187,6 +6289,14 @@ modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" +most@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/most/-/most-1.7.3.tgz#406c31a66d73aa16957816fdf96965e27df84f1a" + dependencies: + "@most/multicast" "^1.2.5" + "@most/prelude" "^1.4.0" + symbol-observable "^1.0.2" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6857,6 +6967,15 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" +parse-git-config@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" + dependencies: + extend-shallow "^2.0.1" + fs-exists-sync "^0.1.0" + git-config-path "^1.0.1" + ini "^1.3.4" + parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" @@ -8222,6 +8341,10 @@ slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +slugify@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.3.1.tgz#f572127e8535329fbc6c1edb74ab856b61ad7de2" + smart-buffer@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" @@ -8281,7 +8404,7 @@ socket.io-client@2.0.4: socket.io-parser "~3.1.1" to-array "0.1.4" -socket.io-client@2.1.1: +socket.io-client@2.1.1, socket.io-client@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" dependencies: @@ -8317,7 +8440,7 @@ socket.io-parser@~3.2.0: debug "~3.1.0" isarray "2.0.1" -socket.io@2.1.1: +socket.io@2.1.1, socket.io@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" dependencies: @@ -8670,6 +8793,10 @@ swap-case@^1.1.0: lower-case "^1.1.1" upper-case "^1.1.1" +symbol-observable@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -8944,6 +9071,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +typescript@^2.2.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + typescript@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.1.tgz#3362ba9dd1e482ebb2355b02dfe8bcd19a2c7c96" @@ -9219,6 +9350,20 @@ webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" +webpack-dashboard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-dashboard/-/webpack-dashboard-2.0.0.tgz#70db22e7bb5b12b4a7fde82de87ce01eed8d921c" + dependencies: + blessed "^0.1.81" + commander "^2.15.1" + cross-spawn "^6.0.5" + filesize "^3.6.1" + handlebars "^4.0.11" + inspectpack "^3.0.1" + most "^1.7.3" + socket.io "^2.1.1" + socket.io-client "^2.1.1" + webpack-dev-middleware@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" @@ -9445,6 +9590,13 @@ yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + yargs-parser@^4.1.0, yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -9534,6 +9686,25 @@ yargs@^12.0.1: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" +yargs@^4.8.1: + version "4.8.1" + resolved "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"