diff --git a/.docs/README.md b/.docs/README.md new file mode 100644 index 0000000..736f2a9 --- /dev/null +++ b/.docs/README.md @@ -0,0 +1,13 @@ +# Docs + +## Develop + +``` +% yarn workspace @hoast/docs run develop +``` + +## Build + +``` +% yarn workspace @hoast/docs run build +``` diff --git a/.docs/hoast.js b/.docs/hoast.js new file mode 100644 index 0000000..6a71aba --- /dev/null +++ b/.docs/hoast.js @@ -0,0 +1,95 @@ +import Hoast from '@hoast/hoast' +import ProcessFrontmatter from '@hoast/process-frontmatter' +import ProcessMarkdown from '@hoast/process-markdown' +import ProcessMithril from '@hoast/process-mithril' +import ProcessPostprocess from '@hoast/process-postprocess' +import ProcessWritefiles from '@hoast/process-writefiles' +import SourceReadfiles from '@hoast/source-readfiles' + +const hoast = new Hoast() + .addCollections([ + // Add pages collection. + { + // Read files from pages directory. + source: new SourceReadfiles({ + directory: 'src/pages', + }), + processes: [ + // Extract frontmatter. + new ProcessFrontmatter(), + // Convert markdown to HTML. + new ProcessMarkdown({ + highlightOptions: {}, + + remarkPlugins: [ + 'remark-external-links', + ], + }), + // Template using mithril. + new ProcessMithril({ + componentDirectory: 'src/components', + componentPath: 'html.js', + + prefix: '', + }), + // Bundle and minify. + new ProcessPostprocess({ + minify: process.env.NODE_ENV === 'production', + + cssPlugins: [ + 'postcss-import', + 'autoprefixer', + 'postcss-preset-env', + ], + }), + // Write to filesystem. + new ProcessWritefiles({ + directory: '../docs', + }), + ], + }, + + // Add style sheets collection. + { + source: new SourceReadfiles({ + directory: 'src/styles', + }), + processes: [ + new ProcessPostprocess({ + mode: 'css', + minify: process.env.NODE_ENV === 'production', + + cssPlugins: [ + 'postcss-import', + 'autoprefixer', + 'postcss-preset-env', + ], + }), + new ProcessWritefiles({ + directory: '../docs/styles', + }), + ], + }, + + // Transfer files from .assets directory over. + { + source: new SourceReadfiles({ + directory: 'src/assets', + + readOptions: { + encoding: null, + }, + }), + processes: [ + new ProcessWritefiles({ + directory: '../docs/assets', + + writeOptions: { + encoding: null, + }, + }), + ], + }, + ]) + +export default hoast diff --git a/.docs/package.json b/.docs/package.json new file mode 100644 index 0000000..698a529 --- /dev/null +++ b/.docs/package.json @@ -0,0 +1,31 @@ +{ + "private": true, + "name": "@hoast/docs", + "version": "0.0.0", + "dependencies": { + "normalize.css": "8.0.1" + }, + "devDependencies": { + "@hoast/hoast": "x", + "@hoast/process-frontmatter": "x", + "@hoast/process-markdown": "x", + "@hoast/process-mithril": "x", + "@hoast/process-postprocess": "x", + "@hoast/process-writefiles": "x", + "@hoast/source-readfiles": "x", + "autoprefixer": "10.0.1", + "mithril": "^2.0.4", + "onchange": "7.0.2", + "postcss-import": "12.0.1", + "postcss-preset-env": "6.7.0", + "remark-external-links": "^7.0.0", + "serve": "11.3.2" + }, + "type": "module", + "scripts": { + "build": "NODE_ENV=production hoast", + "develop": "NODE_ENV=development onchange -i 'hoast.js' 'src/**' -- hoast", + "lint": "eslint --fix --cache *.js src/components/*.js", + "serve": "serve ../docs/" + } +} diff --git a/.docs/src/assets/icon-round-128.png b/.docs/src/assets/icon-round-128.png new file mode 100644 index 0000000..55a7f56 Binary files /dev/null and b/.docs/src/assets/icon-round-128.png differ diff --git a/.docs/src/assets/icon-round-256.png b/.docs/src/assets/icon-round-256.png new file mode 100644 index 0000000..c39ce05 Binary files /dev/null and b/.docs/src/assets/icon-round-256.png differ diff --git a/.docs/src/assets/icon-round-512.png b/.docs/src/assets/icon-round-512.png new file mode 100644 index 0000000..e2d985e Binary files /dev/null and b/.docs/src/assets/icon-round-512.png differ diff --git a/.docs/src/assets/manifest.json b/.docs/src/assets/manifest.json new file mode 100644 index 0000000..98eae1f --- /dev/null +++ b/.docs/src/assets/manifest.json @@ -0,0 +1,19 @@ +{ + "start_url": "index.html?utm_source=homescreen", + "name": "Hoast", + "short_name": "Hoast", + "description": "A modular data processor!", + "dir": "ltr", + "lang": "en-GB", + "background_color": "#ffffff", + "theme_color": "#ffffff", + "display": "standalone", + "orientation": "portrait", + "icons": [ + { + "src": "assets/128.png", + "type": "image/png", + "sizes": "128x128" + } + ] +} diff --git a/.docs/src/components/html.js b/.docs/src/components/html.js new file mode 100644 index 0000000..eedc1df --- /dev/null +++ b/.docs/src/components/html.js @@ -0,0 +1,78 @@ +import m from 'mithril' + +export default { + view: function ({ attrs }) { + // Get file contents. + const frontmatter = attrs.data.frontmatter + const contents = attrs.data.contents + + // Render component. + return m('html', { + lang: 'en', + }, [ + m('head', [ + // File meta data. + m('meta', { + charset: 'UTF-8', + }), + m('meta', { + name: 'viewport', + content: 'width=device-width, initial-scale=1.0', + }), + + // Page meta data. + m('title', frontmatter.title), + m('meta', { + name: 'description', + content: frontmatter.description, + }), + m('meta', { + name: 'keywords', + content: frontmatter.keywords, + }), + + // Icons. + m('link', { + rel: 'icon', + href: '/assets/icon-round-128.png', + type: 'image/png', + sizes: '128x128', + }), + m('link', { + rel: 'icon', + href: '/assets/icon-round-256.png', + type: 'image/png', + sizes: '256x256', + }), + m('link', { + rel: 'icon', + href: '/assets/icon-round-512.png', + type: 'image/png', + sizes: '512x512', + }), + + // Style sheets. + m('link', { + rel: 'stylesheet', + href: '/styles/global.css', + }), + + m('meta', { + name: 'theme-color', + content: '#ffffff', + }), + ]), + + m('body', [ + m('div', { + class: 'container', + }, [ + // Markdown content. + m('div', { + class: 'content', + }, m.trust(contents)), + ]), + ]), + ]) + }, +} diff --git a/.docs/src/pages/index.md b/.docs/src/pages/index.md new file mode 100644 index 0000000..0d634b7 --- /dev/null +++ b/.docs/src/pages/index.md @@ -0,0 +1,25 @@ +--- +{ + "title": "Hoast, a modular data processor!", + "description": "A simple and modular ecosystem for build automation.", + "keywords": "hoast, modular, data, processor, javascript, static, page, generator" +} +--- + +ʕ ˵•ᴥ•ʔ + +# Hoast + +A simple and modular ecosystem for build automation. + +[Repository](https://www.github.com/hoast/hoast#readme) + +[Examples](https://github.com/hoast/hoast/tree/master/examples#readme) + +[Packages](https://github.com/hoast/hoast/tree/master/packages#readme) + +[Guides](https://github.com/hoast/hoast/tree/master/guides#readme) + +[Contribute](https://github.com/hoast/hoast/blob/master/CONTRIBUTING.md) + +[MIT licensed](https://github.com/hoast/hoast/blob/master/LICENSE) diff --git a/.docs/src/styles/global.css b/.docs/src/styles/global.css new file mode 100644 index 0000000..f2bc4c2 --- /dev/null +++ b/.docs/src/styles/global.css @@ -0,0 +1,61 @@ +@import 'normalize.css'; + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-weight: 300; + line-height: 2; +} + +a { + font-weight: 600; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 600; +} + +.container { + position: relative; + display: table; + height: 100vh; + width: 100%; + max-width: 16em; + margin-left: auto; + margin-right: auto; +} + +.container > .content { + display: table-cell; + vertical-align: middle; + padding-top: 0.5em; + padding-bottom: 0.75em; +} + +.content { + padding-left: 2em; + padding-right: 2em; +} + +.content > *:first-child { + margin-top: 0.25em; + margin-bottom: 0.25em; + + font-size: 4em; + font-weight: 400; + text-align: center; + white-space: nowrap; +} + +.content img { + display: block; + margin-left: auto; + margin-right: auto; +} + +.content ul { + padding-left: 1em; +} + +.content ul li { + margin-bottom: 1em; +} diff --git a/.editorconfig b/.editorconfig index 7a68e83..86a63dc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,11 +3,7 @@ root = true [*] charset = utf-8 end_of_line = lf -indent_style = tab -indent_size = 4 -insert_final_newline = false -trim_trailing_whitespace = false - -[{*.md,*.json,*.yml}] indent_style = space -indent_size = 2 \ No newline at end of file +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..bcaf902 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,62 @@ +module.exports = { + env: { + es6: true, + }, + extends: [ + 'standard', + 'eslint:recommended', + 'eslint-config-standard', + ], + globals: { + Atomics: 'readonly', + SharedArrayBuffer: 'readonly', + }, + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + }, + plugins: [ + 'eslint-plugin-import', + 'eslint-plugin-node', + 'eslint-plugin-promise', + 'eslint-plugin-standard', + ], + rules: { + 'comma-dangle': [ + 'warn', + { + arrays: 'always-multiline', + objects: 'always-multiline', + imports: 'never', + exports: 'never', + functions: 'never', + }], + indent: [ + 'error', + 2, + { + SwitchCase: 1, + }, + ], + 'linebreak-style': [ + 'error', + 'unix', + ], + quotes: [ + 'error', + 'single', + ], + semi: [ + 'error', + 'never', + ], + 'space-before-function-paren': [ + 0, + 'always', + ], + 'no-cond-assign': 0, + 'no-case-declarations': 0, + 'no-fallthrough': 0, + 'standard/no-callback-literal': 0, + }, +} diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 7009f08..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "env": { - "es6": true, - "node": true - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module" - }, - "root": true, - "rules": { - "no-console": [ - "off" - ], - "indent": [ - "error", - "tab", - { "SwitchCase": 1 } - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "backtick" - ], - "semi": [ - "error", - "always" - ] - } -} \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/ask.md b/.github/ISSUE_TEMPLATE/ask.md index 0a5cdf0..060238f 100644 --- a/.github/ISSUE_TEMPLATE/ask.md +++ b/.github/ISSUE_TEMPLATE/ask.md @@ -1,7 +1,7 @@ --- name: Ask about: Ask a question. Whether something is unclear or missing we would love to help. -labels: +labels: - question --- @@ -18,4 +18,4 @@ labels: * I have ... -**Write any additional context in place of this.** \ No newline at end of file +**Write any additional context in place of this.** diff --git a/.github/ISSUE_TEMPLATE/report.md b/.github/ISSUE_TEMPLATE/report.md index 8d7df42..1b930b1 100644 --- a/.github/ISSUE_TEMPLATE/report.md +++ b/.github/ISSUE_TEMPLATE/report.md @@ -1,7 +1,7 @@ --- name: Report about: Report a problem. Perhaps you discovered a bug and we can help fix the problem. -labels: +labels: - bug --- @@ -10,9 +10,9 @@ labels: **Actions**: *List actions you took so we can reproduce the issue.* -1. -2. -3. +1. +2. +3. **Expectation**: *Write the result you expected to have.* @@ -23,4 +23,4 @@ labels: * Node version: [e.g. `8.12.0`] * Program version: [e.g. `1.1.0`] -**Write any additional context in place of this.** \ No newline at end of file +**Write any additional context in place of this.** diff --git a/.github/ISSUE_TEMPLATE/suggest.md b/.github/ISSUE_TEMPLATE/suggest.md index c566aa9..a95cea1 100644 --- a/.github/ISSUE_TEMPLATE/suggest.md +++ b/.github/ISSUE_TEMPLATE/suggest.md @@ -1,7 +1,7 @@ --- name: Suggest about: Suggest an idea. Help us improve and grow the project with your suggestions. -labels: +labels: - enhancement --- @@ -19,4 +19,4 @@ labels: -**Write any additional context in place of this.** \ No newline at end of file +**Write any additional context in place of this.** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e88cc02..85665ff 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -13,4 +13,4 @@ **Write any additional context in place of this.** **Checklist**: *Check off the box by placing a `x` inside the brackets after making sure you agree to the term outlined.* -* [ ] I have read and followed the [contributing page](https://hoast.js.org/contributing). \ No newline at end of file +* [ ] I have read and followed the [contributing page](https://hoast.js.org/contributing). diff --git a/.gitignore b/.gitignore index 411323f..b9cad4e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,68 @@ -# Node +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories node_modules/ -# Coverage -.nyc_output/ -# Examples -examples/**/destination/ \ No newline at end of file + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# MacOS files. +.DS_Store + +# Build directories +dst +# Example build directories +examples/**/dst/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 777782f..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: node_js -node_js: - - "7" - - "8" - - "9" - - "10" - - "node" -before_install: - - curl -L https://unpkg.com/@pnpm/self-installer | node -install: - - pnpm install -after_success: - - npm run coverage \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index d63ee00..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,68 +0,0 @@ -# Changelog - -## 1.1.5 (2018-12-12) -### Added -- CLI tool process time indicator. -### Fixed -- CLI tool does not process when using either the version or help flag. - -## 1.1.4 (2018-10-28) -### Added -- `deepAssign` function added to `helpers`. -- Tests improved and `function` tests added for `helpers.deepAssign`, `helpers.matchExpression`, and `helpers.parsePatterns`. - -## 1.1.2 (2018-10-24) -### Fixed -- `createDirectory` function now works with absolute paths. -- `patterns` now parsed as file paths. - -## 1.1.1 (2018-10-23) -### Changed -- Dependencies updated to latest versions. -- Restructured project files with helpers in separate directory and tests placed in separate directory `test` directory as well as updated to reflect new changes. -- Expression matching helper optimized using `planckmatch`'s new `match.all` and `match.any` functions. -- Renamed `helper` property to `helpers` as well as certain names of helper functions, see the list below. (Legacy support is still present.) - - `match` to `matchExpressions` - - `parse` to `parsePatterns` - - `remove` to `removeFiles` -- Exposed underlying `single` functions of helpers which iterate over an array. The are of the `removeFiles` and `writeFiles` helpers with the `single` functions exposed as `removeFiles.single` and `writeFiles.single` respectively. -### Fixed -- `directory` parameter now properly used when removing and writing files to storage. - -## 1.1.0 (2018-10-17) -### Added -- `parse` and `match` functions added to helper functions. -- Filter functionality added when scanning for files added, configurable via `pattern` and `patternOptions` options. -### Changed -- Slight optimization of array flattening in the `library/scanDirectory` function. -### Fixed -- Fixed `options.remove` when using a string or array of strings to specify files. - -## 1.0.2 (2018-10-10) -### Added -- `hoast` icon added to `README.md`. -### Changed -- Rewrote sections of `README.md`. -- Updated keywords in `package.json`. - -## 1.0.1 (2018-09-28) -### Changed -- Updated documentation found in `README.md`. - -## 1.0.0 (2018-09-26) -### Added -- CodeCov coverage report added to CI workflow. -### Changed -- Restructured project files. -- Update examples to match with new versions of any modules. - -## 0.2.0 (2018-09-11) -### Added -- `CHANGELOG.md` added. -- `scanDirectory` function added to helper functions. -- `remove` function added to helper functions. -- `writeFiles` function added to helper functions. -- Helper functions are now also available through Hoast directly, instead of requiring to be an instance. - -## 0.1.0 (2018-08-21) -Initial release. \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 85af9b6..4c57302 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1 +1,11 @@ -> See the organization's [code of conduct page](https://hoast.js.org/code-of-conduct). \ No newline at end of file +# Code of conduct + +In the interest of fostering an open and welcoming environment, we as contributors pledge to making participation in our project and our community a harassment-free experience for everyone. + +Therefore we ask community members to be welcoming and open to newcomers, be respectful and empathetic towards others, accept and provide constructive criticism, always trying to improve the community, and apply this code of conduct both within project spaces and in public spaces when an individual is representing the project or its community. + +Maintainers are responsible for further clarification of acceptable behaviour, and are expected to take appropriate actions in response to unacceptable behaviour. Therefore maintainers have the right to remove, edit, or reject comments, commits, code, issues, and other contributions that are not aligned to this code of conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +If you see a violation of conduct or other unacceptable behaviour within our community do not hesitate and contact the project author Ron Dekker via [rondekker.nl](https://www.rondekker.com). The addressee will maintain confidentiality and follow up with a response in all cases. Maintainers who do not enforce the code of conduct can face repercussions as determined by other maintainers. + +> This document is based of the [Contributor Covenant Code of Conduct](https://www.contributor-covenant.org/version/1/4/code-of-conduct). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ec28dd3..bfb176f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1,88 @@ -> See the organization's [contributing page](https://hoast.js.org/contributing), if you just want to report an issue skip to the [issues section](https://hoast.js.org/contributing#issues). \ No newline at end of file +# Contributing + +Welcome and thank you for wanting to contribute! Following these guidelines helps us communicate to one another more effectively so we can resolve any issues and improve the program quicker. And remember help is always welcome, if you have an idea or want to help out let us know. + +## Table of contents + ++ [Code of conduct](#code-of-conduct) ++ [Philosophy](#philosophy) ++ [Issues](#issues) ++ [Creating pull requests](#creating-pull-requests) + + [Follow styling](#follow-styling) + + [Run tests](#run-tests) + + [Write documentation](#write-documentation) + + [Write tests](#write-tests) + + [Sign off commits](#sign-off-commits) ++ [Reviewing pull requests](#reviewing-pull-requests) + +## Code of conduct + +Besides the guidelines set out in this document we expect our community reads and follows to the [code of conduct](/CODE_OF_CONDUCT) as well. + +## Philosophy + +The organizations philosophy is to provide a simple yet expansive toolkit done through a modular approach preferably using minimal libraries. We hope to achieve a simple to use and easy to maintain solution. + +## Issues + +Before opening an issue choose the right repository. If your issue deals with a specific module go its repository. + +When opening an issue via the issue tracker please use one of the templates listed below. ++ **Ask**: Ask a question. Whether something is unclear or missing we would love to help. ++ **Report**: Report a problem. Perhaps you discovered a bug and we can help fix the problem. ++ **Suggest**: Suggest an idea. Help us improve and grow the project with your suggestions. + +## Creating pull requests + +Before you start work on a pull request check any open pull request first then open an issue and inform us about what you want to do. Whether this is about a bug fix or new feature we would hate to see you effort go to waist. Perhaps someone is already working on fixing that bug or you wish to build a feature that is out of the scope. However do not let this discourage you from creating your own fork! We support most use-cases, but can not realistically support all, so feel free to modify the project. + +To create a pull request first fork the repository, make and and commit your changes. Then create a pull request in the original repository, select the changes, fill in a short form, and submit the request. Afterwards simply wait for us to get back to you with any feedback. + +When making changes make sure you do everything listed below. ++ Follow styling. ++ Run tests. ++ Write documentation. ++ Write examples. ++ Write tests. ++ Sign off commits. + +### Follow styling + +There is no specific styling guide to use. There are however two which can automatically be enforced by [EditorConfig](https://editorconfig.org) and [ESLint](https://eslint.org) using the `.editorconfig` and `.eslintrc.js` file respectively. Therefore you are recommend to install a plugin to automate this process. See [EditorConfig's download section](https://editorconfig.org/#download) for a list of editor extensions. Depending on your preferences you can enable the format / lint on save option in several editors as well. + +### Run tests + +The project uses `yarn` which has some support for monorepositories. To read more about how to run commands with yarn in a monorepository see the [yarn workspaces documentation](https://yarnpkg.com/features/workspaces) or run `% yarn workspaces -h`. Clone the repository, install dependencies with `% yarn install`, and run tests with `% yarn workspaces run test` or `% yarn workspace run test` for a specific package. + +### Write documentation + +The projects documentation include four elements the instruction manual, change log, code comments, and commit messages. The first two are meant for users, and the latter two for contributors. + ++ **Instruction manual**: The `README.md` introduces the project and provides instructions on how to use the package. ++ **Change log**: The `CHANGELOG.md` lists what has changed in which version. Add your changes under the `UNRELEASED` header, if not already there feel free to add it. Then create sub-headers with the type of changes either `Added`, `Changed`, `Fixed`, or `Removed` where you will list the changes. ++ **Code comments**: Code should be annotated explaining briefly what a section of code does, whereby the functionality should be understood by only reading the comments. ++ **Commit message**: Commit messages should summarize what has essentially been written to the change log. + +### Write examples + +In order to help people + +### Write tests + +Sometimes tests need to be added, improved, or updated to reflect recent changes, be sure to run the current tests and make changes if necessary. Tests can be ran using `% yarn workspaces run test` or `% yarn workspace run test` for a specific test. GitHub actions will automatically run the tests when a pull request is submitted. Your pull request will not be merged until all test are passed. + +### Sign off commits + +Ensure your commits are signed off on at the end of your commit message, like so `Signed-off-by: Jean Smith `. Your signature certifies that you comply with the project's [Developer Certificate of Origin](/DCO). The goal of the DCO is to make sure contributors have to legal right to submit their changes. Therefore make sure to use your real name and not a pseudonym. + +> If you set your `user.name` and `user.email` git configs, you can sign your commit automatically with `git commit -s` command or in Visual Studio Code use the `Commit All (Signed Off)` or `Commit Stages (Signed Off)` option. + +## Reviewing pull requests + +Before a pull request is allowed to be deepAssignd into the development branch at least one other contributor has to review and approve the changes made. + ++ Changes follow styling. ++ Documentation is up to date. ++ Tests are up to date. ++ Tests run successfully. ++ Commits are signed off. diff --git a/DCO b/DCO index 0cdce0c..8201f99 100644 --- a/DCO +++ b/DCO @@ -34,4 +34,4 @@ By making a contribution to this project, I certify that: are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. \ No newline at end of file + this project or the open source license(s) involved. diff --git a/LICENSE b/LICENSE index d040705..c9bc52b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,15 +1,21 @@ -ISC License +MIT License -Copyright (c) 2018 Ron Dekker +Copyright (c) 2020 Ron Dekker -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +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 SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file +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. diff --git a/README.md b/README.md index a17eb17..2f19b73 100644 --- a/README.md +++ b/README.md @@ -1,550 +1,96 @@
- - [![](icons/128.png)](https://hoast.js.org) - - [![npm package @latest](https://img.shields.io/npm/v/hoast.svg?label=npm@latest&style=flat-square&maxAge=3600)](https://npmjs.com/package/hoast) - [![npm package @next](https://img.shields.io/npm/v/hoast/next.svg?label=npm@next&style=flat-square&maxAge=3600)](https://npmjs.com/package/hoast/v/next) - - [![Travis-ci status](https://img.shields.io/travis-ci/hoast/hoast.svg?branch=master&label=test%20status&style=flat-square&maxAge=3600)](https://travis-ci.org/hoast/hoast) - [![CodeCov coverage](https://img.shields.io/codecov/c/github/hoast/hoast/master.svg?label=test%20coverage&style=flat-square&maxAge=3600)](https://codecov.io/gh/hoast/hoast) - - [![License agreement](https://img.shields.io/github/license/hoast/hoast.svg?style=flat-square&maxAge=86400)](https://github.com/hoast/hoast/blob/master/LICENSE) - [![Open issues on GitHub](https://img.shields.io/github/issues/hoast/hoast.svg?style=flat-square&maxAge=86400)](https://github.com/hoast/hoast/issues) - -
-# hoast + ![Project logo](.docs/src/assets/icon-round-256.png) -A modular file processor focused on creating a simple ecosystem for task automation. + -## Table of contents +# Hoast -* [Elevator pitch](#elevator-pitch) -* [Introduction](#introduction) -* [Installation and usage](#installation-and-usage) - * [Command line interface](#command-line-interface) - * [Script](#script) - * [Options](#options) - * [Debugging](#debugging) -* [Modules](#modules) - * [Build-in](#build-in) - * [Usage](#usage) - * [Making](#making) -* [Known issues](#known-issues) +A set of simple and modular packages for build automation. ## Elevator pitch -Creating a static page generator can be incredibly easy as is show below. - -```JavaScript -const Hoast = require(`hoast`); -const read = Hoast.read, - frontmatter = require(`hoast-frontmatter`), - layout = require(`hoast-layout`), - transform = require(`hoast-transform`); - -Hoast(__dirname, { - patterns: [ - `*`, - `!(layouts)` - ], - patternOptions: { - all: true, - extended: true - } -}) - // Read file content. - .use(read()) - // Extract front matter. - .use(frontmatter()) - // Transform markdown. - .use(transform({ - patterns: `*.md` - })) - // Layout files. - .use(layout({ - directory: `layouts`, - layouts: `page.hbs`, - patterns: `*.html` - })) - // Process. - .process(); -``` - -> See the [static page generator example](https://github.com/hoast/hoast/blob/master/examples/static-page-generator) for the full example with in depth comments including dependencies and source directory. - -## Introduction - -`hoast` is a modular file processor focused on creating a simple ecosystem for task automation. The original objective was to generate webpages using a minimal system, but in addition to static page generation it can also be used for a range of different applications. - -The system has been written with several goals it mind, to be small in size as well as easy to use and improve. The result is a modular approach some of the advantages are: -1. An incredibly small base system, at just a few hundred lines of code and only three dependencies. -2. Highly customizable as modules are task specific therefore you only include the modules you want. This ensures you have a deeper understanding of the build process. -3. Modules are quick to create and allow a large portion of people to contribute. -4. Maintenance is easier as the code base is sectioned up and simpler to follow along to. - -> Another key advantage is the environment the system has been developed in, Node.js, which utilizes JavaScript the language most commonly known by web developers who this project targets with static page generation. - -The order in which hoast works can be broken down into three main steps. -1. From the source directory all files are scanned. -2. Each module manipulates the information presented. -3. The results are written to the destination directory. - -## Installation and usage - -Install [hoast](https://npmjs.com/package/hoast) using [npm](https://npmjs.com) after you have your project initialized. - -``` -$ npm install hoast -``` - -### Command line interface - -To learn about to hoast command run `$ hoast -h`. - -Create a JSON configuration file with the options and modules. - -```JSON -{ - "options": {}, - "modules": { - "read": {}, - "hoast-transform": { - "patterns": "*.md" - } - } -} -``` - -> See [options](#options) for more detail about the property. - -The modules property ... - -If you want to re-use the same module multiple times you can wrap each module in their object and change the modules property in an array as seen below. - -```JSON -{ - "options": {}, - "modules": [ - { - "read": {}, - }, { - "hoast-transform": { - "patterns": "A/*.md" - } - }, { - "hoast-transform": { - "patterns": "B/*.md" - } - } - ] -} -``` - -> Do not forget to install the modules as well. - -### Script +Creating a static page generator can be incredibly easy! ```JavaScript -// Include library. -const Hoast = require(`hoast`); -// Get build-in module. -const read = Hoast.read; - -// Initialize hoast. -Hoast(__dirname) - // Add module. - .use(read()) - // Start process. - .process(); -``` - -**constructor(directory, options)** - -As with any constructor it initializes the object. - -Returns the `hoast` instance. - -* `directory`: The working directory, most often `__dirname`. - * Type: `String` - * Required: `Yes` -* `options`: See [options](#options) for more detail about the parameter. - * Type: `Object` - * Required: `No` - -**use(module)** - -Adds the module to the modules stack. - -Returns the `hoast` instance. - -* `module`: See [using modules](#using) and [making modules](#making) for more detail about the parameter. - * Type: `Function` - * Required: `Yes` - -**process(options)** - -An asynchronous function which goes through the three steps mentioned in the introduction. It scans the files in the source directory, cycles through each module, and writes the result to the destination directory. - -Returns the `hoast` instance. - -* `options`: See [options](#options) for more detail about the parameter. - * Type: `Object` - * Required: `No` - -**Asynchronously** - -hoast can be used asynchronously via script, two examples are given below. - -```JavaScript -const Hoast = require(`hoast`); -const read = Hoast.read; - -Hoast(__dirname) - .use(read()) - .process() - // On end. - .then(function(hoast) { - console.log(`Processing successfully finished!`); +import Hoast from '@hoast/hoast' +import ProcessFrontmatter from '@hoast/process-frontmatter' +import ProcessHandlebars from '@hoast/process-handlebars' +import ProcessMarkdown from '@hoast/process-markdown' +import ProcessWritefiles from '@hoast/process-writefiles' +import SourceReadfiles from '@hoast/source-readfiles' + +new Hoast() + // Add a collection. + .addCollection({ + // Read data from the filesystem. + source: new SourceReadfiles({ + directory: 'src/pages', + }), + processes: [ + // Extract frontmatter. + new ProcessFrontmatter(), + // Parse Markdown. + new ProcessMarkdown(), + // Template with Handlebars. + new ProcessHandlebars({ + templateDirectory: 'src/layouts', + templatePath: 'default.hbs', + }), + // Write data to the filesystem. + new ProcessWritefiles({ + directory: 'dst', + }), + ], }) - // On error. - .catch(function(error) { - console.error(error); - }); -``` - -```JavaScript -const Hoast = require(`hoast`); -const read = Hoast.read; - -const build = async function() { - let hoast = Hoast(__dirname); - try { - await hoast - .use(read()) - .process(); - } - // On error. - catch(error) { - console.error(error); - } - // On end. - console.log(`Processing successfully finished!`); -}; - -build(); -``` - -> As you can see in both examples the hoast object is still available for further usage. - -### options - -The options object which can be given using the `constructor` or `process` functions. - -* `source` The directory to process files from. - * Type: `String` - * Default: `source` -* `destination`: The directory to write the processed files to. - * Type: `String` - * Default: `destination` -* `remove`: Whether to remove all files in the destination directory before processing. - * Type: `String` - * Default: `false` -* `patterns`: Glob patterns to match directory and file paths with. If a directory or file path does not match during scanning of the source it will not be further explored. - * Type: `String` or `Array of strings` - * Default: `[]` -* `patternOptions`: Options for the glob pattern matching. See [planckmatch options](https://github.com/redkenrok/node-planckmatch#options) for more details on the pattern options. - * Type: `Object` - * Default: `{}` -* `patternOptions.all`: This options is added to `patternOptions`, and determines whether all patterns need to match instead of only one. - * Type: `Boolean` - * Default: `false` -* `concurrency`: Maximum number of files to process at once. - * Type: `Number` - * Default: `Infinity` -* `metadata`: Metadata that can be used by modules. - * Type: `Object` - * Default: `{}` - -> The defaults are only applied when the constructor is called, the process' options parameter overrides what is set earlier. - -### Debugging - -When making a hoast module I highly recommend activating the debug logs by setting up the environment variables as well as the [debug](https://github.com/visionmedia/debug#readme) module. - -On Windows the environment variable is set using the `set` command. - -``` -set DEBUG=*,-not_this -``` - -Note that PowerShell uses different syntax to set environment variables. - -``` -$env:DEBUG = "*,-not_this" -``` - -## Modules - -As mentioned before the modules handle the logic that transforms the file information into the desired result. They are chained one after another and fed the results of the module that came before it. At the start the only information available is provided by the scanner function which performs a recursive search of the source directory and returns an array with objects of which an example can be seen below. - -```JavaScript -{ - path: `mark/down.md`, - stats: { - dev: 2114, - ino: 48064969, - mode: 33188, - nlink: 1, - uid: 85, - gid: 100, - rdev: 0, - size: 527, - blksize: 4096, - blocks: 8, - atimeMs: 1318289051000, - mtimeMs: 1318289051000, - ctimeMs: 1318289051000, - birthtimeMs: 1532801006990 - } -} -``` - -> For more detail about [stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) see the node documentation. The functions as well as the atime, mtime, ctime, and birthtime are not included. - -### Build-in - -There is a single build-in module which reads the content of the files. It adds a `content` property as either a string or buffer depending if it is utf-8 encoded. - -```JavaScript -{ - content: { - type: `string`, - data: `Hello there.` - } -} -``` - -```JavaScript -{ - content: { - type: `Buffer`, - data: [ 71, 101, 110, 101, 114, 97, 108, 32, 75, 101, 110, 111, 98, 105, 46 ] - } -} -``` - -> This module has to be called before the process function or any module that expects the content property to be set. - -### Usage - -The following example copies only the markdown files from the `source` directory to the `destination` directory. - -```JavaScript -const Hoast = require(`hoast`); -const read = Hoast.read, - filter = require(`hoast-filter`); - -Hoast(__dirname) - // Filter to only include .md files. - .use(filter({ - patterns: `*.md` - })) - .use(read()) - .process() -``` - -> In this example you can see why the read function is not done automatically beforehand. Since you can now eliminate items from being further processed using the [filter](https://github.com/hoast/hoast-filter#readme) module before the read call is made. - -You can re-use the modules after you have called process as seen below. The following script will copy all files from the `sourceA` and `sourceB` directories into the default destination directory. - -```JavaScript -const Hoast = require(`hoast`); -const read = Hoast.read; - -Hoast(__dirname) - // Read file content. - .use(read()) - .process({ - source: `sourceA` - }) - .then(function(hoast) { - return hoast.process({ - source: `sourceB` - });// Read will automatically be used again. - }); -``` - -If you want to start with a fresh set of modules all you have to do is remove out `hoast.modules` property. The following script first copies all markdown files from the default source directory to the destination directory, and then copies all text files from the same source directory to the destination directory. - -```JavaScript -const Hoast = require(`hoast`); -const read = Hoast.read, - filter = require(`hoast-filter`); - -Hoast(__dirname) - // Filter out everything but markdown files. - .use(filter({ - patterns: `*.md` - })) // Only .md files available afterwards. - .use(read()) + // Start processing! .process() - .then(function(hoast) { - // Removing out modules array. - hoast.modules = []; - return hoast - // Filter out everything but text files. - .use(filter({ - patterns: `*.txt` - })) // Only .txt files available afterwards. - .use(read()) - .process(); - }); ``` -> See the [examples](https://github.com/hoast/hoast/tree/master/examples) directory for more in depth usage. +## Architecture -### Making - -In the simplest form the script below is a hoast module. The first time it will be called as a function and arguments can be passed on so properties can be initialized or validated. The return of the function is another function which will be called every time files need to be processed. `hoast` is the hoast instance and has the options property assigned via the constructor or process call. The `files` argument is an array files scanned and ready to me transformed. - -```JavaScript -module.exports = function(options) { - // Prepare anything. - - // Return module. - return function(hoast, files) { - // Perform logic. - }; -}; -``` +The package is build up like most modular build tools these days. There is one core package that controls what and when the modules ran as well as the data provided to them. What modules should run in what order can be controlled using a configuration file or directly through code. -> For future proving and compatibility with the command-line tool use a single options parameter in the exported function. +This repository contains the core package as well as first party modules and everything directly surrounding the project. For example all the packages can be found in `packages` directory, the website's source code can be found in the `.docs` directory and the build of the website is in the `docs` directory. -> See the [remove module](https://github.com/hoast/hoast-remove#readme) for an example. +## Usage -**Asynchronous** +See the [core package](/packages/hoast#readme) for -The modules can also be asynchronously by either adding the [async](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) keyword or using a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). +## Packages -```JavaScript -module.exports = function(options) { - - // Return asynchronous module. - return async function(hoast, files) { - // Perform asynchronous logic. - }; -}; -``` +See the [packages directory](/packages#readme) for the core package as well as a full list of first party modules. -**Overriding files** +### Made with -You can also return a new files array if you need to overwrite the existing one, however it is recommended to iterate over the files using the forEach function instead of map or filter. Use this power carefully! +The following list serve as tools you can use directly, or as an example on how to make a solution that fits your needs. -```JavaScript -module.exports = function(options) { - - return function(hoast, files) { - - // Override files. - return files; - }; -}; -``` +- [`.docs`](/.docs#readme) - The website's source code, which is of course build with this project. +- [`examples`](/examples#readme) - Examples on how Hoast and several modules can be used. -> See the [filter module](https://github.com/hoast/hoast-filter#readme) for an example. +The following list are project that are build with this project. -**hoast helpers** +- [`docs`](hoast.js.org) - The project's website is of couse build using the project itself. -The `hoast` instance includes several helpers which can be used to perform task common across modules. These helpers can be accessed via the `helper` property of the `hoast` instance. See the list below for available functions. +## Version numbering -* `createDirectory(directory)`: Create a directory at the given path. - * `directory`: The path to the desired directory. - * Type: `string` - * Required: `Yes` -* `deepAssign(target, ...sources)`: Deeply assign two or more objects together. - * `target`: Object to assign to. - * Type: `Object` - * Required: `Yes` - * `sources`: Objects to read properties from. - * Type: `Object` - * Required: `No` -* `matchExpressions(value, expressions, all)`: Match a value to regular expressions. - * `value`: Value to match to. - * Type: `String` - * Required: `Yes` - * `expressions`: Regular expressions to match with. - * Type: `String` or `Array of strings` - * Required: `Yes` - * `all`: Whether all or any patterns need to match in order to return a positive result. - * Type: `Boolean` - * Default: `false` -* `parsePatterns(patterns, options, path)`: Parse glob patterns into regular expressions. - * `patterns`: Glob patterns. - * Type: `String` or `Array of strings` - * Required: `Yes` - * `options`: Parse options, see [planckmatch](https://github.com/RedKenrok/node-planckmatch#options)'s parse options for more detail. - * Type: `Object` - * Required: `No` -* `removeFiles(files)`: Remove directories and/or files from storage. - * `files`: Paths of directories and/or files. - * Type: `Array of strings` - * Required: `Yes` -* `removeFiles.single(files)`: Remove a directory or file from storage. - * `file`: Path of directory or file. - * Type: `String` - * Required: `Yes` -* `scanDirectory(directory, expressions, all)`: Retrieve stats of files within a given directory. - * `directory`: Path to directory. - * Type: `String` - * Required: `Yes` - * `expressions`: Regular expressions to match with. - * Type: `String` or `Array of strings` - * Required: `No` - * `all`: Whether all or any expressions need to match. - * Type: `Boolean` - * Default: `false` -* `writeFiles(directory, files)`: Write files to storage. - * `directory`: Path to directory where files are to be written to. - * Type: `String` - * Required: `Yes` - * `files`: List of files with `path` property with the relative path to the given directory and a `content` property with the files content. - * Type: `Array of objects` - * Required: `Yes` -* `writeFiles.single(directory, file)`: Write file to storage. - * `directory`: Path to directory where file is to be written to. - * Type: `String` - * Required: `Yes` - * `file`: Object with `path` property with the relative path to the given directory and a `content` property with the file's content. - * Type: `Object` - * Required: `Yes` +The libraries follow sementic versioning meaning a version number follows the `MAJOR.MINOR.PATCH` format. Each segment is incrementend as follows: -**Before and after** +- `MAJOR` version for backwards incompatible changes are made; +- `MINOR` version for functionality added in a backwards compatible manner; +- `PATCH` version for bug fixes made in a backwards compatible manner. -Some modules might require to be perform logic after all options are initialized or after all files are written to storage. To accommodate this you can add a `before` and `after` function to your main method. These functions can also be asynchronously and are called in the order the modules were added. +Do note each package has their own version number which requires their own minimum version of the core package. Keep this in mind when adding packages to your project. That being said the most recent version of everything should work fine. -```JavaScript -module.exports = function(options) { - - const method = function(hoast, files) { - // Perform logic across files. - }; - - method.before = function(hoast) { - // Called before the files are scanned from storage. - }; - - method.after = function(hoast) { - // Called after the files are written to storage. - }; - - // Return functions. - return method. -}; -``` +## Contribute -> See the [changed module](https://github.com/hoast/hoast-changed#readme) for an example. +Read the [code of conduct](/CODE_OF_CONDUCT.md) and [contributing](/CONTRIBUTING.md) documents to get up to speed on how to get involved. -## Known issues +## Tasklist -* Access modes of directories and files are not transferred. \ No newline at end of file +- Expand examples. +- Improve logger use. +- Finish `isValidConfig` in CLI. +- Write tests. +- Setup GitHub actions to run tests. +- Reduce build times via caching. diff --git a/bin/hoast.js b/bin/hoast.js deleted file mode 100644 index 3646b19..0000000 --- a/bin/hoast.js +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env node - -// Node modules. -const fs = require(`fs`), - path = require(`path`); -// If debug available require it. -let debug; try { debug = require(`debug`)(`hoast-cli`); } catch(error) { debug = function() {}; } -// Dependency modules. -const commander = require(`commander`); -// Custom modules. -const info = require(`../package.json`), - Hoast = require(`../library`); - -// Setup command utility. -commander - .name(info.name) - .description(info.description) - .version(info.version) - .option(`-c, --config `, `path to configuration file`, info.name.concat(`.json`)) - .parse(process.argv); - -// If version or help called do process. -if (commander.version !== true && commander.help !== true) { - console.log(`Start building...`); - let time = process.hrtime(); - - // Translate arguments. - const directory = process.cwd(); - const filePath = path.resolve(directory, commander.config); - debug(`Process from ${filePath} configuration.`); - // Check file access. - fs.access(filePath, fs.constants.F_OK | fs.constants.R_OK, function(error) { - if (error) { - throw error; - } - debug(`Configuration accessible.`); - - // Read file. - fs.readFile(filePath, async function(error, data) { - if (error) { - throw error; - } - debug(`Configuration read: ${data}`); - - // Parse file content to JSON. - const config = JSON.parse(data); - - // Initialize hoast. - const hoast = Hoast(directory, config.options); - - debug(`Start adding modules.`); - // Modules cache. - const moduleCache = { - // Already add in any build-in modules. - read: Hoast.read - }; - // Add all modules. - if (Array.isArray(config.modules)) { - for (let i = 0; i < config.modules.length; i++) { - await addModule(directory, hoast, moduleCache, config.modules[i]); - } - } else if (typeof(config.modules) === `object`) { - await addModule(directory, hoast, moduleCache, config.modules); - } else { - throw { - message: `Modules configuration must be of type object or array.` - }; - } - debug(`Finished adding modules.`); - - // Process. - try { - await hoast.process(); - } catch(error) { - throw error; - } - - time = process.hrtime(time); - console.log(`Finished in ${(time[0] + time[1] / 1e9).toFixed(3)}s.`); - }); - }); - - const addModule = async function(directory, hoast, moduleCache, moduleConfig) { - for (const name in moduleConfig) { - if (!moduleConfig.hasOwnProperty(name)) { - continue; - } - - // If module not already loaded. - if (!moduleCache[name]) { - // Get module path. - const modulePath = await getModulePath(directory, name); - if (!modulePath) { - throw { - message: `Unable to find path to module: '${name}'.` - }; - } - // Require module. - moduleCache[name] = require(modulePath); - } - // Add module to stack. - hoast.use(moduleCache[name](moduleConfig[name])); - debug(`Added '${name}' module.`); - } - }; - - /** - * Tries to retrieve the path to the module of that name. - * @param {String} directory The working directory. - * @param {String} moduleName Name of the module. - */ - const getModulePath = async function(directory, moduleName) { - // Create all possible paths. - let modulePaths = [ - path.resolve(directory, `node_modules`, moduleName), - path.resolve(directory, moduleName), - path.resolve(directory, moduleName).concat(`.js`), - moduleName, - moduleName.concat(`.js`) - ]; - - // Check the access to each path to find the right one. - while(modulePaths.length > 0) { - const modulePath = modulePaths.pop(); - const result = await checkPathAccess(modulePath); - // If result is positive return that path. - if (result) { - return modulePath; - } - } - - // If still not found then exit with an error. - return { - message: `Unable to find the '${moduleName}' module.` - }; - }; - - const checkPathAccess = function(filePath) { - return new Promise(function(resolve) { - fs.access(filePath, fs.constants.F_OK | fs.constants.R_OK, function(error) { - if (error) { - // If not found return false. - return resolve(false); - } - // If found return path. - resolve(true); - }); - }); - }; -} \ No newline at end of file diff --git a/docs/assets/icon-round-128.png b/docs/assets/icon-round-128.png new file mode 100644 index 0000000..55a7f56 Binary files /dev/null and b/docs/assets/icon-round-128.png differ diff --git a/docs/assets/icon-round-256.png b/docs/assets/icon-round-256.png new file mode 100644 index 0000000..c39ce05 Binary files /dev/null and b/docs/assets/icon-round-256.png differ diff --git a/docs/assets/icon-round-512.png b/docs/assets/icon-round-512.png new file mode 100644 index 0000000..e2d985e Binary files /dev/null and b/docs/assets/icon-round-512.png differ diff --git a/docs/assets/manifest.json b/docs/assets/manifest.json new file mode 100644 index 0000000..98eae1f --- /dev/null +++ b/docs/assets/manifest.json @@ -0,0 +1,19 @@ +{ + "start_url": "index.html?utm_source=homescreen", + "name": "Hoast", + "short_name": "Hoast", + "description": "A modular data processor!", + "dir": "ltr", + "lang": "en-GB", + "background_color": "#ffffff", + "theme_color": "#ffffff", + "display": "standalone", + "orientation": "portrait", + "icons": [ + { + "src": "assets/128.png", + "type": "image/png", + "sizes": "128x128" + } + ] +} diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..e5a6b1f --- /dev/null +++ b/docs/index.html @@ -0,0 +1 @@ +Hoast, a modular data processor!

ʕ ˵•ᴥ•ʔ

Hoast

A simple and modular ecosystem for build automation.

Repository

Examples

Packages

Guides

Contribute

MIT licensed

\ No newline at end of file diff --git a/docs/styles/global.css b/docs/styles/global.css new file mode 100644 index 0000000..5c2e25c --- /dev/null +++ b/docs/styles/global.css @@ -0,0 +1 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-weight:300;line-height:2}a,h1,h2,h3,h4,h5,h6{font-weight:600}.container{position:relative;display:table;height:100vh;width:100%;max-width:16em;margin-left:auto;margin-right:auto}.container>.content{display:table-cell;vertical-align:middle;padding-top:.5em;padding-bottom:.75em}.content{padding-left:2em;padding-right:2em}.content>:first-child{margin-top:.25em;margin-bottom:.25em;font-size:4em;font-weight:400;text-align:center;white-space:nowrap}.content img{display:block;margin-left:auto;margin-right:auto}.content ul{padding-left:1em}.content ul li{margin-bottom:1em} \ No newline at end of file diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..c520be1 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,13 @@ +# Examples + +Several examples have been written to help you on your way. See the list below for an overview of these. + +- [`config`](/examples/config) - See several configuration examples to find the one best fit for your needs. +- [`handlebars`](/examples/handlebars) - How to use the `process-handlebars` package. +- [`mithril`](/examples/mithril) - How to use the `process-mithril` package. + +> Is something missing or not clear? Let us know or even better submit a change via a pull request. + +## Running examples + +In order to run an example clone this repository. Run `% yarn install` to install any dependecies then run the `% yarn workspace run `. Where the package name can be found in the package file of each package in the monorepository, and the command name is the a of the scripts object in the package file. diff --git a/examples/config/README.md b/examples/config/README.md new file mode 100644 index 0000000..65cf8dc --- /dev/null +++ b/examples/config/README.md @@ -0,0 +1,53 @@ +# Config example + +Examples on configuring and using hoast and some of its modules. + +## Files + +### hoast-instance.js + +This example creates and exports a hoast instance which is picked up by the command line tool and processed. + +Use the following command from the root directory of the repository to run the example. + +``` +% yarn workspace @hoast/examples run hoast-instance +``` + +> Underneath this will run the command line tool. See the package.json for the exact command. + +### hoast-json.json + +This example consists of a JSON configuration file which is picked up by the command line tool then instantiated and processed. + +Use the following command from the root directory of the repository to run the example. + +``` +% yarn workspace @hoast/examples run hoast-json +``` + +> Underneath this will run the command line tool. See the package.json for the exact command. + +### hoast-object.js + +This example creates and exports a configuration object which is picked up by the command line tool then instantiated and processed. + +Use the following command from the root directory of the repository to run the example. + +``` +% yarn workspace @hoast/examples run hoast-object +``` + +> Underneath this will run the command line tool. See the package.json for the exact command. + +### hoast-process.js + +This example creates a hoast instance and processes it without using the command line tool. + +Use the following command from the root directory of the repository to run the example. + +``` +% yarn workspace @hoast/examples run hoast-process +``` + +> Underneath this will run node directly on the file since it creates and runs the core package directly. See the package.json for the exact command. diff --git a/examples/config/hoast-instance.js b/examples/config/hoast-instance.js new file mode 100644 index 0000000..f16914b --- /dev/null +++ b/examples/config/hoast-instance.js @@ -0,0 +1,17 @@ +import Hoast from '@hoast/hoast' +import ProcessLog from '@hoast/process-log' +import SourceReadfiles from '@hoast/source-readfiles' + +const hoast = new Hoast() + .addCollections([ + { + source: new SourceReadfiles({ + directory: 'src', + }), + processes: [ + new ProcessLog(), + ], + }, + ]) + +export default hoast diff --git a/examples/config/hoast-json.json b/examples/config/hoast-json.json new file mode 100644 index 0000000..b592181 --- /dev/null +++ b/examples/config/hoast-json.json @@ -0,0 +1,15 @@ +{ + "collections": [ + { + "source": [ + "@hoast/source-readfiles", + { + "directory": "src" + } + ], + "processes": [ + "@hoast/process-log" + ] + } + ] +} diff --git a/examples/config/hoast-object.js b/examples/config/hoast-object.js new file mode 100644 index 0000000..b3459e7 --- /dev/null +++ b/examples/config/hoast-object.js @@ -0,0 +1,15 @@ +export default { + collections: [ + { + source: [ + '@hoast/source-readfiles', + { + directory: 'src', + }, + ], + processes: [ + '@hoast/process-log', + ], + }, + ], +} diff --git a/examples/config/hoast-process.js b/examples/config/hoast-process.js new file mode 100644 index 0000000..d351d98 --- /dev/null +++ b/examples/config/hoast-process.js @@ -0,0 +1,16 @@ +import Hoast from '@hoast/hoast' +import ProcessLog from '@hoast/process-log' +import SourceReadfiles from '@hoast/source-readfiles' + +new Hoast() + .addCollections([ + { + source: new SourceReadfiles({ + directory: 'src', + }), + processes: [ + new ProcessLog(), + ], + }, + ]) + .process() diff --git a/examples/config/package.json b/examples/config/package.json new file mode 100644 index 0000000..7785330 --- /dev/null +++ b/examples/config/package.json @@ -0,0 +1,20 @@ +{ + "private": true, + "name": "@hoast/example-config", + "version": "0.0.0", + "dependencies": { + "@hoast/hoast": "x", + "@hoast/process-log": "x", + "@hoast/source-readfiles": "x" + }, + "type": "module", + "scripts": { + "help": "hoast help", + "hoast-instance": "hoast --file-path='hoast-instance.js'", + "hoast-json": "hoast --file-path='hoast-json.json'", + "hoast-object": "hoast --file-path='hoast-object.js'", + "hoast-process": "node ./hoast-process.js", + "version": "hoast version", + "lint": "eslint --fix --cache *.js" + } +} diff --git a/examples/config/src/index.txt b/examples/config/src/index.txt new file mode 100644 index 0000000..cd08755 --- /dev/null +++ b/examples/config/src/index.txt @@ -0,0 +1 @@ +Hello world! diff --git a/examples/handlebars/hoast.js b/examples/handlebars/hoast.js new file mode 100644 index 0000000..2fbfe5d --- /dev/null +++ b/examples/handlebars/hoast.js @@ -0,0 +1,22 @@ +import Hoast from '@hoast/hoast' +import ProcessLog from '@hoast/process-log' +import ProcessHandlebars from '@hoast/process-handlebars' +import SourceReadfiles from '@hoast/source-readfiles' + +const hoast = new Hoast() + .addCollections([ + { + source: new SourceReadfiles({ + directory: 'src/pages', + }), + processes: [ + new ProcessHandlebars({ + templateDirectory: 'src/templates', + templatePath: 'default.hbs', + }), + new ProcessLog(), + ], + }, + ]) + +export default hoast diff --git a/examples/handlebars/package.json b/examples/handlebars/package.json new file mode 100644 index 0000000..0bbc4d3 --- /dev/null +++ b/examples/handlebars/package.json @@ -0,0 +1,16 @@ +{ + "private": true, + "name": "@hoast/example-handlebars", + "version": "0.0.0", + "dependencies": { + "@hoast/hoast": "x", + "@hoast/process-handlebars": "x", + "@hoast/process-log": "x", + "@hoast/source-readfiles": "x" + }, + "type": "module", + "scripts": { + "hoast": "hoast", + "lint": "eslint --fix --cache *.js" + } +} diff --git a/examples/handlebars/src/pages/index.txt b/examples/handlebars/src/pages/index.txt new file mode 100644 index 0000000..cd08755 --- /dev/null +++ b/examples/handlebars/src/pages/index.txt @@ -0,0 +1 @@ +Hello world! diff --git a/examples/handlebars/src/templates/default.hbs b/examples/handlebars/src/templates/default.hbs new file mode 100644 index 0000000..1da41d2 --- /dev/null +++ b/examples/handlebars/src/templates/default.hbs @@ -0,0 +1,11 @@ + + + + + + + + {{{contents}}} + + + diff --git a/examples/mithril/README.md b/examples/mithril/README.md new file mode 100644 index 0000000..3e7f748 --- /dev/null +++ b/examples/mithril/README.md @@ -0,0 +1 @@ +# Mithril example diff --git a/examples/mithril/hoast.js b/examples/mithril/hoast.js new file mode 100644 index 0000000..509b2fa --- /dev/null +++ b/examples/mithril/hoast.js @@ -0,0 +1,24 @@ +import Hoast from '@hoast/hoast' +import ProcessLog from '@hoast/process-log' +import ProcessMithril from '@hoast/process-mithril' +import SourceReadfiles from '@hoast/source-readfiles' + +const hoast = new Hoast() + .addCollections([ + { + source: new SourceReadfiles({ + directory: 'src/pages', + }), + processes: [ + new ProcessMithril({ + componentDirectory: 'src/components', + componentPath: 'html.js', + + prefix: '', + }), + new ProcessLog(), + ], + }, + ]) + +export default hoast diff --git a/examples/mithril/package.json b/examples/mithril/package.json new file mode 100644 index 0000000..e0bc1f3 --- /dev/null +++ b/examples/mithril/package.json @@ -0,0 +1,17 @@ +{ + "private": true, + "name": "@hoast/example-mithril", + "version": "0.0.0", + "dependencies": { + "@hoast/hoast": "x", + "@hoast/process-log": "x", + "@hoast/process-mithril": "x", + "@hoast/source-readfiles": "x", + "mithril": "^2.0.4" + }, + "type": "module", + "scripts": { + "hoast": "hoast", + "lint": "eslint --fix --cache *.js src/components/*.js" + } +} diff --git a/examples/mithril/src/components/html.js b/examples/mithril/src/components/html.js new file mode 100644 index 0000000..1db04a7 --- /dev/null +++ b/examples/mithril/src/components/html.js @@ -0,0 +1,16 @@ +import m from 'mithril' + +export default { + view: function ({ attrs }) { + // Get file contents. + const contents = attrs.data.contents + + // Render component. + return m('html', { + lang: 'en', + }, [ + m('head'), + m('body', contents), + ]) + }, +} diff --git a/examples/mithril/src/pages/index.txt b/examples/mithril/src/pages/index.txt new file mode 100644 index 0000000..cd08755 --- /dev/null +++ b/examples/mithril/src/pages/index.txt @@ -0,0 +1 @@ +Hello world! diff --git a/examples/static-page-generator/README.md b/examples/static-page-generator/README.md deleted file mode 100644 index 6547fb7..0000000 --- a/examples/static-page-generator/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Static page generator - -This example includes two ways of constructing a static web site. The first one is using the command line interface in combination with the `hoast.json`, the other is using node directly with the `hoast.js`. In this case they both work from the same source and will have the same result. Since the `JSON` format does not accept comments, therefore check the `JavaScript` file for an explanation of the build process. - -> To learn more about using the [CLI](https://github.com/hoast/hoast#command-line-interface) see the documentation. - -> To learn more about using the [script](https://github.com/hoast/hoast#script) see the documentation. - -## License -[ISC license](https://github.com/hoast/hoast/blob/master/LICENSE) \ No newline at end of file diff --git a/examples/static-page-generator/hoast.js b/examples/static-page-generator/hoast.js deleted file mode 100644 index 7d801f8..0000000 --- a/examples/static-page-generator/hoast.js +++ /dev/null @@ -1,53 +0,0 @@ -// Get hoast module. -const Hoast = require(`hoast`); -// Get all modules. -const read = Hoast.read, - frontmatter = require(`hoast-frontmatter`), - layout = require(`hoast-layout`), - transform = require(`hoast-transform`); - -Hoast(__dirname, { - // Whenever you generate a build clean out the destination directory beforehand. - remove: true, - // Remove all layouts files from being further processed, by accepting all file paths except for those that start out in the layout directory. - patterns: [ - `*`, - `!(layouts/*)` - ], - patternOptions: { - // All patterns need to be true in order to pass. - all: true, - // Use extended glob patterns so you can use symbols such as explanation marks. - extended: true - } -}) - .use(read()) - .use(frontmatter()) - // For the `transform` module to accept handlebar files the `jstransformer-markdown-it` module needs to be installed. - // See the `package.json` for additional information as well. - .use(transform({ - // All files with the markdown extension. - patterns: `*.md` - })) - // For the `layout` module to accept handlebar files the `jstransformer-handlebars` module needs to be installed. - // See the `package.json` for additional information as well. - .use(layout({ - // All layouts can be found in the layouts directory. - directory: `layouts`, - // The default layout is `page.hbs`. - layout: `page.hbs`, - // All files with the HTML extension. - patterns: `*.html` - })) - // Start processing the files. - .process() - // Called when process has finished. - .then(function(hoast) { - // Process successfully completed. - console.log(`Process successfully finished!`); - }) - // Called if an error occurred during the process. - .catch(function(error) { - // Error received during process. - console.error(error); - }); \ No newline at end of file diff --git a/examples/static-page-generator/hoast.json b/examples/static-page-generator/hoast.json deleted file mode 100644 index 54a556b..0000000 --- a/examples/static-page-generator/hoast.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "options": { - "remove": true, - "patterns": [ - "*", - "!(layouts/*)" - ], - "patternOptions": { - "all": true, - "extended": true - } - }, - "modules": { - "read": {}, - "hoast-frontmatter": {}, - "hoast-transform": { - "patterns": "*.md" - }, - "hoast-layout": { - "directory": "layouts", - "layout": "page.hbs", - "patterns": "*.html" - } - } -} \ No newline at end of file diff --git a/examples/static-page-generator/package.json b/examples/static-page-generator/package.json deleted file mode 100644 index 67272ab..0000000 --- a/examples/static-page-generator/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main": "hoast.js", - "scripts": { - "build-config": "node node_modules/hoast/bin/hoast.js", - "build-script": "node hoast.js" - }, - "dependencies": { - "hoast": "^1.1.5", - "hoast-frontmatter": "^1.2.1", - "hoast-layout": "^1.3.0", - "hoast-transform": "^1.1.1", - "jstransformer-handlebars": "^1.1.0", - "jstransformer-markdown-it": "^2.1.0" - } -} diff --git a/examples/static-page-generator/shrinkwrap.yaml b/examples/static-page-generator/shrinkwrap.yaml deleted file mode 100644 index b022a19..0000000 --- a/examples/static-page-generator/shrinkwrap.yaml +++ /dev/null @@ -1,217 +0,0 @@ -dependencies: - hoast: 1.1.5 - hoast-frontmatter: 1.2.1 - hoast-layout: 1.3.0 - hoast-transform: 1.1.1 - jstransformer-handlebars: 1.1.0 - jstransformer-markdown-it: 2.1.0 -packages: - /argparse/1.0.10: - dependencies: - sprintf-js: 1.0.3 - dev: false - resolution: - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - /asap/2.0.6: - dev: false - resolution: - integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - /async/2.6.1: - dependencies: - lodash: 4.17.11 - dev: false - resolution: - integrity: sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== - /commander/2.17.1: - dev: false - optional: true - resolution: - integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== - /commander/2.19.0: - dev: false - resolution: - integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - /entities/1.1.2: - dev: false - resolution: - integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - /handlebars/4.0.12: - dependencies: - async: 2.6.1 - optimist: 0.6.1 - source-map: 0.6.1 - dev: false - engines: - node: '>=0.4.7' - hasBin: true - optionalDependencies: - uglify-js: 3.4.9 - resolution: - integrity: sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== - /hoast-frontmatter/1.2.1: - dev: false - engines: - node: '>=7.8.0' - resolution: - integrity: sha512-oFKGWZ3vJ0E2i8msmhxBKE5o8F8lJeCji950CNPnnZzex/AJm3MzRFCVels9fnvZUASYgA1xRM2dzgkfFqvmag== - /hoast-layout/1.3.0: - dependencies: - inputformat-to-jstransformer: 1.3.2 - jstransformer: 1.0.0 - dev: false - engines: - node: '>=7.8.0' - resolution: - integrity: sha512-kOjGer2amYy2NC65eX2+sIExG1c6tFUIuv3+zRDROpEKZfrXNeEuZPCbtrYTlc2exZ7PkkMAjfA+DKLyDMy0Dg== - /hoast-transform/1.1.1: - dependencies: - inputformat-to-jstransformer: 1.3.2 - jstransformer: 1.0.0 - dev: false - engines: - node: '>=7.8.0' - resolution: - integrity: sha512-KorP7Yg9dYYIEXeuf1ut9UBTlwYZUdCmfCJ8hWIGZr4mNHoBUy87OGbDmDdyYcIGIwK6JxVURnLahaNfiaD10Q== - /hoast/1.1.5: - dependencies: - commander: 2.19.0 - isutf8: 2.0.2 - planckmatch: 0.2.0 - dev: false - engines: - node: '>=7.8.0' - hasBin: true - resolution: - integrity: sha512-Cwwwo/gi/KntgxHESLLhNN7tgnpKh6xK0tHfpIsNEnHIUElGHkzSC9UAhzpqAzTwm/ghUoGzOT7HTtYbPJJaYw== - /inputformat-to-jstransformer/1.3.2: - dependencies: - require-one: 1.0.3 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-0iXhVOvsa7NzJU+S9VqNyA4o477/h5SFEs8MUoX1/QKmsHGxbFudyrXl2L2w1CmeuUeEHhsAyQ7y51FNlBhC3g== - /is-promise/2.1.0: - dev: false - resolution: - integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - /isutf8/2.0.2: - dev: false - engines: - node: '>= 0.12' - resolution: - integrity: sha512-9lNbG6k+PE6vuFnPTHjhtX79/LDMQrXoFx1MOEjXXCyqFCSahWKAzuAb9G5ct+lfS12aQxNmC0tiZuyujvr4Uw== - /jstransformer-handlebars/1.1.0: - dependencies: - handlebars: 4.0.12 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-kbpW4KKK7jG7VtStvLzlCNgjBGg= - /jstransformer-markdown-it/2.1.0: - dependencies: - markdown-it: 8.4.2 - dev: false - engines: - node: '>=7' - resolution: - integrity: sha1-aewwzkUYvtWZezjwJ2SOjChekvc= - /jstransformer/1.0.0: - dependencies: - is-promise: 2.1.0 - promise: 7.3.1 - dev: false - resolution: - integrity: sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= - /linkify-it/2.1.0: - dependencies: - uc.micro: 1.0.5 - dev: false - resolution: - integrity: sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg== - /lodash/4.17.11: - dev: false - resolution: - integrity: sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - /markdown-it/8.4.2: - dependencies: - argparse: 1.0.10 - entities: 1.1.2 - linkify-it: 2.1.0 - mdurl: 1.0.1 - uc.micro: 1.0.5 - dev: false - hasBin: true - resolution: - integrity: sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== - /mdurl/1.0.1: - dev: false - resolution: - integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - /minimist/0.0.10: - dev: false - resolution: - integrity: sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - /optimist/0.6.1: - dependencies: - minimist: 0.0.10 - wordwrap: 0.0.3 - dev: false - resolution: - integrity: sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - /planckmatch/0.2.0: - dev: false - resolution: - integrity: sha512-osoAGnmIFfU4p2EJ80sPs//ObCEmQla7uxM3NwQpMtB96xlGKGEiDjp7yVsq4fDMoiMLZ/+28bZCs3/m0aUe6g== - /promise/7.3.1: - dependencies: - asap: 2.0.6 - dev: false - resolution: - integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - /require-one/1.0.3: - dev: false - resolution: - integrity: sha1-Dv68zpgP78PfhM4A8mnhnItvSZA= - /source-map/0.6.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - /sprintf-js/1.0.3: - dev: false - resolution: - integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - /uc.micro/1.0.5: - dev: false - resolution: - integrity: sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== - /uglify-js/3.4.9: - dependencies: - commander: 2.17.1 - source-map: 0.6.1 - dev: false - engines: - node: '>=0.8.0' - hasBin: true - optional: true - resolution: - integrity: sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== - /wordwrap/0.0.3: - dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -registry: 'https://registry.npmjs.org/' -shrinkwrapMinorVersion: 9 -shrinkwrapVersion: 3 -specifiers: - hoast: ^1.1.5 - hoast-frontmatter: ^1.2.1 - hoast-layout: ^1.3.0 - hoast-transform: ^1.1.1 - jstransformer-handlebars: ^1.1.0 - jstransformer-markdown-it: ^2.1.0 diff --git a/examples/static-page-generator/source/index.md b/examples/static-page-generator/source/index.md deleted file mode 100644 index edf7295..0000000 --- a/examples/static-page-generator/source/index.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Hoast ---- -This is an example page made with Hoast!. \ No newline at end of file diff --git a/examples/static-page-generator/source/layouts/page.hbs b/examples/static-page-generator/source/layouts/page.hbs deleted file mode 100644 index 16b9a6a..0000000 --- a/examples/static-page-generator/source/layouts/page.hbs +++ /dev/null @@ -1,9 +0,0 @@ - - - - {{ title }} - - - {{{ content }}} - - \ No newline at end of file diff --git a/guides/README.md b/guides/README.md new file mode 100644 index 0000000..c6579ff --- /dev/null +++ b/guides/README.md @@ -0,0 +1,8 @@ +# Guides + +A list of guides to help you on your way are listed below. + +- [`Setup and configuration`](./setup-and-configuration.md) - For those who want to know more on how to get stared. +- [`Writing source packages`](./writing-source-packages.md) - How to get started writing source packges. +- [`Writing process packages`](./writing-process-packages.md) - How to get started writing process packges. +- [`Migrating to v2`](./migrating-to-v2.md) - For those who have used version 1 in the past. diff --git a/guides/migrating-to-v2.md b/guides/migrating-to-v2.md new file mode 100644 index 0000000..f0d8408 --- /dev/null +++ b/guides/migrating-to-v2.md @@ -0,0 +1,11 @@ +# Migrating to v2 + +Version 2 has been a complete rewrite from version 1. The rewrite has come with several benefits the largest one being that collections are sourced via modular packages. A source package does not have to be tied to the filesystem and can therefore fetch data from varying sources for example from external API. + +As a result of the complete rewrite the packages have also drastically changed. Some notable to them changes are: +- The generic layout and transformer packages has been deprecated in order to focus more on creating better intergration with the library used for transformation. An example of this is the new handlebars and markdown packages. +- The changed package is also deprecated it never worked well and was rather unreliable. I will think about a different optimization strategy whick will most likely be done on a source or process package level. Suggestions are as always welcome. +- Filtering can now be done on a package by package basis thanks to the `base-process` package which is inherited by most process packages. As a result a step can be skipped in the processes. This change removes the need for a seprate collection if a single process is different for a few items in a collection. +- Minification can now handled by a postprocess package which also accepts other babel and postcss plugins for transformation of your style sheets and scripts. + +If you want to migrate to the new version you will unfortunately need to rewrite the entire configuration file. An overview of all packages can be found in the [packages directory](/packages). diff --git a/guides/setup-and-configuration.md b/guides/setup-and-configuration.md new file mode 100644 index 0000000..439d898 --- /dev/null +++ b/guides/setup-and-configuration.md @@ -0,0 +1,3 @@ +# Setup and configuration + +TODO: diff --git a/guides/writing-process-packages.md b/guides/writing-process-packages.md new file mode 100644 index 0000000..e8bfd94 --- /dev/null +++ b/guides/writing-process-packages.md @@ -0,0 +1,3 @@ +# Writing process packages + +TODO: diff --git a/guides/writing-source-packages.md b/guides/writing-source-packages.md new file mode 100644 index 0000000..9348839 --- /dev/null +++ b/guides/writing-source-packages.md @@ -0,0 +1,3 @@ +# Writing source packages + +TODO: diff --git a/hoast.code-workspace b/hoast.code-workspace new file mode 100644 index 0000000..022c3e5 --- /dev/null +++ b/hoast.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} diff --git a/icons/128.png b/icons/128.png deleted file mode 100644 index 516b2be..0000000 Binary files a/icons/128.png and /dev/null differ diff --git a/library/helpers/createDirectory.js b/library/helpers/createDirectory.js deleted file mode 100644 index 5a5ef7e..0000000 --- a/library/helpers/createDirectory.js +++ /dev/null @@ -1,56 +0,0 @@ -// Node modules. -const fs = require(`fs`), - path = require(`path`); - -/** - * Create a directory. - * @param {String} directory Path of the directory. - */ -const createDirectory = function(directory) { - // Join and split path into sequential directory segments. - directory = directory.split(path.sep); - - // If path started with separator prepend this to the first segment. - if (directory[0] === ``) { - directory.shift(); - directory[0] = `${path.sep}${directory[0]}`; - } - - // Iterate over each part of the directory path and add the next part to each subsequent promise. - return directory.reduce(function(promise, directory) { - return promise.then(function(previous) { - if (previous) { - directory = `${previous}${path.sep}${directory}`; - } - - // Check if directory already exists. - if (fs.existsSync(directory)) { - // Directory already exists go to next element of path. - return new Promise(function(resolve, reject) { - fs.lstat(directory, function(error, stats) { - if (error) { - return reject(error); - } - resolve(stats); - }); - }).then(function(stats) { - if (stats.isDirectory()) { - return directory; - } - }); - } - - // Create the directory. - return new Promise(function(resolve, reject) { - fs.mkdir(directory, function(error) { - if (error && error.code !== `EEXIST`) { - return reject(error); - } - resolve(directory); - }); - }); - }); - }, Promise.resolve(null)); -}; - -module.exports = createDirectory; \ No newline at end of file diff --git a/library/helpers/deepAssign.js b/library/helpers/deepAssign.js deleted file mode 100644 index c624dc2..0000000 --- a/library/helpers/deepAssign.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Check whether the value is an object. - * @param {Any} value Value of unknown type. - * @returns Whether the value is an object. - */ -const isObject = function(value) { - return (value && typeof value === `object` && !Array.isArray(value)); -}; - -/** - * Deeply assign a series of objects properties together. - * @param {Object} target Target object to merge to. - * @param {...Object} sources Objects to merge into the target. - */ -const deepAssign = function(target, ...sources) { - if (!sources.length) { - return target; - } - const source = sources.shift(); - - if (isObject(target) && isObject(source)) { - for (const key in source) { - if (isObject(source[key])) { - if (!target[key]) { - Object.assign(target, { - [key]: {} - }); - } - deepAssign(target[key], source[key]); - } else { - Object.assign(target, { - [key]: source[key] - }); - } - } - } - - return deepAssign(target, ...sources); -}; - -module.exports = deepAssign; \ No newline at end of file diff --git a/library/helpers/matchExpressions.js b/library/helpers/matchExpressions.js deleted file mode 100644 index c0b0f91..0000000 --- a/library/helpers/matchExpressions.js +++ /dev/null @@ -1,20 +0,0 @@ -// Dependency modules -const _match = require(`planckmatch/match`); - -/** - * Check if expressions match with the given value. - * @param {String} value String to match with the expressions. - * @param {RegExps|Array} expressions Regular expressions to match with. - * @param {Boolean} all Whether all patterns need to match. - */ -const match = function(value, expressions, all = false) { - // If no expressions return early as valid. - if (!expressions || expressions.length === 0) { - return true; - } - - // Check whether all or just any will result in a match, and return the outcome. - return all ? _match.all(value, expressions) : _match.any(value, expressions); -}; - -module.exports = match; \ No newline at end of file diff --git a/library/helpers/removeFiles.js b/library/helpers/removeFiles.js deleted file mode 100644 index abee01b..0000000 --- a/library/helpers/removeFiles.js +++ /dev/null @@ -1,68 +0,0 @@ -// Node modules. -const fs = require(`fs`), - path = require(`path`); - -/** - * Remove directories and/or files. - * @param {String[]} files Paths of directories and\or files. - */ -const removeFiles = function(files) { - // If array iterate over each file. - return Promise.all( - files.map(function(file) { - return removeFiles.single(file); - }) - ); -}; - -/** - * Remove directory or file. - * @param {String} file Path of directory or file. - */ -removeFiles.single = function(file) { - return new Promise(function(resolve, reject) { - fs.lstat(file, function(error, stats) { - if (error) { - if (error.code === `ENOENT`) { - // File does not exist. - return resolve(); - } - return reject(error); - } - - if (stats.isFile()) { - // If file unlink it. - fs.unlink(file, function (error) { - if (error) { - return reject(error); - } - resolve(); - }); - } else { - // For readability use 'directory' instead if 'file' - const directory = file; - // Get All files within the directory. - fs.readdir(directory, function(error, directoryFiles) { - if (error) { - return reject(error); - } - - // If directory then remove each directory and\or file within, then remove this directory. - Promise.all(directoryFiles.map(function(directoryFile) { - return removeFiles.single(path.join(directory, directoryFile)); - })).then(function() { - // Remove the now empty directory. - fs.rmdir(directory, function(error) { - if (error) { - return reject(error); - } - resolve(); - }); - }).catch(reject); - }); - } - }); - }); -}; - -module.exports = removeFiles; \ No newline at end of file diff --git a/library/helpers/scanDirectory.js b/library/helpers/scanDirectory.js deleted file mode 100644 index 821a4dc..0000000 --- a/library/helpers/scanDirectory.js +++ /dev/null @@ -1,96 +0,0 @@ -// Node modules. -const fs = require(`fs`), - path = require(`path`); -// Custom modules. -const match = require(`./matchExpressions`); - -/** - * Scan a directory recursively. - * @param {String} directory Directory name. - * @param {RegExps|Array} expression Regular Expression for matching with file paths. - * @param {Boolean} all Whether all patterns need to match. - */ -const scanDirectory = function(directory, expressions, all = false) { - // Create inner scan method that can be recursively called whilst still having access to the 'expressions' and 'all' parameters. - const scan = async function(directory, relative) { - // Create absolute path. - let absolute; - if (relative) { - absolute = path.join(directory, relative); - } else { - relative = ``; - absolute = directory; - } - - return new Promise(function(resolve, reject) { - // Retrieve file status. - fs.lstat(absolute, function(error, stats) { - if (error) { - return reject(error); - } - - // If it is a file resolve with its stats. - if (stats.isFile()) { - resolve({ - path: relative, - stats: { - dev: stats.dev, - ino: stats.ino, - mode: stats.mode, - nlink: stats.nlink, - uid: stats.uid, - gid: stats.gid, - rdev: stats.rdev, - size: stats.size, - blksize: stats.blksize, - blocks: stats.blocks, - atimeMs: stats.atimeMs, - mtimeMs: stats.mtimeMs, - ctimeMs: stats.ctimeMs, - birthtimeMs: stats.birthtimeMs - } - }); - return; - } - - // Read directory and invoke this method for all items in it. - fs.readdir(absolute, function(error, files) { - if (error) { - return reject(error); - } - - // Recursively call for each file in subdirectory. - Promise.all(files.map(function(file) { - // Create new relative path. - const newRelative = path.join(relative, file); - - // Check if path still matches expression. - if (!match(newRelative, expressions, all)) { - return; - } - - // Recursively call this again. - return scan(directory, newRelative); - })).then(function(result) { - // Flatten array before returning. - resolve(result.reduce(function(previous, current) { - if (!current) { - return previous; - } else if (Array.isArray(current)) { - return previous.concat(current); - } else { - previous.push(current); - return previous; - } - }, [])); - }).catch(reject); - }); - }); - }); - }; - - // Return first call of scan. - return scan(directory); -}; - -module.exports = scanDirectory; \ No newline at end of file diff --git a/library/helpers/writeFiles.js b/library/helpers/writeFiles.js deleted file mode 100644 index 1738718..0000000 --- a/library/helpers/writeFiles.js +++ /dev/null @@ -1,43 +0,0 @@ -// Node modules. -const fs = require(`fs`), - path = require(`path`); -// Custom modules -const createDirectory = require(`./createDirectory`); - -/** - * Writes each file to the directory. - * @param {String} directory Directory path. - * @param {Object} files File dataset. - */ -const writeFiles = function(directory, files) { - return Promise.all( - files.map(function(file) { - return writeFiles.single(directory, file); - }) - ); -}; - -/** - * Write the file to the directory. - * @param {String} directory Directory path. - * @param {Object} file File data. - */ -writeFiles.single = function(directory, file) { - return new Promise(function(resolve, reject) { - createDirectory(path.join(directory, path.dirname(file.path))) - .then(function() { - fs.writeFile( - path.join(directory, file.path), - file.content.type === `string` ? file.content.data : file.content, - function(error) { - if (error) { - return reject(error); - } - resolve(); - } - ); - }).catch(reject); - }); -}; - -module.exports = writeFiles; \ No newline at end of file diff --git a/library/index.js b/library/index.js deleted file mode 100644 index 777507a..0000000 --- a/library/index.js +++ /dev/null @@ -1,195 +0,0 @@ -// Node modules. -const path = require(`path`); -// If debug available require it. -let debug; try { debug = require(`debug`)(`hoast`); } catch(error) { debug = function() {}; } - -/** - * Initializes the object. - * @param {Object} directory The directory to operate from. - * @param {Object} options The options. - */ -const Hoast = function(directory, options) { - // Create instance of this. - if (!(this instanceof Hoast)) { - return new Hoast(directory, options); - } - debug(`Initializing.`); - - // Directory. - this.directory = directory; - - // Set default options. - this.options = { - source: `source`, - destination: `destination`, - - remove: false, - patterns: [], - patternOptions: {}, - concurrency: Infinity, - - metadata: {} - }; - if (options) { - // Override default options. - this.options = Object.assign(this.options, options); - - // Parse new patterns to expressions. - if (options.patterns) { - this.expressions = this.helper.parse(this.options.patterns, this.options.patternOptions, true); - debug(`Patterns parsed to '${this.expressions}'.`); - } - } - - debug(`Initialized.`); -}; - -// Build in read module required to run before process. -Hoast.read = require(`./read`); - -// Add helpers. -Hoast.helpers = Hoast.prototype.helpers = { - createDirectory: require(`./helpers/createDirectory`), - deepAssign: require(`./helpers/deepAssign`), - matchExpressions: require(`./helpers/matchExpressions`), - parsePatterns: require(`planckmatch/parse`), - removeFiles: require(`./helpers/removeFiles`), - scanDirectory: require(`./helpers/scanDirectory`), - writeFiles: require(`./helpers/writeFiles`) -}; -// Legacy helpers. -Hoast.helper = Hoast.prototype.helper = { - createDirectory: require(`./helpers/createDirectory`), - match: require(`./helpers/matchExpressions`), - parse: require(`planckmatch/parse`), - remove: require(`./helpers/removeFiles`), - scanDirectory: require(`./helpers/scanDirectory`), - writeFiles: require(`./helpers/writeFiles`) -}; - -/** - * Add a module to the processing stack. - * @param {Function} module A Hoast compatible module function. - */ -Hoast.prototype.use = function(module) { - // Reset modules array if not set or of incorrect type. - if (this.modules == null || !Array.isArray(this.modules)) { - this.modules = []; - debug(`Initialized modules array.`); - } - // Add module to list. - this.modules.push(module); - return this; -}; - -/** - * Process the files using the specified modules. - * @param {Object} options - */ -Hoast.prototype.process = async function(options) { - if (options) { - // Override options. - this.options = Object.assign(this.options, options); - - // Parse new patterns to expressions. - if (options.patterns) { - this.expressions = this.helpers.parsePatterns(this.options.patterns, this.options.patternOptions); - debug(`Patterns parsed to '${this.expressions}'.`); - } - } - debug(`Start processing files in '${this.options.source}' directory.`); - - // Absolute directory to remove and write from. - const directoryDestination = path.join(this.directory, this.options.destination), - directorySource = path.join(this.directory, this.options.source); - - // Remove the destination directory or specified files within it. - if (this.options.remove) { - debug(`Start removing.`); - - // Remove type. - const type = typeof(this.options.remove); - if (type === `boolean`) { - debug(`Removing '${directoryDestination}' directory.`); - - // If no file paths are defined then remove the entire destination directory. - await this.helpers.removeFiles.single(directoryDestination); - } else if (type === `string`) { - debug(`Removing '${this.options.remove}' directory/file in '${directoryDestination}' directory.`); - - // Remove given directory or file. - await this.helpers.removeFiles.single(path.join(directoryDestination, this.options.remove)); - } else if (Array.isArray(this.options.remove)) { - debug(`Removing listed directories and/or files in '${directoryDestination}' directory.`); - - // Remove all directories or files listed in the array. - await this.helpers.removeFiles( - this.options.remove.map(function(file) { - return path.join(directoryDestination, file); - }) - ); - } else { - debug(`Nothing removed as 'remove' option not of valid type.`); - } - debug(`Finished removing.`); - } - - // Call before function on modules. - debug(`Start calling before function on modules.`); - for (let i = 0; i < this.modules.length; i++) { - if (this.modules[i].hasOwnProperty(`before`) && typeof(this.modules[i].before) === `function`) { - await this.modules[i].before(this); - } - } - debug(`Finished calling before function on modules.`); - - // Scan source for files. - debug(`Scanning files.`); - let files = await this.helpers.scanDirectory(directorySource, this.expressions, this.options.patternOptions.all); - debug(`Scanned files, found ${files.length} files.`); - - // Batch out files as to not handle to many at once. - let batch; - while (files.length > 0) { - // Slice files based on concurrent option into batches. - batch = files.splice(0, this.options.concurrency); - debug(`Created batch of ${batch.length} files.`); - - // Process each module over the batched files. - for (let i = 0; i < this.modules.length; i++) { - // Override batch if new files are returned. - batch = await this.modules[i](this, batch) || batch; - // Check if any files are left in the batch. - if (batch.length <= 0) { - break; - } - } - debug(`Batched processed.`); - - // Check if any files left to write to storage. - if (batch.length <= 0) { - debug(`No files left in batch to write to storage.`); - continue; - } - - // Write batched files to disk. - debug(`Writing batch to storage.`); - await this.helpers.writeFiles(directoryDestination, batch); - debug(`Batch written.`); - } - debug(`Finished processing files to '${directoryDestination}' directory.`); - - // Call after function on modules. - debug(`Start calling after function on modules.`); - for (let i = 0; i < this.modules.length; i++) { - if (this.modules[i].hasOwnProperty(`after`) && typeof(this.modules[i].after) === `function`) { - await this.modules[i].after(this); - } - } - debug(`Finished calling after function on modules.`); - - // Return hoast. - return this; -}; - -module.exports = Hoast; \ No newline at end of file diff --git a/library/read.js b/library/read.js deleted file mode 100644 index fe39ddf..0000000 --- a/library/read.js +++ /dev/null @@ -1,45 +0,0 @@ -// Node modules. -const fs = require(`fs`), - path = require(`path`); -// Dependency module. -const isutf8 = require(`isutf8`); - -/** - * Read the content of the file. - * @param {Object} directory The directory path of the file. - * @param {Object} file The file data. - */ -const read = function(directory, file) { - return new Promise(function(resolve, reject) { - fs.readFile(path.join(directory, file.path), function(error, buffer) { - if (error) { - return reject(error); - } - return resolve( - Object.assign(file, { - // If file is utf8 store it as a string. - content: isutf8(buffer) ? { - type: `string`, - data: buffer.toString() - } : buffer, - }) - ); - }); - }); -}; - -/** - * Read module which reads the content of each file. - */ -module.exports = function() { - /** - * Reads data from all the given files. - * @param {Object} hoast Hoast instance. - * @param {Object[]} files An array of file data. - */ - return async function(hoast, files) { - await Promise.all(files.map(function(file) { - return read(path.join(hoast.directory, hoast.options.source), file); - })); - }; -}; \ No newline at end of file diff --git a/package.json b/package.json index fd019d0..80cf28f 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,25 @@ { - "author": { - "name": "Ron Dekker", - "url": "https://rondekker.nl" - }, - "name": "hoast", - "version": "1.1.5", - "description": "A modular file processor focused on creating a simple ecosystem for task automation.", - "license": "ISC", - "keywords": [ - "modular", - "file", - "processor" - ], - "homepage": "https://hoast.github.io/hoast", - "repository": { - "type": "git", - "url": "git+https://github.com/hoast/hoast.git" - }, - "bugs": { - "url": "https://github.com/hoast/hoast/issues" - }, - "engines": { - "node": ">=7.8.0" - }, - "main": "library/index.js", - "bin": { - "hoast": "bin/hoast.js" - }, - "files": [ - "*.js", - "bin/", - "library/" + "private": true, + "name": "@hoast/workspace", + "description": "A set of simple and modular packages for build automation.", + "workspaces": [ + ".docs/", + "examples/*", + "packages/*" ], "scripts": { - "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", - "pretest": "eslint library/**/*.js bin/**/*.js test/**/*.js", - "test": "nyc --reporter=text ava \"test/**/*.js\" --verbose", - "next": "npm publish --tag next" - }, - "dependencies": { - "commander": "^2.19.0", - "isutf8": "^2.0.2", - "planckmatch": "^0.2.0" + "docs:build": "yarn workspace @hoast/docs run build", + "docs:develop": "yarn workspace @hoast/docs run develop", + "help": "hoast h", + "lint": "yarn workspaces run lint", + "version": "hoast v" }, "devDependencies": { - "ava": "^0.25.0", - "codecov": "^3.1.0", - "debug": "^4.1.0", - "eslint": "^5.10.0", - "nyc": "^13.1.0" + "eslint": "^7.7.0", + "eslint-config-standard": "^14.1.1", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1" } } diff --git a/packages/README.md b/packages/README.md new file mode 100644 index 0000000..cc94447 --- /dev/null +++ b/packages/README.md @@ -0,0 +1,42 @@ +# Packages + +- [`hoast`](/packages/hoast) - The core package of hoast responsible for managing and running the other packages. + +## Source packages + +- [`source-custom`](/packages/source-custom) - Allows you to provide your own custom source functions. Extends base-source where the overridabel functions can be provided via the options. Helps you from having to create a package for simple one-off behaviour. +- [`source-readfiles`](/packages/source-readfiles) - Read files from the filesystem. + +## Process packages + +- [`process-custom`](/packages/process-custom) - Allows you to provide your own custom process functions. Extends base-process where the overridabel functions can be provided via the options. Helps you from having to create a package for simple one-off behaviour. +- [`process-frontmatter`](/packages/process-frontmatter) - Extract frontmatter from a text value. +- [`process-handlebars`](/packages/process-handlebars) - Template using [Handlebars](https://github.com/handlebars-lang/handlebars.js#readme). +- [`process-javascript`](/packages/process-javascript) - Retrieve and or execute JavaScript. +- [`process-log`](/packages/process-log) - Log data to the terminal, useful for developing other process and source packages. +- [`process-markdown`](/packages/process-markdown) - Convert markdown to HTML using [Unified](https://github.com/unifiedjs/unified#readme). +- [`process-mithril`](/packages/process-mithril) - Template using [Mithril](https://github.com/MithrilJS/mithril.js#readme). +- [`process-parse`](/packages/process-parse) - Parse a text value using a function or package. +- [`process-postprocess`](/packages/process-postprocess) - Process CSS, HTML, and JS data using Postcss and Babel plugins. Only minifies by default using cleancss, html-minifier-terser, and terser. +- [`process-writefiles`](/packages/process-writefiles) - Write data to the filesystem. + +## For developers + +- [`base-package`](/packages/base-package) - Provides basic functionality like receiving the app reference and setting up a logger. +- [`base-process`](/packages/base-process) - Provides basic functionality for process package like an initialization function, sequentially running of certain code, and filtering out running the process based of the data. +- [`base-source`](/packages/base-source) - Provides basic functionality for source package like an initialization function, sequentially running of certain code, and a finallize function called after the source is done iterating. +- [`utils`](/packages/utils) - A package of utility functions used by several other packages in this list. + +## Package ideas + +The project can always grow and find new problems to solve. A short list of ideas that might spark your imagination are written below. If you want to create one of these modules do let me know by creating an issue. I would love to help where I can. + +### Source packages + +- `source-graphql` - Retrieve data via GraphQL queries. +- `source-rest` - Retrieve data via restful calls. + +### Process packages + +- `process-` - Process queries from the given data. Perhaps via GrapQL or another query method. +- `process-` - More render methods are always welcome as everyone has a favourite or is already using one in a project they want to migrate over. diff --git a/packages/base-package/README.md b/packages/base-package/README.md new file mode 100644 index 0000000..3d3fcb1 --- /dev/null +++ b/packages/base-package/README.md @@ -0,0 +1,53 @@ +# @hoast/base-package + +Provides basic functionality like receiving the app reference and setting up a logger. Meant for developers to be used as a base for a [hoast](https://hoast.js.org) source or process package. + +## Install + +``` +% yarn add @hoast/base-package +``` + +OR + +``` +% npm install @hoast/base-package --save +``` + +## Usage + +### Constructor + +- `constructor` Create package instance. + - `@param {Object} ...Options` Options objects which can contain the following key. + - `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). + +### Variables + +- `{Object} _app` Hoast instance. +- `{Object} _options` Merged options. +- `{Object} _logger` [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js) instance. + +### Functions + +- `_setApp` Set app reference. This will be called by hoast itself before the next function is called. + - `@params {Object} app` hoast instance. + +### Example + +```JavaScript +// Import base modules. +import BasePackage from '@hoast/base-package' + +class NewPackage extends BasePackage { + constructor(options) { + super({ + // Default options. + }, options) + } +} + +export default NewPackage +``` + +See the [@hoast/process-log](https://github.com/hoast/hoast/tree/master/packages/process-log#readme) package for another example. diff --git a/packages/base-package/package.json b/packages/base-package/package.json new file mode 100644 index 0000000..c355675 --- /dev/null +++ b/packages/base-package/package.json @@ -0,0 +1,36 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/base-package", + "version": "2.0.0", + "description": "Base package for other packages.", + "keywords": [ + "hoast", + "base", + "processor" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/*.js" + ], + "main": "src/BasePackage.js", + "scripts": { + "lint": "eslint --fix --cache src/*.js" + }, + "dependencies": { + "@hoast/utils": "2.0.0" + } +} diff --git a/packages/base-package/src/BasePackage.js b/packages/base-package/src/BasePackage.js new file mode 100644 index 0000000..c358df3 --- /dev/null +++ b/packages/base-package/src/BasePackage.js @@ -0,0 +1,29 @@ +// Import external modules. +import Logger from '@hoast/utils/Logger.js' +import deepAssign from '@hoast/utils/deepAssign.js' + +class BasePackage { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(...options) { + // Set initial options. + this._options = deepAssign({ + logLevel: 2, + }, ...options) + + // Create internal logger. + this._logger = new Logger(this._options.logLevel, this.constructor.name) + } + + /** + * Set app reference. This will be called by hoast itself before the next function is called. + * @param {Object} app Hoast instance. + */ + _setApp (app) { + this._app = app + } +} + +export default BasePackage diff --git a/packages/base-process/README.md b/packages/base-process/README.md new file mode 100644 index 0000000..8650321 --- /dev/null +++ b/packages/base-process/README.md @@ -0,0 +1,103 @@ +# @hoast/base-process + +Provides basic functionality for process package like an initialization function, sequentially running of certain code, and filtering out running the process based of the data. Meant for developers to be used as a base for a [hoast](https://hoast.js.org) process package. + +## Install + +``` +% yarn add @hoast/base-process +``` + +OR + +``` +% npm install @hoast/base-process --save +``` +## Usage + +### Constructor + +- `constructor` Create package instance. + - `@param {Object} ...Options` Options objects which can contain the following keys. + - `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + + - `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). + +### Variables + +- `{Boolean} _hasInitialize` True if the derived class has a `initialize` function. +- `{Boolean} _hasSequential` True if the derived class has a `sequential` function. +- `{Boolean} _hasConcurrent` True if the derived class has a `concurrent` function. + +- `{Array} _filterExpressions` Parsed `options.filterPatterns` values as regular expressions. +- `{Array} _filterPropertyPath` Parsed `options.filterProperty` value as series of strings. + +#### Inherited + +- `{Object} _app` Hoast instance. +- `{Object} _options` Merged options. +- `{Object} _logger` [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js) instance. + +### Functions + +- `async next` This will be called by hoast itself to process the given item. + - `@param {Any} data` Data to process. + - `@returns {Any}` Item to be processed. +- `async _next` Internally called to process the given item. + - `@param {Any} data` Data to process. + - `@returns {Any}` Item to be processed. + +#### Inherited + +- `_setApp` Set app reference. This will be called by hoast itself before the next function is called. + - `@params {Object} app` hoast instance. + +### Abstract functions + +The following functions can be implimented by the derived class and will automatically called if present. All functions are optional and don't have to be asynchronous. + +- `async initialize` Called only once before sequential and concurrent. +- `async sequential` Called sequentially for each iteration call. Meaning while this method is running it won't be called until the ongoing call is finished. + - `@params {Any}` Item. + - `@returns {Any}` Item. +- `async concurrent` Called concurrently for each iteration call after the sequential call. Meaning this will run after the sequential call and in contrast to the sequential function will be called before a previous call has finished. + - `@params {Any}` Item. + - `@returns {Any}` Item. +- `async final` Called after the processor has iterated over all data. + +### Example + +```JavaScript +// Import base modules. +import BaseProcess from '@hoast/base-process' + +class NewProcess extends BaseProcess { + constructor(options) { + super({ + // Default options. + }, options) + } + + async initialize() { + // Initialize. + } + + async sequential(data) { + // Sequential. + return data + } + + async concurrent(data) { + // Concurrent. + return data + } + + async final() { + // Final. + } +} + +export default NewProcess +``` + +See the [@hoast/process-writefiles](https://github.com/hoast/hoast/tree/master/packages/process-writefiles#readme) package for another example. diff --git a/packages/base-process/package.json b/packages/base-process/package.json new file mode 100644 index 0000000..8e223c5 --- /dev/null +++ b/packages/base-process/package.json @@ -0,0 +1,36 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/base-process", + "version": "2.0.0", + "description": "Base package for process packages.", + "keywords": [ + "hoast", + "base", + "process" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/*.js" + ], + "main": "src/BaseProcess.js", + "scripts": { + "lint": "eslint --fix --cache src/*.js" + }, + "dependencies": { + "@hoast/base-package": "2.0.0" + } +} diff --git a/packages/base-process/src/BaseProcess.js b/packages/base-process/src/BaseProcess.js new file mode 100644 index 0000000..af40665 --- /dev/null +++ b/packages/base-process/src/BaseProcess.js @@ -0,0 +1,107 @@ +// Import base class. +import BasePackage from '@hoast/base-package' + +class BaseProcess extends BasePackage { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(...options) { + super({ + filter: null, + }, ...options) + + this._hasInitialize = typeof (this.initialize) === 'function' + this._hasSequential = typeof (this.sequential) === 'function' + this._hasConcurrent = typeof (this.concurrent) === 'function' + + if (this._hasInitialize) { + this._isInitialized = false + } + if (this._hasInitialize || this._hasSequential) { + this._holdCalls = false + this._promiseQueue = [] + } + } + + /** + * This will be called by hoast itself to process the given item. + * @param {Any} data Data to process. + * @returns {Any} Processed data. + */ + async next (data) { + // Exit early now if filtered out. + if (this._options.filter) { + // Skip if custom functions returns false. + if (!this._options.filter(data)) { + return data + } + } + + if ((!this._hasInitialize || this._isInitialized) && !this._hasSequential) { + // Run concurrent part. + return await this.concurrent(data) + } + + // Check if calls should be held. + if (this._holdCalls) { + // Add calls to queue. + return await new Promise((resolve, reject) => { + this._promiseQueue.push({ + resolve, + reject, + data, + }) + }) + } + + // Hold new calls. + this._holdCalls = true + + // Try initialization. + if (this._hasInitialize && !this._isInitialized) { + await this.initialize() + this._isInitialized = true + } + + // Run now. + return await this._next(data) + } + + /** + * Internally called to process the given item. + * @param {Any} data Data to process. + * @returns {Any} Processed data. + */ + async _next (data) { + if (this._hasSequential) { + // Run sequential part. + data = await this.sequential(data) + } + + if (this._hasInitialize || this._hasSequential) { + // Run any promises. + if (this._promiseQueue.length > 0) { + // Run next iteration. + const promise = this._promiseQueue.shift() + try { + promise.resolve(this._next(promise.data)) + } catch (error) { + promise.reject(error) + } + } else { + // Set hold back to false. + this._holdCalls = false + } + } + + if (this._hasConcurrent) { + // Run concurrent part. + data = await this.concurrent(data) + } + + return data + } +} + +export default BaseProcess diff --git a/packages/base-source/README.md b/packages/base-source/README.md new file mode 100644 index 0000000..5f367a7 --- /dev/null +++ b/packages/base-source/README.md @@ -0,0 +1,104 @@ +# @hoast/base-source + +Provides basic functionality for source package like an initialization function, sequentially running of certain code, and a finallize function called after the source is done iterating. Meant for developers to be used as a base for a [hoast](https://hoast.js.org) source package. + +## Install + +``` +% yarn add @hoast/base-source +``` + +OR + +``` +% npm install @hoast/base-source --save +``` + +## Usage + +### Constructor + +- `constructor` Create package instance. + - `@param {Object} ...Options` Options objects which can contain the following keys. + - `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). + +### Variables + +- `{Boolean} done` Is set to true if all items are returned. +- `{Boolean} exhausted` Set `exhausted` to true if the source has ran out of items to return. + +- `{Boolean} _hasInitialize` True if the derived class has a `initialize` function. +- `{Boolean} _hasSequential` True if the derived class has a `sequential` function. +- `{Boolean} _hasConcurrent` True if the derived class has a `concurrent` function. +- `{Boolean} _hasFinal` True if the derived class has a `final` function. + +- `{Boolean} _holdCalls` Whether next calls are temporarily held while the initialize or sequential function is running. +- `{Array} _promiseQueue` A queue of next calls that gets added to while hold calls is true. + +#### Inherited + +- `{Object} _app` Hoast instance. +- `{Object} _options` Merged options. +- `{Object} _logger` [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js) instance. + +### Functions + +- `async next` This will be called by hoast itself to retrieve the next item. + - `@returns {Any}` Retrieved data. +- `async _next` Internally called to retrieve the next item. + - `@returns {Any}` Retrieved data. + +#### Inherited + +- `_setApp` Set app reference. This will be called by hoast itself before the next function is called. + - `@params {Object} app` hoast instance. + +### Abstract functions + +The following functions can be implimented by the derived class and will automatically called if present. All functions are optional and don't have to be asynchronous. + +- `async initialize` Called only once before sequential and concurrent. +- `async sequential` Called sequentially for each iteration call. Meaning while this method is running it won't be called until the ongoing call is finished. Useful for processes that have to happen in order. Useful for iterating over the items in the filesystem. + - `@returns {Any}` Item. +- `async concurrent` Called concurrently for each iteration call after the sequential call. Meaning this will run after the sequential call and in contrast to the sequential function will be called before a previous call has finished. Useful for reading file contents from the filesystem. + - `@params {Any}` Data returned by the sequential method. + - `@returns {Any}` Item. +- `async final` Called after the source has been exhausted and is finished. + +### Example + +```JavaScript +// Import base modules. +import BaseSource from '@hoast/base-source' + +class NewSource extends BaseSource { + constructor(options) { + super({ + // Default options. + }, options) + } + + async initialize() { + // Initialize. + } + + async sequential() { + // Sequential. + this.exhausted = true + return {} + } + + async concurrent(data) { + // Concurrent. + return data + } + + async final() { + // Final. + } +} + +export default NewSource +``` + +See the [@hoast/source-readfiles](https://github.com/hoast/hoast/tree/master/packages/source-readfiles#readme) package for another example. diff --git a/packages/base-source/package.json b/packages/base-source/package.json new file mode 100644 index 0000000..cd83bc2 --- /dev/null +++ b/packages/base-source/package.json @@ -0,0 +1,36 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/base-source", + "version": "2.0.0", + "description": "Base package for source packages.", + "keywords": [ + "hoast", + "base", + "source" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/*.js" + ], + "main": "src/BaseSource.js", + "scripts": { + "lint": "eslint --fix --cache src/*.js" + }, + "dependencies": { + "@hoast/base-package": "2.0.0" + } +} diff --git a/packages/base-source/src/BaseSource.js b/packages/base-source/src/BaseSource.js new file mode 100644 index 0000000..049ba49 --- /dev/null +++ b/packages/base-source/src/BaseSource.js @@ -0,0 +1,130 @@ +// Import base class. +import BasePackage from '@hoast/base-package' + +class BaseSource extends BasePackage { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(...options) { + super(...options) + + this.done = false + this.exhausted = false + + this._hasInitialize = typeof (this.initialize) === 'function' + this._hasSequential = typeof (this.sequential) === 'function' + this._hasConcurrent = typeof (this.concurrent) === 'function' + this._hasFinal = typeof (this.final) === 'function' + + if (this._hasInitialize) { + this._isInitialized = false + } + if (this._hasInitialize || this._hasSequential) { + this._holdCalls = false + this._promiseQueue = [] + } + if (this._hasConcurrent) { + this._concurrentCount = 0 + } + } + + /** + * This will be called by hoast itself to retrieve the next item. + * @returns {Any} Retrieved data. + */ + async next () { + // Exit early if done or exhausted. + if (this.done || this.exhausted) { + return + } + + if ((!this._hasInitialize || this._isInitialized) && !this._hasSequential) { + // Run concurrent part. + return await this.concurrent() + } + + // Check if calls should be held. + if (this._holdCalls) { + // Add calls to queue. + return await new Promise((resolve, reject) => { + this._promiseQueue.push({ + resolve, + reject, + }) + }) + } + + // Hold new calls. + this._holdCalls = true + + // Try initialization. + if (this._hasInitialize && !this._isInitialized) { + await this.initialize() + this._isInitialized = true + } + + // Run now. + return await this._next() + } + + /** + * Internally called to retrieve the next item. + * @returns {Any} Retrieved data. + */ + async _next () { + let data = null + if (this._hasSequential) { + // Run sequential part. + data = await this.sequential() + } + + if (this._hasInitialize || this._hasSequential) { + // If done wait for now. + if (this.exhausted || this.done) { + // Immediately resolve all queued promises. + for (const promise of this._promiseQueue) { + promise.resolve(null) + } + this._promiseQueue = [] + } + + // Set hold back to false. + if (this._promiseQueue.length > 0) { + // Run next iteration. + const promise = this._promiseQueue.shift() + try { + promise.resolve(this._next(promise.data)) + } catch (error) { + promise.reject(error) + } + } else { + this._holdCalls = false + } + } + + if (this._hasConcurrent) { + // Increment concurrent count. + this._concurrentCount++ + + // Run concurrent part. + data = await this.concurrent(data) + + // Decrement concurrent count. + this._concurrentCount-- + } + + // If exhausted and no more concurreny of this source is going then set done to true! + if (this.exhausted && (!this._hasConcurrent || this._concurrentCount === 0)) { + if (this._hasFinal) { + await this.final() + } + + this.done = true + } + + return data + } +} + +export default BaseSource diff --git a/packages/hoast/README.md b/packages/hoast/README.md new file mode 100644 index 0000000..f54a5c0 --- /dev/null +++ b/packages/hoast/README.md @@ -0,0 +1,54 @@ +# @hoast/hoast + +The core package of [hoast](https://hoast.js.org) responsible for managing and running the other packages. + +## Install + +``` +% yarn add @hoast/hoast +``` + +OR + +``` +% npm install @hoast/hoast --save +``` + +## Usage + +### Configuration file + +See the [config example](https://github.com/hoast/hoast/tree/master/examples/config#readme) for more detail on how to configure and use the core package. + +### Command line interface + +Run `hoast help` or `hoast h` to see information on how to use command line interface. + +``` +Usage +% @hoast/hoast [command] [...options] + +Commands + h, help Display help + r, run Run from file (default command) + v, version Display version + +Options for run + --log-level {Number} Log level given to the logger. (Default: 2 (Errors and warnings)) + --file-path {String} File path to config or script file. (Defaults: hoast.js and hoast.json) + --concurrency-limit {Number} Maximum amount of items to process at once. (Default: 4) +``` + +### Code + +- `constructor` Create `Hoast` instance. + - `@params {Object} options` Options object which can contain the following keys. + - `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). + - `{Number} concurrencyLimit = 4` Maximum amount of items to process at once. + - `@params {Object} meta = {}` Global metadata that can be picked up by process packages. + - `@returns {Object}` Hoast instance. + +#### Public variables + +- `meta {Object}` Global metadata that can be picked up by process packages. +- `options {Object}` Options object. diff --git a/packages/hoast/package.json b/packages/hoast/package.json new file mode 100644 index 0000000..bb78601 --- /dev/null +++ b/packages/hoast/package.json @@ -0,0 +1,42 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/hoast", + "version": "2.0.0", + "description": "A set of simple and modular packages for build automation.", + "keywords": [ + "modular", + "data", + "processor", + "task", + "automation" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "bin": { + "hoast": "src/cli/hoast.js" + }, + "main": "src/Hoast.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/utils": "2.0.0", + "minimist": "^1.2.5" + } +} diff --git a/packages/hoast/src/Hoast.js b/packages/hoast/src/Hoast.js new file mode 100644 index 0000000..6f6a8dd --- /dev/null +++ b/packages/hoast/src/Hoast.js @@ -0,0 +1,219 @@ +// Import external modules. +import { hasProperties } from '@hoast/utils/has.js' +import deepAssign from '@hoast/utils/deepAssign.js' + +// Import internal modules. +import call from './utils/call.js' +import logger from './utils/logger.js' +import process from './utils/process.js' + +class Hoast { + /** + * Create Hoast instance. + * @param {Object} options Options object. + * @param {Object} meta Global metadata that can be picked up by process packages. + * @returns {Object} Hoast instance. + */ + constructor(options = null, meta = null) { + // Set options. + this.options = { + logLevel: 2, + + concurrencyLimit: 4, + } + if (options) { + this.options = deepAssign(this.options, options) + } + + // Set meta. + this.meta = meta ?? {} + + // Set debugger. + logger.setLevel(this.options.logLevel) + logger.setPrefix(this.constructor.name) + + // Initialize meta collections. + this._metaCollections = [] + + // Initialize collections. + this._collections = [] + + // Initialize modules registry. + this._processes = {} + } + + // Meta. + + /** + * Add collection to meta collections. + * @param {Object} collection Collection to add. + * @returns {Object} The hoast instance. + */ + addMetaCollection (collection) { + if (!hasProperties(collection, ['source'])) { + return this + } + + this._metaCollections.push(collection) + + return this + } + + /** + * Add multiple collections to meta collections. + * @param {Array} collections Collections to add. + * @returns {Object} The hoast instance. + */ + addMetaCollections (collections) { + // Filter based on type. + collections = collections.filter((collection) => hasProperties(collection, ['source'])) + if (!collections) { + return this + } + + // Add to collections. + this._metaCollections.push(...collections) + + return this + } + + // Collections. + + /** + * Add collection to collections. + * @param {Object} collection Collection to add. + * @returns {Object} The hoast instance. + */ + addCollection (collection) { + if (!hasProperties(collection, ['source'])) { + return this + } + + this._collections.push(collection) + + return this + } + + /** + * Add multiple collections to collections. + * @param {Array} collections Collections to add. + * @returns {Object} The hoast instance. + */ + addCollections (collections) { + // Filter based on type. + collections = collections.filter(collection => hasProperties(collection, ['source'])) + if (!collections) { + return this + } + + // Add to collections. + this._collections.push(...collections) + + return this + } + + // Processes. + + /** + * Register process. + * @param {String} name Name of process. + * @param {Object} process Process object. + * @returns {Object} The hoast instance. + */ + registerProcess (name, process) { + if (typeof (name) !== 'string') { + return this + } + + this._processes[name] = process + + return this + } + + /** + * Register multiple processes. + * @param {Object} processes Process objects by name as key. + * @returns {Object} The hoast instance. + */ + registerProcesses (processes) { + const processesFiltered = {} + for (const name in processes) { + if (typeof (name) !== 'string') { + continue + } + + if (!Object.prototype.hasOwnProperty.call(processes, name)) { + continue + } + processesFiltered[name] = processes[name] + } + if (processesFiltered === {}) { + return this + } + + this._processes = Object.assign(this._processes, processesFiltered) + + return this + } + + // Process. + + /** + * Process collections. + * @returns {Object} The hoast instance. + */ + async process () { + if (this._processes) { + // Call set app on processes. + await call({ + concurrencyLimit: this.options.concurrencyLimit, + }, this._processes, '_setApp', this) + } + + if (this._metaCollections.length > 0) { + // Prepare meta collections. + const metaCollections = this._metaCollections.map(collection => { + // Add 'assign to meta' process at the end of each meta collection. + collection.processes = [...collection.processes, { + process: function (app, data) { + app.assignMeta(data) + return data + }, + }] + + return collection + }) + + for (const collection of metaCollections) { + // Call set app on processes. + await call({ + concurrencyLimit: this.options.concurrencyLimit, + }, collection.processes, '_setApp', this) + } + + // Process meta collections. + await process(this, metaCollections) + } + + for (const collection of this._collections) { + // Call set app on processes. + await call({ + concurrencyLimit: this.options.concurrencyLimit, + }, collection.processes, '_setApp', this) + } + + // Process collections. + await process(this, this._collections) + + if (this._processes) { + // Call final on processes. + await call({ + concurrencyLimit: this.options.concurrencyLimit, + }, this._processes, 'final') + } + + return this + } +} + +export default Hoast diff --git a/packages/hoast/src/cli/hoast.js b/packages/hoast/src/cli/hoast.js new file mode 100755 index 0000000..8447df5 --- /dev/null +++ b/packages/hoast/src/cli/hoast.js @@ -0,0 +1,250 @@ +#!/usr/bin/env node + +// Import build-in modules. +import fs from 'fs' +import path from 'path' +import { promisify } from 'util' + +// Import external modules. +import deepAssign from '@hoast/utils/deepAssign.js' +import instantiate from '@hoast/utils/instantiate.js' +import minimist from 'minimist' + +// Import local utility libraries. +// TODO: import { isValidConfig } from './util/isValid.js' +import timer from './utils/timer.js' + +// Import core library. +import Hoast from '../Hoast.js' + +// Promisify read file. +const fsAccess = promisify(fs.access) +const fsReadFile = promisify(fs.readFile) + +const CLI = async function () { + // Get package file. + // 1. Take import url (aka file path of script). + // 2. Remove file:// protecol using a regular expression. + // 3. Get directory path from file path. + // 4. Resolve path to package file in parent directory. + // 5. Get content of file at path. + // 6. Parse file content as JSON. + const pkg = JSON.parse( + await fsReadFile( + path.resolve( + path.dirname( + import.meta.url + .replace(/(^\w+:|^)\/\//, '') + ), + '../../package.json' + ), + 'utf8' + ) + ) + + // Standard CLI messages. + + const MESSAGE_VERSION = ` +ʕ ˵·ᴥ·ʔっ ${pkg.name} (v${pkg.version}) +` + + const MESSAGE_HELP = ` +ʕ ˵•ᴥ•ʔっ ${pkg.name} (v${pkg.version}) + +Usage +% ${pkg.name} [command] [...options] + +Commands + h, help Display help + r, run Run from file (default command) + v, version Display version + +Options for run + --log-level {Number} Log level given to the logger. (Default: 2 (Errors and warnings)) + --file-path {String} File path to config or script file. (Defaults: hoast.js and hoast.json) + --concurrency-limit {Number} Maximum amount of items to process at once. (Default: 4) +` + + const MESSAGE_SEE_DOCS = `See '${pkg.docs}' for more information about hoast.` + const MESSAGE_SEE_HELP = `Use '${pkg.name} help' to see a list of commands.` + const MESSAGE_UNKNOWN_COMMAND = 'ʕ ˵;ᴥ;ʔ Unkown command!' + + // Construct command line interface. + const options = minimist(process.argv.slice(2)) + options._ = options._.map(_ => String.prototype.toLowerCase.call(_)) + + if (options._.length > 0) { + // Display help. + if (options._.indexOf('h') >= 0 || options._.indexOf('help') >= 0) { + console.log(MESSAGE_HELP) + return + } + + // Display version. + if (options._.indexOf('v') >= 0 || options._.indexOf('version') >= 0) { + console.log(MESSAGE_VERSION) + return + } + + if (options._.indexOf('r') === -1 && options._.indexOf('run') === -1) { + console.log(`${MESSAGE_UNKNOWN_COMMAND} ${MESSAGE_SEE_HELP}`) + return + } + } + + // Log prepare message. + console.log('ʕ ˵·ᴥ·ʔ Preparing!') + + // Set configuration file path. + let filePath + if (Object.prototype.hasOwnProperty.call(options, 'file-path')) { + filePath = options['file-path'] + if (!path.isAbsolute(filePath)) { + filePath = path.resolve(process.cwd(), filePath) + } + + try { + await fsAccess(filePath, fs.constants.R_OK) + } catch { + console.error(`Error: No readable configuration file found at "${filePath}". ` + MESSAGE_SEE_HELP) + return + } + } else { + // Check for hoast.js or hoast.json in current working directory. + filePath = path.resolve(process.cwd(), 'hoast.js') + try { + await fsAccess(filePath, fs.constants.R_OK) + } catch { + filePath = path.resolve(process.cwd(), 'hoast.json') + + try { + await fsAccess(filePath, fs.constants.R_OK) + } catch { + console.error(`Error: No readable configuration file found in "${process.cwd()}". ` + MESSAGE_SEE_HELP) + return + } + } + } + + const extension = path.extname(filePath) + let config + let hoast + switch (String.prototype.toLowerCase.call(extension)) { + case '.json': + // Read and parse configuration at file path. + config = JSON.parse(await fsReadFile(filePath, 'utf8')) + break + + case '.js': + // Import from file path. + let imported = await import(filePath) + + if (!imported || typeof (imported) !== 'object') { + // Invalid response. + throw new Error('Invalid configuration file content! ' + MESSAGE_SEE_HELP) + } + + imported = imported.default + + if (imported && imported instanceof Hoast) { + hoast = imported + break + } + + config = deepAssign({}, imported) + break + + default: + throw new Error('Unkown extension type! ' + MESSAGE_SEE_DOCS) + } + + if (!hoast) { + // Ensure options is set and an object. + if (!config.options) { + config.options = {} + } else if (typeof (config.options) !== 'object') { + throw new Error('Invalid options type in configuration file! Must be of type object. ' + MESSAGE_SEE_DOCS) + } + + // Ensure meta is set and an object. + if (!config.meta) { + config.meta = {} + } else if (typeof (config.meta) !== 'object') { + throw new Error('Invalid meta type in configuration file! Must be of type object. ' + MESSAGE_SEE_DOCS) + } + + // Setup hoast. + hoast = new Hoast(config.options, config.meta) + + if (config.metaCollections) { + // Instantiate meta collection properties. + for (const collection of config.metaCollections) { + // Instantiate source. + collection.source = await instantiate(collection.source) + + // Instantiate processes. + for (let i = 0; i < collection.processes.length; i++) { + collection.processes[i] = await instantiate(collection.processes[i]) + } + + // Add meta collection. + hoast.addMetaCollection(collection) + } + } + + // Instantiate collection properties. + for (const collection of config.collections) { + // Instantiate source. + collection.source = await instantiate(collection.source) + + // Instantiate processes. + for (let i = 0; i < collection.processes.length; i++) { + collection.processes[i] = await instantiate(collection.processes[i]) + } + + // Add collection. + hoast.addCollection(collection) + } + + if (config.processes) { + // Instantiate processes. + for (const name in config.processes) { + if (Object.prototype.hasOwnProperty.call(config.processes, name)) { + continue + } + + // Register process. + hoast.registerProcess(name, await instantiate(config.processes[name])) + } + } + } + + // Overwrite options with CLI options. + const optionsOverride = {} + if (Object.prototype.hasOwnProperty.call(options, 'log-level')) { + optionsOverride.logLevel = options['log-level'] + } + if (Object.prototype.hasOwnProperty.call(options, 'concurrency-limit')) { + optionsOverride.concurrencyLimit = options['concurrency-limit'] + } + // Manually overwrite options. + hoast.options = deepAssign( + hoast.options, + optionsOverride + ) + + // Log start message. + console.log('ʕ ˵•ₒ•ʔ Starting!') + + // Start execution timer. + const time = timer() + + // Start processing. + await hoast.process() + + // Log end with execution time. + console.log(`ʕっ✦ᴥ✦ʔっ Done in ${time()}s!`) +} + +// Run CLI. +CLI() diff --git a/packages/hoast/src/cli/utils/isValid.js b/packages/hoast/src/cli/utils/isValid.js new file mode 100644 index 0000000..155847f --- /dev/null +++ b/packages/hoast/src/cli/utils/isValid.js @@ -0,0 +1,22 @@ +import { hasProperties } from '@hoast/utils/has.js' +import { isObject } from '@hoast/utils/is.js' + +export const isValidConfig = function (value) { + if (!hasProperties(value, ['collections'])) { + return { + error: 'Object does not contain "collections" property.', + } + } + + if (Object.prototype.hasOwnProperty.call(value, 'processes') && !isObject(value.processes)) { + return { + error: 'Invalid type for "processes" property, must be of type "object".', + } + } + + return true +} + +export default { + isValidConfig, +} diff --git a/packages/hoast/src/cli/utils/timer.js b/packages/hoast/src/cli/utils/timer.js new file mode 100644 index 0000000..842157e --- /dev/null +++ b/packages/hoast/src/cli/utils/timer.js @@ -0,0 +1,18 @@ +/** + * Start a timer, call the returned function to stop the timer and get the result. + * @returns {Function} Returns a function to stop the timer which returns the result. + */ +const timer = function () { + // Store start time. + const start = process.hrtime() + + // Return time end function. + return function (precision = 3) { + // Store end time. + const end = process.hrtime(start) + // Return result time. + return (end[0] + (end[1] / 1e9)).toFixed(precision) + } +} + +export default timer diff --git a/packages/hoast/src/utils/call.js b/packages/hoast/src/utils/call.js new file mode 100644 index 0000000..68c3f58 --- /dev/null +++ b/packages/hoast/src/utils/call.js @@ -0,0 +1,31 @@ +// Import internal modules. +import iterate from './iterate.js' + +const call = async function (options, context, functionName, ...functionArguments) { + if (Array.isArray(context)) { + if (context.length === 0) { + return + } + + await iterate({ + exhausted: false, + next: async function (index) { + const contextItem = context[index] + if (typeof (contextItem) === 'object' && typeof (contextItem[functionName]) === 'function') { + await contextItem[functionName](...functionArguments) + } + + if (index + 1 >= context.length) { + this.exhausted = true + } + }, + }, options.concurrencyLimit) + return + } + + if (typeof (context) === 'object' && typeof (context[functionName]) === 'function') { + await context[functionName](...functionArguments) + } +} + +export default call diff --git a/packages/hoast/src/utils/iterate.js b/packages/hoast/src/utils/iterate.js new file mode 100644 index 0000000..44abd99 --- /dev/null +++ b/packages/hoast/src/utils/iterate.js @@ -0,0 +1,51 @@ +/** + * Execute functions returned by the iterator until null is returned. + * @param {Function} next Function to call when a new process can be run. + * @param {Number} limit Maximum number of iterators to have running at once. + * @returns {Promise} Limited concurrent process as a promise. + */ +const iterate = function (iterator, limit = 1) { + // Track active calls. + let count = 0 + let index = -1 + + return new Promise((resolve, reject) => { + const add = () => { + // Increment count. + index++ + count++ + + // Resolve given value. + Promise.resolve(iterator.next(index)) + .then(() => { + // Reduce count. + count-- + + // Add another one in its place. + if (!iterator.exhausted) { + add() + } else if (count <= 0) { + // If the last active one then resolve. + resolve() + } + }, (error) => { + reject(error) + }) + } + + for (let i = 0; i < limit; i++) { + if (iterator.exhausted) { + break + } + + add() + } + + // If nothing was added then resolve immediately. + if (count === 0) { + resolve() + } + }) +} + +export default iterate diff --git a/packages/hoast/src/utils/logger.js b/packages/hoast/src/utils/logger.js new file mode 100644 index 0000000..2e51b5e --- /dev/null +++ b/packages/hoast/src/utils/logger.js @@ -0,0 +1,5 @@ +// Import external modules. +import Logger from '@hoast/utils/Logger.js' + +// Create single logger instance. +export default new Logger() diff --git a/packages/hoast/src/utils/process.js b/packages/hoast/src/utils/process.js new file mode 100644 index 0000000..fa267ce --- /dev/null +++ b/packages/hoast/src/utils/process.js @@ -0,0 +1,119 @@ +// Import internal modules. +import call from './call.js' +import iterate from './iterate.js' +import logger from './logger.js' + +/** + * Process collections. + * @param {Object} app App instance. + * @param {Array} collections Collections to process. + */ +const process = async function (app, collections) { + // Exit early if already done. + if (collections.length === 0) { + logger.info('No collections to process.') + return + } + logger.info('Start processing collections.') + + // Iterate on collection sources and process them. + await iterate( + // Return a source process function. + { + collectionIndex: 0, + collection: null, + collectionProcesses: null, + + collectionsActiveByIndex: Array.from({ length: collections.length }, () => 0), + collectionsExhausted: Array.from({ length: collections.length }, () => false), + + exhausted: false, + + next: async function (index) { + if (!this.collection) { + // Set collection. + this.collection = collections[this.collectionIndex] + + // Prepare collections. + this.collectionProcesses = this.collection.processes.map(process => { + let processType = typeof (process) + + // If string get from lookup. + if (processType === 'string') { + process = app._processes[process] + + // Get type again. + processType = typeof (process) + } + + // If function wrap in object. + if (processType === 'function') { + process = { + process: process, + } + } + + return process + }) + } + + // Store values locally. + const collectionIndex = this.collectionIndex + const source = this.collection.source + const processes = this.collection.processes + const processesPrepared = this.collectionProcesses + + // Increment active collections. + this.collectionsActiveByIndex[collectionIndex]++ + + // Get data from source. + let data = await source.next() + + if (data) { + // Iterate over processes. + for (const process of processesPrepared) { + // Skip if data is null. + if (data === undefined || data === null) { + break + } + + data = await process.next(data) + } + } + + // Check source is exhausted and was not exhausted previously. + if (source.exhausted && !this.collectionsExhausted[collectionIndex]) { + this.collectionsExhausted[collectionIndex] = true + // Check if more collections left. + if (this.collectionIndex < collections.length - 1) { + // Unset collection. + this.collection = null + this.collectionProcesses = null + + // Increment collection index. + this.collectionIndex++ + } else { + // Set iterator as exhausted. + this.exhausted = true + } + } + + // Check if done and this is the last active collection call. + if (source.done && this.collectionsActiveByIndex[collectionIndex] === 1) { + // Call final on processes only in this collection. + await call({ + concurrencyLimit: app.options.concurrencyLimit, + }, processes, 'final') + } + + // Decrement active count. + this.collectionsActiveByIndex[collectionIndex]-- + }, + }, + app.options.concurrencyLimit, true + ) + + logger.info('Finished processing collections.') +} + +export default process diff --git a/packages/process-custom/README.md b/packages/process-custom/README.md new file mode 100644 index 0000000..8ef45ef --- /dev/null +++ b/packages/process-custom/README.md @@ -0,0 +1,28 @@ +# @hoast/process-custom + +Allows you to provide your own custom process functions. Extends base-process where the overridabel functions can be provided via the options. Helps you from having to create a package for simple one-off behaviour. + +## Install + +``` +% yarn add @hoast/process-custom +``` + +OR + +``` +% npm install @hoast/process-custom --save +``` + +## Options + +This package extends the [@hoast/base-process](https://github.com/hoast/hoast/tree/master/packages/base-process#readme) package. For more information on how to use this package see the options below as well as the base package. + +- `{Function} initialize = null` Initialize function. +- `{Function} sequential = null` Sequential function. +- `{Function} concurrent = null` Concurrent function. +- `{Function} final = null` Final function. + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-custom/package.json b/packages/process-custom/package.json new file mode 100644 index 0000000..f8047b9 --- /dev/null +++ b/packages/process-custom/package.json @@ -0,0 +1,36 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-custom", + "version": "2.0.0", + "description": "Allows you to provide your own custom process functions.", + "keywords": [ + "hoast", + "process", + "custom" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessCustom.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-package": "2.0.0" + } +} diff --git a/packages/process-custom/src/ProcessCustom.js b/packages/process-custom/src/ProcessCustom.js new file mode 100644 index 0000000..b137a0c --- /dev/null +++ b/packages/process-custom/src/ProcessCustom.js @@ -0,0 +1,35 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +class ProcessCustom extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + initialize: null, + sequential: null, + concurrent: null, + final: null, + }, options) + + if (this._options.initialize) { + this.initialize = this._options.initialize + } + + if (this._options.sequential) { + this.sequential = this._options.sequential + } + + if (this._options.concurrent) { + this.concurrent = this._options.concurrent + } + + if (this._options.final) { + this.final = this._options.final + } + } +} + +export default ProcessCustom diff --git a/packages/process-frontmatter/README.md b/packages/process-frontmatter/README.md new file mode 100644 index 0000000..f9192c4 --- /dev/null +++ b/packages/process-frontmatter/README.md @@ -0,0 +1,26 @@ +# @hoast/process-frontmatter + +Extract frontmatter from text. + +## Install + +``` +% yarn add @hoast/process-frontmatter +``` + +OR + +``` +% npm install @hoast/process-frontmatter --save +``` + +## Options + +- `{String} property = 'contents'` Dot notation path to the data property from which frontmatter should be read. +- `{String} frontmatterProperty = 'frontmatter'` Dot notation path to the data property to which the extracted frontmatter should be written. +- `{String} fence = '---'` The text which marks the start and end of the frontmatter portion. +- `{Function} parser = JSON.parse` Function which parses the extracted frontmatter text. + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-frontmatter/package.json b/packages/process-frontmatter/package.json new file mode 100644 index 0000000..dbf8896 --- /dev/null +++ b/packages/process-frontmatter/package.json @@ -0,0 +1,36 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-frontmatter", + "version": "2.0.0", + "description": "Extract frontmatter from text.", + "keywords": [ + "hoast", + "process", + "frontmatter" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessFrontmatter.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-process": "2.0.0" + } +} diff --git a/packages/process-frontmatter/src/ProcessFrontmatter.js b/packages/process-frontmatter/src/ProcessFrontmatter.js new file mode 100644 index 0000000..1f9ff05 --- /dev/null +++ b/packages/process-frontmatter/src/ProcessFrontmatter.js @@ -0,0 +1,104 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +// Import external modules. +import { getByPathSegments } from '@hoast/utils/get.js' +import { setByPathSegments } from '@hoast/utils/set.js' + +const NEW_LINE = '\n' + +class ProcessFrontmatter extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + property: 'contents', + frontmatterProperty: 'frontmatter', + + fence: '---', + parser: JSON.parse, + }, options) + + // Convert dot notation to path segments. + this._fence = this._options.fence.toLowerCase() + this._propertyPath = this._options.property.split('.') + this._frontmatterPropertyPath = this._options.frontmatterProperty.split('.') + } + + concurrent (data) { + // Get value. + const value = getByPathSegments(data, this._propertyPath) + + // Check if file starts with the fence. + let startIndex = value.indexOf(NEW_LINE) + if (startIndex < 0) { + // No content. + return data + } + if (value.substring(0, startIndex).trim().toLowerCase() !== this._fence) { + // Does not start with fence. + return data + } + + // Skip past new line character. + startIndex++ + + let temp + let lineIndexSum = startIndex + let lineStartIndex + let lineEndIndex + while (true) { + temp = value.substring(lineIndexSum) + lineStartIndex = temp.indexOf(this._fence) + if (!lineStartIndex) { + // No frontmatter end fence. + return data + } + // Get index after new line character before the fence. + temp = temp.substring(0, lineStartIndex) + lineStartIndex = temp.lastIndexOf(NEW_LINE) + if (!lineStartIndex) { + lineStartIndex = 0 + } else { + lineStartIndex++ + } + + lineIndexSum += lineStartIndex + + // Get index before new line character after the fence. + temp = value.substring(lineIndexSum) + lineEndIndex = temp.indexOf(NEW_LINE) + if (!lineEndIndex) { + lineEndIndex = temp.length - 1 + } + + temp = temp.substring(0, lineEndIndex) + + // Check if line is only the fence. + if (temp.trim().toLowerCase() === this._fence) { + break + } + + lineIndexSum += lineEndIndex + } + + // Get frontmatter. + let frontmatter = value.substring(startIndex, lineIndexSum) + // Get rest. + const rest = value.substring(lineIndexSum + lineEndIndex) + + // Parse frontmatter. + if (this._options.parser) { + frontmatter = this._options.parser(frontmatter) + } + // Set values. + data = setByPathSegments(data, this._frontmatterPropertyPath, frontmatter) + data = setByPathSegments(data, this._propertyPath, rest) + // Return result. + return data + } +} + +export default ProcessFrontmatter diff --git a/packages/process-handlebars/README.md b/packages/process-handlebars/README.md new file mode 100644 index 0000000..5d5b739 --- /dev/null +++ b/packages/process-handlebars/README.md @@ -0,0 +1,31 @@ +# @hoast/process-handlebars + +Template using [Handlebars](https://github.com/handlebars-lang/handlebars.js#readme). + +## Install + +``` +% yarn add @hoast/process-handlebars +``` + +OR + +``` +% npm install @hoast/process-handlebars --save +``` + +## Options + +- `{String} property = 'contents'` Dot notation path to the data property which should be used processed by handlebars. +- `{String} templateDirectory = null` Template directory path, either absolute or relative to the working directory. +- `{String} templatePath = null` Default template path relative to the template directory. +- `{String} templateProperty = null` Dot notation path to the data property where the template path can be written. +- `{Object} handlebarsOptions = {}` [Handlebars options](https://github.com/handlebars-lang/handlebars.js#readme). +- `{Object} helpers = null` Object of Handlebars helpers whereby the key is the name of the helper and the value the helper function. +- `{String} helpersDirectory = null` Handlebars helpers directory path, either absolute or relative to the working directory. All items in the directory will be read where the path relative to the given directory is the name of the helper and the default export of the file the helper. +- `{Object} partials = null` Object of Handlebars parials whereby the key is the name of the parial and the value the partial contents. +- `{String} partialsDirectory = null` Handlebars partials directory path, either absolute or relative to the working directory. All items in the directory will be read where the path relative to the given directory is the name of the partial and the contents of the file the partial. + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-handlebars/package.json b/packages/process-handlebars/package.json new file mode 100644 index 0000000..891e062 --- /dev/null +++ b/packages/process-handlebars/package.json @@ -0,0 +1,38 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-handlebars", + "version": "2.0.0", + "description": "Template using Handlebars", + "keywords": [ + "hoast", + "process", + "handlebars" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessHandlebars.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-process": "2.0.0", + "@hoast/utils": "2.0.0", + "handlebars": "^4.7.6" + } +} diff --git a/packages/process-handlebars/src/ProcessHandlebars.js b/packages/process-handlebars/src/ProcessHandlebars.js new file mode 100644 index 0000000..a5653cf --- /dev/null +++ b/packages/process-handlebars/src/ProcessHandlebars.js @@ -0,0 +1,223 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +// Import build-in modules. +import fs from 'fs' +import path from 'path' +import { promisify } from 'util' + +// Import utility modules. +import iterateDirectory from '@hoast/utils/iterateDirectory.js' +import { getByPathSegments } from '@hoast/utils/get.js' +import { setByPathSegments } from '@hoast/utils/set.js' + +// Import external modules. +import Handlebars from 'handlebars' + +// Promisfy read file. +const fsReadFile = promisify(fs.readFile) + +class ProcessHandlebars extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + property: 'contents', + + // Template options. + templateDirectory: null, + templatePath: null, + templateProperty: null, + + // Handlebars options. + handlebarsOptions: {}, + helpers: null, + helpersDirectory: null, + partials: null, + partialsDirectory: null, + }, options) + + if (!this._options.templatePath && !this._options.templateProperty) { + this._logger.error('No template specified. Use the "templatePath" or "templateProperty" options.') + } + + // Construct absolute directory path. + this._templateDirectoryPath = + (this._options.templateDirectory && path.isAbsolute(this._options.templateDirectory)) + ? this._options.templateDirectory + : path.resolve(process.cwd(), this._options.templateDirectory) + + // Convert dot notation to path segments. + this._propertyPath = this._options.property.split('.') + if (this._options.templateProperty) { + this._templatePropertyPath = this._options.templateProperty.split('.') + } + } + + async initialize () { + this._templates = {} + + if (this._options.templatePath) { + // Construct absolute template path. + const templatePathAbsolute = + path.isAbsolute(this._options.templatePath) + ? this._options.templatePath + : path.resolve(this._options.templateDirectory, this._options.templatePath) + const template = await fsReadFile(templatePathAbsolute, { + encoding: 'utf8', + }) + + if (!template) { + this._logger.error('No template found at path: "' + this._options.templatePath + '"') + } else { + // Store compiled template in cache. + this._templates[templatePathAbsolute] = Handlebars.compile(template, this._options.handlebarsOptions) + } + } + + if (this._options.helpersDirectory || this._options.partialsDirectory) { + const promises = [] + + // Get helpers from directory. + if (this._options.helpersDirectory) { + promises.push( + (async () => { + // Construct absolute helpers directory path. + const directoryPath = + (this._options.helpersDirectory && path.isAbsolute(this._options.helpersDirectory)) + ? this._options.helpersDirectory + : path.resolve(process.cwd(), this._options.helpersDirectory) + + // Get helper files. + const directoryIterator = await iterateDirectory(directoryPath) + + let filePath + // Get next file path. + while (filePath = await directoryIterator()) { + // Get relative file path. + const filePathRelative = path.relative(directoryPath, filePath) + + // Dynamic import helper. + let helper = await import(filePath) + if (!helper || !helper.default) { + continue + } + helper = helper.default + + // Register helper. + Handlebars.registerHelper(filePathRelative, helper) + } + })() + ) + } + + // Get partials from directory. + if (this._options.partialsDirectory) { + promises.push( + (async () => { + // Construct absolute helpers directory path. + const directoryPath = + (this._options.partialsDirectory && path.isAbsolute(this._options.partialsDirectory)) + ? this._options.partialsDirectory + : path.resolve(process.cwd(), this._options.partialsDirectory) + + // Get helper files. + const directoryIterator = await iterateDirectory(directoryPath) + + let filePath + // Get next file path. + while (filePath = await directoryIterator()) { + // Get relative file path. + const filePathRelative = path.relative(directoryPath, filePath) + + // Get file content. + const partial = await fsReadFile(filePath, { encoding: 'utf8' }) + + // Register partial. + Handlebars.registerPartial(filePathRelative, partial) + } + })() + ) + } + + // Await directory promises. + await Promise.all(promises) + } + + // Register helpers. + if (this._options.helpers) { + for (const { name, helper } of this._options.helpers) { + Handlebars.registerHelper(name, helper) + } + } + + // Register partials. + if (this._options.partials) { + for (const { name, partial } of this._options.partials) { + Handlebars.registerPartial(name, partial) + } + } + } + + async sequential (data) { + // Get template path. + let templatePath + if (this._templatePropertyPath) { + templatePath = getByPathSegments(data, this._templatePropertyPath) + } + + if (!templatePath && this._options.templatePath) { + templatePath = this._options.templatePath + } else { + this._logger.warn('No template path found therefore skipping!') + return data + } + + // Construct absolute template path. + const templatePathAbsolute = + path.isAbsolute(templatePath) + ? templatePath + : path.resolve(this._options.templateDirectory, templatePath) + + // Get template. + let template + // Check if it exists in cache. + if (this._templates[templatePathAbsolute]) { + template = this._templates[templatePathAbsolute] + } else { + // Get template from filesystem. + template = await fsReadFile(templatePathAbsolute, { + encoding: 'utf8', + }) + + if (!template) { + this._logger.warn('No template found at path "' + templatePath + '" therefore skipping!') + return data + } + + // Compile template. + template = Handlebars.compile(template, this._options.handlebarsOptions) + + // Store template in cache. + this._templates[templatePathAbsolute] = template + } + + // Compile data with template and set value. + data = setByPathSegments(data, this._propertyPath, template({ + app: this._app, + data: data, + })) + + // Return result. + return data + } + + final () { + // Clear templates cache. + this._templates = undefined + } +} + +export default ProcessHandlebars diff --git a/packages/process-javascript/README.md b/packages/process-javascript/README.md new file mode 100644 index 0000000..bbd33bd --- /dev/null +++ b/packages/process-javascript/README.md @@ -0,0 +1,30 @@ +# @hoast/process-javascript + +Retrieve and or execute JavaScript. + +## Install + +``` +% yarn add @hoast/process-javascript +``` + +OR + +``` +% npm install @hoast/process-javascript --save +``` + +## Options + +- `{String} importProperty = 'path'` Dot notation path to the data property from which the dynamic importing path should be taken. +- `{Object} importOptions` Dynamic importing options. Set to `false` to disable dynamic importing. + - `{String} extractName = 'default'` The name of the item to import from the imported code. + - `{String} setProperty = 'contents'` Dot notation path to the data property to which the imported code should be written. +- `{String} executeProperty = 'contents'` Dot notation path to the data property which should be executed. This option is ignored if the code is dynamically imported from the path at the `importProperty` option. +- `{Object} executeOptions` Code execution options. Set to `false` to disable code execution. + - `{Array} functionNames = ['']` Names of the functions to call on the code. If multiple names are given the function is called on the data returned by the earlier function call. An empty string will assume the value itself is a function and call it instead. + - `{String} setProperty = 'contents'` Dot notation path to the data property to which the result of the function call should be written. + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-javascript/package.json b/packages/process-javascript/package.json new file mode 100644 index 0000000..83f24e1 --- /dev/null +++ b/packages/process-javascript/package.json @@ -0,0 +1,37 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-javascript", + "version": "2.0.0", + "description": "Retrieve and or execute JavaScript.", + "keywords": [ + "hoast", + "process", + "javascript" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessJavascript.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-process": "2.0.0", + "@hoast/utils": "2.0.0" + } +} diff --git a/packages/process-javascript/src/ProcessJavascript.js b/packages/process-javascript/src/ProcessJavascript.js new file mode 100644 index 0000000..f56fbe3 --- /dev/null +++ b/packages/process-javascript/src/ProcessJavascript.js @@ -0,0 +1,115 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +// Import utility modules. +import { getByPathSegments } from '@hoast/utils/get.js' +import { setByPathSegments } from '@hoast/utils/set.js' +import { isClass } from '@hoast/utils/is.js' + +class ProcessJavascript extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + importProperty: 'path', + importOptions: { + extractName: 'default', + setProperty: 'contents', + }, + + executeProperty: 'contents', + executeOptions: { + functionNames: [''], + setProperty: 'contents', + }, + }, options) + + // Convert dot notation to path segments. + if (this._options.executeProperty) { + this._executePropertyPath = this._options.executeProperty.split('.') + } + if (this._options.executeOptions && this._options.executeOptions.setProperty) { + this._executeSetPropertyPath = this._options.executeOptions.setProperty.split('.') + } + if (this._options.importProperty) { + this._importPropertyPath = this._options.importProperty.split('.') + } + if (this._options.importOptions && this._options.importOptions.setProperty) { + this._importSetPropertyPath = this._options.importOptions.setProperty.split('.') + } + } + + async concurrent (data) { + let value + + // Dynamically import code. + if (this._importPropertyPath) { + // Get path from data. + const importValue = getByPathSegments(data, this._importPropertyPath) + try { + // Import value at path. + value = await import(importValue) + + // Deconstruct imported value. + if (this._options.extractName) { + value = getByPathSegments(value, this._options.extractName) + + if (!value) { + this._logger.warn('Unable to deconstruct imported code.') + return data + } + } + + // Set value back to data object. + if (this._importSetPropertyPath) { + data = setByPathSegments(data, this._importSetPropertyPath, value) + } + } catch (error) { + this._logger.warn('Unable to import file at path: "' + importValue + '".') + return data + } + } + + // Get executable code from exising object. + if (!value && this._executePropertyPath) { + value = getByPathSegments(data, this._executePropertyPath) + + if (!value) { + this._logger.warn('Unable to retrieve an executable value or propert') + return data + } + } + + // Iterate over function names. + for (const functionName of this._options.executeOptions.functionNames) { + // Deconstruct if function name is given. + if (functionName && functionName !== '') { + value = value[functionName] + } + + // Check if variable can be called. + if (typeof (value) !== 'function') { + this._logger.error('Value not of type function or class') + return data + } + + // If class then invoke as new otherwise call it as a function. + if (isClass(value)) { + value = new value(data) // eslint-disable-line new-cap + } else { + value = value(data) + } + } + + // Write value back to data. + if (this._executeSetPropertyPath) { + data = setByPathSegments(data, this._executeSetPropertyPath, value) + } + + return data + } +} + +export default ProcessJavascript diff --git a/packages/process-log/README.md b/packages/process-log/README.md new file mode 100644 index 0000000..245c18e --- /dev/null +++ b/packages/process-log/README.md @@ -0,0 +1,25 @@ +# @hoast/process-log + +Log data to the terminal, useful for developing other process and source packages. + +## Install + +``` +% yarn add @hoast/process-log +``` + +OR + +``` +% npm install @hoast/process-log --save +``` + +## Options + +- `{String} property = null` Dot notation path to the data property which should be logged. +- `{String} format = 'js'` In what format to log the data. Either `js` or `json`. +- `{String} level = 'info'` What console command to output the data with. Either `info`, `warn`, or `error`. +- `{String} prepend = null` Text to prepend to the message. +- `{String} append = null` Text to append to the message. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-log/package.json b/packages/process-log/package.json new file mode 100644 index 0000000..2755327 --- /dev/null +++ b/packages/process-log/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-log", + "version": "2.0.0", + "description": "Log data to the terminal, useful for developing other process and source packages.", + "keywords": [ + "hoast", + "process", + "debug", + "debugging", + "log", + "logging" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessLog.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-package": "2.0.0", + "@hoast/utils": "2.0.0" + } +} diff --git a/packages/process-log/src/ProcessLog.js b/packages/process-log/src/ProcessLog.js new file mode 100644 index 0000000..46b0c70 --- /dev/null +++ b/packages/process-log/src/ProcessLog.js @@ -0,0 +1,77 @@ +// Import base modules. +import BasePackage from '@hoast/base-package' + +// Import external modules. +import { getByPathSegments } from '@hoast/utils/get.js' + +class ProcessLog extends BasePackage { + /** + * Create package instance. + * @param {Object} options Options objects. + */ + constructor(options) { + super({ + property: null, + + format: 'js', + level: 'info', + + prepend: null, + append: null, + }, options) + + // Convert dot notation to path segments. + if (this._options.property) { + this._propertyPath = this._options.property.split('.') + } + } + + next (data) { + const messages = [] + + if (this._options.prepend) { + messages.push(this._options.prepend) + } + + const value = this._propertyPath ? getByPathSegments(data, this._propertyPath) : data + + switch (String.prototype.toLowerCase.call(this._options.format)) { + default: + this._logger.warn('Unkown value for option "format", falling back to "js".') + case 'js': + messages.push(value) + break + + case 'json': + messages.push( + JSON.stringify(value, null, 2) + ) + break + } + + if (this._options.append) { + messages.push(this._options.append) + } + + switch (String.prototype.toLowerCase.call(this._options.level)) { + case 'error': + console.error(...messages) + break + + default: + case 'info': + case 'log': + console.log(...messages) + break + + case 'warn': + console.warn(...messages) + break + } + + // Return data as is. + return data + } +} + +export default ProcessLog diff --git a/packages/process-markdown/README.md b/packages/process-markdown/README.md new file mode 100644 index 0000000..a847fa9 --- /dev/null +++ b/packages/process-markdown/README.md @@ -0,0 +1,25 @@ +# @hoast/process-markdown + +Convert markdown to HTML using [Unified](https://github.com/unifiedjs/unified#readme). + +## Install + +``` +% yarn add @hoast/process-markdown +``` + +OR + +``` +% npm install @hoast/process-markdown --save +``` + +## Options + +- `{String} property = 'contents'` Dot notation path to the data property which should be processed as markdown. +- `{Array} remarkPlugins = []` Remark plugins. If the value in the array is an array the first will be instantiated if not already an instance, the subsequent values will be used as the plugin's options. +- `{Array} rehypePlugins = []` Rehype plugins. If the value in the array is an array the first will be instantiated if not already an instance, the subsequent values will be used as the plugin's options. + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-markdown/package.json b/packages/process-markdown/package.json new file mode 100644 index 0000000..a32a688 --- /dev/null +++ b/packages/process-markdown/package.json @@ -0,0 +1,43 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-markdown", + "version": "2.0.0", + "description": "Convert markdown to HTML using Unified", + "keywords": [ + "hoast", + "process", + "markdown" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessMarkdown.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-process": "2.0.0", + "@hoast/utils": "2.0.0", + "rehype-raw": "^4.0.2", + "rehype-sanitize": "^4.0.0", + "rehype-stringify": "^8.0.0", + "remark-parse": "^8.0.3", + "remark-rehype": "^7.0.0", + "unified": "^9.2.0" + } +} diff --git a/packages/process-markdown/src/ProcessMarkdown.js b/packages/process-markdown/src/ProcessMarkdown.js new file mode 100644 index 0000000..c679a1c --- /dev/null +++ b/packages/process-markdown/src/ProcessMarkdown.js @@ -0,0 +1,125 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +// Import utility modules. +import { getByPathSegments } from '@hoast/utils/get.js' +import { setByPathSegments } from '@hoast/utils/set.js' + +// Import external unified modules. +import unified from 'unified' +import remarkParse from 'remark-parse' +import remarkRehype from 'remark-rehype' +import rehypeRaw from 'rehype-raw' +import rehypeSanitize from 'rehype-sanitize' +import rehypeStringify from 'rehype-stringify' + +const EXTENSIONS_FROM = ['md', 'markdown'] +const EXTENSIONS_TO = 'html' + +class ProcessMarkdown extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + property: 'contents', + remarkPlugins: [], + rehypePlugins: [], + }, options) + + // Convert dot notation to path segments. + this._propertyPath = this._options.property.split('.') + } + + async initialize () { + // Construct unified parser. + this._parser = unified() + + const addPlugin = async (plugin) => { + let result, parameters + if (Array.isArray(plugin)) { + result = plugin.shift() + parameters = plugin + } else { + result = plugin + parameters = [] + } + + // Get type of result. + let type = typeof (result) + + // Import as package if string. + if (type === 'string') { + result = (await import(result)) + if (result.default) { + result = result.default + } + + // Get type of imported. + type = typeof (result) + + // Check new value. + if (type !== 'function') { + throw new Error('Imported type must be a class or function.') + } + } + + this._parser + .use(result, ...parameters) + } + + this._parser + .use(remarkParse) // Markdown to Mardown AST. + + // Add remark plugins. + for (const plugin of this._options.remarkPlugins) { + await addPlugin(plugin) + } + + this._parser + .use(remarkRehype) // Markdown AST to HTML AST. + .use(rehypeRaw) // Reparse HTML AST. + + // Add rehype plugins. + for (const plugin of this._options.rehypePlugins) { + await addPlugin(plugin) + } + + this._parser + .use(rehypeSanitize) // Sanitize HTML AST. + .use(rehypeStringify) // HTML AST to string. + } + + async concurrent (data) { + // Get value from data. + let value = getByPathSegments(data, this._propertyPath) + + // Parse data. + value = await this._parser.process(value) + value = value.contents + + // Set value back to data. + data = setByPathSegments(data, this._propertyPath, value) + + // Change extension. + if (data.path) { + // Split path into segments. + const pathSegments = data.path.split('.') + // Check if file ends with an expected extension. + if (EXTENSIONS_FROM.indexOf(pathSegments[pathSegments.length - 1]) >= 0) { + // Remove existin extension. + pathSegments.pop() + // Add html extension. + pathSegments.push(EXTENSIONS_TO) + // Write path back to data. + data.path = pathSegments.join('.') + } + } + + // Return result. + return data + } +} + +export default ProcessMarkdown diff --git a/packages/process-mithril/README.md b/packages/process-mithril/README.md new file mode 100644 index 0000000..0c82bc8 --- /dev/null +++ b/packages/process-mithril/README.md @@ -0,0 +1,28 @@ +# @hoast/process-mithril + +Template using [Mithril](https://github.com/MithrilJS/mithril.js#readme). + +## Install + +``` +% yarn add @hoast/process-mithril +``` + +OR + +``` +% npm install @hoast/process-mithril --save +``` + +## Options + +- `{String} property = 'contents'` Dot notation path to the data property which should be processed by Mithril. +- `{String} componentDirectory = null` Component directory path, either absolute or relative to the working directory. +- `{String} componentPath = null` Default component path relative to the component directory. +- `{String} componentProperty = null` Dot notation path to the data property where the component path can be written. +- `{String} prefix = null` Text to prepend to the result. For instance `` if you are generating an entire webpage using mithril. +- `{String} suffix = null` Text to append to the result. + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-mithril/package.json b/packages/process-mithril/package.json new file mode 100644 index 0000000..f2069c6 --- /dev/null +++ b/packages/process-mithril/package.json @@ -0,0 +1,38 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-mithril", + "version": "2.0.0", + "description": "Template using Mithril", + "keywords": [ + "hoast", + "process", + "mithril" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessMithril.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-process": "2.0.0", + "@hoast/utils": "2.0.0", + "mithril-node-render": "^3.0.0" + } +} diff --git a/packages/process-mithril/src/ProcessMithril.js b/packages/process-mithril/src/ProcessMithril.js new file mode 100644 index 0000000..0f34460 --- /dev/null +++ b/packages/process-mithril/src/ProcessMithril.js @@ -0,0 +1,102 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +// Import build-in modules. +import path from 'path' + +// Import utility modules. +import { getByPathSegments } from '@hoast/utils/get.js' +import { setByPathSegments } from '@hoast/utils/set.js' + +// Import external modules. +import render from 'mithril-node-render' + +// Make Mithril renderer happy. +if (!global.window) { + global.window = global.document = global.requestAnimationFrame = undefined +} + +class ProcessMythril extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + property: 'contents', + + componentDirectory: null, + componentPath: null, + componentProperty: null, + + prefix: null, + suffix: null, + }, options) + + if (!this._options.componentPath && !this._options.componentProperty) { + this._logger.error('No component specified. Use the "componentPath" or "componentProperty" options.') + } + // Construct absolute directory path. + this._componentDirectoryPath = + (this._options.componentDirectory && path.isAbsolute(this._options.componentDirectory)) + ? this._options.componentDirectory + : path.resolve(process.cwd(), this._options.componentDirectory) + + // Convert dot notation to path segments. + this._propertyPath = this._options.property.split('.') + if (this._options.componentProperty) { + this._componentPropertyPath = this._options.componentProperty.split('.') + } + } + + async concurrent (data) { + // Get component path. + let componentPath + if (this._componentPropertyPath) { + componentPath = getByPathSegments(data, this._componentPropertyPath) + } + + if (!componentPath && this._options.componentPath) { + componentPath = this._options.componentPath + } else { + this._logger.warn('No component path found therefore skipping!') + return data + } + + // Construct absolute component path. + const componentPathAbsolute = + path.isAbsolute(componentPath) + ? componentPath + : path.resolve(this._options.componentDirectory, componentPath) + + // Import component. + let component = await import(componentPathAbsolute) + if (!component) { + this._logger.warn('No component found at path "' + componentPathAbsolute + '" therefore skipping!') + return data + } + if (component.default) { + component = component.default + } + + // Compile data with component. + let value = await render(component, { + meta: this._app.meta, + data: data, + }) + if (this._options.prefix) { + value = this._options.prefix + value + } + if (this._options.suffix) { + value = value + this._options.suffix + } + + // Set value. + data = setByPathSegments(data, this._propertyPath, value) + + // Return result. + return data + } +} + +export default ProcessMythril diff --git a/packages/process-parse/README.md b/packages/process-parse/README.md new file mode 100644 index 0000000..bdd9858 --- /dev/null +++ b/packages/process-parse/README.md @@ -0,0 +1,21 @@ +# @hoast/process-parse + +Parse a text value using a function or package. + +## Install + +``` +% yarn add @hoast/process-parse +``` + +OR + +``` +% npm install @hoast/process-parse --save +``` + +## Options + +- `{String} property = 'contents'` Dot notation path to the data property which should be used processed by the parser. +- `{Function} parser = JSON.parse` Function which parse the value at the property path. + diff --git a/packages/process-parse/package.json b/packages/process-parse/package.json new file mode 100644 index 0000000..0be0757 --- /dev/null +++ b/packages/process-parse/package.json @@ -0,0 +1,37 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-parse", + "version": "2.0.0", + "description": "Parse a text value using a function or package.", + "keywords": [ + "hoast", + "process", + "parse" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessParse.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-process": "2.0.0", + "@hoast/utils": "2.0.0" + } +} diff --git a/packages/process-parse/src/ProcessParse.js b/packages/process-parse/src/ProcessParse.js new file mode 100644 index 0000000..57d6475 --- /dev/null +++ b/packages/process-parse/src/ProcessParse.js @@ -0,0 +1,44 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +// Import external modules. +import { getByPathSegments } from '@hoast/utils/get.js' +import instantiate from '@hoast/utils/instantiate.js' +import { setByPathSegments } from '@hoast/utils/set.js' + +class ProcessParse extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + property: 'contents', + parser: JSON.parse, + }, options) + + // Convert dot notation to path segments. + this._propertyPath = this._options.property.split('.') + } + + async initialize () { + if (Array.isArray(this._options.parser) || typeof (this._options.parser) === 'string') { + this._parser = await instantiate(this._options.parser) + } else { + this._parser = this._options.parser + } + } + + concurrent (data) { + // Get value. + let value = getByPathSegments(data, this._propertyPath) + // Parse value. + value = this._parser(value) + // Set value. + data = setByPathSegments(data, this._propertyPath, value) + // Return result. + return data + } +} + +export default ProcessParse diff --git a/packages/process-postprocess/README.md b/packages/process-postprocess/README.md new file mode 100644 index 0000000..a7c0153 --- /dev/null +++ b/packages/process-postprocess/README.md @@ -0,0 +1,31 @@ +# @hoast/process-postprocess + +Process CSS, HTML, and JS data using [`postcss`](https://github.com/postcss/postcss#readme) and [`babel`](https://github.com/babel/babel#readme) plugins and minify using [`cssnano`](https://github.com/cssnano/cssnano#readme), [`html-minifier-terser`](https://github.com/terser/html-minifier-terser#readme), and [`terser`](https://github.com/terser/terser#readme). + +## Install + +``` +% yarn add @hoast/process-postprocess +``` + +OR + +``` +% npm install @hoast/process-postprocess --save +``` + +## Options + +- `{String} property = 'contents'` Dot notation path to the data property which should be used processed by Mithril. +- `{String} mode = 'html'` Whether to process the data as either `css`, `html`, or `js`. Set to either of those options. +- `{Boolean} minify = true` Whether to minify. +- `{Object} cssMinifyOptions = {}` [`cssnano` options](https://github.com/cssnano/cssnano#readme). Set to `false` to disable CSS minification. +- `{Object} cssOptions = {}` [`postcss` options](https://github.com/postcss/postcss#readme). +- `{Array} cssPlugins = []` [`postcss` plugins](https://github.com/postcss/postcss#readme). +- `{Object} htmlMinifyOptions = { collapseWhitespace: true }` [`html-minifier-terser` options](https://github.com/terser/html-minifier-terser#readme). +- `{Object} jsMinifyOptions = {}` [`terser` options](https://github.com/terser/terser#readme). Set to `false` to disable JS minification. +- `{Object} jsOptions = {}` [`babel` options](https://github.com/babel/babel#readme). + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-postprocess/package.json b/packages/process-postprocess/package.json new file mode 100644 index 0000000..d03f850 --- /dev/null +++ b/packages/process-postprocess/package.json @@ -0,0 +1,46 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-postprocess", + "version": "2.0.0", + "description": "Process CSS, HTML, and JS data using PostCSS, CSSnano, html-minifier-terser, Babel, and Terser.", + "keywords": [ + "hoast", + "process", + "postprocess", + "minify", + "css", + "html", + "js" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessPostprocess.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@babel/core": "^7.11.6", + "@hoast/base-process": "2.0.0", + "@hoast/utils": "2.0.0", + "cssnano": "^4.1.10", + "html-minifier-terser": "^5.1.1", + "postcss": "^8.1.1", + "terser": "^5.3.3" + } +} diff --git a/packages/process-postprocess/src/ProcessPostprocess.js b/packages/process-postprocess/src/ProcessPostprocess.js new file mode 100644 index 0000000..60002e1 --- /dev/null +++ b/packages/process-postprocess/src/ProcessPostprocess.js @@ -0,0 +1,167 @@ +// Import base class. +import BaseProcess from '@hoast/base-process' + +// Import utility modules. +import deepAssign from '@hoast/utils/deepAssign.js' +import { getByPathSegments } from '@hoast/utils/get.js' +import instantiate from '@hoast/utils/instantiate.js' +import { setByPathSegments } from '@hoast/utils/set.js' + +// import external modules. +import babel from '@babel/core' +import cssnano from 'cssnano' +import htmlMinifier from 'html-minifier-terser' +import { minify as terser } from 'terser' +import Postcss from 'postcss' + +const MODES = [ + 'css', + 'html', + 'js', +] + +class ProcessPostprocess extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + property: 'contents', + mode: 'html', + minify: true, + + cssMinifyOptions: {}, + cssOptions: {}, + cssPlugins: [], + + htmlMinifyOptions: { + collapseWhitespace: true, + }, + + jsMinifyOptions: {}, + jsOptions: {}, + }, options) + + if (MODES.indexOf(this._options.mode) < 0) { + this._logger.error('Unkown mode used. Mode: "' + this._options.mode + '".') + } + + // Convert dot notation to path segments. + this._propertyPath = this._options.property.split('.') + if (this._options.modeProperty) { + this._modePropertyPath = this._options.modeProperty.split('.') + } + } + + async initialize () { + // Setup Postcss plugins. + let cssPlugins = this._options.cssPlugins ?? [] + if (cssPlugins.length >= 0) { + // Instantiate all plugins. + const pluginsTemp = [] + for (let plugin of cssPlugins) { + if (Array.isArray(plugin) || typeof (plugin) === 'string') { + plugin = await instantiate(plugin) + } + pluginsTemp.push(plugin) + } + cssPlugins = pluginsTemp + } + + // Add Postcss minifier. + if (this._options.minify && this._options.cssMinifyOptions) { + cssPlugins.push(cssnano(this._options.cssMinifyOptions)) + } + + // Setup Postcss. + const postcss = new Postcss(cssPlugins) + // Store options. + const cssOptions = deepAssign({ + }, this._options.cssOptions, { + from: undefined, + }) + + // Create CSS processor. + this._cssProcess = (code) => { + return postcss.process(code, cssOptions).css + } + this._cssProcessAsync = (code) => { + return new Promise((resolve, reject) => { + // Process via Postcss. + postcss.process(code, cssOptions) + .then(result => { + resolve(result.css) + }) + .catch(error => { + reject(error) + }) + }) + } + + // Store options. + const jsOptions = deepAssign({}, this._options.jsOptions) + const jsMinifyOptions = deepAssign({}, this._options.jsMinifyOptions) + + // Create JS processor. + this._jsProcess = (code) => { + // Process via Babel. + const result = babel.transform(code, jsOptions) + if (result.error) { + return code + } + + return result.code + } + this._jsProcessAsync = async (code) => { + // Process via Babel. + let result = await babel.transformAsync(code, jsOptions) + if (result.error) { + return code + } + + code = result.code + + // Process via Terser. + result = await terser(code, jsMinifyOptions) + if (result.error) { + return code + } + + return result.code + } + + // CSS and JS parser functions to this. + const htmlMinifyOptions = deepAssign({}, this._options.htmlMinifyOptions, { + minifyCSS: this._cssProcess, + minifyJS: this._jsProcess, + }) + + // Create HTML processor. + this._htmlProcess = (code) => { + return htmlMinifier.minify(code, htmlMinifyOptions) + } + } + + async concurrent (data) { + let value = getByPathSegments(data, this._propertyPath) + switch (this._options.mode) { + case 'css': + value = await this._cssProcessAsync(value) + break + + case 'html': + value = this._htmlProcess(value) + break + + case 'js': + value = await this._jsProcessAsync(value) + break + } + data = setByPathSegments(data, this._propertyPath, value) + + return data + } +} + +export default ProcessPostprocess diff --git a/packages/process-writefiles/README.md b/packages/process-writefiles/README.md new file mode 100644 index 0000000..dc4f438 --- /dev/null +++ b/packages/process-writefiles/README.md @@ -0,0 +1,26 @@ +# @hoast/process-writefiles + +Write data to the filesystem. + +## Install + +``` +% yarn add @hoast/process-writefiles +``` + +OR + +``` +% npm install @hoast/process-writefiles --save +``` + +## Options + +- `{String} directory = 'dst'` Directory path, either absolute or relative to the working directory. +- `{Object} directoryOptions = {}` [fs.mkdir options](https://nodejs.org/api/fs.html#fs_fs_mkdir_path_options_callback). +- `{String} property = 'contents'` Dot notation path to the data property which should be used as the file's contents. +- `{Object} writeOptions = { encoding: 'utf8' }` [fs.writeFile](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback). + +- `{Function} filter = null` Custom filter function. The item data is given as the parameter. Return `true` if it should be processed, return `false` if this processor should be skipped. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/process-writefiles/package.json b/packages/process-writefiles/package.json new file mode 100644 index 0000000..4a1b9f4 --- /dev/null +++ b/packages/process-writefiles/package.json @@ -0,0 +1,39 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/process-writefiles", + "version": "2.0.0", + "description": "Write data to the filesystem.", + "keywords": [ + "hoast", + "process", + "filesystem", + "write", + "files" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/ProcessWritefiles.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-package": "2.0.0", + "@hoast/utils": "2.0.0" + } +} diff --git a/packages/process-writefiles/src/ProcessWritefiles.js b/packages/process-writefiles/src/ProcessWritefiles.js new file mode 100644 index 0000000..4911cc9 --- /dev/null +++ b/packages/process-writefiles/src/ProcessWritefiles.js @@ -0,0 +1,74 @@ +// Import base module. +import BaseProcess from '@hoast/base-process' +import { getByPathSegments } from '@hoast/utils/get.js' + +// Import build-in modules. +import fs from 'fs' +import path from 'path' +import { promisify } from 'util' + +// Promisify file system functions. +const fsMkdir = promisify(fs.mkdir) +const fsWriteFile = promisify(fs.writeFile) + +class ProcessWritefiles extends BaseProcess { + /** + * Create package instance. + * @param {...Object} options Options objects. + */ + constructor(options) { + super({ + directory: 'dst', + directoryOptions: {}, + + property: 'contents', + writeOptions: { + encoding: 'utf8', + }, + }, options) + + // Construct absolute directory path. + this._directoryPath = + (this._options.directory && path.isAbsolute(this._options.directory)) + ? this._options.directory + : path.resolve(process.cwd(), this._options.directory) + + this.directoryOptions = Object.assign( + this._options.directoryOptions, + { + recursive: true, + } + ) + + this._propertyPath = this._options.property.split('.') + } + + async sequential (data) { + // Construct absolute file path. + const filePath = path.resolve(this._directoryPath, data.path) + + // Ensure directory exists. + await fsMkdir( + path.dirname(filePath), + this.directoryOptions + ) + + return data + } + + async concurrent (data) { + // Construct absolute file path. + const filePath = path.resolve(this._directoryPath, data.path) + + // Write file to directory. + await fsWriteFile( + filePath, + getByPathSegments(data, this._propertyPath), + this._options.writeOptions + ) + + return data + } +} + +export default ProcessWritefiles diff --git a/packages/source-custom/README.md b/packages/source-custom/README.md new file mode 100644 index 0000000..456472a --- /dev/null +++ b/packages/source-custom/README.md @@ -0,0 +1,26 @@ +# @hoast/source-custom + +Allows you to provide your own custom source functions. Extends base-source where the overridabel functions can be provided via the options. Helps you from having to create a package for simple one-off behaviour. + +## Install + +``` +% yarn add @hoast/source-custom +``` + +OR + +``` +% npm install @hoast/source-custom --save +``` + +## Options + +This package extends the [@hoast/base-source](https://github.com/hoast/hoast/tree/master/packages/base-source#readme) package. For more information on how to use this package see the options below as well as the base package. + +- `{Function} initialize = null` Initialize function. +- `{Function} sequential = null` Sequential function. +- `{Function} concurrent = null` Concurrent function. +- `{Function} final = null` Final function. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/source-custom/package.json b/packages/source-custom/package.json new file mode 100644 index 0000000..a5737c4 --- /dev/null +++ b/packages/source-custom/package.json @@ -0,0 +1,36 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/source-custom", + "version": "2.0.0", + "description": "Allows you to provide your own custom source functions.", + "keywords": [ + "hoast", + "source", + "custom" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/SourceCustom.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-source": "2.0.0" + } +} diff --git a/packages/source-custom/src/SourceCustom.js b/packages/source-custom/src/SourceCustom.js new file mode 100644 index 0000000..bed01a3 --- /dev/null +++ b/packages/source-custom/src/SourceCustom.js @@ -0,0 +1,35 @@ +// Import base module. +import BaseSource from '@hoast/base-source' + +class SourceCustom extends BaseSource { + /** + * Create package instance. + * @param {Object} options Options objects. + */ + constructor(options) { + super({ + initialize: null, + sequential: null, + concurrent: null, + final: null, + }, options) + + if (this._options.initialize) { + this.initialize = this._options.initialize + } + + if (this._options.sequential) { + this.sequential = this._options.sequential + } + + if (this._options.concurrent) { + this.concurrent = this._options.concurrent + } + + if (this._options.final) { + this.final = this._options.final + } + } +} + +export default SourceCustom diff --git a/packages/source-readfiles/README.md b/packages/source-readfiles/README.md new file mode 100644 index 0000000..740c00b --- /dev/null +++ b/packages/source-readfiles/README.md @@ -0,0 +1,30 @@ +# @hoast/source-readfiles + +Read files from the filesystem. + +## Install + +``` +% yarn add @hoast/source-readfiles +``` + +OR + +``` +% npm install @hoast/source-readfiles --save +``` + +## Options + +- `{String} directory = 'src'` Directory path, either absolute or relative to the working directory. +- `{Array} filterPatterns = null` Glob patterns used to filter the file paths relative to the set directory with. +- `{Object} filterOptions` Pattern matching options. + - `{Boolean} all = false` Whether all patterns have to match, or any match is sufficient. + - `{Boolean} extended = false` Enable all advanced features from extglob. + - `{String} flags = ''` RegExp flags (e.g. 'i' ) to pass to the RegExp constructor. + - `{Boolean} globstar = false` If false the pattern 'path/*' will match any string beginning with 'path/', for example it will match 'path/file.txt' and 'path/to/file.txt'. If true the same 'path/*' will match any string beginning with 'path/' that does not have a '/' to the right of it, for example it will match 'path/file.txt' but not 'path/to/file.txt'. If true the pattern 'path/**' will match any string beginning with 'path/', which is equal to the 'path/*' with globstar set to false. + - `{Boolean} strict = false` Be forgiving about multiple slashes, such as /// and make everything after the first / optional. Like how bash glob works. +- `{Object} readOptions = { encoding: 'utf8' }` [fs.readfile options](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback). Set to false to disable retrieving the file contents. +- `{Object} statOptions = {}` [fs.stat options](https://nodejs.org/api/fs.html#fs_fs_stat_path_options_callback) Set to false to disable retrieving the file metadata. + +- `{Number} logLevel = 2` Log level given to the [logger](https://github.com/hoast/hoast/tree/master/packages/utils#logger.js). diff --git a/packages/source-readfiles/package.json b/packages/source-readfiles/package.json new file mode 100644 index 0000000..08b55bc --- /dev/null +++ b/packages/source-readfiles/package.json @@ -0,0 +1,40 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/source-readfiles", + "version": "2.0.0", + "description": "Read files from the filesystem.", + "keywords": [ + "hoast", + "source", + "filesystem", + "read", + "files" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "src/" + ], + "main": "src/SourceReadfiles.js", + "scripts": { + "lint": "eslint --fix --cache src --ext .js" + }, + "dependencies": { + "@hoast/base-source": "2.0.0", + "@hoast/utils": "2.0.0", + "planckmatch": "^0.2.1" + } +} diff --git a/packages/source-readfiles/src/SourceReadfiles.js b/packages/source-readfiles/src/SourceReadfiles.js new file mode 100644 index 0000000..979d986 --- /dev/null +++ b/packages/source-readfiles/src/SourceReadfiles.js @@ -0,0 +1,150 @@ +// Import base module. +import BaseSource from '@hoast/base-source' + +// Import build-in modules. +import fs from 'fs' +import path from 'path' + +// Import external modules. +import iterateDirectory from '@hoast/utils/iterateDirectory.js' +import planckmatch from 'planckmatch' +import { trimStart } from '@hoast/utils/trim.js' + +// TODO: Improve build speed. +// Add option to skip unchanged files, prevents copying over basic files that haven't changed. +// One problem is that files names can change for example from a .md extension to .html extension. +// Perhaps an optional file name transformer function can given to improve this. +// Consider caching at the process.cwd directory in a cache file which stores the last iterated time of +// the file at the relative path which can be compared with the last modified time from the stats data. +// Perhaps intergrate a file watcher with the CLI that monitors the files and store which file is changed. +// As a result it can be check based on the change origin that a template has been changed and therefore +// requires a full rebuild of all the pages instead of just the one page itself. + +class SourceReadfiles extends BaseSource { + /** + * Create package instance. + * @param {Object} options Options objects. + */ + constructor(options) { + super({ + directory: 'src', + filterPatterns: null, + filterOptions: { + all: false, + }, + readOptions: { + encoding: 'utf8', + }, + statOptions: {}, + }, options) + + // Parse patterns into regular expressions. + if (this._options.patterns && this._options.patterns.length > 0) { + this._expressions = this._options.patterns.map(pattern => { + return planckmatch.parse(pattern, this._options.patternOptions, true) + }) + } + + // Construct absolute directory path. + this._directoryPath = + (this._options.directory && path.isAbsolute(this._options.directory)) + ? this._options.directory + : path.resolve(process.cwd(), this._options.directory) + } + + async initialize () { + // Create directory iterator. + this._directoryIterator = await iterateDirectory(this._directoryPath) + } + + async sequential () { + let filePath + // Get next file path. + while (filePath = await this._directoryIterator()) { + // Make file path relative. + const filePathRelative = path.relative(this._directoryPath, filePath) + + // Check if path matches the patterns. + if (this._expressions) { + // Skip if it does not matches. + const matches = this._options.patternOptions.all ? planckmatch.match.all(filePathRelative, this._expressions) : planckmatch.match.any(filePathRelative, this._expressions) + if (!matches) { + continue + } + } + + return [filePath, filePathRelative] + } + + this.exhausted = true + } + + async concurrent (data) { + // Exit early if invalid parameters. + if (!data) { + return + } + + // Deconstruct paramters. + const [filePath, filePathRelative] = data + + // Construc URI for file. + let uri = trimStart(filePath, path.sep) + if (path.sep !== '/') { + uri = uri.replace(path.sep, '/') + } + + // Create result. + const result = { + uri: 'file://' + uri, + path: filePathRelative, + } + + // Store promises here. + const promises = [] + + // Read file content. + if (this._options.readOptions) { + promises.push( + new Promise((resolve, reject) => { + fs.readFile(filePath, this._options.readOptions, (error, data) => { + if (error) { + reject(error) + return + } + + result.contents = data + resolve() + }) + }) + ) + } + + // Get file stat. + if (this._options.statOptions) { + promises.push( + new Promise((resolve, reject) => { + fs.stat(filePath, this._options.statOptions, (error, data) => { + if (error) { + reject(error) + return + } + + result.stat = data + resolve() + }) + }) + ) + } + + // Wait for all the promises to finish. + if (promises.length > 0) { + await Promise.all(promises) + } + + // Return result. + return result + } +} + +export default SourceReadfiles diff --git a/packages/utils/Logger.js b/packages/utils/Logger.js new file mode 100644 index 0000000..8d83091 --- /dev/null +++ b/packages/utils/Logger.js @@ -0,0 +1,131 @@ +/** + * Logger class usefull for only allowing messages to be send to the console of the right level is set. + */ +class Logger { + /** + * Create logger instance. + * @param {Number} level Log level. + * @param {String} prefix Prefix of logged messages. + */ + constructor(level = 2, prefix = undefined) { + this.setLevel(level) + this.setPrefix(prefix) + } + + // Option setters and getters. + + /** + * Get log level value. + * @returns {Number} log level value. + */ + getlevel () { + return this._level + } + + /** + * Set log level value. + * @param {Number} level Log level value. + */ + setLevel (level) { + if (level !== null && level !== undefined && typeof (level) !== 'number') { + throw new Error('Log level value not of type number.') + } + + this._level = level + } + + /** + * Get log prefix value. + * @returns {String} Log prefix value. + */ + getPrefix () { + return this._prefix + } + + /** + * Set log prefix value. + * @param {Number} prefix Log prefix value. + */ + setPrefix (prefix) { + if (prefix !== null && prefix !== undefined && typeof (prefix) !== 'string') { + throw new Error('Log prefix value not of type string.') + } + + this._prefix = prefix + } + + // Logging functions. + + /** + * Undocumented alias for `info` function. + */ + log (parameters) { + return this.info(...parameters) + } + + /** + * Logs info message to console if level is greater than 2. + * @param {String} message Message to output. + * @param {...Any} optionalParams Additional optional parameters. + */ + info (message, ...optionalParams) { + if (this._level < 3) { + return + } + + if (this.getPrefix()) { + message = `${this.getPrefix()}: ${message}` + } + + console.log(message, ...optionalParams) + } + + /** + * Logs warning message to console if level is greater than 1. + * @param {String} message Message to output. + * @param {...Any} optionalParams Additional optional parameters. + */ + warn (message, ...optionalParams) { + if (this._level < 2) { + return + } + + if (this.getPrefix()) { + message = `${this.getPrefix()}: ${message}` + } + + console.warn(message, ...optionalParams) + } + + /** + * Logs error message to console if level is greater than 1. + * @param {String} message Message to output. + * @param {...Any} optionalParams Additional optional parameters. + */ + error (message, ...optionalParams) { + if (this._level < 1) { + return + } + + if (this.getPrefix()) { + message = `${this.getPrefix()}: ${message}` + } + + console.error(message, ...optionalParams) + } + + /** + * Logs trace to console. + * @param {String} message Message to output. + * @param {...Any} optionalParams Additional optional parameters. + */ + trace (message, ...optionalParams) { + if (this.getPrefix()) { + message = `${this.getPrefix()}: ${message}` + } + + console.trace(message, ...optionalParams) + } +} + +export default Logger diff --git a/packages/utils/README.md b/packages/utils/README.md new file mode 100644 index 0000000..3a2fd79 --- /dev/null +++ b/packages/utils/README.md @@ -0,0 +1,159 @@ +# @hoast/utils + +Utility functions commonly used by hoast and hoast packages. + +## Install + +``` +% yarn add @hoast/utils +``` + +OR + +``` +% npm install @hoast/utils --save +``` + +## Usage + +A list of all the files and exported functions can be seen below. Simply import by the package name followed by the file path, for example `import deepAssign from '@hoast/utils/deepAssign.js'`. If a file exports multiple functions the default export will be object with all the functions on it. + +### deepAssign.js + +Deeply assign a series of objects properties together. +- `@param {Object} target` Target object to assign onto. +- `@param {...Object} sources` Sources to assign with. +- `@returns {Object}` Target object with sources values assigned. + +### deepMerge.js + +Deeply assign a series of arrays and or objects properties together. +- `@param {Any} target` Target to merge onto. +- `@param {...Any} sources` Sources to merge with. +- `@returns {Object}` Target object with sources values merged. + +### iterateDirectory.js + +Creates recursive directory iterator. Call the returned function again and again to receive a file path. Returns `null` when all values have been iterated over. +- `@param {String} directoryPath` Absolute directory path. +- `@returns {Function}` Recursive directory iterator function. + +### get.js + +#### getByDotNotation + +Get a value from a source by a dot seperated path. +- `@param {Object} source` The object to retrieve a value from. +- `@param {String} path` Dot notation string with each segment a property on the source. +- `@returns {Any}` Value at path. + +#### getByPathSegments + +Get a value from a source by an array seperated path. +- `@param {Object} source` The object to retrieve a value from. +- `@param {Array}` path Array of strings with each segment a property on the source. +- `@returns {Any}` Value at path. + +### has.js + +Check if an object has the required properties. +- `@param {Object} value` Value to check. +- `@param {Array} propertyNames` Array of property names. +- `@returns {Boolean}` Whether the value is an object and the properties exist. + +### instantiate.js + +Instantiate a value. If the value is an array the first item is assumed to be the value and the others become parameters given to the constructor. +- `@param {Any} value` Value to import and or instantiate. A string will be dynamically imported. +- `@returns {Object}` The imported and instantiated object. + +### is.js + +#### isClass + +Checks if value is a class. +- `@param {Any}` value Value to check. +- `@returns {Boolean}` Whether the value is a class. + +#### isObject + +Check whether the value is an object. +- `@param {Any}` value Value of unknown type. +- `@returns {Boolean}` Whether the value is an object. + +### Logger.js + +Logger class usefull for only allowing messages to be send to the console of the right level is set. + +- `constructor` Create logger instance. + - `@param {Number} level` Log level. + - `@param {String} prefix` Prefix of logged messages. + +- `getLevel` Get log level value. + - `@returns {Number}` log level value. + +- `setLevel` Set log level value. + - `@param {Number} level` Log level value. + +- `getPrefix` Get log prefix value. + - `@returns {String}` Log prefix value. + +- `setPrefix` Set log prefix value. + - `@param {Number} prefix` Log prefix value. + +- `info` Logs info message to console if level is greater than 2. + - `@param {String} message` Message to output. + - `@param {...Any} optionalParams` Additional optional parameters. + +- `warn` Logs warning message to console if level is greater than 1. + - `@param {String} message` Message to output. + - `@param {...Any} optionalParams` Additional optional parameters. + +- `error` Logs error message to console if level is greater than 1. + - `@param {String} message` Message to output. + - `@param {...Any} optionalParams` Additional optional parameters. + +- `trace` Logs trace to console. + - `@param {String} message` Message to output. + - `@param {...Any} optionalParams` Additional optional parameters. + +### set.js + +#### setByDotNotation + +Set a value on a target by a dot seperated path. +- `@param {Object} target` Target object to set value to. +- `@param {String} path` Dot notation string with each segment a property on the target. +- `@param {Any} value` The value to set at the path on the target. +- `@returns {Object}` Target object with the value set to it. + +#### setByPathSegments + +Set a value on a target by an array seperated path. +- `@param {Object} target` Target object to set value to. +- `@param {Array} path` Array of strings with each segment a property on the target. +- `@param {Any} value` The value to set at the path on the target. +- `@returns {Object}` Target object with the value set to it. + +### trim.js + +#### trimStart + +Trim a specific character from the start of a string. +- `@param {String} string` String to trim. +- `@param {String} character` Character to trim. +- `@returns {String}` Trimmed string. + +#### trim + +Trim a specific character from the start and end of a string. +- `@param {String} string` String to trim. +- `@param {String} character` Character to trim. +- `@returns {String}` Trimmed string. + +#### trimEnd + +Trim a specific character from the end of a string. +- `@param {String} string` String to trim. +- `@param {String} character` Character to trim. +- `@returns {String}` Trimmed string. diff --git a/packages/utils/deepAssign.js b/packages/utils/deepAssign.js new file mode 100644 index 0000000..02b6744 --- /dev/null +++ b/packages/utils/deepAssign.js @@ -0,0 +1,36 @@ +// Import internal modules. +import { isObject } from './is.js' + +/** + * Deeply assign a series of objects properties together. + * @param {Object} target Target object to assign onto. + * @param {...Object} sources Sources to assign with. + * @returns {Object} Target object with sources values assigned. + */ +const deepAssign = function (target, ...sources) { + if (!sources.length) { + return target + } + const source = sources.shift() + + if (isObject(target) && isObject(source)) { + for (const key in source) { + if (isObject(source[key])) { + if (!target[key]) { + Object.assign(target, { + [key]: {}, + }) + } + deepAssign(target[key], source[key]) + } else { + Object.assign(target, { + [key]: source[key], + }) + } + } + } + + return deepAssign(target, ...sources) +} + +export default deepAssign diff --git a/packages/utils/deepMerge.js b/packages/utils/deepMerge.js new file mode 100644 index 0000000..8aaa939 --- /dev/null +++ b/packages/utils/deepMerge.js @@ -0,0 +1,46 @@ +// Import internal modules. +import { isObject } from './is.js' + +/** + * Deeply assign a series of arrays and or objects properties together. + * @param {Any} target Target to merge onto. + * @param {...Any} sources Sources to merge with. + * @returns {Object} Target object with sources values merged. + */ +const deepMerge = function (target, ...sources) { + if (!sources.length) { + return target + } + const source = sources.shift() + + if (Array.isArray(source)) { + if (Array.isArray(target)) { + for (const item of source) { + if (target.indexOf(item) < 0) { + target.push(source) + } + } + } + } else if (isObject(source)) { + if (isObject(target)) { + for (const key in source) { + if (isObject(source[key])) { + if (!target[key]) { + Object.assign(target, { + [key]: {}, + }) + } + deepMerge(target[key], source[key]) + } else { + Object.assign(target, { + [key]: source[key], + }) + } + } + } + } + + return deepMerge(target, ...sources) +} + +export default deepMerge diff --git a/packages/utils/get.js b/packages/utils/get.js new file mode 100644 index 0000000..103f715 --- /dev/null +++ b/packages/utils/get.js @@ -0,0 +1,24 @@ +/** + * Get a value from a source by a dot seperated path. + * @param {Object} source The object to retrieve a value from. + * @param {String} path Dot notation string with each segment a property on the source. + * @returns {Any} Value at path. + */ +export const getByDotNotation = function (source, path) { + return getByPathSegments(source, path.split('.')) +} + +/** + * Get a value from a source by an array seperated path. + * @param {Object} source The object to retrieve a value from. + * @param {Array} path Array of strings with each segment a property on the source. + * @returns {Any} Value at path. + */ +export const getByPathSegments = function (source, path) { + return [...path].reduce((object, segment) => object[segment], source) +} + +export default { + getByDotNotation, + getByPathSegments, +} diff --git a/packages/utils/has.js b/packages/utils/has.js new file mode 100644 index 0000000..2e03849 --- /dev/null +++ b/packages/utils/has.js @@ -0,0 +1,26 @@ +/** + * Check if an object has the required properties. + * @param {Object} value Value to check. + * @param {Array} propertyNames Array of property names. + * @returns {Boolean} Whether the value is an object and the properties exist. + */ +export const hasProperties = function (value, propertyNames) { + // Check if module is an object. + const moduleType = typeof (value) + if (moduleType !== 'object') { + return false + } + + // Check if object has all required properties. + for (const propertyName of propertyNames) { + if (!Object.prototype.hasOwnProperty.call(value, propertyName)) { + return false + } + } + + return true +} + +export default { + hasProperties, +} diff --git a/packages/utils/index.js b/packages/utils/index.js new file mode 100644 index 0000000..1ea8da7 --- /dev/null +++ b/packages/utils/index.js @@ -0,0 +1,34 @@ +import _deepAssign from './deepAssign.js' +import _deepMerge from './deepMerge.js' +import _get from './get.js' +import _has from './has.js' +import _instantiate from './instantiate.js' +import _iterateDirectory from './iterateDirectory.js' +import _is from './is.js' +import _Logger from './Logger.js' +import _set from './set.js' +import _trim from './trim.js' + +export const deepAssign = _deepAssign +export const deepMerge = _deepMerge +export const get = _get +export const has = _has +export const instantiate = _instantiate +export const iterateDirectory = _iterateDirectory +export const is = _is +export const Logger = _Logger +export const set = _set +export const trim = _trim + +export default { + deepAssign: _deepAssign, + deepMerge: _deepMerge, + get: _get, + has: _has, + instantiate: _instantiate, + iterateDirectory: _iterateDirectory, + is: _is, + Logger: _Logger, + set: _set, + trim: _trim, +} diff --git a/packages/utils/instantiate.js b/packages/utils/instantiate.js new file mode 100644 index 0000000..4d8335e --- /dev/null +++ b/packages/utils/instantiate.js @@ -0,0 +1,49 @@ +import { isClass } from './is.js' + +/** + * Instantiate a value. If the value is an array the first item is assumed to be the value and the others become parameters given to the constructor. + * @param {Any} value Value to import and or instantiate. A string will be dynamically imported. + * @returns {Object} The imported and instantiated object. + */ +const instantiate = async function (value) { + let result, parameters + if (Array.isArray(value)) { + result = value.shift() + parameters = value + } else { + result = value + parameters = [] + } + + // Get type of result. + let type = typeof (result) + + // Import as package if string. + if (type === 'string') { + result = (await import(result)) + if (result.default) { + result = result.default + } + + // Get type of imported. + type = typeof (result) + + // Check new value. + if (type !== 'function') { + throw new Error('Imported type must be a class or function.') + } + } + + // Instantiate result. + if (type === 'function') { + if (isClass(result)) { + result = new result(...parameters) // eslint-disable-line new-cap + } else { + result = result(...parameters) + } + } + + return result +} + +export default instantiate diff --git a/packages/utils/is.js b/packages/utils/is.js new file mode 100644 index 0000000..7fd9ecc --- /dev/null +++ b/packages/utils/is.js @@ -0,0 +1,27 @@ +/** + * Checks if value is a class. + * @param {Any} value Value to check. + * @returns {Boolean} Whether the value is a class. + */ +export const isClass = function (value) { + const isConstructorOrClass = value.constructor && value.constructor.toString().substring(0, 5) === 'class' + if (value.prototype === undefined) { + return isConstructorOrClass + } + const prototypeIsConstructorOrClass = (value.prototype.constructor && value.prototype.constructor.toString && value.prototype.constructor.toString().substring(0, 5) === 'class') + return isConstructorOrClass || prototypeIsConstructorOrClass +} + +/** + * Check whether the value is an object. + * @param {Any} value Value of unknown type. + * @returns {Boolean} Whether the value is an object. + */ +export const isObject = function (value) { + return (value && typeof value === 'object' && !Array.isArray(value)) +} + +export default { + isClass, + isObject, +} diff --git a/packages/utils/iterateDirectory.js b/packages/utils/iterateDirectory.js new file mode 100644 index 0000000..6112380 --- /dev/null +++ b/packages/utils/iterateDirectory.js @@ -0,0 +1,63 @@ +// Import build-in modules. +import fs from 'fs' +import path from 'path' +import { promisify } from 'util' + +const fsOpendir = promisify(fs.opendir) + +/** + * Creates recursive directory iterator. Call the returned function again and again to receive a file path. Returns `null` when all values have been iterated over. + * @param {String} directoryPath Absolute directory path. + * @returns {Function} Recursive directory iterator function. + */ +const iterateDirectory = async function (directoryPath) { + const directoryResource = await fsOpendir(directoryPath, { encoding: 'utf8' }) + let subIterator = null + + /** + * Call the function again and again to receive a file path. Returns `null` when all values have been iterated over. + */ + return async function () { + if (subIterator) { + const item = await subIterator.next() + if (item) { + return item + } + + subIterator = null + } + + let item + // Get directory item. + while (item = await directoryResource.read()) { + // For directories recursively create an iterator on the sub directory. + if (item.isDirectory()) { + // Create new sub iterator. + subIterator = await iterateDirectory( + path.resolve(directoryPath, item.name) + ) + + // Get next item from iterator. + const filePath = await subIterator.next() + + // Exit early if end of iterator. + if (!filePath) { + subIterator = null + continue + } + + // Return file path. + return filePath + } + + // Construct file path. + const filePath = path.resolve(directoryPath, item.name) + return filePath + } + + // Close directory resource handler. + await directoryResource.close() + } +} + +export default iterateDirectory diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000..9876393 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,37 @@ +{ + "author": { + "name": "Ron Dekker", + "url": "https://rondekker.com" + }, + "name": "@hoast/utils", + "version": "2.0.0", + "description": "Utility functions commonly used by hoast and hoast packages.", + "keywords": [ + "hoast", + "util", + "utils", + "utility", + "utilities" + ], + "license": "MIT", + "homepage": "https://github.com/hoast/hoast#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/hoast/hoast.git" + }, + "bugs": { + "url": "https://github.com/hoast/hoast/issues" + }, + "type": "module", + "files": [ + "README.md", + "CHANGELOG.md", + "*.js", + "base/*.js" + ], + "main": "index.js", + "scripts": { + "lint": "eslint --fix --cache *.js" + }, + "dependencies": {} +} diff --git a/packages/utils/set.js b/packages/utils/set.js new file mode 100644 index 0000000..1a2bae7 --- /dev/null +++ b/packages/utils/set.js @@ -0,0 +1,43 @@ +/** + * Set a value on a target by a dot seperated path. + * @param {Object} target Target object to set value to. + * @param {String} path Dot notation string with each segment a property on the target. + * @param {Any} value The value to set at the path on the target. + * @returns {Object} Target object with the value set to it. + */ +export const setByDotNotation = function (target, path, value) { + // Split path and return result from setByPathSegments. + return setByPathSegments(target, path.split('.'), value) +} + +/** + * Set a value on a target by an array seperated path. + * @param {Object} target Target object to set value to. + * @param {Array} path Array of strings with each segment a property on the target. + * @param {Any} value The value to set at the path on the target. + * @returns {Object} Target object with the value set to it. + */ +export const setByPathSegments = function (target, path, value) { + // Ensure target is an object. + if (typeof (target) !== 'object') { + target = {} + } + + [...path].reduce((object, segment, index) => { + if (index === path.length - 1) { + object[segment] = value + return + } else if (!object[segment] || typeof (object[segment]) !== 'object') { + object[segment] = {} + } + + return object[segment] + }, target) + + return target +} + +export default { + setByDotNotation, + setByPathSegments, +} diff --git a/packages/utils/trim.js b/packages/utils/trim.js new file mode 100644 index 0000000..7e55104 --- /dev/null +++ b/packages/utils/trim.js @@ -0,0 +1,53 @@ +/** + * Trim a specific character from the start of a string. + * @param {String} string String to trim. + * @param {String} character Character to trim. + * @returns {String} Trimmed string. + */ +export const trimStart = function (string, character) { + if (character === ']') { + character = '\\]' + } else if (character === '\\') { + character = '\\\\' + } + + return string.replace(new RegExp('^[' + character + ']', 'g'), '') +} + +/** + * Trim a specific character from the start and end of a string. + * @param {String} string String to trim. + * @param {String} character Character to trim. + * @returns {String} Trimmed string. + */ +export const trim = function (string, character) { + if (character === ']') { + character = '\\]' + } else if (character === '\\') { + character = '\\\\' + } + + return string.replace(new RegExp('^[' + character + ']+|[' + character + ']+$', 'g'), '') +} + +/** + * Trim a specific character from the end of a string. + * @param {String} string String to trim. + * @param {String} character Character to trim. + * @returns {String} Trimmed string. + */ +export const trimEnd = function (string, character) { + if (character === ']') { + character = '\\]' + } else if (character === '\\') { + character = '\\\\' + } + + return string.replace(new RegExp('[' + character + ']$', 'g'), '') +} + +export default { + trimStart, + trim, + trimEnd, +} diff --git a/read.js b/read.js deleted file mode 100644 index cb7deb4..0000000 --- a/read.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require(`./library/read`); \ No newline at end of file diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml deleted file mode 100644 index 331daf7..0000000 --- a/shrinkwrap.yaml +++ /dev/null @@ -1,4470 +0,0 @@ -dependencies: - commander: 2.19.0 - isutf8: 2.0.2 - planckmatch: 0.2.0 -devDependencies: - ava: 0.25.0 - codecov: 3.1.0 - debug: 4.1.0 - eslint: 5.10.0 - nyc: 13.1.0 -packages: - /@ava/babel-plugin-throws-helper/2.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw= - /@ava/babel-preset-stage-4/1.1.0: - dependencies: - babel-plugin-check-es2015-constants: 6.22.0 - babel-plugin-syntax-trailing-function-commas: 6.22.0 - babel-plugin-transform-async-to-generator: 6.24.1 - babel-plugin-transform-es2015-destructuring: 6.23.0 - babel-plugin-transform-es2015-function-name: 6.24.1 - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - babel-plugin-transform-es2015-parameters: 6.24.1 - babel-plugin-transform-es2015-spread: 6.22.0 - babel-plugin-transform-es2015-sticky-regex: 6.24.1 - babel-plugin-transform-es2015-unicode-regex: 6.24.1 - babel-plugin-transform-exponentiation-operator: 6.24.1 - package-hash: 1.2.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg== - /@ava/babel-preset-transform-test-files/3.0.0: - dependencies: - '@ava/babel-plugin-throws-helper': 2.0.0 - babel-plugin-espower: 2.4.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc= - /@ava/write-file-atomic/2.2.0: - dependencies: - graceful-fs: 4.1.15 - imurmurhash: 0.1.4 - slide: 1.1.6 - dev: true - resolution: - integrity: sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA== - /@babel/code-frame/7.0.0: - dependencies: - '@babel/highlight': 7.0.0 - dev: true - resolution: - integrity: sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== - /@babel/generator/7.2.0: - dependencies: - '@babel/types': 7.2.0 - jsesc: 2.5.2 - lodash: 4.17.11 - source-map: 0.5.7 - trim-right: 1.0.1 - dev: true - resolution: - integrity: sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg== - /@babel/helper-function-name/7.1.0: - dependencies: - '@babel/helper-get-function-arity': 7.0.0 - '@babel/template': 7.1.2 - '@babel/types': 7.2.0 - dev: true - resolution: - integrity: sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== - /@babel/helper-get-function-arity/7.0.0: - dependencies: - '@babel/types': 7.2.0 - dev: true - resolution: - integrity: sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== - /@babel/helper-split-export-declaration/7.0.0: - dependencies: - '@babel/types': 7.2.0 - dev: true - resolution: - integrity: sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== - /@babel/highlight/7.0.0: - dependencies: - chalk: 2.4.1 - esutils: 2.0.2 - js-tokens: 4.0.0 - dev: true - resolution: - integrity: sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== - /@babel/parser/7.2.0: - dev: true - engines: - node: '>=6.0.0' - hasBin: true - resolution: - integrity: sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg== - /@babel/template/7.1.2: - dependencies: - '@babel/code-frame': 7.0.0 - '@babel/parser': 7.2.0 - '@babel/types': 7.2.0 - dev: true - resolution: - integrity: sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== - /@babel/traverse/7.1.6: - dependencies: - '@babel/code-frame': 7.0.0 - '@babel/generator': 7.2.0 - '@babel/helper-function-name': 7.1.0 - '@babel/helper-split-export-declaration': 7.0.0 - '@babel/parser': 7.2.0 - '@babel/types': 7.2.0 - debug: 4.1.0 - globals: 11.9.0 - lodash: 4.17.11 - dev: true - resolution: - integrity: sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ== - /@babel/types/7.2.0: - dependencies: - esutils: 2.0.2 - lodash: 4.17.11 - to-fast-properties: 2.0.0 - dev: true - resolution: - integrity: sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A== - /@concordance/react/1.0.0: - dependencies: - arrify: 1.0.1 - dev: true - engines: - node: '>=4.5' - resolution: - integrity: sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ== - /@ladjs/time-require/0.1.4: - dependencies: - chalk: 0.4.0 - date-time: 0.1.1 - pretty-ms: 0.2.2 - text-table: 0.2.0 - dev: true - engines: - node: '>= 0.10.0' - resolution: - integrity: sha512-weIbJqTMfQ4r1YX85u54DKfjLZs2jwn1XZ6tIOP/pFgMwhIN5BAtaCp/1wn9DzyLsDR9tW0R2NIePcVJ45ivQQ== - /acorn-jsx/5.0.1/acorn@6.0.4: - dependencies: - acorn: 6.0.4 - dev: true - id: registry.npmjs.org/acorn-jsx/5.0.1 - peerDependencies: - acorn: ^6.0.0 - resolution: - integrity: sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== - /acorn/6.0.4: - dev: true - engines: - node: '>=0.4.0' - hasBin: true - resolution: - integrity: sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== - /ajv/6.6.1: - dependencies: - fast-deep-equal: 2.0.1 - fast-json-stable-stringify: 2.0.0 - json-schema-traverse: 0.4.1 - uri-js: 4.2.2 - dev: true - resolution: - integrity: sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== - /ansi-align/2.0.0: - dependencies: - string-width: 2.1.1 - dev: true - resolution: - integrity: sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - /ansi-escapes/3.1.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== - /ansi-regex/2.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - /ansi-regex/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - /ansi-regex/4.0.0: - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== - /ansi-styles/1.0.0: - dev: true - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= - /ansi-styles/2.2.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - /ansi-styles/3.2.1: - dependencies: - color-convert: 1.9.3 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - /anymatch/1.3.2: - dependencies: - micromatch: 2.3.11 - normalize-path: 2.1.1 - dev: true - resolution: - integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - /argparse/1.0.10: - dependencies: - sprintf-js: 1.0.3 - dev: true - resolution: - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - /argv/0.0.2: - dev: true - engines: - node: '>=0.6.10' - resolution: - integrity: sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= - /arr-diff/2.0.0: - dependencies: - arr-flatten: 1.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - /arr-diff/4.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - /arr-exclude/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-38fC5VKicHI8zaBM8xKMjL/lxjE= - /arr-flatten/1.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - /arr-union/3.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - /array-differ/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= - /array-find-index/1.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - /array-union/1.0.2: - dependencies: - array-uniq: 1.0.3 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - /array-uniq/1.0.3: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - /array-unique/0.2.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - /array-unique/0.3.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - /arrify/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - /asn1/0.2.4: - dependencies: - safer-buffer: 2.1.2 - dev: true - resolution: - integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - /assert-plus/1.0.0: - dev: true - engines: - node: '>=0.8' - resolution: - integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - /assign-symbols/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - /astral-regex/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - /async-each/1.0.1: - dev: true - resolution: - integrity: sha1-GdOGodntxufByF04iu28xW0zYC0= - /asynckit/0.4.0: - dev: true - resolution: - integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= - /atob/2.1.2: - dev: true - engines: - node: '>= 4.5.0' - hasBin: true - resolution: - integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - /auto-bind/1.2.1: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA== - /ava-init/0.2.1: - dependencies: - arr-exclude: 1.0.0 - execa: 0.7.0 - has-yarn: 1.0.0 - read-pkg-up: 2.0.0 - write-pkg: 3.2.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg== - /ava/0.25.0: - dependencies: - '@ava/babel-preset-stage-4': 1.1.0 - '@ava/babel-preset-transform-test-files': 3.0.0 - '@ava/write-file-atomic': 2.2.0 - '@concordance/react': 1.0.0 - '@ladjs/time-require': 0.1.4 - ansi-escapes: 3.1.0 - ansi-styles: 3.2.1 - arr-flatten: 1.1.0 - array-union: 1.0.2 - array-uniq: 1.0.3 - arrify: 1.0.1 - auto-bind: 1.2.1 - ava-init: 0.2.1 - babel-core: 6.26.3 - babel-generator: 6.26.1 - babel-plugin-syntax-object-rest-spread: 6.13.0 - bluebird: 3.5.3 - caching-transform: 1.0.1 - chalk: 2.4.1 - chokidar: 1.7.0 - clean-stack: 1.3.0 - clean-yaml-object: 0.1.0 - cli-cursor: 2.1.0 - cli-spinners: 1.3.1 - cli-truncate: 1.1.0 - co-with-promise: 4.6.0 - code-excerpt: 2.1.1 - common-path-prefix: 1.0.0 - concordance: 3.0.0 - convert-source-map: 1.6.0 - core-assert: 0.2.1 - currently-unhandled: 0.4.1 - debug: 3.2.6 - dot-prop: 4.2.0 - empower-core: 0.6.2 - equal-length: 1.0.1 - figures: 2.0.0 - find-cache-dir: 1.0.0 - fn-name: 2.0.1 - get-port: 3.2.0 - globby: 6.1.0 - has-flag: 2.0.0 - hullabaloo-config-manager: 1.1.1 - ignore-by-default: 1.0.1 - import-local: 0.1.1 - indent-string: 3.2.0 - is-ci: 1.2.1 - is-generator-fn: 1.0.0 - is-obj: 1.0.1 - is-observable: 1.1.0 - is-promise: 2.1.0 - last-line-stream: 1.0.0 - lodash.clonedeepwith: 4.5.0 - lodash.debounce: 4.0.8 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - loud-rejection: 1.6.0 - make-dir: 1.3.0 - matcher: 1.1.1 - md5-hex: 2.0.0 - meow: 3.7.0 - ms: 2.1.1 - multimatch: 2.1.0 - observable-to-promise: 0.5.0 - option-chain: 1.0.0 - package-hash: 2.0.0 - pkg-conf: 2.1.0 - plur: 2.1.2 - pretty-ms: 3.2.0 - require-precompiled: 0.1.0 - resolve-cwd: 2.0.0 - safe-buffer: 5.1.2 - semver: 5.6.0 - slash: 1.0.0 - source-map-support: 0.5.9 - stack-utils: 1.0.2 - strip-ansi: 4.0.0 - strip-bom-buf: 1.0.0 - supertap: 1.0.0 - supports-color: 5.5.0 - trim-off-newlines: 1.0.1 - unique-temp-dir: 1.0.0 - update-notifier: 2.5.0 - dev: true - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-4lGNJCf6xL8SvsKVEKxEE46se7JAUIAZoKHw9itTQuwcsydhpAMkBs5gOOiWiwt0JKNIuXWc2/r4r8ZdcNrBEw== - /aws-sign2/0.7.0: - dev: true - resolution: - integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - /aws4/1.8.0: - dev: true - resolution: - integrity: sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - /babel-code-frame/6.26.0: - dependencies: - chalk: 1.1.3 - esutils: 2.0.2 - js-tokens: 3.0.2 - dev: true - resolution: - integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - /babel-core/6.26.3: - dependencies: - babel-code-frame: 6.26.0 - babel-generator: 6.26.1 - babel-helpers: 6.24.1 - babel-messages: 6.23.0 - babel-register: 6.26.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - convert-source-map: 1.6.0 - debug: 2.6.9 - json5: 0.5.1 - lodash: 4.17.11 - minimatch: 3.0.4 - path-is-absolute: 1.0.1 - private: 0.1.8 - slash: 1.0.0 - source-map: 0.5.7 - dev: true - resolution: - integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - /babel-generator/6.26.1: - dependencies: - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - detect-indent: 4.0.0 - jsesc: 1.3.0 - lodash: 4.17.11 - source-map: 0.5.7 - trim-right: 1.0.1 - dev: true - resolution: - integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - /babel-helper-builder-binary-assignment-operator-visitor/6.24.1: - dependencies: - babel-helper-explode-assignable-expression: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - /babel-helper-call-delegate/6.24.1: - dependencies: - babel-helper-hoist-variables: 6.24.1 - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - /babel-helper-explode-assignable-expression/6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - /babel-helper-function-name/6.24.1: - dependencies: - babel-helper-get-function-arity: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - /babel-helper-get-function-arity/6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - /babel-helper-hoist-variables/6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - /babel-helper-regex/6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - lodash: 4.17.11 - dev: true - resolution: - integrity: sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - /babel-helper-remap-async-to-generator/6.24.1: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - /babel-helpers/6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 - dev: true - resolution: - integrity: sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - /babel-messages/6.23.0: - dependencies: - babel-runtime: 6.26.0 - dev: true - resolution: - integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - /babel-plugin-check-es2015-constants/6.22.0: - dependencies: - babel-runtime: 6.26.0 - dev: true - resolution: - integrity: sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - /babel-plugin-espower/2.4.0: - dependencies: - babel-generator: 6.26.1 - babylon: 6.18.0 - call-matcher: 1.1.0 - core-js: 2.6.0 - espower-location-detector: 1.0.0 - espurify: 1.8.1 - estraverse: 4.2.0 - dev: true - resolution: - integrity: sha512-/+SRpy7pKgTI28oEHfn1wkuM5QFAdRq8WNsOOih1dVrdV6A/WbNbRZyl0eX5eyDgtb0lOE27PeDFuCX2j8OxVg== - /babel-plugin-syntax-async-functions/6.13.0: - dev: true - resolution: - integrity: sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - /babel-plugin-syntax-exponentiation-operator/6.13.0: - dev: true - resolution: - integrity: sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - /babel-plugin-syntax-object-rest-spread/6.13.0: - dev: true - resolution: - integrity: sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - /babel-plugin-syntax-trailing-function-commas/6.22.0: - dev: true - resolution: - integrity: sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - /babel-plugin-transform-async-to-generator/6.24.1: - dependencies: - babel-helper-remap-async-to-generator: 6.24.1 - babel-plugin-syntax-async-functions: 6.13.0 - babel-runtime: 6.26.0 - dev: true - resolution: - integrity: sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - /babel-plugin-transform-es2015-destructuring/6.23.0: - dependencies: - babel-runtime: 6.26.0 - dev: true - resolution: - integrity: sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - /babel-plugin-transform-es2015-function-name/6.24.1: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - /babel-plugin-transform-es2015-modules-commonjs/6.26.2: - dependencies: - babel-plugin-transform-strict-mode: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - /babel-plugin-transform-es2015-parameters/6.24.1: - dependencies: - babel-helper-call-delegate: 6.24.1 - babel-helper-get-function-arity: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - /babel-plugin-transform-es2015-spread/6.22.0: - dependencies: - babel-runtime: 6.26.0 - dev: true - resolution: - integrity: sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - /babel-plugin-transform-es2015-sticky-regex/6.24.1: - dependencies: - babel-helper-regex: 6.26.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - /babel-plugin-transform-es2015-unicode-regex/6.24.1: - dependencies: - babel-helper-regex: 6.26.0 - babel-runtime: 6.26.0 - regexpu-core: 2.0.0 - dev: true - resolution: - integrity: sha1-04sS9C6nMj9yk4fxinxa4frrNek= - /babel-plugin-transform-exponentiation-operator/6.24.1: - dependencies: - babel-helper-builder-binary-assignment-operator-visitor: 6.24.1 - babel-plugin-syntax-exponentiation-operator: 6.13.0 - babel-runtime: 6.26.0 - dev: true - resolution: - integrity: sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - /babel-plugin-transform-strict-mode/6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - dev: true - resolution: - integrity: sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - /babel-register/6.26.0: - dependencies: - babel-core: 6.26.3 - babel-runtime: 6.26.0 - core-js: 2.6.0 - home-or-tmp: 2.0.0 - lodash: 4.17.11 - mkdirp: 0.5.1 - source-map-support: 0.4.18 - dev: true - resolution: - integrity: sha1-btAhFz4vy0htestFxgCahW9kcHE= - /babel-runtime/6.26.0: - dependencies: - core-js: 2.6.0 - regenerator-runtime: 0.11.1 - dev: true - resolution: - integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - /babel-template/6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - lodash: 4.17.11 - dev: true - resolution: - integrity: sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - /babel-traverse/6.26.0: - dependencies: - babel-code-frame: 6.26.0 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - debug: 2.6.9 - globals: 9.18.0 - invariant: 2.2.4 - lodash: 4.17.11 - dev: true - resolution: - integrity: sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - /babel-types/6.26.0: - dependencies: - babel-runtime: 6.26.0 - esutils: 2.0.2 - lodash: 4.17.11 - to-fast-properties: 1.0.3 - dev: true - resolution: - integrity: sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - /babylon/6.18.0: - dev: true - hasBin: true - resolution: - integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - /balanced-match/1.0.0: - dev: true - resolution: - integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - /base/0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.2.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.1 - pascalcase: 0.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - /bcrypt-pbkdf/1.0.2: - dependencies: - tweetnacl: 0.14.5 - dev: true - resolution: - integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - /binary-extensions/1.12.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== - /bluebird/3.5.3: - dev: true - resolution: - integrity: sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== - /boxen/1.3.0: - dependencies: - ansi-align: 2.0.0 - camelcase: 4.1.0 - chalk: 2.4.1 - cli-boxes: 1.0.0 - string-width: 2.1.1 - term-size: 1.2.0 - widest-line: 2.0.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - /brace-expansion/1.1.11: - dependencies: - balanced-match: 1.0.0 - concat-map: 0.0.1 - dev: true - resolution: - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - /braces/1.8.5: - dependencies: - expand-range: 1.8.2 - preserve: 0.2.0 - repeat-element: 1.1.3 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - /braces/2.3.2: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.3 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - /buf-compare/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-/vKNqLgROgoNtEMLC2Rntpcws0o= - /buffer-from/1.1.1: - dev: true - resolution: - integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - /builtin-modules/1.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - /cache-base/1.0.1: - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.2.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.0 - to-object-path: 0.3.0 - union-value: 1.0.0 - unset-value: 1.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - /caching-transform/1.0.1: - dependencies: - md5-hex: 1.3.0 - mkdirp: 0.5.1 - write-file-atomic: 1.3.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= - /call-matcher/1.1.0: - dependencies: - core-js: 2.6.0 - deep-equal: 1.0.1 - espurify: 1.8.1 - estraverse: 4.2.0 - dev: true - resolution: - integrity: sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw== - /call-signature/0.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qEq8glpV70yysCi9dOIFpluaSZY= - /caller-path/0.1.0: - dependencies: - callsites: 0.2.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - /callsites/0.2.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= - /camelcase-keys/2.1.0: - dependencies: - camelcase: 2.1.1 - map-obj: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - /camelcase/2.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - /camelcase/4.1.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - /capture-stack-trace/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - /caseless/0.12.0: - dev: true - resolution: - integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - /chalk/0.4.0: - dependencies: - ansi-styles: 1.0.0 - has-color: 0.1.7 - strip-ansi: 0.1.1 - dev: true - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= - /chalk/1.1.3: - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - /chalk/2.4.1: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== - /chardet/0.7.0: - dev: true - resolution: - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - /chokidar/1.7.0: - dependencies: - anymatch: 1.3.2 - async-each: 1.0.1 - glob-parent: 2.0.0 - inherits: 2.0.3 - is-binary-path: 1.0.1 - is-glob: 2.0.1 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - dev: true - optionalDependencies: - fsevents: 1.2.4 - resolution: - integrity: sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - /ci-info/1.6.0: - dev: true - resolution: - integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - /circular-json/0.3.3: - deprecated: 'CircularJSON is in maintenance only, flatted is its successor.' - dev: true - resolution: - integrity: sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - /class-utils/0.3.6: - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - /clean-stack/1.3.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= - /clean-yaml-object/0.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= - /cli-boxes/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-T6kXw+WclKAEzWH47lCdplFocUM= - /cli-cursor/2.1.0: - dependencies: - restore-cursor: 2.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - /cli-spinners/1.3.1: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== - /cli-truncate/1.1.0: - dependencies: - slice-ansi: 1.0.0 - string-width: 2.1.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== - /cli-width/2.2.0: - dev: true - resolution: - integrity: sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - /co-with-promise/4.6.0: - dependencies: - pinkie-promise: 1.0.0 - dev: true - engines: - iojs: '>= 1.0.0' - node: '>= 0.10.0' - resolution: - integrity: sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc= - /code-excerpt/2.1.1: - dependencies: - convert-to-spaces: 1.0.2 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw== - /codecov/3.1.0: - dependencies: - argv: 0.0.2 - ignore-walk: 3.0.1 - js-yaml: 3.12.0 - request: 2.88.0 - urlgrey: 0.4.4 - dev: true - engines: - node: '>=4.0' - hasBin: true - resolution: - integrity: sha512-aWQc/rtHbcWEQLka6WmBAOpV58J2TwyXqlpAQGhQaSiEUoigTTUk6lLd2vB3kXkhnDyzyH74RXfmV4dq2txmdA== - /collection-visit/1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - /color-convert/1.9.3: - dependencies: - color-name: 1.1.3 - dev: true - resolution: - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - /color-name/1.1.3: - dev: true - resolution: - integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - /combined-stream/1.0.7: - dependencies: - delayed-stream: 1.0.0 - dev: true - engines: - node: '>= 0.8' - resolution: - integrity: sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== - /commander/2.19.0: - dev: false - resolution: - integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - /common-path-prefix/1.0.0: - dev: true - resolution: - integrity: sha1-zVL28HEuC6q5fW+XModPIvR3UsA= - /commondir/1.0.1: - dev: true - resolution: - integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - /component-emitter/1.2.1: - dev: true - resolution: - integrity: sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - /concat-map/0.0.1: - dev: true - resolution: - integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - /concordance/3.0.0: - dependencies: - date-time: 2.1.0 - esutils: 2.0.2 - fast-diff: 1.2.0 - function-name-support: 0.2.0 - js-string-escape: 1.0.1 - lodash.clonedeep: 4.5.0 - lodash.flattendeep: 4.4.0 - lodash.merge: 4.6.1 - md5-hex: 2.0.0 - semver: 5.6.0 - well-known-symbols: 1.0.0 - dev: true - engines: - node: '>=4.5' - resolution: - integrity: sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ== - /configstore/3.1.2: - dependencies: - dot-prop: 4.2.0 - graceful-fs: 4.1.15 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.3.0 - xdg-basedir: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== - /convert-source-map/1.6.0: - dependencies: - safe-buffer: 5.1.2 - dev: true - resolution: - integrity: sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - /convert-to-spaces/1.0.2: - dev: true - engines: - node: '>= 4' - resolution: - integrity: sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= - /copy-descriptor/0.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - /core-assert/0.2.1: - dependencies: - buf-compare: 1.0.1 - is-error: 2.2.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8= - /core-js/2.6.0: - dev: true - resolution: - integrity: sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw== - /core-util-is/1.0.2: - dev: true - resolution: - integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - /create-error-class/3.0.2: - dependencies: - capture-stack-trace: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - /cross-spawn/5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - resolution: - integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - /cross-spawn/6.0.5: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.6.0 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - engines: - node: '>=4.8' - resolution: - integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - /crypto-random-string/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - /currently-unhandled/0.4.1: - dependencies: - array-find-index: 1.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-mI3zP+qxke95mmE2nddsF635V+o= - /dashdash/1.14.1: - dependencies: - assert-plus: 1.0.0 - dev: true - engines: - node: '>=0.10' - resolution: - integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - /date-time/0.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc= - /date-time/2.1.0: - dependencies: - time-zone: 1.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== - /debug/2.6.9: - dependencies: - ms: 2.0.0 - dev: true - resolution: - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - /debug/3.2.6: - dependencies: - ms: 2.1.1 - dev: true - resolution: - integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - /debug/4.1.0: - dependencies: - ms: 2.1.1 - dev: true - resolution: - integrity: sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== - /decamelize/1.2.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - /decode-uri-component/0.2.0: - dev: true - engines: - node: '>=0.10' - resolution: - integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - /deep-equal/1.0.1: - dev: true - resolution: - integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - /deep-extend/0.6.0: - dev: true - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - /deep-is/0.1.3: - dev: true - resolution: - integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - /define-property/0.2.5: - dependencies: - is-descriptor: 0.1.6 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - /define-property/1.0.0: - dependencies: - is-descriptor: 1.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - /define-property/2.0.2: - dependencies: - is-descriptor: 1.0.2 - isobject: 3.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - /delayed-stream/1.0.0: - dev: true - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - /detect-indent/4.0.0: - dependencies: - repeating: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - /detect-indent/5.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-OHHMCmoALow+Wzz38zYmRnXwa50= - /doctrine/2.1.0: - dependencies: - esutils: 2.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - /dot-prop/4.2.0: - dependencies: - is-obj: 1.0.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - /duplexer3/0.1.4: - dev: true - resolution: - integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - /ecc-jsbn/0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - resolution: - integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - /empower-core/0.6.2: - dependencies: - call-signature: 0.0.2 - core-js: 2.6.0 - dev: true - resolution: - integrity: sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ= - /equal-length/1.0.1: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-IcoRLUirJLTh5//A5TOdMf38J0w= - /error-ex/1.3.2: - dependencies: - is-arrayish: 0.2.1 - dev: true - resolution: - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - /es6-error/4.1.1: - dev: true - resolution: - integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - /escape-string-regexp/1.0.5: - dev: true - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - /eslint-scope/4.0.0: - dependencies: - esrecurse: 4.2.1 - estraverse: 4.2.0 - dev: true - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== - /eslint-utils/1.3.1: - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== - /eslint-visitor-keys/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== - /eslint/5.10.0: - dependencies: - '@babel/code-frame': 7.0.0 - ajv: 6.6.1 - chalk: 2.4.1 - cross-spawn: 6.0.5 - debug: 4.1.0 - doctrine: 2.1.0 - eslint-scope: 4.0.0 - eslint-utils: 1.3.1 - eslint-visitor-keys: 1.0.0 - espree: 5.0.0 - esquery: 1.0.1 - esutils: 2.0.2 - file-entry-cache: 2.0.0 - functional-red-black-tree: 1.0.1 - glob: 7.1.3 - globals: 11.9.0 - ignore: 4.0.6 - imurmurhash: 0.1.4 - inquirer: 6.2.1 - js-yaml: 3.12.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.11 - minimatch: 3.0.4 - mkdirp: 0.5.1 - natural-compare: 1.4.0 - optionator: 0.8.2 - path-is-inside: 1.0.2 - pluralize: 7.0.0 - progress: 2.0.3 - regexpp: 2.0.1 - require-uncached: 1.0.3 - semver: 5.6.0 - strip-ansi: 4.0.0 - strip-json-comments: 2.0.1 - table: 5.1.1 - text-table: 0.2.0 - dev: true - engines: - node: ^6.14.0 || ^8.10.0 || >=9.10.0 - hasBin: true - resolution: - integrity: sha512-HpqzC+BHULKlnPwWae9MaVZ5AXJKpkxCVXQHrFaRw3hbDj26V/9ArYM4Rr/SQ8pi6qUPLXSSXC4RBJlyq2Z2OQ== - /espower-location-detector/1.0.0: - dependencies: - is-url: 1.2.4 - path-is-absolute: 1.0.1 - source-map: 0.5.7 - xtend: 4.0.1 - dev: true - resolution: - integrity: sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU= - /espree/5.0.0: - dependencies: - acorn: 6.0.4 - acorn-jsx: /acorn-jsx/5.0.1/acorn@6.0.4 - eslint-visitor-keys: 1.0.0 - dev: true - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA== - /esprima/4.0.1: - dev: true - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - /espurify/1.8.1: - dependencies: - core-js: 2.6.0 - dev: true - resolution: - integrity: sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg== - /esquery/1.0.1: - dependencies: - estraverse: 4.2.0 - dev: true - engines: - node: '>=0.6' - resolution: - integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - /esrecurse/4.2.1: - dependencies: - estraverse: 4.2.0 - dev: true - engines: - node: '>=4.0' - resolution: - integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - /estraverse/4.2.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= - /esutils/2.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= - /execa/0.7.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.2 - strip-eof: 1.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - /expand-brackets/0.1.5: - dependencies: - is-posix-bracket: 0.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - /expand-brackets/2.1.4: - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - /expand-range/1.8.2: - dependencies: - fill-range: 2.2.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - /extend-shallow/2.0.1: - dependencies: - is-extendable: 0.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - /extend-shallow/3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - /extend/3.0.2: - dev: true - resolution: - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - /external-editor/3.0.3: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== - /extglob/0.3.2: - dependencies: - is-extglob: 1.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - /extglob/2.0.4: - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - /extsprintf/1.3.0: - dev: true - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - /extsprintf/1.4.0: - dev: true - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - /fast-deep-equal/2.0.1: - dev: true - resolution: - integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - /fast-diff/1.2.0: - dev: true - resolution: - integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - /fast-json-stable-stringify/2.0.0: - dev: true - resolution: - integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - /fast-levenshtein/2.0.6: - dev: true - resolution: - integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - /figures/2.0.0: - dependencies: - escape-string-regexp: 1.0.5 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - /file-entry-cache/2.0.0: - dependencies: - flat-cache: 1.3.4 - object-assign: 4.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - /filename-regex/2.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - /fill-range/2.2.4: - dependencies: - is-number: 2.1.0 - isobject: 2.1.0 - randomatic: 3.1.1 - repeat-element: 1.1.3 - repeat-string: 1.6.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - /fill-range/4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - /find-cache-dir/1.0.0: - dependencies: - commondir: 1.0.1 - make-dir: 1.3.0 - pkg-dir: 2.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= - /find-up/1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - /find-up/2.1.0: - dependencies: - locate-path: 2.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - /flat-cache/1.3.4: - dependencies: - circular-json: 0.3.3 - graceful-fs: 4.1.15 - rimraf: 2.6.2 - write: 0.2.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== - /fn-name/2.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= - /for-in/1.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - /for-own/0.1.5: - dependencies: - for-in: 1.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - /forever-agent/0.6.1: - dev: true - resolution: - integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - /form-data/2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.7 - mime-types: 2.1.21 - dev: true - engines: - node: '>= 0.12' - resolution: - integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - /fragment-cache/0.2.1: - dependencies: - map-cache: 0.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - /fs.realpath/1.0.0: - dev: true - resolution: - integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - /fsevents/1.2.4: - bundledDependencies: - - node-pre-gyp - dependencies: - nan: 2.11.1 - dev: true - engines: - node: '>=0.8.0' - optional: true - requiresBuild: true - resolution: - integrity: sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== - /function-name-support/0.2.0: - dev: true - resolution: - integrity: sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE= - /functional-red-black-tree/1.0.1: - dev: true - resolution: - integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - /get-port/3.2.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= - /get-stdin/4.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - /get-stream/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - /get-value/2.0.6: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - /getpass/0.1.7: - dependencies: - assert-plus: 1.0.0 - dev: true - resolution: - integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - /glob-base/0.3.0: - dependencies: - glob-parent: 2.0.0 - is-glob: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - /glob-parent/2.0.0: - dependencies: - is-glob: 2.0.1 - dev: true - resolution: - integrity: sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - /glob/7.1.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.3 - minimatch: 3.0.4 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - resolution: - integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - /global-dirs/0.1.1: - dependencies: - ini: 1.3.5 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - /globals/11.9.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg== - /globals/9.18.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - /globby/6.1.0: - dependencies: - array-union: 1.0.2 - glob: 7.1.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - /got/6.7.1: - dependencies: - create-error-class: 3.0.2 - duplexer3: 0.1.4 - get-stream: 3.0.0 - is-redirect: 1.0.0 - is-retry-allowed: 1.1.0 - is-stream: 1.1.0 - lowercase-keys: 1.0.1 - safe-buffer: 5.1.2 - timed-out: 4.0.1 - unzip-response: 2.0.1 - url-parse-lax: 1.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - /graceful-fs/4.1.15: - dev: true - resolution: - integrity: sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - /har-schema/2.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - /har-validator/5.1.3: - dependencies: - ajv: 6.6.1 - har-schema: 2.0.0 - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - /has-ansi/2.0.0: - dependencies: - ansi-regex: 2.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - /has-color/0.1.7: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= - /has-flag/2.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - /has-flag/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - /has-value/0.3.1: - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - /has-value/1.0.0: - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - /has-values/0.1.4: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E= - /has-values/1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - /has-yarn/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac= - /home-or-tmp/2.0.0: - dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-42w/LSyufXRqhX440Y1fMqeILbg= - /hosted-git-info/2.7.1: - dev: true - resolution: - integrity: sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== - /http-signature/1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.1 - sshpk: 1.15.2 - dev: true - engines: - node: '>=0.8' - npm: '>=1.3.7' - resolution: - integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - /hullabaloo-config-manager/1.1.1: - dependencies: - dot-prop: 4.2.0 - es6-error: 4.1.1 - graceful-fs: 4.1.15 - indent-string: 3.2.0 - json5: 0.5.1 - lodash.clonedeep: 4.5.0 - lodash.clonedeepwith: 4.5.0 - lodash.isequal: 4.5.0 - lodash.merge: 4.6.1 - md5-hex: 2.0.0 - package-hash: 2.0.0 - pkg-dir: 2.0.0 - resolve-from: 3.0.0 - safe-buffer: 5.1.2 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A== - /iconv-lite/0.4.24: - dependencies: - safer-buffer: 2.1.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - /ignore-by-default/1.0.1: - dev: true - resolution: - integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk= - /ignore-walk/3.0.1: - dependencies: - minimatch: 3.0.4 - dev: true - resolution: - integrity: sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - /ignore/4.0.6: - dev: true - engines: - node: '>= 4' - resolution: - integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - /import-lazy/2.1.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - /import-local/0.1.1: - dependencies: - pkg-dir: 2.0.0 - resolve-cwd: 2.0.0 - dev: true - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha1-sReVcqrNwRxqkQCftDDbyrX2aKg= - /imurmurhash/0.1.4: - dev: true - engines: - node: '>=0.8.19' - resolution: - integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= - /indent-string/2.1.0: - dependencies: - repeating: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - /indent-string/3.2.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - /inflight/1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - resolution: - integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - /inherits/2.0.3: - dev: true - resolution: - integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - /ini/1.3.5: - dev: true - resolution: - integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - /inquirer/6.2.1: - dependencies: - ansi-escapes: 3.1.0 - chalk: 2.4.1 - cli-cursor: 2.1.0 - cli-width: 2.2.0 - external-editor: 3.0.3 - figures: 2.0.0 - lodash: 4.17.11 - mute-stream: 0.0.7 - run-async: 2.3.0 - rxjs: 6.3.3 - string-width: 2.1.1 - strip-ansi: 5.0.0 - through: 2.3.8 - dev: true - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg== - /invariant/2.2.4: - dependencies: - loose-envify: 1.4.0 - dev: true - resolution: - integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - /irregular-plurals/1.4.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y= - /is-accessor-descriptor/0.1.6: - dependencies: - kind-of: 3.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - /is-accessor-descriptor/1.0.0: - dependencies: - kind-of: 6.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - /is-arrayish/0.2.1: - dev: true - resolution: - integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - /is-binary-path/1.0.1: - dependencies: - binary-extensions: 1.12.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - /is-buffer/1.1.6: - dev: true - resolution: - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - /is-builtin-module/1.0.0: - dependencies: - builtin-modules: 1.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - /is-ci/1.2.1: - dependencies: - ci-info: 1.6.0 - dev: true - hasBin: true - resolution: - integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - /is-data-descriptor/0.1.4: - dependencies: - kind-of: 3.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - /is-data-descriptor/1.0.0: - dependencies: - kind-of: 6.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - /is-descriptor/0.1.6: - dependencies: - is-accessor-descriptor: 0.1.6 - is-data-descriptor: 0.1.4 - kind-of: 5.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - /is-descriptor/1.0.2: - dependencies: - is-accessor-descriptor: 1.0.0 - is-data-descriptor: 1.0.0 - kind-of: 6.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - /is-dotfile/1.0.3: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - /is-equal-shallow/0.1.3: - dependencies: - is-primitive: 2.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - /is-error/2.2.1: - dev: true - resolution: - integrity: sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= - /is-extendable/0.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - /is-extendable/1.0.1: - dependencies: - is-plain-object: 2.0.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - /is-extglob/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - /is-finite/1.0.2: - dependencies: - number-is-nan: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - /is-fullwidth-code-point/2.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - /is-generator-fn/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= - /is-glob/2.0.1: - dependencies: - is-extglob: 1.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - /is-installed-globally/0.1.0: - dependencies: - global-dirs: 0.1.1 - is-path-inside: 1.0.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - /is-npm/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - /is-number/2.1.0: - dependencies: - kind-of: 3.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - /is-number/3.0.0: - dependencies: - kind-of: 3.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - /is-number/4.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - /is-obj/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - /is-observable/0.2.0: - dependencies: - symbol-observable: 0.2.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI= - /is-observable/1.1.0: - dependencies: - symbol-observable: 1.2.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - /is-path-inside/1.0.1: - dependencies: - path-is-inside: 1.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-jvW33lBDej/cprToZe96pVy0gDY= - /is-plain-obj/1.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - /is-plain-object/2.0.4: - dependencies: - isobject: 3.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - /is-posix-bracket/0.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - /is-primitive/2.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - /is-promise/2.1.0: - dev: true - resolution: - integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - /is-redirect/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - /is-retry-allowed/1.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= - /is-stream/1.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - /is-typedarray/1.0.0: - dev: true - resolution: - integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - /is-url/1.2.4: - dev: true - resolution: - integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - /is-utf8/0.2.1: - dev: true - resolution: - integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - /is-windows/1.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - /isarray/1.0.0: - dev: true - resolution: - integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - /isexe/2.0.0: - dev: true - resolution: - integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - /isobject/2.1.0: - dependencies: - isarray: 1.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - /isobject/3.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - /isstream/0.1.2: - dev: true - resolution: - integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - /istanbul-lib-coverage/2.0.1: - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA== - /istanbul-lib-instrument/3.0.0: - dependencies: - '@babel/generator': 7.2.0 - '@babel/parser': 7.2.0 - '@babel/template': 7.1.2 - '@babel/traverse': 7.1.6 - '@babel/types': 7.2.0 - istanbul-lib-coverage: 2.0.1 - semver: 5.6.0 - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ== - /isutf8/2.0.2: - dev: false - engines: - node: '>= 0.12' - resolution: - integrity: sha512-9lNbG6k+PE6vuFnPTHjhtX79/LDMQrXoFx1MOEjXXCyqFCSahWKAzuAb9G5ct+lfS12aQxNmC0tiZuyujvr4Uw== - /js-string-escape/1.0.1: - dev: true - engines: - node: '>= 0.8' - resolution: - integrity: sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= - /js-tokens/3.0.2: - dev: true - resolution: - integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls= - /js-tokens/4.0.0: - dev: true - resolution: - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - /js-yaml/3.12.0: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - hasBin: true - resolution: - integrity: sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== - /jsbn/0.1.1: - dev: true - resolution: - integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - /jsesc/0.5.0: - dev: true - hasBin: true - resolution: - integrity: sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - /jsesc/1.3.0: - dev: true - hasBin: true - resolution: - integrity: sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - /jsesc/2.5.2: - dev: true - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - /json-parse-better-errors/1.0.2: - dev: true - resolution: - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - /json-schema-traverse/0.4.1: - dev: true - resolution: - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - /json-schema/0.2.3: - dev: true - resolution: - integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - /json-stable-stringify-without-jsonify/1.0.1: - dev: true - resolution: - integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - /json-stringify-safe/5.0.1: - dev: true - resolution: - integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - /json5/0.5.1: - dev: true - hasBin: true - resolution: - integrity: sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - /jsprim/1.4.1: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.2.3 - verror: 1.10.0 - dev: true - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - /kind-of/3.2.2: - dependencies: - is-buffer: 1.1.6 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - /kind-of/4.0.0: - dependencies: - is-buffer: 1.1.6 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - /kind-of/5.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - /kind-of/6.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - /last-line-stream/1.0.0: - dependencies: - through2: 2.0.5 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-0bZNafhv8kry0EiDos7uFFIKVgA= - /latest-version/3.1.0: - dependencies: - package-json: 4.0.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - /levn/0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - /load-json-file/1.1.0: - dependencies: - graceful-fs: 4.1.15 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - /load-json-file/2.0.0: - dependencies: - graceful-fs: 4.1.15 - parse-json: 2.2.0 - pify: 2.3.0 - strip-bom: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - /load-json-file/4.0.0: - dependencies: - graceful-fs: 4.1.15 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - /locate-path/2.0.0: - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - /lodash.clonedeep/4.5.0: - dev: true - resolution: - integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - /lodash.clonedeepwith/4.5.0: - dev: true - resolution: - integrity: sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ= - /lodash.debounce/4.0.8: - dev: true - resolution: - integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168= - /lodash.difference/4.5.0: - dev: true - resolution: - integrity: sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - /lodash.flatten/4.4.0: - dev: true - resolution: - integrity: sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - /lodash.flattendeep/4.4.0: - dev: true - resolution: - integrity: sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - /lodash.isequal/4.5.0: - dev: true - resolution: - integrity: sha1-QVxEePK8wwEgwizhDtMib30+GOA= - /lodash.merge/4.6.1: - dev: true - resolution: - integrity: sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== - /lodash/4.17.11: - dev: true - resolution: - integrity: sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - /loose-envify/1.4.0: - dependencies: - js-tokens: 4.0.0 - dev: true - hasBin: true - resolution: - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - /loud-rejection/1.6.0: - dependencies: - currently-unhandled: 0.4.1 - signal-exit: 3.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - /lowercase-keys/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - /lru-cache/4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - resolution: - integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - /make-dir/1.3.0: - dependencies: - pify: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - /map-cache/0.2.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - /map-obj/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - /map-visit/1.0.0: - dependencies: - object-visit: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - /matcher/1.1.1: - dependencies: - escape-string-regexp: 1.0.5 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== - /math-random/1.0.1: - dev: true - resolution: - integrity: sha1-izqsWIuKZuSXXjzepn97sylgH6w= - /md5-hex/1.3.0: - dependencies: - md5-o-matic: 0.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= - /md5-hex/2.0.0: - dependencies: - md5-o-matic: 0.1.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= - /md5-o-matic/0.1.1: - dev: true - resolution: - integrity: sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= - /meow/3.7.0: - dependencies: - camelcase-keys: 2.1.0 - decamelize: 1.2.0 - loud-rejection: 1.6.0 - map-obj: 1.0.1 - minimist: 1.2.0 - normalize-package-data: 2.4.0 - object-assign: 4.1.1 - read-pkg-up: 1.0.1 - redent: 1.0.0 - trim-newlines: 1.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - /micromatch/2.3.11: - dependencies: - arr-diff: 2.0.0 - array-unique: 0.2.1 - braces: 1.8.5 - expand-brackets: 0.1.5 - extglob: 0.3.2 - filename-regex: 2.0.1 - is-extglob: 1.0.0 - is-glob: 2.0.1 - kind-of: 3.2.2 - normalize-path: 2.1.1 - object.omit: 2.0.1 - parse-glob: 3.0.4 - regex-cache: 0.4.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - /micromatch/3.1.10: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.2 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - /mime-db/1.37.0: - dev: true - engines: - node: '>= 0.6' - resolution: - integrity: sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== - /mime-types/2.1.21: - dependencies: - mime-db: 1.37.0 - dev: true - engines: - node: '>= 0.6' - resolution: - integrity: sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== - /mimic-fn/1.2.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - /minimatch/3.0.4: - dependencies: - brace-expansion: 1.1.11 - dev: true - resolution: - integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - /minimist/0.0.8: - dev: true - resolution: - integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - /minimist/1.2.0: - dev: true - resolution: - integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - /mixin-deep/1.3.1: - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== - /mkdirp/0.5.1: - dependencies: - minimist: 0.0.8 - dev: true - hasBin: true - resolution: - integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - /ms/2.0.0: - dev: true - resolution: - integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - /ms/2.1.1: - dev: true - resolution: - integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - /multimatch/2.1.0: - dependencies: - array-differ: 1.0.0 - array-union: 1.0.2 - arrify: 1.0.1 - minimatch: 3.0.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= - /mute-stream/0.0.7: - dev: true - resolution: - integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - /nan/2.11.1: - dev: true - optional: true - resolution: - integrity: sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== - /nanomatch/1.2.13: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.2 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - /natural-compare/1.4.0: - dev: true - resolution: - integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - /nice-try/1.0.5: - dev: true - resolution: - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - /normalize-package-data/2.4.0: - dependencies: - hosted-git-info: 2.7.1 - is-builtin-module: 1.0.0 - semver: 5.6.0 - validate-npm-package-license: 3.0.4 - dev: true - resolution: - integrity: sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== - /normalize-path/2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - /npm-run-path/2.0.2: - dependencies: - path-key: 2.0.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - /number-is-nan/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - /nyc/13.1.0: - bundledDependencies: - - archy - - arrify - - caching-transform - - convert-source-map - - debug-log - - find-cache-dir - - find-up - - foreground-child - - glob - - istanbul-lib-coverage - - istanbul-lib-hook - - istanbul-lib-report - - istanbul-lib-source-maps - - istanbul-reports - - make-dir - - merge-source-map - - resolve-from - - rimraf - - signal-exit - - spawn-wrap - - test-exclude - - uuid - - yargs - - yargs-parser - dependencies: - istanbul-lib-instrument: 3.0.0 - dev: true - engines: - node: '>=6' - hasBin: true - resolution: - integrity: sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg== - /oauth-sign/0.9.0: - dev: true - resolution: - integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - /object-assign/4.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - /object-copy/0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - /object-visit/1.0.1: - dependencies: - isobject: 3.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - /object.omit/2.0.1: - dependencies: - for-own: 0.1.5 - is-extendable: 0.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - /object.pick/1.3.0: - dependencies: - isobject: 3.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - /observable-to-promise/0.5.0: - dependencies: - is-observable: 0.2.0 - symbol-observable: 1.2.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8= - /once/1.4.0: - dependencies: - wrappy: 1.0.2 - dev: true - resolution: - integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - /onetime/2.0.1: - dependencies: - mimic-fn: 1.2.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - /option-chain/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-k41zvU4Xg/lI00AjZEraI2aeMPI= - /optionator/0.8.2: - dependencies: - deep-is: 0.1.3 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - wordwrap: 1.0.0 - dev: true - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - /os-homedir/1.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - /os-tmpdir/1.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - /p-finally/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - /p-limit/1.3.0: - dependencies: - p-try: 1.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - /p-locate/2.0.0: - dependencies: - p-limit: 1.3.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - /p-try/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - /package-hash/1.2.0: - dependencies: - md5-hex: 1.3.0 - dev: true - resolution: - integrity: sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ= - /package-hash/2.0.0: - dependencies: - graceful-fs: 4.1.15 - lodash.flattendeep: 4.4.0 - md5-hex: 2.0.0 - release-zalgo: 1.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-eK4ybIngWk2BO2hgGXevBcANKg0= - /package-json/4.0.1: - dependencies: - got: 6.7.1 - registry-auth-token: 3.3.2 - registry-url: 3.1.0 - semver: 5.6.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - /parse-glob/3.0.4: - dependencies: - glob-base: 0.3.0 - is-dotfile: 1.0.3 - is-extglob: 1.0.0 - is-glob: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - /parse-json/2.2.0: - dependencies: - error-ex: 1.3.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - /parse-json/4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - /parse-ms/0.1.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-3T+iXtbC78e93hKtm0bBY6opIk4= - /parse-ms/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= - /pascalcase/0.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - /path-exists/2.1.0: - dependencies: - pinkie-promise: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - /path-exists/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - /path-is-absolute/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - /path-is-inside/1.0.2: - dev: true - resolution: - integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - /path-key/2.0.1: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - /path-type/1.1.0: - dependencies: - graceful-fs: 4.1.15 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - /path-type/2.0.0: - dependencies: - pify: 2.3.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - /performance-now/2.1.0: - dev: true - resolution: - integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - /pify/2.3.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - /pify/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - /pinkie-promise/1.0.0: - dependencies: - pinkie: 1.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-0dpn9UglY7t89X8oauKCLs+/NnA= - /pinkie-promise/2.0.1: - dependencies: - pinkie: 2.0.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o= - /pinkie/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q= - /pinkie/2.0.4: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - /pkg-conf/2.1.0: - dependencies: - find-up: 2.1.0 - load-json-file: 4.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= - /pkg-dir/2.0.0: - dependencies: - find-up: 2.1.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - /planckmatch/0.2.0: - dev: false - resolution: - integrity: sha512-osoAGnmIFfU4p2EJ80sPs//ObCEmQla7uxM3NwQpMtB96xlGKGEiDjp7yVsq4fDMoiMLZ/+28bZCs3/m0aUe6g== - /plur/2.1.2: - dependencies: - irregular-plurals: 1.4.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo= - /pluralize/7.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - /posix-character-classes/0.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - /prelude-ls/1.1.2: - dev: true - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - /prepend-http/1.0.4: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - /preserve/0.2.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - /pretty-ms/0.2.2: - dependencies: - parse-ms: 0.1.2 - dev: true - engines: - node: '>=0.10.0' - hasBin: true - resolution: - integrity: sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY= - /pretty-ms/3.2.0: - dependencies: - parse-ms: 1.0.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== - /private/0.1.8: - dev: true - engines: - node: '>= 0.6' - resolution: - integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - /process-nextick-args/2.0.0: - dev: true - resolution: - integrity: sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - /progress/2.0.3: - dev: true - engines: - node: '>=0.4.0' - resolution: - integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - /pseudomap/1.0.2: - dev: true - resolution: - integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - /psl/1.1.31: - dev: true - resolution: - integrity: sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== - /punycode/1.4.1: - dev: true - resolution: - integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4= - /punycode/2.1.1: - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - /qs/6.5.2: - dev: true - engines: - node: '>=0.6' - resolution: - integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - /randomatic/3.1.1: - dependencies: - is-number: 4.0.0 - kind-of: 6.0.2 - math-random: 1.0.1 - dev: true - engines: - node: '>= 0.10.0' - resolution: - integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - /rc/1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.5 - minimist: 1.2.0 - strip-json-comments: 2.0.1 - dev: true - hasBin: true - resolution: - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - /read-pkg-up/1.0.1: - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - /read-pkg-up/2.0.0: - dependencies: - find-up: 2.1.0 - read-pkg: 2.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - /read-pkg/1.1.0: - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.4.0 - path-type: 1.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - /read-pkg/2.0.0: - dependencies: - load-json-file: 2.0.0 - normalize-package-data: 2.4.0 - path-type: 2.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - /readable-stream/2.3.6: - dependencies: - core-util-is: 1.0.2 - inherits: 2.0.3 - isarray: 1.0.0 - process-nextick-args: 2.0.0 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - resolution: - integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - /readdirp/2.2.1: - dependencies: - graceful-fs: 4.1.15 - micromatch: 3.1.10 - readable-stream: 2.3.6 - dev: true - engines: - node: '>=0.10' - resolution: - integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - /redent/1.0.0: - dependencies: - indent-string: 2.1.0 - strip-indent: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - /regenerate/1.4.0: - dev: true - resolution: - integrity: sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - /regenerator-runtime/0.11.1: - dev: true - resolution: - integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - /regex-cache/0.4.4: - dependencies: - is-equal-shallow: 0.1.3 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - /regex-not/1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - /regexpp/2.0.1: - dev: true - engines: - node: '>=6.5.0' - resolution: - integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - /regexpu-core/2.0.0: - dependencies: - regenerate: 1.4.0 - regjsgen: 0.2.0 - regjsparser: 0.1.5 - dev: true - resolution: - integrity: sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - /registry-auth-token/3.3.2: - dependencies: - rc: 1.2.8 - safe-buffer: 5.1.2 - dev: true - resolution: - integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== - /registry-url/3.1.0: - dependencies: - rc: 1.2.8 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-PU74cPc93h138M+aOBQyRE4XSUI= - /regjsgen/0.2.0: - dev: true - resolution: - integrity: sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - /regjsparser/0.1.5: - dependencies: - jsesc: 0.5.0 - dev: true - hasBin: true - resolution: - integrity: sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - /release-zalgo/1.0.0: - dependencies: - es6-error: 4.1.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= - /remove-trailing-separator/1.1.0: - dev: true - resolution: - integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - /repeat-element/1.1.3: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - /repeat-string/1.6.1: - dev: true - engines: - node: '>=0.10' - resolution: - integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc= - /repeating/2.0.1: - dependencies: - is-finite: 1.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - /request/2.88.0: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.8.0 - caseless: 0.12.0 - combined-stream: 1.0.7 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.3 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.21 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.2 - safe-buffer: 5.1.2 - tough-cookie: 2.4.3 - tunnel-agent: 0.6.0 - uuid: 3.3.2 - dev: true - engines: - node: '>= 4' - resolution: - integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - /require-precompiled/0.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo= - /require-uncached/1.0.3: - dependencies: - caller-path: 0.1.0 - resolve-from: 1.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - /resolve-cwd/2.0.0: - dependencies: - resolve-from: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - /resolve-from/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - /resolve-from/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-six699nWiBvItuZTM17rywoYh0g= - /resolve-url/0.2.1: - dev: true - resolution: - integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - /restore-cursor/2.0.0: - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.2 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - /ret/0.1.15: - dev: true - engines: - node: '>=0.12' - resolution: - integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - /rimraf/2.6.2: - dependencies: - glob: 7.1.3 - dev: true - hasBin: true - resolution: - integrity: sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - /run-async/2.3.0: - dependencies: - is-promise: 2.1.0 - dev: true - engines: - node: '>=0.12.0' - resolution: - integrity: sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - /rxjs/6.3.3: - dependencies: - tslib: 1.9.3 - dev: true - engines: - npm: '>=2.0.0' - resolution: - integrity: sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== - /safe-buffer/5.1.2: - dev: true - resolution: - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - /safe-regex/1.1.0: - dependencies: - ret: 0.1.15 - dev: true - resolution: - integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - /safer-buffer/2.1.2: - dev: true - resolution: - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - /semver-diff/2.1.0: - dependencies: - semver: 5.6.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - /semver/5.6.0: - dev: true - hasBin: true - resolution: - integrity: sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - /serialize-error/2.1.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= - /set-value/0.4.3: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - to-object-path: 0.3.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - /set-value/2.0.0: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== - /shebang-command/1.2.0: - dependencies: - shebang-regex: 1.0.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - /shebang-regex/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - /signal-exit/3.0.2: - dev: true - resolution: - integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - /slash/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - /slice-ansi/1.0.0: - dependencies: - is-fullwidth-code-point: 2.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - /slice-ansi/2.0.0: - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ== - /slide/1.1.6: - dev: true - resolution: - integrity: sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - /snapdragon-node/2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - /snapdragon-util/3.0.1: - dependencies: - kind-of: 3.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - /snapdragon/0.8.2: - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.2 - use: 3.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - /sort-keys/2.0.0: - dependencies: - is-plain-obj: 1.1.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= - /source-map-resolve/0.5.2: - 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 - dev: true - resolution: - integrity: sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - /source-map-support/0.4.18: - dependencies: - source-map: 0.5.7 - dev: true - resolution: - integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - /source-map-support/0.5.9: - dependencies: - buffer-from: 1.1.1 - source-map: 0.6.1 - dev: true - resolution: - integrity: sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== - /source-map-url/0.4.0: - dev: true - resolution: - integrity: sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - /source-map/0.5.7: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - /source-map/0.6.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - /spdx-correct/3.1.0: - dependencies: - spdx-expression-parse: 3.0.0 - spdx-license-ids: 3.0.2 - dev: true - resolution: - integrity: sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - /spdx-exceptions/2.2.0: - dev: true - resolution: - integrity: sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - /spdx-expression-parse/3.0.0: - dependencies: - spdx-exceptions: 2.2.0 - spdx-license-ids: 3.0.2 - dev: true - resolution: - integrity: sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - /spdx-license-ids/3.0.2: - dev: true - resolution: - integrity: sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== - /split-string/3.1.0: - dependencies: - extend-shallow: 3.0.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - /sprintf-js/1.0.3: - dev: true - resolution: - integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - /sshpk/1.15.2: - dependencies: - asn1: 0.2.4 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: true - engines: - node: '>=0.10.0' - hasBin: true - resolution: - integrity: sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== - /stack-utils/1.0.2: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - /static-extend/0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - /string-width/2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - /string_decoder/1.1.1: - dependencies: - safe-buffer: 5.1.2 - dev: true - resolution: - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - /strip-ansi/0.1.1: - dev: true - engines: - node: '>=0.8.0' - hasBin: true - resolution: - integrity: sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= - /strip-ansi/3.0.1: - dependencies: - ansi-regex: 2.1.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - /strip-ansi/4.0.0: - dependencies: - ansi-regex: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= - /strip-ansi/5.0.0: - dependencies: - ansi-regex: 4.0.0 - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== - /strip-bom-buf/1.0.0: - dependencies: - is-utf8: 0.2.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= - /strip-bom/2.0.0: - dependencies: - is-utf8: 0.2.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - /strip-bom/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - /strip-eof/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - /strip-indent/1.0.1: - dependencies: - get-stdin: 4.0.1 - dev: true - engines: - node: '>=0.10.0' - hasBin: true - resolution: - integrity: sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - /strip-json-comments/2.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= - /supertap/1.0.0: - dependencies: - arrify: 1.0.1 - indent-string: 3.2.0 - js-yaml: 3.12.0 - serialize-error: 2.1.0 - strip-ansi: 4.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA== - /supports-color/2.0.0: - dev: true - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - /supports-color/5.5.0: - dependencies: - has-flag: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - /symbol-observable/0.2.4: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= - /symbol-observable/1.2.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - /table/5.1.1: - dependencies: - ajv: 6.6.1 - lodash: 4.17.11 - slice-ansi: 2.0.0 - string-width: 2.1.1 - dev: true - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw== - /term-size/1.2.0: - dependencies: - execa: 0.7.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - /text-table/0.2.0: - dev: true - resolution: - integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - /through/2.3.8: - dev: true - resolution: - integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - /through2/2.0.5: - dependencies: - readable-stream: 2.3.6 - xtend: 4.0.1 - dev: true - resolution: - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - /time-zone/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= - /timed-out/4.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - /tmp/0.0.33: - dependencies: - os-tmpdir: 1.0.2 - dev: true - engines: - node: '>=0.6.0' - resolution: - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - /to-fast-properties/1.0.3: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - /to-fast-properties/2.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - /to-object-path/0.3.0: - dependencies: - kind-of: 3.2.2 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - /to-regex-range/2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - /to-regex/3.0.2: - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - /tough-cookie/2.4.3: - dependencies: - psl: 1.1.31 - punycode: 1.4.1 - dev: true - engines: - node: '>=0.8' - resolution: - integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - /trim-newlines/1.0.0: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-WIeWa7WCpFA6QetST301ARgVphM= - /trim-off-newlines/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-n5up2e+odkw4dpi8v+sshI8RrbM= - /trim-right/1.0.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - /tslib/1.9.3: - dev: true - resolution: - integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - /tunnel-agent/0.6.0: - dependencies: - safe-buffer: 5.1.2 - dev: true - resolution: - integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - /tweetnacl/0.14.5: - dev: true - resolution: - integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - /type-check/0.3.2: - dependencies: - prelude-ls: 1.1.2 - dev: true - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - /uid2/0.0.3: - dev: true - resolution: - integrity: sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= - /union-value/1.0.0: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 0.4.3 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= - /unique-string/1.0.0: - dependencies: - crypto-random-string: 1.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - /unique-temp-dir/1.0.0: - dependencies: - mkdirp: 0.5.1 - os-tmpdir: 1.0.2 - uid2: 0.0.3 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U= - /unset-value/1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - /unzip-response/2.0.1: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - /update-notifier/2.5.0: - dependencies: - boxen: 1.3.0 - chalk: 2.4.1 - configstore: 3.1.2 - import-lazy: 2.1.0 - is-ci: 1.2.1 - is-installed-globally: 0.1.0 - is-npm: 1.0.0 - latest-version: 3.1.0 - semver-diff: 2.1.0 - xdg-basedir: 3.0.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - /uri-js/4.2.2: - dependencies: - punycode: 2.1.1 - dev: true - resolution: - integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - /urix/0.1.0: - dev: true - resolution: - integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - /url-parse-lax/1.0.0: - dependencies: - prepend-http: 1.0.4 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - /urlgrey/0.4.4: - dev: true - resolution: - integrity: sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8= - /use/3.1.1: - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - /util-deprecate/1.0.2: - dev: true - resolution: - integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - /uuid/3.3.2: - dev: true - hasBin: true - resolution: - integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - /validate-npm-package-license/3.0.4: - dependencies: - spdx-correct: 3.1.0 - spdx-expression-parse: 3.0.0 - dev: true - resolution: - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - /verror/1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.0 - dev: true - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - /well-known-symbols/1.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg= - /which/1.3.1: - dependencies: - isexe: 2.0.0 - dev: true - hasBin: true - resolution: - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - /widest-line/2.0.1: - dependencies: - string-width: 2.1.1 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - /wordwrap/1.0.0: - dev: true - resolution: - integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - /wrappy/1.0.2: - dev: true - resolution: - integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - /write-file-atomic/1.3.4: - dependencies: - graceful-fs: 4.1.15 - imurmurhash: 0.1.4 - slide: 1.1.6 - dev: true - resolution: - integrity: sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= - /write-file-atomic/2.3.0: - dependencies: - graceful-fs: 4.1.15 - imurmurhash: 0.1.4 - signal-exit: 3.0.2 - dev: true - resolution: - integrity: sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== - /write-json-file/2.3.0: - dependencies: - detect-indent: 5.0.0 - graceful-fs: 4.1.15 - make-dir: 1.3.0 - pify: 3.0.0 - sort-keys: 2.0.0 - write-file-atomic: 2.3.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= - /write-pkg/3.2.0: - dependencies: - sort-keys: 2.0.0 - write-json-file: 2.3.0 - dev: true - engines: - node: '>=4' - resolution: - integrity: sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== - /write/0.2.1: - dependencies: - mkdirp: 0.5.1 - dev: true - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - /xdg-basedir/3.0.0: - dev: true - engines: - node: '>=4' - resolution: - integrity: sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - /xtend/4.0.1: - dev: true - engines: - node: '>=0.4' - resolution: - integrity: sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - /yallist/2.1.2: - dev: true - resolution: - integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -registry: 'https://registry.npmjs.org/' -shrinkwrapMinorVersion: 9 -shrinkwrapVersion: 3 -specifiers: - ava: ^0.25.0 - codecov: ^3.1.0 - commander: ^2.19.0 - debug: ^4.1.0 - eslint: ^5.7.0 - isutf8: ^2.0.2 - nyc: ^13.1.0 - planckmatch: ^0.2.0 diff --git a/test/library-helpers/createDirectory.js b/test/library-helpers/createDirectory.js deleted file mode 100644 index 7a4cffe..0000000 --- a/test/library-helpers/createDirectory.js +++ /dev/null @@ -1,17 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../../library`); -const hoast = Hoast(__dirname); - -test(`type`, function(t) { - t.is(typeof(Hoast.helpers.createDirectory), `function`); - t.is(typeof(hoast.helpers.createDirectory), `function`); - t.is(Hoast.helpers.createDirectory, hoast.helpers.createDirectory); - - // Legacy support check. - t.is(typeof(Hoast.helper.createDirectory), `function`); - t.is(typeof(hoast.helper.createDirectory), `function`); - t.is(Hoast.helper.createDirectory, hoast.helper.createDirectory); - t.is(Hoast.helper.createDirectory, Hoast.helpers.createDirectory); -}); \ No newline at end of file diff --git a/test/library-helpers/deepAssign.js b/test/library-helpers/deepAssign.js deleted file mode 100644 index cb8d74e..0000000 --- a/test/library-helpers/deepAssign.js +++ /dev/null @@ -1,127 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../../library`); -const hoast = Hoast(__dirname); - -test(`type`, function(t) { - t.is(typeof(Hoast.helpers.deepAssign), `function`); - t.is(typeof(hoast.helpers.deepAssign), `function`); - t.is(Hoast.helpers.deepAssign, hoast.helpers.deepAssign); -}); - -test(`function`, function(t) { - // Return modified primary object. - const object = {}; - t.is(Hoast.helpers.deepAssign(object), object); - t.is(Hoast.helpers.deepAssign(object, {}), object); - t.not(Hoast.helpers.deepAssign({}, object), object); - - // Assign. - t.deepEqual(Hoast.helpers.deepAssign({ - a: `a` - }, {}), { - a: `a` - }); - t.deepEqual(Hoast.helpers.deepAssign({}, { - a: `a` - }), { - a: `a` - }); - - // Assign deep. - t.deepEqual(Hoast.helpers.deepAssign({ - a: { - b: `b` - } - }, {}), { - a: { - b: `b` - } - }); - t.deepEqual(Hoast.helpers.deepAssign({}, { - a: { - b: `b` - } - }), { - a: { - b: `b` - } - }); - - // Merge. - t.deepEqual(Hoast.helpers.deepAssign({ - a: `a` - }, { - b: `b` - }), { - a: `a`, - b: `b` - }); - - // Merge deep. - t.deepEqual(Hoast.helpers.deepAssign({ - a: { - b: `b` - } - }, { - a: { - c: `c` - } - }), { - a: { - b: `b`, - c: `c` - } - }); - - // Overwrite. - t.deepEqual(Hoast.helpers.deepAssign({ - a: `a` - }, { - a: `b` - }), { - a: `b` - }); - - // Overwrite deep. - t.deepEqual(Hoast.helpers.deepAssign({ - a: { - b: `b` - } - }, { - a: { - b: `c` - } - }), { - a: { - b: `c` - } - }); - - // Multiple - t.deepEqual(Hoast.helpers.deepAssign({ - a: `a` - }, { - b: `b` - }, { - c: `c` - }), { - a: `a`, - b: `b`, - c: `c` - }); - - // Invalid parameters. - t.deepEqual(Hoast.helpers.deepAssign(1), 1); - t.deepEqual(Hoast.helpers.deepAssign(1, 2), 1); - t.deepEqual(Hoast.helpers.deepAssign({}, 2), {}); - t.deepEqual(Hoast.helpers.deepAssign({ - a: `a` - }, 2, { - b: `b` - }), { - a: `a`, - b: `b` - }); -}); \ No newline at end of file diff --git a/test/library-helpers/matchExpressions.js b/test/library-helpers/matchExpressions.js deleted file mode 100644 index f5cf33d..0000000 --- a/test/library-helpers/matchExpressions.js +++ /dev/null @@ -1,49 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../../library`); -const hoast = Hoast(__dirname); - -test(`type`, function(t) { - t.is(typeof(Hoast.helpers.matchExpressions), `function`); - t.is(typeof(hoast.helpers.matchExpressions), `function`); - t.is(Hoast.helpers.matchExpressions, hoast.helpers.matchExpressions); - - // Legacy support check. - t.is(typeof(Hoast.helper.match), `function`); - t.is(typeof(hoast.helper.match), `function`); - t.is(Hoast.helper.match, hoast.helper.match); - t.is(Hoast.helper.match, Hoast.helpers.matchExpressions); -}); - -test(`function`, function(t) { - // Setup variables. - const value = `directory/file.extension`; - const expressionsValid = Hoast.helpers.parsePatterns([ - `directory/*`, - `*/file.*`, - `*.extension` - ], {}, false); - const expressionsInvalid = Hoast.helpers.parsePatterns([ - `dirname/*`, - `*/filename.*`, - `*.extname` - ], {}, false); - - // Check single pattern. - t.true(Hoast.helpers.matchExpressions(value, expressionsValid[0])); - t.false(Hoast.helpers.matchExpressions(value, expressionsInvalid[0])); - - // Check default `all` value. - t.true(Hoast.helpers.matchExpressions(value, [ expressionsInvalid[0], expressionsValid[0] ])); - - // Check `all = true` workings. - t.true(Hoast.helpers.matchExpressions(value, expressionsValid, true)); - t.false(Hoast.helpers.matchExpressions(value, expressionsInvalid, true)); - t.false(Hoast.helpers.matchExpressions(value, [ expressionsValid[0], expressionsInvalid[0] ], true)); - - // Check `all = false` workings, in other words `any` mode. - t.true(Hoast.helpers.matchExpressions(value, expressionsValid, false)); - t.false(Hoast.helpers.matchExpressions(value, expressionsInvalid, false)); - t.true(Hoast.helpers.matchExpressions(value, [ expressionsInvalid[0], expressionsValid[0] ], false)); -}); \ No newline at end of file diff --git a/test/library-helpers/parsePatterns.js b/test/library-helpers/parsePatterns.js deleted file mode 100644 index 7428e2c..0000000 --- a/test/library-helpers/parsePatterns.js +++ /dev/null @@ -1,22 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../../library`); -const hoast = Hoast(__dirname); - -test(`type`, function(t) { - t.is(typeof(Hoast.helpers.parsePatterns), `function`); - t.is(typeof(hoast.helpers.parsePatterns), `function`); - t.is(Hoast.helpers.parsePatterns, hoast.helpers.parsePatterns); - - // Legacy support check. - t.is(typeof(Hoast.helper.parse), `function`); - t.is(typeof(hoast.helper.parse), `function`); - t.is(Hoast.helper.parse, hoast.helper.parse); - t.is(Hoast.helper.parse, Hoast.helpers.parsePatterns); -}); - -test(`function`, function(t) { - // Extra check against `planckmatch/parse` directly. - t.is(Hoast.helpers.parsePatterns, require(`planckmatch/parse`)); -}); \ No newline at end of file diff --git a/test/library-helpers/removeFiles.js b/test/library-helpers/removeFiles.js deleted file mode 100644 index 63710f6..0000000 --- a/test/library-helpers/removeFiles.js +++ /dev/null @@ -1,17 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../../library`); -const hoast = Hoast(__dirname); - -test(`type`, function(t) { - t.is(typeof(Hoast.helpers.removeFiles), `function`); - t.is(typeof(hoast.helpers.removeFiles), `function`); - t.is(Hoast.helpers.removeFiles, hoast.helpers.removeFiles); - - // Legacy support check. - t.is(typeof(Hoast.helper.remove), `function`); - t.is(typeof(hoast.helper.remove), `function`); - t.is(Hoast.helper.remove, hoast.helper.remove); - t.is(Hoast.helper.remove, Hoast.helpers.removeFiles); -}); \ No newline at end of file diff --git a/test/library-helpers/scanDirectory.js b/test/library-helpers/scanDirectory.js deleted file mode 100644 index 3f4f110..0000000 --- a/test/library-helpers/scanDirectory.js +++ /dev/null @@ -1,17 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../../library`); -const hoast = Hoast(__dirname); - -test(`type`, function(t) { - t.is(typeof(Hoast.helpers.scanDirectory), `function`); - t.is(typeof(hoast.helpers.scanDirectory), `function`); - t.is(Hoast.helpers.scanDirectory, hoast.helpers.scanDirectory); - - // Legacy support check. - t.is(typeof(Hoast.helper.scanDirectory), `function`); - t.is(typeof(hoast.helper.scanDirectory), `function`); - t.is(Hoast.helper.scanDirectory, hoast.helper.scanDirectory); - t.is(Hoast.helper.scanDirectory, Hoast.helpers.scanDirectory); -}); \ No newline at end of file diff --git a/test/library-helpers/writeFiles.js b/test/library-helpers/writeFiles.js deleted file mode 100644 index aa1946d..0000000 --- a/test/library-helpers/writeFiles.js +++ /dev/null @@ -1,17 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../../library`); -const hoast = Hoast(__dirname); - -test(`type`, function(t) { - t.is(typeof(Hoast.helpers.writeFiles), `function`); - t.is(typeof(hoast.helpers.writeFiles), `function`); - t.is(Hoast.helpers.writeFiles, hoast.helpers.writeFiles); - - // Legacy support check. - t.is(typeof(Hoast.helper.writeFiles), `function`); - t.is(typeof(hoast.helper.writeFiles), `function`); - t.is(Hoast.helper.writeFiles, hoast.helper.writeFiles); - t.is(Hoast.helper.writeFiles, Hoast.helpers.writeFiles); -}); \ No newline at end of file diff --git a/test/module.js b/test/module.js deleted file mode 100644 index 6e6e2fb..0000000 --- a/test/module.js +++ /dev/null @@ -1,56 +0,0 @@ -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../library`); - -// Core functions. -test(`core`, function(t) { - t.is(typeof(Hoast), `function`); - - // Instance. - const hoast = Hoast(__dirname); - t.is(typeof(hoast.use), `function`); - t.is(typeof(hoast.process), `function`); - - // Default options - const options = { - source: `source`, - destination: `destination`, - - remove: false, - patterns: [], - patternOptions: {}, - concurrency: Infinity, - - metadata: {} - }; - t.deepEqual(hoast.options, options); -}); - -// Build-in modules. -test(`modules`, function(t) { - t.is(typeof(Hoast.read), `function`); - - // Alias path. - const read = require(`../read`); - t.is(typeof(read), `function`); - t.deepEqual(Hoast.read, read); -}); - -// `helpers` functions. -test(`helpers`, function(t) { - // Global - t.is(typeof(Hoast.helpers), `object`); - // Prototype. - const hoast = Hoast(__dirname); - t.is(typeof(hoast.helpers), `object`); -}); - -// Legacy `helper` functions. -test(`helper`, function(t) { - // Global - t.is(typeof(Hoast.helper), `object`); - // Prototype. - const hoast = Hoast(__dirname); - t.is(typeof(hoast.helpers), `object`); -}); \ No newline at end of file diff --git a/test/src/directory/file.txt b/test/src/directory/file.txt deleted file mode 100644 index f3a3485..0000000 --- a/test/src/directory/file.txt +++ /dev/null @@ -1 +0,0 @@ -text \ No newline at end of file diff --git a/test/src/directory/name.txt b/test/src/directory/name.txt deleted file mode 100644 index 6b584e8..0000000 --- a/test/src/directory/name.txt +++ /dev/null @@ -1 +0,0 @@ -content \ No newline at end of file diff --git a/test/src/file.txt b/test/src/file.txt deleted file mode 100644 index f3a3485..0000000 --- a/test/src/file.txt +++ /dev/null @@ -1 +0,0 @@ -text \ No newline at end of file diff --git a/test/use-case.js b/test/use-case.js deleted file mode 100644 index 81b6984..0000000 --- a/test/use-case.js +++ /dev/null @@ -1,122 +0,0 @@ -// Node modules. -const fs = require(`fs`), - path = require(`path`); -// Dependency modules. -const test = require(`ava`); -// Custom module. -const Hoast = require(`../library`); - -// Constants. -const DESTINATION = `dst`, - SOURCE = `src`; - -// Hoast instance. -let hoast; - -test.serial(`initializing hoast`, function(t) { - const options = { - source: `hoast_src`, - destination: `hoast_dst`, - - remove: true, - patterns: [ - `file.*` - ], - patternOptions: {}, - concurrency: 16, - - metadata: { - title: `instance` - } - }; - - hoast = Hoast(__dirname, options); - - t.deepEqual(hoast.directory, __dirname); - t.deepEqual(hoast.options, options); -}); - -test.serial(`adding modules`, function(t) { - t.is(hoast.modules, undefined); - - hoast.use(Hoast.read()); - - t.is(hoast.modules.length, 1); - t.deepEqual(hoast.modules[0], Hoast.read()); -}); - -test.serial(`processing files`, async function(t) { - t.plan(13); // `method` gets called twice. - - const options = { - source: SOURCE, - destination: DESTINATION, - - remove: [ - DESTINATION, - `${DESTINATION}-TEST` - ], - patterns: [ - `directory`, - `directory${path.sep}*` - ], - patternOptions: {}, - concurrency: 1, - - metadata: { - title: `process` - } - }; - - // Create mock-up module. - const method = function(_hoast, files) { - // Check hoast. - t.deepEqual(hoast, _hoast); - - // Check if file is read and other file is filtered out. - t.is(files.length, 1); - - const file = files[0]; - // Check if scan directories worked. - t.true(file.hasOwnProperty(`path`)); - t.true(file.hasOwnProperty(`stats`)); - - // Check if read module worked. - t.true(file.hasOwnProperty(`content`)); - - if (file.path === `directory${path.sep}file.txt`) { - return []; - } - }; - method.before = function(_hoast) { - // Check hoast. - t.deepEqual(hoast, _hoast); - }; - method.after = function(_hoast) { - // Check hoast. - t.deepEqual(hoast, _hoast); - }; - // Add mock-up module. - hoast.use(method); - - try { - await hoast.process(options); - } catch(error) { - throw error; - } - - t.deepEqual(hoast.options, options); -}); - -test.serial.after(`clean-up`, async function(t) { - // Construct path of destination directory. - const directory = path.join(__dirname, DESTINATION); - - // Check if directory exists before. - t.true(fs.existsSync(directory)); - - await Hoast.helpers.removeFiles.single(directory); - - // Check if directory exists after. - t.false(fs.existsSync(directory)); -}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b70aa40 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3833 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/core@^7.11.6": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" + integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.6" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.5" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.11.5", "@babel/generator@^7.11.6": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" + integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== + dependencies: + "@babel/types" "^7.11.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.4", "@babel/parser@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@blakeembrey/deque@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@blakeembrey/deque/-/deque-1.0.5.tgz#f4fa17fc5ee18317ec01a763d355782c7b395eaf" + integrity sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg== + +"@blakeembrey/template@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@blakeembrey/template/-/template-1.0.0.tgz#bf8828bc3ae8004d97904d78f64e3cc2cd216438" + integrity sha512-J6WGZqCLdRMHUkyRG6fBSIFJ0rL60/nsQNh5rQvsYZ5u0PsKw6XQcJcA3DWvd9cN3j/IQx5yB1fexhCafwwUUw== + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@eslint/eslintrc@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" + integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@zeit/schemas@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" + integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg== + +accepts@~1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-jsx@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: + version "6.12.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" + integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arch@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" + integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== + +arg@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" + integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== + +arg@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array.prototype.flat@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +autoprefixer@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.0.1.tgz#e2d9000f84ebd98d77b7bc16f8adb2ff1f7bb946" + integrity sha512-aQo2BDIsoOdemXUAOBpFv4ZQa2DrOtEufarYhtFsK1088Ca0TUwu/aQWf0M3mrILXZ3mTIVn1lR3hPW8acacsw== + dependencies: + browserslist "^4.14.5" + caniuse-lite "^1.0.30001137" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss-value-parser "^4.1.0" + +autoprefixer@^9.6.1: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + 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.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.6.4: + version "4.14.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" + integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== + dependencies: + caniuse-lite "^1.0.30001135" + electron-to-chromium "^1.3.571" + escalade "^3.1.0" + node-releases "^1.1.61" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135, caniuse-lite@^1.0.30001137: + version "1.0.30001144" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001144.tgz#bca0fffde12f97e1127a351fec3bfc1971aa3b3d" + integrity sha512-4GQTEWNMnVZVOFG3BK0xvGeaDAtiPAbG2N8yuMXuXzx/c2Vd4XoMPO8+E918zeXn5IF0FRVtGShBfkfQea2wHQ== + +ccount@^1.0.0, ccount@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" + integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== + +chalk@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-html4@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" + integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chokidar@^3.3.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + 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.4.0" + optionalDependencies: + fsevents "~2.1.2" + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +clipboardy@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +compressible@~2.0.14: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.1.tgz#81cb70b609e4b1351b1e54cbc90fd9c54af86e2e" + integrity sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g== + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +debug@2.6.9, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" + integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +electron-to-chromium@^1.3.571: + version "1.3.577" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.577.tgz#9885f3f72c6e3367010b461ff6f2d9624a929720" + integrity sha512-dSb64JQSFif/pD8mpVAgSFkbVi6YHbK6JeEziwNNmXlr/Ne2rZtseFK5SM7JoWSLf6gP0gVvRGi4/2ZRhSX/rA== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.0: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" + integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-config-standard@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" + integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.22.0: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + +eslint-plugin-standard@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" + integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^7.7.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9" + integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.3" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.3.0" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +graceful-fs@^4.1.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +handlebars@^4.7.6: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-to-hyperscript@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz#7c4c037d9a8ea19b0a3fdb676a26448ad922353d" + integrity sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA== + dependencies: + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.2.1" + unist-util-is "^3.0.0" + web-namespaces "^1.1.2" + +hast-util-from-parse5@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz#3089dc0ee2ccf6ec8bc416919b51a54a589e097c" + integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== + dependencies: + ccount "^1.0.3" + hastscript "^5.0.0" + property-information "^5.0.0" + web-namespaces "^1.1.2" + xtend "^4.0.1" + +hast-util-is-element@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" + integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== + +hast-util-parse-selector@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz#60c99d0b519e12ab4ed32e58f150ec3f61ed1974" + integrity sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA== + +hast-util-raw@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-5.0.2.tgz#62288f311ec2f35e066a30d5e0277f963ad43a67" + integrity sha512-3ReYQcIHmzSgMq8UrDZHFL0oGlbuVGdLKs8s/Fe8BfHFAyZDrdv1fy/AGn+Fim8ZuvAHcJ61NQhVMtyfHviT/g== + dependencies: + hast-util-from-parse5 "^5.0.0" + hast-util-to-parse5 "^5.0.0" + html-void-elements "^1.0.0" + parse5 "^5.0.0" + unist-util-position "^3.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-sanitize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-3.0.0.tgz#4cdc26b2991b3bf90ee74b5c932e14d907549312" + integrity sha512-gxsM24ARtuulsrWEj8QtVM6FNeAEHklF/t7TEIWvX1wuQcoAQtJtEUcT8t0os4uxCUqh1epX/gTi8fp8gNKvCA== + dependencies: + xtend "^4.0.0" + +hast-util-to-html@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.1.tgz#39818b8bbfcb8eaa87846a120b3875487b27d094" + integrity sha512-Ujqj0hGuo3dIQKilkbauAv5teOqPvhaSLEgs1lgApFT0812e114KiffV8XfE4ttR8dRPqxNOIJOMu6SKOVOGlg== + dependencies: + ccount "^1.0.0" + comma-separated-tokens "^1.0.0" + hast-util-is-element "^1.0.0" + hast-util-whitespace "^1.0.0" + html-void-elements "^1.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + stringify-entities "^3.0.1" + unist-util-is "^4.0.0" + xtend "^4.0.0" + +hast-util-to-parse5@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-5.1.2.tgz#09d27bee9ba9348ea05a6cfcc44e02f9083969b6" + integrity sha512-ZgYLJu9lYknMfsBY0rBV4TJn2xiwF1fXFFjbP6EE7S0s5mS8LIKBVWzhA1MeIs1SWW6GnnE4In6c3kPb+CWhog== + dependencies: + hast-to-hyperscript "^7.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-whitespace@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" + integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== + +hastscript@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" + integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-minifier-terser@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1, ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-decimal@^1.0.0, is-decimal@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +isarray@1.0.0, isarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +line-column@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" + integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= + dependencies: + isarray "^1.0.0" + isobject "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.14, lodash@^4.17.19: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +mdast-util-definitions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz#06af6c49865fc63d6d7d30125569e2f7ae3d0a86" + integrity sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@^9.1.0: + version "9.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-9.1.2.tgz#10fa5ed9d45bf3755891e5801d0f32e2584a9423" + integrity sha512-OpkFLBC2VnNAb2FNKcKWu9FMbJhQKog+FCT8nuKmQNIKXyT1n3SIskE7uWDep6x+cA20QXlK5AETHQtYmQmxtQ== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^3.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +"mime-db@>= 1.43.0 < 2": + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@~2.1.24: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mithril-node-render@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mithril-node-render/-/mithril-node-render-3.0.0.tgz#27fb36225456a118d3e137944096429b62113e99" + integrity sha512-aerVhZh6LRHHVhlsxAfxwyTa6KRFKzliAM9AmHkxPI8wLFs62NjwIWKbmeYzpNdtZhp8BKwQ6N3WPctX74OiLA== + +mithril@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mithril/-/mithril-2.0.4.tgz#d125969d992b924c7185d24ff92d997e5c00116b" + integrity sha512-mgw+DMZlhMS4PpprF6dl7ZoeZq5GGcAuWnrg5e12MvaGauc4jzWsDZtVGRCktsiQczOEUr2K5teKbE5k44RlOg== + +mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + +node-releases@^1.1.61: + version "1.1.61" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" + integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize.css@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" + integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" + integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.0" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +on-headers@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onchange@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/onchange/-/onchange-7.0.2.tgz#77f98263cc8412210c1a2d89a55cc5eb32ad33ec" + integrity sha512-pyJroR9gZKilbJtdGsuyxhFhwaeYSpYVle9hAORGJ5vQQH8n7QT+qWpncJTMEk9dlIXI9tOMjdJwbPaTSPTKFA== + dependencies: + "@blakeembrey/deque" "^1.0.5" + "@blakeembrey/template" "^1.0.0" + arg "^4.1.3" + chokidar "^3.3.1" + cross-spawn "^7.0.1" + ignore "^5.1.4" + tree-kill "^1.2.2" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +param-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" + integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + dependencies: + dot-case "^3.0.3" + tslib "^1.10.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +planckmatch@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/planckmatch/-/planckmatch-0.2.1.tgz#62018e11be5582f76e54ec1cee0a221a44629f2c" + integrity sha512-ckBZEvk4h1a5NA/gYej4tNaeUF5IdYbolYB54spNRoI+ypY6CHdr184Cx3s0gWdrl8155N5XO6UMIpxYfPxQvg== + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-import@12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== + dependencies: + postcss "^7.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.1.tgz#c3a287dd10e4f6c84cb3791052b96a5d859c9389" + integrity sha512-9DGLSsjooH3kSNjTZUOt2eIj2ZTW0VI2PZ/3My+8TC7KIbH2OKwUlISfDsf63EP4aiRUt3XkEWMWvyJHvJelEg== + dependencies: + colorette "^1.2.1" + line-column "^1.0.2" + nanoid "^3.1.12" + source-map "^0.6.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +property-information@^5.0.0, property-information@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.5.0.tgz#4dc075d493061a82e2b7d096f406e076ed859943" + integrity sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA== + dependencies: + xtend "^4.0.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +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" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +registry-auth-token@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +rehype-raw@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-4.0.2.tgz#5d3191689df96c8c651ce5f51a6c668d2c07b9c8" + integrity sha512-xQt94oXfDaO7sK9mJBtsZXkjW/jm6kArCoYN+HqKZ51O19AFHlp3Xa5UfZZ2tJkbpAZzKtgVUYvnconk9IsFuA== + dependencies: + hast-util-raw "^5.0.0" + +rehype-sanitize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rehype-sanitize/-/rehype-sanitize-4.0.0.tgz#b5241cf66bcedc49cd4e924a5f7a252f00a151ad" + integrity sha512-ZCr/iQRr4JeqPjun5i9CHHILVY7i45VnLu1CkkibDrSyFQ7dTLSvw8OIQpHhS4RSh9h/9GidxFw1bRb0LOxIag== + dependencies: + hast-util-sanitize "^3.0.0" + +rehype-stringify@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" + integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== + dependencies: + hast-util-to-html "^7.1.1" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-external-links@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-7.0.1.tgz#c71ca81ea4cca48f067a9659645e4e87a94e54d5" + integrity sha512-a98JnTMRln8GseQq0buE4Aq6yYjYF4aRIlrPVxL9PT1pcy+yMJij24dEYAqvdluF9GHgNs/De+8y6kzqsjH1jQ== + dependencies: + extend "^3.0.0" + is-absolute-url "^3.0.0" + mdast-util-definitions "^3.0.0" + space-separated-tokens "^1.0.0" + unist-util-visit "^2.0.0" + +remark-parse@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-rehype@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-7.0.0.tgz#8e106e49806c69b2e9523b76d24965119e2da67b" + integrity sha512-uqQ/VbaTdxyu/da6npHAso6hA00cMqhA3a59RziQdOLN2KEIkPykAVy52IcmZEVTuauXO0VtpxkyCey4phtHzQ== + dependencies: + mdast-util-to-hast "^9.1.0" + +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +safe-buffer@5.1.2, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +"semver@2 || 3 || 4 || 5", semver@^5.4.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +serve-handler@6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve@11.3.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/serve/-/serve-11.3.2.tgz#b905e980616feecd170e51c8f979a7b2374098f5" + integrity sha512-yKWQfI3xbj/f7X1lTBg91fXBP0FqjJ4TEi+ilES5yzH0iKJpN5LjNb1YzIfQg9Rqn4ECUS2SOf2+Kmepogoa5w== + dependencies: + "@zeit/schemas" "2.6.0" + ajv "6.5.3" + arg "2.0.0" + boxen "1.3.0" + chalk "2.4.1" + clipboardy "1.2.3" + compression "1.7.3" + serve-handler "6.1.3" + update-check "1.5.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +source-map-support@~0.5.12, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +stringify-entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.0.1.tgz#32154b91286ab0869ab2c07696223bd23b6dbfc0" + integrity sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.2" + is-hexadecimal "^1.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-to-object@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.2.3.tgz#afcf42bc03846b1e311880c55632a26ad2780bcb" + integrity sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.4.tgz#e510e05f86e0bd87f01835c3238839193f77a60c" + integrity sha512-dxuB8KQo8Gt6OVOeLg/rxfcxdNZI/V1G6ze1czFUzPeCFWZRtvZMgSzlZZ5OYBZ4HoG607F6pFPNLekJyV+yVw== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-trailing-lines@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94" + integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +uglify-js@^3.1.4: + version "3.11.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.11.1.tgz#32d274fea8aac333293044afd7f81409d5040d38" + integrity sha512-OApPSuJcxcnewwjSGGfWOjx3oix5XpmrK9Z2j0fTRlHGoZ49IU6kExfZTM0++fCArOOCet+vIfWwFHbvWqwp6g== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unified@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.5.tgz#1e903e68467931ebfaea386dae9ea253628acd42" + integrity sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw== + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-is@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" + integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz#4dd262fb9dcfe44f297d53e882fc6ff3421173d5" + integrity sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +update-check@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.2.tgz#2fe09f725c543440b3d7dabe8971f2d5caaedc28" + integrity sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ== + dependencies: + registry-auth-token "3.3.2" + registry-url "3.1.0" + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +v8-compile-cache@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vfile-location@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.1.0.tgz#81cd8a04b0ac935185f4fce16f270503fc2f692f" + integrity sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01" + integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +web-namespaces@^1.0.0, web-namespaces@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==