commit 4ec47c764dcfcc914b820bb017bfc0d6518aa95f Author: Anoop Date: Wed Mar 15 11:09:21 2023 +0530 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1435ffb --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules +build +yarn-error.log +test/dist +package-lock.json +test/dist \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/deployment.xml b/.idea/deployment.xml new file mode 100644 index 0000000..89064f6 --- /dev/null +++ b/.idea/deployment.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/esbuild-plugin-postcss2.iml b/.idea/esbuild-plugin-postcss2.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/esbuild-plugin-postcss2.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9c116f2 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..1f97fa9 --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +dist/test \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..bda2512 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +node_modules +.github +dist \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..36b3563 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +{ + "trailingComma": "none" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9bf6deb --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Marton Lederer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bc1649 --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +# esbuild-plugin-postcss2 + +This plugin is an optimized, type-friendly version of [esbuild-plugin-postcss](https://github.com/deanc/esbuild-plugin-postcss). It supports CSS preprocessors and CSS modules. + +## Install + +```sh +yarn add -D esbuild-plugin-postcss2 +``` + +or + +```sh +npm i -D esbuild-plugin-postcss2 +``` + +## Usage + +Add the plugin to your esbuild plugins: + +```js +const esbuild = require("esbuild"); +const postCssPlugin = require("esbuild-plugin-postcss2"); + +esbuild.build({ + ... + plugins: [ + postCssPlugin.default() + ] + ... +}); +``` + +### PostCSS plugins + +Add your desired PostCSS plugin to the plugins array: + +```js +const autoprefixer = require("autoprefixer"); + +esbuild.build({ + ... + plugins: [ + postCssPlugin.default({ + plugins: [autoprefixer] + }) + ] + ... +}); +``` + +### CSS modules + +PostCSS modules are enabled by default. You can pass in a config or disable it with the `modules` field: + +```js +postCssPlugin.default({ + // pass in `postcss-modules` custom options + // set to false to disable + modules: { + getJSON(cssFileName, json, outputFileName) { + const path = require("path"); + const cssName = path.basename(cssFileName, ".css"); + const jsonFileName = path.resolve("./build/" + cssName + ".json"); + + fs.writeFileSync(jsonFileName, JSON.stringify(json)); + } + } +}); +``` + +As per standard any file having `module` before the extension (ie `somefile.module.css`) will be treated as a module. +The option `fileIsModule` allows to override this behavior. + +```js +postCssPlugin.default({ + // pass a custom `fileIsModule` option to tell whether a file should be treated as a module + // in this example we want everything to be a module except file finishing with `global.css` + fileIsModule: (filepath) => !filepath.endsWith(".global.css") +}); +``` + +### Preprocessors + +To use preprocessors (`sass`, `scss`, `stylus`, `less`), just add the desired preprocessor as a `devDependency`: + +```sh +yarn add -D sass +``` diff --git a/build.js b/build.js new file mode 100644 index 0000000..d8f41d6 --- /dev/null +++ b/build.js @@ -0,0 +1,16 @@ +const { build } = require("esbuild"), + { copyFile } = require("fs"); + +const production = process.env.NODE_ENV === "production", + formats = ["cjs", "esm"]; + +(async () => { + for (const format of formats) { + await build({ + entryPoints: ["./src/index.ts"], + watch: !production, + format, + outfile: `./dist/index${format === "cjs" ? "" : "." + format}.js` + }); + } +})(); diff --git a/dist/index.esm.js b/dist/index.esm.js new file mode 100644 index 0000000..082973f --- /dev/null +++ b/dist/index.esm.js @@ -0,0 +1,180 @@ +import { + ensureDir, + readFile, + readdirSync, + statSync, + writeFile +} from "fs-extra"; +import {TextDecoder} from "util"; +import path from "path"; +import tmp from "tmp"; +import postcss from "postcss"; +import postcssModules from "postcss-modules"; +import less from "less"; +import stylus from "stylus"; +import resolveFile from "resolve-file"; +const defaultOptions = { + plugins: [], + modules: true, + rootDir: process.cwd(), + sassOptions: {}, + lessOptions: {}, + stylusOptions: {}, + fileIsModule: null +}; +const postCSSPlugin = ({ + plugins = [], + modules = true, + rootDir = process.cwd(), + sassOptions = {}, + lessOptions = {}, + stylusOptions = {}, + fileIsModule +} = defaultOptions) => ({ + name: "postcss2", + setup(build) { + const tmpDirPath = tmp.dirSync().name, modulesMap = []; + const modulesPlugin = postcssModules({ + generateScopedName: "[name]__[local]___[hash:base64:5]", + ...typeof modules !== "boolean" ? modules : {}, + getJSON(filepath, json, outpath) { + const mapIndex = modulesMap.findIndex((m) => m.path === filepath); + if (mapIndex !== -1) { + modulesMap[mapIndex].map = json; + } else { + modulesMap.push({ + path: filepath, + map: json + }); + } + if (typeof modules !== "boolean" && typeof modules.getJSON === "function") + return modules.getJSON(filepath, json, outpath); + } + }); + build.onResolve({filter: /.\.(css|sass|scss|less|styl)$/}, async (args) => { + if (args.namespace !== "file" && args.namespace !== "") + return; + let sourceFullPath = resolveFile(args.path); + if (!sourceFullPath) + sourceFullPath = path.resolve(args.resolveDir, args.path); + const sourceExt = path.extname(sourceFullPath); + const sourceBaseName = path.basename(sourceFullPath, sourceExt); + const isModule = fileIsModule ? fileIsModule(sourceFullPath) : sourceBaseName.match(/\.module$/); + const sourceDir = path.dirname(sourceFullPath); + const watchFiles = [sourceFullPath]; + let tmpFilePath; + if (args.kind === "entry-point") { + const sourceRelDir = path.relative(path.dirname(rootDir), path.dirname(sourceFullPath)); + tmpFilePath = path.resolve(tmpDirPath, sourceRelDir, `${sourceBaseName}.css`); + await ensureDir(path.dirname(tmpFilePath)); + } else { + const uniqueTmpDir = path.resolve(tmpDirPath, uniqueId()); + tmpFilePath = path.resolve(uniqueTmpDir, `${sourceBaseName}.css`); + } + await ensureDir(path.dirname(tmpFilePath)); + const fileContent = await readFile(sourceFullPath); + let css = sourceExt === ".css" ? fileContent : ""; + if (sourceExt === ".sass" || sourceExt === ".scss") { + const sassResult = await renderSass({ + ...sassOptions, + file: sourceFullPath + }); + css = sassResult.css.toString(); + watchFiles.push(...sassResult.stats.includedFiles); + } + if (sourceExt === ".styl") + css = await renderStylus(new TextDecoder().decode(fileContent), { + ...stylusOptions, + filename: sourceFullPath + }); + if (sourceExt === ".less") + css = (await less.render(new TextDecoder().decode(fileContent), { + ...lessOptions, + filename: sourceFullPath, + rootpath: path.dirname(args.path) + })).css; + const result = await postcss(isModule ? [modulesPlugin, ...plugins] : plugins).process(css, { + from: sourceFullPath, + to: tmpFilePath + }); + watchFiles.push(...getPostCssDependencies(result.messages)); + await writeFile(tmpFilePath, result.css); + return { + namespace: isModule ? "postcss-module" : "file", + path: tmpFilePath, + watchFiles, + pluginData: { + originalPath: sourceFullPath + } + }; + }); + build.onLoad({filter: /.*/, namespace: "postcss-module"}, async (args) => { + const mod = modulesMap.find(({path: path2}) => path2 === args?.pluginData?.originalPath), resolveDir = path.dirname(args.path); + return { + resolveDir, + contents: `import ${JSON.stringify(args.path)}; +export default ${JSON.stringify(mod && mod.map ? mod.map : {})};` + }; + }); + } +}); +function renderSass(options) { + return new Promise((resolve, reject) => { + getSassImpl().render(options, (e, res) => { + if (e) + reject(e); + else + resolve(res); + }); + }); +} +function renderStylus(str, options) { + return new Promise((resolve, reject) => { + stylus.render(str, options, (e, res) => { + if (e) + reject(e); + else + resolve(res); + }); + }); +} +function getSassImpl() { + let impl = "sass"; + try { + require.resolve("sass"); + } catch { + try { + require.resolve("node-sass"); + impl = "node-sass"; + } catch { + throw new Error('Please install "sass" or "node-sass" package'); + } + } + return require(impl); +} +function getFilesRecursive(directory) { + return readdirSync(directory).reduce((files, file) => { + const name = path.join(directory, file); + return statSync(name).isDirectory() ? [...files, ...getFilesRecursive(name)] : [...files, name]; + }, []); +} +let idCounter = 0; +function uniqueId() { + return Date.now().toString(16) + (idCounter++).toString(16); +} +function getPostCssDependencies(messages) { + let dependencies = []; + for (const message of messages) { + if (message.type == "dir-dependency") { + dependencies.push(...getFilesRecursive(message.dir)); + } else if (message.type == "dependency") { + dependencies.push(message.file); + } + } + return dependencies; +} +var src_default = postCSSPlugin; +export { + src_default as default, + defaultOptions +}; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..35a020a --- /dev/null +++ b/dist/index.js @@ -0,0 +1,197 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, {get: all[name], enumerable: true}); +}; +var __exportStar = (target, module2, desc) => { + if (module2 && typeof module2 === "object" || typeof module2 === "function") { + for (let key of __getOwnPropNames(module2)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable}); + } + return target; +}; +var __toModule = (module2) => { + return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2); +}; +__markAsModule(exports); +__export(exports, { + default: () => src_default, + defaultOptions: () => defaultOptions +}); +var import_fs_extra = __toModule(require("fs-extra")); +var import_util = __toModule(require("util")); +var import_path = __toModule(require("path")); +var import_tmp = __toModule(require("tmp")); +var import_postcss2 = __toModule(require("postcss")); +var import_postcss_modules = __toModule(require("postcss-modules")); +var import_less = __toModule(require("less")); +var import_stylus = __toModule(require("stylus")); +var import_resolve_file = __toModule(require("resolve-file")); +const defaultOptions = { + plugins: [], + modules: true, + rootDir: process.cwd(), + sassOptions: {}, + lessOptions: {}, + stylusOptions: {}, + fileIsModule: null +}; +const postCSSPlugin = ({ + plugins = [], + modules = true, + rootDir = process.cwd(), + sassOptions = {}, + lessOptions = {}, + stylusOptions = {}, + fileIsModule +} = defaultOptions) => ({ + name: "postcss2", + setup(build) { + const tmpDirPath = import_tmp.default.dirSync().name, modulesMap = []; + const modulesPlugin = (0, import_postcss_modules.default)({ + generateScopedName: "[name]__[local]___[hash:base64:5]", + ...typeof modules !== "boolean" ? modules : {}, + getJSON(filepath, json, outpath) { + const mapIndex = modulesMap.findIndex((m) => m.path === filepath); + if (mapIndex !== -1) { + modulesMap[mapIndex].map = json; + } else { + modulesMap.push({ + path: filepath, + map: json + }); + } + if (typeof modules !== "boolean" && typeof modules.getJSON === "function") + return modules.getJSON(filepath, json, outpath); + } + }); + build.onResolve({filter: /.\.(css|sass|scss|less|styl)$/}, async (args) => { + if (args.namespace !== "file" && args.namespace !== "") + return; + let sourceFullPath = (0, import_resolve_file.default)(args.path); + if (!sourceFullPath) + sourceFullPath = import_path.default.resolve(args.resolveDir, args.path); + const sourceExt = import_path.default.extname(sourceFullPath); + const sourceBaseName = import_path.default.basename(sourceFullPath, sourceExt); + const isModule = fileIsModule ? fileIsModule(sourceFullPath) : sourceBaseName.match(/\.module$/); + const sourceDir = import_path.default.dirname(sourceFullPath); + const watchFiles = [sourceFullPath]; + let tmpFilePath; + if (args.kind === "entry-point") { + const sourceRelDir = import_path.default.relative(import_path.default.dirname(rootDir), import_path.default.dirname(sourceFullPath)); + tmpFilePath = import_path.default.resolve(tmpDirPath, sourceRelDir, `${sourceBaseName}.css`); + await (0, import_fs_extra.ensureDir)(import_path.default.dirname(tmpFilePath)); + } else { + const uniqueTmpDir = import_path.default.resolve(tmpDirPath, uniqueId()); + tmpFilePath = import_path.default.resolve(uniqueTmpDir, `${sourceBaseName}.css`); + } + await (0, import_fs_extra.ensureDir)(import_path.default.dirname(tmpFilePath)); + const fileContent = await (0, import_fs_extra.readFile)(sourceFullPath); + let css = sourceExt === ".css" ? fileContent : ""; + if (sourceExt === ".sass" || sourceExt === ".scss") { + const sassResult = await renderSass({ + ...sassOptions, + file: sourceFullPath + }); + css = sassResult.css.toString(); + watchFiles.push(...sassResult.stats.includedFiles); + } + if (sourceExt === ".styl") + css = await renderStylus(new import_util.TextDecoder().decode(fileContent), { + ...stylusOptions, + filename: sourceFullPath + }); + if (sourceExt === ".less") + css = (await import_less.default.render(new import_util.TextDecoder().decode(fileContent), { + ...lessOptions, + filename: sourceFullPath, + rootpath: import_path.default.dirname(args.path) + })).css; + const result = await (0, import_postcss2.default)(isModule ? [modulesPlugin, ...plugins] : plugins).process(css, { + from: sourceFullPath, + to: tmpFilePath + }); + watchFiles.push(...getPostCssDependencies(result.messages)); + await (0, import_fs_extra.writeFile)(tmpFilePath, result.css); + return { + namespace: isModule ? "postcss-module" : "file", + path: tmpFilePath, + watchFiles, + pluginData: { + originalPath: sourceFullPath + } + }; + }); + build.onLoad({filter: /.*/, namespace: "postcss-module"}, async (args) => { + const mod = modulesMap.find(({path: path2}) => path2 === args?.pluginData?.originalPath), resolveDir = import_path.default.dirname(args.path); + return { + resolveDir, + contents: `import ${JSON.stringify(args.path)}; +export default ${JSON.stringify(mod && mod.map ? mod.map : {})};` + }; + }); + } +}); +function renderSass(options) { + return new Promise((resolve, reject) => { + getSassImpl().render(options, (e, res) => { + if (e) + reject(e); + else + resolve(res); + }); + }); +} +function renderStylus(str, options) { + return new Promise((resolve, reject) => { + import_stylus.default.render(str, options, (e, res) => { + if (e) + reject(e); + else + resolve(res); + }); + }); +} +function getSassImpl() { + let impl = "sass"; + try { + require.resolve("sass"); + } catch { + try { + require.resolve("node-sass"); + impl = "node-sass"; + } catch { + throw new Error('Please install "sass" or "node-sass" package'); + } + } + return require(impl); +} +function getFilesRecursive(directory) { + return (0, import_fs_extra.readdirSync)(directory).reduce((files, file) => { + const name = import_path.default.join(directory, file); + return (0, import_fs_extra.statSync)(name).isDirectory() ? [...files, ...getFilesRecursive(name)] : [...files, name]; + }, []); +} +let idCounter = 0; +function uniqueId() { + return Date.now().toString(16) + (idCounter++).toString(16); +} +function getPostCssDependencies(messages) { + let dependencies = []; + for (const message of messages) { + if (message.type == "dir-dependency") { + dependencies.push(...getFilesRecursive(message.dir)); + } else if (message.type == "dependency") { + dependencies.push(message.file); + } + } + return dependencies; +} +var src_default = postCSSPlugin; diff --git a/package.json b/package.json new file mode 100644 index 0000000..d2ff977 --- /dev/null +++ b/package.json @@ -0,0 +1,71 @@ +{ + "name": "@xhiveframework/esbuild-plugin-postcss2", + "version": "0.1.3", + "description": "Use postcss with esbuild", + "repository": { + "type": "git", + "url": "git+https://github.com/xhiveframework/esbuild-plugin-postcss2.git" + }, + "author": "Marton Lederer ", + "license": "MIT", + "private": false, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "cross-env NODE_ENV=production node build.js", + "dev": "cross-env NODE_ENV=development node build.js", + "test": "yarn build && cd test && mocha 'index.js' --no-timeout --exit", + "fmt": "prettier --write .", + "fmt:check": "prettier --check ." + }, + "gitHooks": { + "pre-commit": "prettier --write . && git add -A" + }, + "files": [ + "dist", + "src/modules.d.ts" + ], + "main": "dist/index.js", + "module": "dist/index.esm.js", + "types": "src/modules.d.ts", + "dependencies": { + "autoprefixer": "^10.2.5", + "fs-extra": "^9.1.0", + "less": "^4.x", + "postcss-modules": "^4.0.0", + "resolve-file": "^0.3.0", + "sass": "^1.x", + "stylus": "^0.x", + "tmp": "^0.2.1" + }, + "devDependencies": { + "@types/chai": "^4.2.15", + "@types/fs-extra": "^9.0.9", + "@types/less": "^3.0.2", + "@types/mocha": "^8.2.2", + "@types/node": "^14.14.37", + "@types/sass": "^1.16.0", + "@types/stylus": "^0.48.33", + "@types/tmp": "^0.2.0", + "chai": "^4.3.4", + "cross-env": "^7.0.3", + "esbuild": "^0.11.2", + "mocha": "^8.3.2", + "normalize.css": "^8.0.1", + "postcss-import": "^14.0.2", + "prettier": "^2.2.1", + "typescript": "^4.2.3", + "yorkie": "^2.0.0" + }, + "peerDependencies": { + "less": "^4.x", + "postcss": "8.x", + "sass": "^1.x", + "stylus": "^0.x" + }, + "bugs": { + "url": "https://github.com/xhiveframework/esbuild-plugin-postcss2/issues" + }, + "homepage": "https://github.com/xhiveframework/esbuild-plugin-postcss2#readme" +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..10beb96 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,275 @@ +import { Plugin } from "esbuild"; +import { Plugin as PostCSSPlugin, Message } from "postcss"; +import { + ensureDir, + readFile, + readdirSync, + statSync, + writeFile +} from "fs-extra"; +import { TextDecoder } from "util"; +import { + SassException, + Result as SassResult, + Options as SassOptions +} from "sass"; +import path from "path"; +import tmp from "tmp"; +import postcss from "postcss"; +import postcssModules from "postcss-modules"; +import less from "less"; +import stylus from "stylus"; +import resolveFile from "resolve-file"; + +type StylusRenderOptions = Parameters[1]; // The Stylus.RenderOptions interface doesn't seem to be exported... So next best + +interface PostCSSPluginOptions { + plugins: PostCSSPlugin[]; + modules: boolean | any; + rootDir?: string; + sassOptions?: SassOptions; + lessOptions?: Less.Options; + stylusOptions?: StylusRenderOptions; + fileIsModule?: (filename: string) => boolean; +} + +interface CSSModule { + path: string; + map: { + [key: string]: string; + }; +} + +export const defaultOptions: PostCSSPluginOptions = { + plugins: [], + modules: true, + rootDir: process.cwd(), + sassOptions: {}, + lessOptions: {}, + stylusOptions: {}, + fileIsModule: null +}; + +const postCSSPlugin = ({ + plugins = [], + modules = true, + rootDir = process.cwd(), + sassOptions = {}, + lessOptions = {}, + stylusOptions = {}, + fileIsModule +}: PostCSSPluginOptions = defaultOptions): Plugin => ({ + name: "postcss2", + setup(build) { + // get a temporary path where we can save compiled CSS + const tmpDirPath = tmp.dirSync().name, + modulesMap: CSSModule[] = []; + + const modulesPlugin = postcssModules({ + generateScopedName: "[name]__[local]___[hash:base64:5]", + ...(typeof modules !== "boolean" ? modules : {}), + getJSON(filepath, json, outpath) { + // Make sure to replace json map instead of pushing new map everytime with edit file on watch + const mapIndex = modulesMap.findIndex((m) => m.path === filepath); + if (mapIndex !== -1) { + modulesMap[mapIndex].map = json; + } else { + modulesMap.push({ + path: filepath, + map: json + }); + } + + if ( + typeof modules !== "boolean" && + typeof modules.getJSON === "function" + ) + return modules.getJSON(filepath, json, outpath); + } + }); + + build.onResolve( + { filter: /.\.(css|sass|scss|less|styl)$/ }, + async (args) => { + // Namespace is empty when using CSS as an entrypoint + if (args.namespace !== "file" && args.namespace !== "") return; + + // Resolve files from node_modules (ex: npm install normalize.css) + let sourceFullPath = resolveFile(args.path); + if (!sourceFullPath) + sourceFullPath = path.resolve(args.resolveDir, args.path); + + const sourceExt = path.extname(sourceFullPath); + const sourceBaseName = path.basename(sourceFullPath, sourceExt); + const isModule = fileIsModule + ? fileIsModule(sourceFullPath) + : sourceBaseName.match(/\.module$/); + const sourceDir = path.dirname(sourceFullPath); + const watchFiles = [sourceFullPath]; + + let tmpFilePath: string; + if (args.kind === "entry-point") { + // For entry points, we use //.css + const sourceRelDir = path.relative( + path.dirname(rootDir), + path.dirname(sourceFullPath) + ); + tmpFilePath = path.resolve( + tmpDirPath, + sourceRelDir, + `${sourceBaseName}.css` + ); + await ensureDir(path.dirname(tmpFilePath)); + } else { + // For others, we use //.css + // + // This is a workaround for the following esbuild issue: + // https://github.com/evanw/esbuild/issues/1101 + // + // esbuild is unable to find the file, even though it does exist. This only + // happens for files in a directory with several other entries, so by + // creating a unique directory name per file on every build, we guarantee + // that there will only every be a single file present within the directory, + // circumventing the esbuild issue. + const uniqueTmpDir = path.resolve(tmpDirPath, uniqueId()); + tmpFilePath = path.resolve(uniqueTmpDir, `${sourceBaseName}.css`); + } + await ensureDir(path.dirname(tmpFilePath)); + + const fileContent = await readFile(sourceFullPath); + let css = sourceExt === ".css" ? fileContent : ""; + + // parse files with preprocessors + if (sourceExt === ".sass" || sourceExt === ".scss") { + const sassResult = await renderSass({ + ...sassOptions, + file: sourceFullPath + }); + css = sassResult.css.toString(); + watchFiles.push(...sassResult.stats.includedFiles); + } + if (sourceExt === ".styl") + css = await renderStylus(new TextDecoder().decode(fileContent), { + ...stylusOptions, + filename: sourceFullPath + }); + if (sourceExt === ".less") + css = ( + await less.render(new TextDecoder().decode(fileContent), { + ...lessOptions, + filename: sourceFullPath, + rootpath: path.dirname(args.path) + }) + ).css; + + // wait for plugins to complete parsing & get result + const result = await postcss( + isModule ? [modulesPlugin, ...plugins] : plugins + ).process(css, { + from: sourceFullPath, + to: tmpFilePath + }); + watchFiles.push(...getPostCssDependencies(result.messages)); + + // Write result CSS + await writeFile(tmpFilePath, result.css); + + return { + namespace: isModule ? "postcss-module" : "file", + path: tmpFilePath, + watchFiles, + pluginData: { + originalPath: sourceFullPath + } + }; + } + ); + + // load css modules + build.onLoad( + { filter: /.*/, namespace: "postcss-module" }, + async (args) => { + const mod = modulesMap.find( + ({ path }) => path === args?.pluginData?.originalPath + ), + resolveDir = path.dirname(args.path); + + return { + resolveDir, + contents: `import ${JSON.stringify( + args.path + )};\nexport default ${JSON.stringify(mod && mod.map ? mod.map : {})};` + }; + } + ); + } +}); + +function renderSass(options: SassOptions): Promise { + return new Promise((resolve, reject) => { + getSassImpl().render(options, (e: SassException, res: SassResult) => { + if (e) reject(e); + else resolve(res); + }); + }); +} + +function renderStylus( + str: string, + options: StylusRenderOptions +): Promise { + return new Promise((resolve, reject) => { + stylus.render(str, options, (e, res) => { + if (e) reject(e); + else resolve(res); + }); + }); +} + +function getSassImpl() { + let impl = "sass"; + try { + require.resolve("sass"); + } catch { + try { + require.resolve("node-sass"); + impl = "node-sass"; + } catch { + throw new Error('Please install "sass" or "node-sass" package'); + } + } + return require(impl); +} + +function getFilesRecursive(directory: string): string[] { + return readdirSync(directory).reduce((files, file) => { + const name = path.join(directory, file); + + return statSync(name).isDirectory() + ? [...files, ...getFilesRecursive(name)] + : [...files, name]; + }, []); +} + +let idCounter = 0; + +/** + * Generates an id that is guaranteed to be unique for the Node.JS instance. + */ +function uniqueId(): string { + return Date.now().toString(16) + (idCounter++).toString(16); +} + +function getPostCssDependencies(messages: Message[]): string[] { + let dependencies = []; + for (const message of messages) { + if (message.type == "dir-dependency") { + dependencies.push(...getFilesRecursive(message.dir)); + } else if (message.type == "dependency") { + dependencies.push(message.file); + } + } + return dependencies; +} + +export default postCSSPlugin; diff --git a/src/modules.d.ts b/src/modules.d.ts new file mode 100644 index 0000000..18eee0c --- /dev/null +++ b/src/modules.d.ts @@ -0,0 +1,25 @@ +// css module files +declare module "*.module.css" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.scss" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.sass" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.less" { + const classes: { readonly [key: string]: string }; + export default classes; +} + +declare module "*.module.styl" { + const classes: { readonly [key: string]: string }; + export default classes; +} diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..d09b56d --- /dev/null +++ b/test/index.js @@ -0,0 +1,154 @@ +const autoprefixer = require("autoprefixer"), + postCssImport = require("postcss-import"), + { build } = require("esbuild"), + postCSS = require("../dist"), + { assert } = require("chai"), + fs = require("fs"); + +describe("PostCSS esbuild tests", () => { + it("Works with basic CSS imports", (done) => { + test(["tests/basic.ts"]) + .then((res) => { + assert(res); + done(); + }) + .catch(done); + }); + it("Works with preprocessors", (done) => { + test(["tests/preprocessors.ts"]) + .then((res) => { + assert(res); + done(); + }) + .catch(done); + }); + it("Works with CSS modules", (done) => { + test(["tests/modules.ts"]) + .then((res) => { + assert(res); + done(); + }) + .catch(done); + }); + it("Works with CSS as entrypoint", (done) => { + test(["tests/styles.css", "tests/styles2.css"]) + .then((res) => { + assert(res); + done(); + }) + .catch(done); + }); + it("Works with node_modules import", (done) => { + test(["tests/node_modules.ts"]) + .then((res) => { + assert(res); + done(); + }) + .catch(done); + }); + it("Works while waching css files directly", (done) => { + let notTriggerTimeout = null; + build({ + entryPoints: ["tests/watch.ts"], + bundle: true, + outdir: "dist", + watch: { + onRebuild: (error, result) => { + notTriggerTimeout = null; + if (error) return done(error); + assert(result); + done(); + } + }, + plugins: [ + postCSS.default({ + plugins: [autoprefixer] + }) + ] + }) + .then(() => { + // test if modifying the css actually triggers the onRebuild event + const data = `.Test { display: block; }`; + fs.writeFile("./styles/watch.css", data, (err) => { + if (err) return done(err); + notTriggerTimeout = setTimeout(() => { + done("Watch file not triggered!"); + }, 1000); + }); + }) + .catch(() => process.exit(1)); + }); + + it("Works while waching css files through dependencies", (done) => { + let notTriggerTimeout = null; + build({ + entryPoints: ["tests/watch2.ts"], + bundle: true, + outdir: "dist", + watch: { + onRebuild: (error, result) => { + notTriggerTimeout = null; + if (error) return done(error); + assert(result); + done(); + } + }, + plugins: [ + postCSS.default({ + plugins: [autoprefixer, postCssImport] + }) + ] + }) + .then(() => { + // test if modifying the css actually triggers the onRebuild event + const data = `.Test { display: block; }`; + fs.writeFile("./styles/watch3.css", data, (err) => { + if (err) return done(err); + notTriggerTimeout = setTimeout(() => { + done("Watch file not triggered!"); + }, 1000); + }); + }) + .catch(() => process.exit(1)); + }); + + it("Works with custom module function", (done) => { + let testFilename = null; + build({ + entryPoints: ["tests/basic.ts"], + bundle: true, + outdir: "dist", + plugins: [ + postCSS.default({ + plugins: [autoprefixer, postCssImport], + modules: true, + fileIsModule: (filename) => { + testFilename = filename; + return false; + } + }) + ] + }) + .then(() => { + // ensure the proper filename was passed + assert.match(testFilename, /styles\/basic\.css/); + }) + .catch((e) => { + console.error(e); + process.exit(1); + }); + }); +}); + +function test(entryPoint) { + return build({ + entryPoints: entryPoint, + bundle: true, + outdir: "dist", + plugins: [ + postCSS.default({ + plugins: [autoprefixer] + }) + ] + }).catch(() => process.exit(1)); +} diff --git a/test/styles/basic.css b/test/styles/basic.css new file mode 100644 index 0000000..55d7059 --- /dev/null +++ b/test/styles/basic.css @@ -0,0 +1,3 @@ +.Test { + display: block; +} diff --git a/test/styles/example.module.css b/test/styles/example.module.css new file mode 100644 index 0000000..c513142 --- /dev/null +++ b/test/styles/example.module.css @@ -0,0 +1,11 @@ +.TestModule { + align-items: center; +} + +.TestModuleAnother { + justify-content: space-between; +} + +.TextModuleLast { + width: 100vw; +} diff --git a/test/styles/example.module.less b/test/styles/example.module.less new file mode 100644 index 0000000..dfdf0f1 --- /dev/null +++ b/test/styles/example.module.less @@ -0,0 +1,5 @@ +@text: left; + +.TestLessModule { + text-align: @text; +} diff --git a/test/styles/example.module.sass b/test/styles/example.module.sass new file mode 100644 index 0000000..a011e04 --- /dev/null +++ b/test/styles/example.module.sass @@ -0,0 +1,2 @@ +.TestModuleSass + display: flex \ No newline at end of file diff --git a/test/styles/preprocessors.less b/test/styles/preprocessors.less new file mode 100644 index 0000000..55d7059 --- /dev/null +++ b/test/styles/preprocessors.less @@ -0,0 +1,3 @@ +.Test { + display: block; +} diff --git a/test/styles/preprocessors.sass b/test/styles/preprocessors.sass new file mode 100644 index 0000000..dbca092 --- /dev/null +++ b/test/styles/preprocessors.sass @@ -0,0 +1,6 @@ +$test: 20px + +.SassClass + text-transform: uppercase + display: flex + font-size: $test \ No newline at end of file diff --git a/test/styles/preprocessors.scss b/test/styles/preprocessors.scss new file mode 100644 index 0000000..43a4820 --- /dev/null +++ b/test/styles/preprocessors.scss @@ -0,0 +1,8 @@ +$test: translate(-50%, -50%); + +.ScssClass { + position: relative; + top: 50%; + left: 50%; + transform: $test; +} diff --git a/test/styles/preprocessors.styl b/test/styles/preprocessors.styl new file mode 100644 index 0000000..b0862de --- /dev/null +++ b/test/styles/preprocessors.styl @@ -0,0 +1,4 @@ +test = 25px + +.StylusClass + margin test \ No newline at end of file diff --git a/test/styles/watch.css b/test/styles/watch.css new file mode 100644 index 0000000..55d7059 --- /dev/null +++ b/test/styles/watch.css @@ -0,0 +1,3 @@ +.Test { + display: block; +} diff --git a/test/styles/watch2.css b/test/styles/watch2.css new file mode 100644 index 0000000..29af4d0 --- /dev/null +++ b/test/styles/watch2.css @@ -0,0 +1,5 @@ +@import "./watch3.css"; + +.Test { + display: block; +} diff --git a/test/styles/watch3.css b/test/styles/watch3.css new file mode 100644 index 0000000..55d7059 --- /dev/null +++ b/test/styles/watch3.css @@ -0,0 +1,3 @@ +.Test { + display: block; +} diff --git a/test/tests/basic.ts b/test/tests/basic.ts new file mode 100644 index 0000000..1aebc3d --- /dev/null +++ b/test/tests/basic.ts @@ -0,0 +1 @@ +import "../styles/basic.css"; diff --git a/test/tests/modules.ts b/test/tests/modules.ts new file mode 100644 index 0000000..5d8d37b --- /dev/null +++ b/test/tests/modules.ts @@ -0,0 +1,5 @@ +import styles from "../styles/example.module.sass"; +import styles2 from "../styles/example.module.css"; +import styles3 from "../styles/example.module.less"; + +console.log(styles, styles2, styles3); diff --git a/test/tests/node_modules.ts b/test/tests/node_modules.ts new file mode 100644 index 0000000..868faf0 --- /dev/null +++ b/test/tests/node_modules.ts @@ -0,0 +1 @@ +import "normalize.css"; diff --git a/test/tests/preprocessors.ts b/test/tests/preprocessors.ts new file mode 100644 index 0000000..dbb46bc --- /dev/null +++ b/test/tests/preprocessors.ts @@ -0,0 +1,4 @@ +import "../styles/preprocessors.sass"; +import "../styles/preprocessors.scss"; +import "../styles/preprocessors.less"; +import "../styles/preprocessors.styl"; diff --git a/test/tests/styles.css b/test/tests/styles.css new file mode 100644 index 0000000..65ec989 --- /dev/null +++ b/test/tests/styles.css @@ -0,0 +1,6 @@ +.example { + display: grid; + transition: all 0.5s; + user-select: none; + background: linear-gradient(to bottom, white, black); +} diff --git a/test/tests/styles2.css b/test/tests/styles2.css new file mode 100644 index 0000000..65ec989 --- /dev/null +++ b/test/tests/styles2.css @@ -0,0 +1,6 @@ +.example { + display: grid; + transition: all 0.5s; + user-select: none; + background: linear-gradient(to bottom, white, black); +} diff --git a/test/tests/watch.ts b/test/tests/watch.ts new file mode 100644 index 0000000..4a34187 --- /dev/null +++ b/test/tests/watch.ts @@ -0,0 +1 @@ +import "../styles/watch.css"; diff --git a/test/tests/watch2.ts b/test/tests/watch2.ts new file mode 100644 index 0000000..0132a11 --- /dev/null +++ b/test/tests/watch2.ts @@ -0,0 +1 @@ +import "../styles/watch2.css"; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..89ff9a1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "moduleResolution": "node", + "module": "commonjs", + "target": "es2017", + "outDir": "dist", + "declaration": true, + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..30e1003 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1490 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/chai@^4.2.15": + version "4.2.15" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.2.15.tgz" + integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== + +"@types/fs-extra@^9.0.9": + version "9.0.9" + resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.9.tgz" + integrity sha512-5TqDycCl0oMzwzd1cIjSJWMKMvLCDVErle4ZTjU4EmHDURR/+yZghe6GDHMCpHtcVfq0x0gMoOM546/5TbYHrg== + dependencies: + "@types/node" "*" + +"@types/less@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/less/-/less-3.0.2.tgz" + integrity sha512-62vfe65cMSzYaWmpmhqCMMNl0khen89w57mByPi1OseGfcV/LV03fO8YVrNj7rFQsRWNJo650WWyh6m7p8vZmA== + +"@types/mocha@^8.2.2": + version "8.2.2" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz" + integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== + +"@types/node@*", "@types/node@^14.14.37": + version "14.14.37" + resolved "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz" + integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== + +"@types/sass@^1.16.0": + version "1.16.0" + resolved "https://registry.npmjs.org/@types/sass/-/sass-1.16.0.tgz" + integrity sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA== + dependencies: + "@types/node" "*" + +"@types/stylus@^0.48.33": + version "0.48.33" + resolved "https://registry.npmjs.org/@types/stylus/-/stylus-0.48.33.tgz" + integrity sha512-2uxz/OykfCkFOewBMw55GYVW9MGGgvmOvMR0bnLKD6HybK1QFspJlEwrHG9L5NDImoGRCbCfGFqlcoczfcf+RA== + dependencies: + "@types/node" "*" + +"@types/tmp@^0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.0.tgz" + integrity sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^10.2.5: + version "10.2.5" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.5.tgz" + integrity sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA== + dependencies: + browserslist "^4.16.3" + caniuse-lite "^1.0.30001196" + colorette "^1.2.2" + fraction.js "^4.0.13" + normalize-range "^0.1.2" + postcss-value-parser "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.16.3: + version "4.16.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001196: + version "1.0.30001204" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz" + integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== + +chai@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@3.5.1, "chokidar@>=2.0.0 <4.0.0": + version "3.5.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +copy-anything@^2.0.1: + version "2.0.3" + resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz" + integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== + dependencies: + is-what "^3.12.0" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.1: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-parse@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz" + integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + dependencies: + css "^2.0.0" + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cwd@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz" + integrity sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc= + dependencies: + find-pkg "^0.1.2" + fs-exists-sync "^0.1.0" + +debug@4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +electron-to-chromium@^1.3.649: + version "1.3.696" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.696.tgz" + integrity sha512-yuKKvBuXe+IWRp6DxqbGUxbPtamh5C+mEC38vZ0KLxQFpGG9TQn0DbPL9WhWhQnfNhLyzxmPYlCzShbs8QxGbA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +esbuild@^0.11.2: + version "0.11.2" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.11.2.tgz" + integrity sha512-8d5FCQrR+juXC2u9zjTQ3+IYiuFuaWyKYwmApFJLquTrYNbk36H/+MkRQeTuOJg7IjUchRX2Ulwo1zRYXZ1pUg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz" + 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" + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz" + integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= + dependencies: + os-homedir "^1.0.1" + +expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-file-up@^0.1.2: + version "0.1.3" + resolved "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz" + integrity sha1-z2gJG8+fMApA2kEbN9pczlovvqA= + dependencies: + fs-exists-sync "^0.1.0" + resolve-dir "^0.1.0" + +find-pkg@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz" + integrity sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc= + dependencies: + find-file-up "^0.1.2" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fraction.js@^4.0.13: + version "4.0.13" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz" + integrity sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA== + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz" + integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +generic-names@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz" + integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== + dependencies: + loader-utils "^1.1.0" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.6, glob@^7.1.3, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz" + integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz" + integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-what@^3.12.0: + version "3.14.1" + resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz" + integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz" + integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= + dependencies: + set-getter "^0.1.0" + +less@^4.x: + version "4.1.1" + resolved "https://registry.npmjs.org/less/-/less-4.1.1.tgz" + integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^2.5.2" + source-map "~0.6.0" + +loader-utils@^1.1.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.5" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mocha@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz" + integrity sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +needle@^2.5.2: + version "2.6.0" + resolved "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz" + integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize.css@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz" + integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +postcss-import@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1" + integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-modules@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.0.0.tgz" + integrity sha512-ghS/ovDzDqARm4Zj6L2ntadjyQMoyJmi0JkLlYtH2QFLrvNlxH5OAVRPWPeKilB0pY7SbuhO173KOWkPAxRJcw== + dependencies: + generic-names "^2.0.1" + icss-replace-symbols "^1.1.0" + lodash.camelcase "^4.3.0" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + string-hash "^1.1.1" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz" + integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-file@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/resolve-file/-/resolve-file-0.3.0.tgz" + integrity sha1-EeH7RkVm06fFAMt+lIHo8LAKFO8= + dependencies: + cwd "^0.10.0" + expand-tilde "^2.0.2" + extend-shallow "^2.0.1" + fs-exists-sync "^0.1.0" + homedir-polyfill "^1.0.1" + lazy-cache "^2.0.2" + resolve "^1.2.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.7, resolve@^1.2.0: + version "1.20.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass@^1.x: + version "1.32.8" + resolved "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz" + integrity sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ== + dependencies: + chokidar ">=2.0.0 <4.0.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz" + integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= + dependencies: + to-object-path "^0.3.0" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +stylus@^0.x: + version "0.54.8" + resolved "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz" + integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.6" + mkdirp "~1.0.4" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.3.0" + source-map "^0.7.3" + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tslib@^1.10.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typescript@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz" + integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^1.2.12, which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yargs-parser@20.2.4, yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yorkie@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz" + integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw== + dependencies: + execa "^0.8.0" + is-ci "^1.0.10" + normalize-path "^1.0.0" + strip-indent "^2.0.0"