From d2c8014c632e5183c8dab2904a49b9d7d02d58d6 Mon Sep 17 00:00:00 2001 From: azu Date: Sun, 25 Aug 2019 16:52:58 +0900 Subject: [PATCH] feat(@power-doctest/markdown): add @power-doctest/markdown --- .gitignore | 2 +- package.json | 3 +- .../javascript}/.gitignore | 0 .../javascript}/LICENSE | 0 .../javascript}/README.md | 8 +- .../javascript}/package.json | 7 +- .../javascript}/src/power-doctest-runner.ts | 19 + .../javascript}/test/mocha.opts | 0 .../test/power-doctest-runner.test.ts | 12 +- .../javascript}/test/snapshot.test.ts | 0 .../test/snapshots/error.array/error.txt | 0 .../test/snapshots/error.array/input.js | 0 .../test/snapshots/error.object/error.txt | 0 .../test/snapshots/error.object/input.js | 0 .../test/snapshots/ok.array/error.txt | 0 .../test/snapshots/ok.array/input.js | 0 .../javascript}/test/tsconfig.json | 0 .../javascript}/tsconfig.json | 0 .../javascript}/yarn.lock | 0 packages/@power-doctest/markdown/.gitignore | 155 ++++++++ packages/@power-doctest/markdown/LICENSE | 19 + packages/@power-doctest/markdown/README.md | 172 ++++++++ packages/@power-doctest/markdown/package.json | 70 ++++ .../markdown/src/DocTestController.ts | 148 +++++++ packages/@power-doctest/markdown/src/index.ts | 98 +++++ .../markdown/test/fixtures/example.md | 13 + .../markdown/test/index.test.ts | 21 + .../@power-doctest/markdown/test/mocha.opts | 1 + .../markdown/test/snapshot.test.ts | 65 +++ .../test/snapshots/ng.async/error.txt | 11 + .../markdown/test/snapshots/ng.async/input.md | 13 + .../snapshots/ng.invalid-options/error.txt | 8 + .../snapshots/ng.invalid-options/input.md | 10 + .../ng.runMode-all-timeout/error.txt | 8 + .../snapshots/ng.runMode-all-timeout/input.md | 10 + .../ng.runMode-all-timeout/options.json | 3 + .../test/snapshots/ng.simple/error.txt | 11 + .../test/snapshots/ng.simple/input.md | 13 + .../test/snapshots/ng.with-meta/error.txt | 11 + .../test/snapshots/ng.with-meta/input.md | 6 + .../test/snapshots/ok.disable/input.md | 7 + .../test/snapshots/ok.disable/pass.txt | 1 + .../test/snapshots/ok.doctest-error/input.md | 6 + .../test/snapshots/ok.doctest-error/pass.txt | 1 + .../test/snapshots/ok.runMode-any/input.md | 10 + .../test/snapshots/ok.runMode-any/pass.txt | 1 + .../test/snapshots/ok.simple/input.md | 13 + .../test/snapshots/ok.simple/pass.txt | 1 + .../markdown/test/tsconfig.json | 11 + .../@power-doctest/markdown/tsconfig.json | 36 ++ yarn.lock | 369 +++++++++++++++++- 51 files changed, 1359 insertions(+), 14 deletions(-) rename packages/{power-doctest-runner => @power-doctest/javascript}/.gitignore (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/LICENSE (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/README.md (88%) rename packages/{power-doctest-runner => @power-doctest/javascript}/package.json (91%) rename packages/{power-doctest-runner => @power-doctest/javascript}/src/power-doctest-runner.ts (85%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/mocha.opts (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/power-doctest-runner.test.ts (91%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/snapshot.test.ts (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/snapshots/error.array/error.txt (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/snapshots/error.array/input.js (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/snapshots/error.object/error.txt (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/snapshots/error.object/input.js (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/snapshots/ok.array/error.txt (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/snapshots/ok.array/input.js (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/test/tsconfig.json (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/tsconfig.json (100%) rename packages/{power-doctest-runner => @power-doctest/javascript}/yarn.lock (100%) create mode 100644 packages/@power-doctest/markdown/.gitignore create mode 100644 packages/@power-doctest/markdown/LICENSE create mode 100644 packages/@power-doctest/markdown/README.md create mode 100644 packages/@power-doctest/markdown/package.json create mode 100644 packages/@power-doctest/markdown/src/DocTestController.ts create mode 100644 packages/@power-doctest/markdown/src/index.ts create mode 100644 packages/@power-doctest/markdown/test/fixtures/example.md create mode 100644 packages/@power-doctest/markdown/test/index.test.ts create mode 100644 packages/@power-doctest/markdown/test/mocha.opts create mode 100644 packages/@power-doctest/markdown/test/snapshot.test.ts create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.async/error.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.async/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/error.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/error.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/options.json create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.simple/error.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.simple/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.with-meta/error.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ng.with-meta/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.disable/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.disable/pass.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/pass.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/pass.txt create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.simple/input.md create mode 100644 packages/@power-doctest/markdown/test/snapshots/ok.simple/pass.txt create mode 100644 packages/@power-doctest/markdown/test/tsconfig.json create mode 100644 packages/@power-doctest/markdown/tsconfig.json diff --git a/.gitignore b/.gitignore index b458213..71e1399 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # monorepo -packages/*/lib +packages/*/lib/ ### https://raw.github.com/github/gitignore/d2c1bb2b9c72ead618c9f6a48280ebc7a8e0dff6/Node.gitignore diff --git a/package.json b/package.json index 4f79a24..136a3a5 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "main": "index.js", "workspaces": { "packages": [ - "packages/*" + "packages/*", + "packages/@power-doctest/*" ] }, "devDependencies": { diff --git a/packages/power-doctest-runner/.gitignore b/packages/@power-doctest/javascript/.gitignore similarity index 100% rename from packages/power-doctest-runner/.gitignore rename to packages/@power-doctest/javascript/.gitignore diff --git a/packages/power-doctest-runner/LICENSE b/packages/@power-doctest/javascript/LICENSE similarity index 100% rename from packages/power-doctest-runner/LICENSE rename to packages/@power-doctest/javascript/LICENSE diff --git a/packages/power-doctest-runner/README.md b/packages/@power-doctest/javascript/README.md similarity index 88% rename from packages/power-doctest-runner/README.md rename to packages/@power-doctest/javascript/README.md index cbc60bc..ef0bec9 100644 --- a/packages/power-doctest-runner/README.md +++ b/packages/@power-doctest/javascript/README.md @@ -1,17 +1,17 @@ -# power-doctest-runner +# @power-doctest/javascript -A Test Runner for power-doctest. +A power-doctest Runner using for JavaScript. ## Install Install with [npm](https://www.npmjs.com/): - npm install power-doctest-runner + npm install @power-doctest/javascript ## Usage ```js -import { run } from "power-doctest-runner" +import { run } from "@power-doctest/javascript" run(` console.log(1); // => 1 console.log("string"); // => "string" diff --git a/packages/power-doctest-runner/package.json b/packages/@power-doctest/javascript/package.json similarity index 91% rename from packages/power-doctest-runner/package.json rename to packages/@power-doctest/javascript/package.json index da8d4f6..eeaea0d 100644 --- a/packages/power-doctest-runner/package.json +++ b/packages/@power-doctest/javascript/package.json @@ -1,7 +1,7 @@ { - "name": "power-doctest-runner", + "name": "@power-doctest/javascript", "version": "1.0.0", - "description": "A Test Runner for power-doctest.", + "description": "A power-doctest Runner using for JavaScript.", "keywords": [ "doctest", "node.js", @@ -70,5 +70,8 @@ "prettier --write", "git add" ] + }, + "publishConfig": { + "access": "public" } } diff --git a/packages/power-doctest-runner/src/power-doctest-runner.ts b/packages/@power-doctest/javascript/src/power-doctest-runner.ts similarity index 85% rename from packages/power-doctest-runner/src/power-doctest-runner.ts rename to packages/@power-doctest/javascript/src/power-doctest-runner.ts index 83964c1..7b431f4 100644 --- a/packages/power-doctest-runner/src/power-doctest-runner.ts +++ b/packages/@power-doctest/javascript/src/power-doctest-runner.ts @@ -20,6 +20,9 @@ export interface PowerDoctestRunnerOptions { // console.log(1); // => 1 // ``` console?: boolean; + // Timeout + // Default: 2000ms + timeout?: number // Default: all // If runMode is all, all assertions are finished and resolve it // If runMode is any, anyone assertion is finished and resolve it @@ -32,9 +35,21 @@ const CALLBACK_FUNCTION_NAME = "__power_doctest_runner_callback__"; export function run(code: string, options: PowerDoctestRunnerOptions = {}) { const runMode = options.runMode || "all"; + const timeout = options.timeout !== undefined ? options.timeout : 2000; const postCallbackName = options.powerDoctestCallbackFunctionName || CALLBACK_FUNCTION_NAME; const context = options.context || {}; return new Promise((resolve, reject) => { + let isSettled = false; + const timeoutId = setTimeout(() => { + if (isSettled) { + return; + } + restoreListener(); + reject(new Error(`Timeout error + +${runMode === "all" ? `If you use { "runMode": "all" }, you should check all condition flow is passed. Maybe +Also, you should consider to use { "runMode": "any" }` : ""}`)); + }, timeout); // Test Runner like mocha listen unhandledRejection and uncaughtException // Disable these listener before running code const originalUnhandledRejection = process.listeners("unhandledRejection"); @@ -50,6 +65,7 @@ export function run(code: string, options: PowerDoctestRunnerOptions = {}) { reject(error); }; const restoreListener = () => { + isSettled = true; process.off("uncaughtException", uncaughtException); process.off("unhandledRejection", unhandledRejection); // restore @@ -59,6 +75,8 @@ export function run(code: string, options: PowerDoctestRunnerOptions = {}) { originalUnhandledRejection.forEach(listener => { process.addListener("unhandledRejection", listener); }); + // clearTimeout + clearTimeout(timeoutId); }; process.on("uncaughtException", uncaughtException); process.on("unhandledRejection", unhandledRejection as any); @@ -71,6 +89,7 @@ export function run(code: string, options: PowerDoctestRunnerOptions = {}) { let countOfExecutedAssertion = 0; const vm = new NodeVM({ console: options.console ? "inherit" : "off", + timeout: timeout, sandbox: { [postCallbackName]: (_id: string) => { countOfExecutedAssertion++; diff --git a/packages/power-doctest-runner/test/mocha.opts b/packages/@power-doctest/javascript/test/mocha.opts similarity index 100% rename from packages/power-doctest-runner/test/mocha.opts rename to packages/@power-doctest/javascript/test/mocha.opts diff --git a/packages/power-doctest-runner/test/power-doctest-runner.test.ts b/packages/@power-doctest/javascript/test/power-doctest-runner.test.ts similarity index 91% rename from packages/power-doctest-runner/test/power-doctest-runner.test.ts rename to packages/@power-doctest/javascript/test/power-doctest-runner.test.ts index 3d44163..5a0b998 100644 --- a/packages/power-doctest-runner/test/power-doctest-runner.test.ts +++ b/packages/@power-doctest/javascript/test/power-doctest-runner.test.ts @@ -85,5 +85,15 @@ setTimeout(() => { runMode: "any" })); }); - + it("does timeout because all assertion never called", () => { + return assert.rejects(run(` +if( true ) { + 1; // => 1 +} else{ + 2; // => 2 +} +`, { + timeout: 100 // 100ms + })); + }); }); diff --git a/packages/power-doctest-runner/test/snapshot.test.ts b/packages/@power-doctest/javascript/test/snapshot.test.ts similarity index 100% rename from packages/power-doctest-runner/test/snapshot.test.ts rename to packages/@power-doctest/javascript/test/snapshot.test.ts diff --git a/packages/power-doctest-runner/test/snapshots/error.array/error.txt b/packages/@power-doctest/javascript/test/snapshots/error.array/error.txt similarity index 100% rename from packages/power-doctest-runner/test/snapshots/error.array/error.txt rename to packages/@power-doctest/javascript/test/snapshots/error.array/error.txt diff --git a/packages/power-doctest-runner/test/snapshots/error.array/input.js b/packages/@power-doctest/javascript/test/snapshots/error.array/input.js similarity index 100% rename from packages/power-doctest-runner/test/snapshots/error.array/input.js rename to packages/@power-doctest/javascript/test/snapshots/error.array/input.js diff --git a/packages/power-doctest-runner/test/snapshots/error.object/error.txt b/packages/@power-doctest/javascript/test/snapshots/error.object/error.txt similarity index 100% rename from packages/power-doctest-runner/test/snapshots/error.object/error.txt rename to packages/@power-doctest/javascript/test/snapshots/error.object/error.txt diff --git a/packages/power-doctest-runner/test/snapshots/error.object/input.js b/packages/@power-doctest/javascript/test/snapshots/error.object/input.js similarity index 100% rename from packages/power-doctest-runner/test/snapshots/error.object/input.js rename to packages/@power-doctest/javascript/test/snapshots/error.object/input.js diff --git a/packages/power-doctest-runner/test/snapshots/ok.array/error.txt b/packages/@power-doctest/javascript/test/snapshots/ok.array/error.txt similarity index 100% rename from packages/power-doctest-runner/test/snapshots/ok.array/error.txt rename to packages/@power-doctest/javascript/test/snapshots/ok.array/error.txt diff --git a/packages/power-doctest-runner/test/snapshots/ok.array/input.js b/packages/@power-doctest/javascript/test/snapshots/ok.array/input.js similarity index 100% rename from packages/power-doctest-runner/test/snapshots/ok.array/input.js rename to packages/@power-doctest/javascript/test/snapshots/ok.array/input.js diff --git a/packages/power-doctest-runner/test/tsconfig.json b/packages/@power-doctest/javascript/test/tsconfig.json similarity index 100% rename from packages/power-doctest-runner/test/tsconfig.json rename to packages/@power-doctest/javascript/test/tsconfig.json diff --git a/packages/power-doctest-runner/tsconfig.json b/packages/@power-doctest/javascript/tsconfig.json similarity index 100% rename from packages/power-doctest-runner/tsconfig.json rename to packages/@power-doctest/javascript/tsconfig.json diff --git a/packages/power-doctest-runner/yarn.lock b/packages/@power-doctest/javascript/yarn.lock similarity index 100% rename from packages/power-doctest-runner/yarn.lock rename to packages/@power-doctest/javascript/yarn.lock diff --git a/packages/@power-doctest/markdown/.gitignore b/packages/@power-doctest/markdown/.gitignore new file mode 100644 index 0000000..b82077a --- /dev/null +++ b/packages/@power-doctest/markdown/.gitignore @@ -0,0 +1,155 @@ +### https://raw.github.com/github/gitignore/d2c1bb2b9c72ead618c9f6a48280ebc7a8e0dff6/Node.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# 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 + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + + +### https://raw.github.com/github/gitignore/d2c1bb2b9c72ead618c9f6a48280ebc7a8e0dff6/Global/JetBrains.gitignore + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + + +/lib diff --git a/packages/@power-doctest/markdown/LICENSE b/packages/@power-doctest/markdown/LICENSE new file mode 100644 index 0000000..add9e8e --- /dev/null +++ b/packages/@power-doctest/markdown/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2019 azu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/@power-doctest/markdown/README.md b/packages/@power-doctest/markdown/README.md new file mode 100644 index 0000000..228b87f --- /dev/null +++ b/packages/@power-doctest/markdown/README.md @@ -0,0 +1,172 @@ +# @power-doctest/markdown + +A power-doctest Runner using for Markdown. + +## Features + +Run doctest for Markdown's CodeBlock. + + This is markdown example. + Following code is tested by power-doctest. + + + `js` CodeBlock + + ```js + console.log(1); // => 1 + ``` + + `javascript` codeBlock + + ```javascript + console.log("str"); // => "str" + ``` + + +## Install + +Install with [npm](https://www.npmjs.com/): + + npm install @power-doctest/markdown + +## Usage + +`fixtures/example.md`: + + This Is Markdown + + Valid JavaScript Example: + + ```js + console.log("ok"); // => "ok" + ``` + + Invalid JavaScript Example + + ```js + console.log("ok"); // => "ng" + ``` +Example test code + +```js +import fs from "fs"; +import path from "path"; +import assert from "assert"; +import { run } from "@power-doctest/markdown"; + +describe("run markdown", function() { + it("is example", () => { + const markdown = fs.readFileSync(path.join(__dirname, "fixtures/example.md"), "utf-8"); + return run(markdown).then(() => { + // pass + }).catch(aggregatedError => { + assert.strictEqual(aggregatedError.message, "Throw 1 error in 2 code blocks"); + assert.strictEqual(aggregatedError.errors.length, 1); + const [error] = aggregatedError.errors; + assert.strictEqual(error.message, `Expected values to be strictly equal: + +'ok' !== 'ng' +`); + }); + }); +}); +``` + + +## Options + +`@power-doctest/markdown` support some options with HTML comments. + +### Disable Doctest: `` + +Disable doctest for the codeblock. + + This code block is not evaluated. + + + ```js + console.log(true); // => "not eval" + ``` + + +### Expected error: `` + +If the error is not match the result, throw error. + + + ```js + ++++++++; + ``` + +### Doctest options:` ` + +Pass `options` to `@power-doctest/markdown`. +The inline options is preferred constructor options. + + + ```js + if (1 === 1) { + console.log(1); // => 1 + } else{ + console.log(2); // => 2 + } + ``` + +### Metadata: `` + +It is useful for testing original behavior. + + Attach Metadata to error + + + ```javascript + typeof 123n; // => "bigint" + ``` + +And `errors` include `meta` property + +```json +{ + "message": "Throw 1 error in 1 code blocks", + "errors": [ + { + "meta": { + "ECMAScript": 2020 + }, + "message": "Identifier directly after number (1:10)" + } + ] +} +``` + + +## Changelog + +See [Releases page](https://github.com/azu/power-doctest/releases). + +## Running tests + +Install devDependencies and Run `npm test`: + + npm test + +## Contributing + +Pull requests and stars are always welcome. + +For bugs and feature requests, [please create an issue](https://github.com/azu/power-doctest/issues). + +1. Fork it! +2. Create your feature branch: `git checkout -b my-new-feature` +3. Commit your changes: `git commit -am 'Add some feature'` +4. Push to the branch: `git push origin my-new-feature` +5. Submit a pull request :D + +## Author + +- [github/azu](https://github.com/azu) +- [twitter/azu_re](https://twitter.com/azu_re) + +## License + +MIT © azu diff --git a/packages/@power-doctest/markdown/package.json b/packages/@power-doctest/markdown/package.json new file mode 100644 index 0000000..d136d11 --- /dev/null +++ b/packages/@power-doctest/markdown/package.json @@ -0,0 +1,70 @@ +{ + "name": "@power-doctest/markdown", + "version": "1.0.0", + "description": "A power-doctest Runner using for Markdown.", + "keywords": [ + "doctest", + "javascript", + "markdown" + ], + "homepage": "https://github.com/azu/power-doctest/tree/master/packages/@power-doctest/markdown/", + "bugs": { + "url": "https://github.com/azu/power-doctest/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/azu/power-doctest.git" + }, + "license": "MIT", + "author": "azu", + "files": [ + "bin/", + "lib/", + "src/" + ], + "main": "lib/markdown.js", + "types": "lib/markdown.d.ts", + "directories": { + "lib": "lib", + "test": "test" + }, + "scripts": { + "build": "cross-env NODE_ENV=production tsc -p .", + "clean": "rimraf lib/", + "prettier": "prettier --write \"**/*.{js,jsx,ts,tsx,css}\"", + "prepublish": "npm run --if-present build", + "test": "mocha \"test/**/*.ts\"", + "updateSnapshot": "UPDATE_SNAPSHOT=1 npm test", + "watch": "tsc -p . --watch" + }, + "prettier": { + "printWidth": 120, + "singleQuote": false, + "tabWidth": 4 + }, + "devDependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^12.7.2", + "cross-env": "^5.2.0", + "mocha": "^6.2.0", + "prettier": "^1.18.2", + "rimraf": "^3.0.0", + "strip-color": "^0.1.0", + "ts-node": "^8.3.0", + "ts-node-test-register": "^8.0.1", + "typescript": "^3.5.3" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@power-doctest/javascript": "^1.0.0", + "@types/unist": "^2.0.3", + "promise.allsettled": "^1.0.1", + "remark": "^11.0.1", + "unist-util-find-all-between": "^1.0.6", + "unist-util-find-before": "^2.0.4", + "unist-util-parents": "^1.0.2", + "unist-util-select": "^2.0.2" + } +} diff --git a/packages/@power-doctest/markdown/src/DocTestController.ts b/packages/@power-doctest/markdown/src/DocTestController.ts new file mode 100644 index 0000000..47ab281 --- /dev/null +++ b/packages/@power-doctest/markdown/src/DocTestController.ts @@ -0,0 +1,148 @@ +// MIT © 2017 azu +"use strict"; + +const DISABLE_PATTERN = /doctest:\s*?disable/; +const DOCTEST_OPTIONS = /doctest:\w*?options:({[^}]+})/; +const DOCTEST_METADATA = /doctest:\w*?meta:({[^}]+})/; +const ERROR_TYPE_PATTERN = /doctest:\s*([\w\s]*?Error)/; + +/** + * CodeBlockの手前に該当するHTMLコメントはdoctestの制御コードとして扱える + * + * @example + * 以下のは実行されないのでOKになる + * + * + * ```js + * 1; // => 2 + * ``` + * + * @example + * 次はdoctestの結果のError名を指定できる + * + * + * ```js + * NO_DEFINE++; + * ``` + * + * @type {String} + */ +export class DocTestController { + private comments: string[]; + private _expectedErrorName: undefined | (null | string); + + /** + * @param {string[]} comments + */ + constructor(comments: string[]) { + this.comments = comments; + this._expectedErrorName = this._getExpectedErrorName(comments); + } + + /** + * Return true if `this.comments` include DISABLE_PATTERN + * @returns {boolean} + */ + get isDisabled() { + return this.comments.some(comment => { + return DISABLE_PATTERN.test(comment); + }); + } + + /** + * @returns {string|undefined} + */ + get expectedErrorName() { + return this._expectedErrorName; + } + + /** + * @returns {boolean} + */ + get hasExpectedError() { + return this.expectedErrorName !== undefined; + } + + get doctestMetadata() { + const optionComment = this.comments.find(comment => { + return DOCTEST_METADATA.test(comment); + }); + if (!optionComment) { + return; + } + const optionString = optionComment.match(DOCTEST_METADATA); + if (!optionString) { + return; + } + try { + return JSON.parse(optionString[1]); + } catch (error) { + throw new Error(`Can not parsed the metadata. + +doctest:metadata:{ ... } should be json string. + +Actual: ${optionString} +`); + } + + } + + get doctestOptions() { + const optionComment = this.comments.find(comment => { + return DOCTEST_OPTIONS.test(comment); + }); + if (!optionComment) { + return; + } + const optionString = optionComment.match(DOCTEST_OPTIONS); + if (!optionString) { + return; + } + try { + return JSON.parse(optionString[1]); + } catch (error) { + throw new Error(`Can not parsed the options. + +doctest:options:{ ... } should be json string. + +Actual: ${optionString} +`); + } + + } + + /** + * Return true, if the `error` is expected error name + * If not defined expected error, return true. + * @param {Error} [error] + * @returns {boolean} + */ + isExpectedError(error: Error) { + if (!this.hasExpectedError) { + return false; + } + const expectedErrorType = this.expectedErrorName; + if (!expectedErrorType) { + return true; // no expected error + } + return error.name === expectedErrorType; + } + + + /** + * Return expected Error name if expected is defined. + * @returns {string[]} + * @returns {string|undefined} + * @private + */ + _getExpectedErrorName(comments: string[]) { + const expectedErrorTypeComment = comments.find(comment => { + return ERROR_TYPE_PATTERN.test(comment); + }); + if (!expectedErrorTypeComment) { + return; + } + const match = expectedErrorTypeComment.match(ERROR_TYPE_PATTERN); + return match && match[1]; + } +} diff --git a/packages/@power-doctest/markdown/src/index.ts b/packages/@power-doctest/markdown/src/index.ts new file mode 100644 index 0000000..78ab642 --- /dev/null +++ b/packages/@power-doctest/markdown/src/index.ts @@ -0,0 +1,98 @@ +import { run as runJavaScript, PowerDoctestRunnerOptions } from "@power-doctest/javascript"; +import { DocTestController } from "./DocTestController"; + +const allSettled = require("promise.allsettled"); + +type UnistParentNode = import("unist").Parent +// unist-util-parents +type UnistNode = import("unist").Node & { + parent: UnistParentNode +}; + +export interface AggregateError { + message: string; + errors: Error[] +} + +const remark = require("remark")(); +const select = require("unist-util-select"); +const attachParents = require("unist-util-parents"); +const findAllBetween = require("unist-util-find-all-between"); +const findBefore = require("unist-util-find-before"); +const getComments = (parentNode: UnistParentNode, codeNode: UnistNode) => { + const nonHtmlNode = findBefore(parentNode, codeNode, (node: UnistNode) => { + return node.type !== "html"; + }); + const startNode = nonHtmlNode ? nonHtmlNode : parentNode.children[0]; + const htmlNodes = findAllBetween(parentNode, startNode, codeNode, "html"); + return htmlNodes.map((htmlNode: any) => { + return htmlNode.value.replace(/^$/, ""); + }); +}; + + +type Rejected = { status: "rejected", reason: Error }; +type Fulfilled = { status: "fulfilled", value: any }; +/** + * Run code with power-doctest and return a Promise object. + * If all is ok, resolve the promise. + * If someone has an error, reject the promise with AggregateError + * @param markdown + * @param [options] + * @returns Promise or Promise + */ +export const run = async (markdown: string, options: PowerDoctestRunnerOptions = {}): Promise => { + const markdownAST = attachParents(remark.parse(markdown)); + const codeBlocks = [].concat( + select.selectAll(`code[lang="js"]`, markdownAST), + select.selectAll(`code[lang="javascript"]`, markdownAST) + ); + // try to eval + const promises = codeBlocks.map(async (codeBlock: UnistNode) => { + const codeValue = codeBlock.value; + if (typeof codeValue !== "string") { + return; + } + const comments = getComments(codeBlock.parent, codeBlock); + const docTestController = new DocTestController(comments); + // + if (docTestController.isDisabled) { + return; + } + const inlineOptions = docTestController.doctestOptions; + return runJavaScript(codeValue, { + ...options, + ...inlineOptions + }).catch(error => { + // + if (docTestController.isExpectedError(error)) { + return Promise.resolve(); + } + // + const metadata = docTestController.doctestMetadata; + if (metadata) { + error.meta = metadata; + } + return Promise.reject(error); + }); + }); + const isRejected = (promise: Fulfilled | Rejected): promise is Rejected => { + return promise.status === "rejected"; + }; + // + // + const errors = await allSettled(promises).then((promises: (Fulfilled | Rejected)[]) => { + return promises.filter(isRejected).map((rejected: Rejected) => { + return rejected.reason; + }); + }); + if (errors.length === 0) { + return; // pass + } else { + // return AggregateError + return Promise.reject({ + message: `Throw ${errors.length} error in ${codeBlocks.length} code blocks`, + errors + }); + } +}; diff --git a/packages/@power-doctest/markdown/test/fixtures/example.md b/packages/@power-doctest/markdown/test/fixtures/example.md new file mode 100644 index 0000000..56fc0aa --- /dev/null +++ b/packages/@power-doctest/markdown/test/fixtures/example.md @@ -0,0 +1,13 @@ +This Is Markdown + +Valid JavaScript Example: + +```js +console.log("ok"); // => "ok" +``` + +Invalid JavaScript Example + +```js +console.log("ok"); // => "ng" +``` diff --git a/packages/@power-doctest/markdown/test/index.test.ts b/packages/@power-doctest/markdown/test/index.test.ts new file mode 100644 index 0000000..579ae44 --- /dev/null +++ b/packages/@power-doctest/markdown/test/index.test.ts @@ -0,0 +1,21 @@ +import fs from "fs"; +import path from "path"; +import { run } from "../src"; +import assert = require("assert"); + +describe("run markdown", function() { + it("is example", () => { + const markdown = fs.readFileSync(path.join(__dirname, "fixtures/example.md"), "utf-8"); + return run(markdown).then(() => { + // pass + }).catch(aggregatedError => { + assert.strictEqual(aggregatedError.message, "Throw 1 error in 2 code blocks"); + assert.strictEqual(aggregatedError.errors.length, 1); + const [error] = aggregatedError.errors; + assert.strictEqual(error.message, `Expected values to be strictly equal: + +'ok' !== 'ng' +`); + }); + }); +}); diff --git a/packages/@power-doctest/markdown/test/mocha.opts b/packages/@power-doctest/markdown/test/mocha.opts new file mode 100644 index 0000000..b518ce0 --- /dev/null +++ b/packages/@power-doctest/markdown/test/mocha.opts @@ -0,0 +1 @@ +--require ts-node-test-register diff --git a/packages/@power-doctest/markdown/test/snapshot.test.ts b/packages/@power-doctest/markdown/test/snapshot.test.ts new file mode 100644 index 0000000..4234b19 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshot.test.ts @@ -0,0 +1,65 @@ +import * as fs from "fs"; +import * as path from "path"; +import * as assert from "assert"; +// transform function +import { run } from "../src"; + +const strip = require("strip-color"); +const fixturesDir = path.join(__dirname, "snapshots"); +describe("Snapshot testing", () => { + fs.readdirSync(fixturesDir) + .map(caseName => { + const normalizedTestName = caseName.replace(/-/g, " "); + it(`Test ${normalizedTestName}`, async function() { + const fixtureDir = path.join(fixturesDir, caseName); + const actualFilePath = path.join(fixtureDir, "input.md"); + const actualContent = fs.readFileSync(actualFilePath, "utf-8"); + const actualOptionFilePath = path.join(fixtureDir, "options.json"); + const actualOptions = fs.existsSync(actualOptionFilePath) + ? JSON.parse(fs.readFileSync(actualOptionFilePath, "utf-8")) + : {}; + const actual = await run(actualContent, actualOptions) + .then(() => { + return "PASS"; + }).catch(error => { + return { + message: error.message, + errors: error.errors.map((error: any) => { + return { + // do not add undefined value + ...(error.meta ? { + meta: error.meta + } : {}), + message: strip(error.message) + }; + }) + }; + }); + const errorFilePath = path.join(fixtureDir, "error.txt"); + const okFilePath = path.join(fixtureDir, "pass.txt"); + if (actual === "PASS") { + assert.ok(!fs.existsSync(errorFilePath), "should not have error.txt"); + fs.writeFileSync(okFilePath, "PASS"); + return; + } + // Usage: update snapshots + // UPDATE_SNAPSHOT=1 npm test + if (!fs.existsSync(errorFilePath) || process.env.UPDATE_SNAPSHOT) { + fs.writeFileSync(errorFilePath, JSON.stringify(actual, null, 4)); + this.skip(); // skip when updating snapshots + return; + } + // compare input and output + const expectedContent = JSON.parse(fs.readFileSync(errorFilePath, "utf-8")); + assert.deepStrictEqual( + actual, + expectedContent, + ` +${fixtureDir} +${actual} +` + ); + assert.ok(!fs.existsSync(okFilePath), "should not have pass.txt"); + }); + }); +}); diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.async/error.txt b/packages/@power-doctest/markdown/test/snapshots/ng.async/error.txt new file mode 100644 index 0000000..47de2e0 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.async/error.txt @@ -0,0 +1,11 @@ +{ + "message": "Throw 2 error in 2 code blocks", + "errors": [ + { + "message": "Expected values to be strictly equal:\n+ actual - expected\n\n+ 'setTimeout'\n- '???'" + }, + { + "message": "Expected values to be strictly equal:\n\n1 !== 2\n" + } + ] +} \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.async/input.md b/packages/@power-doctest/markdown/test/snapshots/ng.async/input.md new file mode 100644 index 0000000..f9ca854 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.async/input.md @@ -0,0 +1,13 @@ +Async Code test. + +```js +Promise.resolve(1); // => Resolve: 2 +``` + +`javascript` codeBlock + +```javascript +setTimeout(() => { + console.log("setTimeout"); // => "???" +}) +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/error.txt b/packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/error.txt new file mode 100644 index 0000000..e327292 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/error.txt @@ -0,0 +1,8 @@ +{ + "message": "Throw 1 error in 2 code blocks", + "errors": [ + { + "message": "Can not parsed the options.\n\ndoctest:options:{ ... } should be json string.\n\nActual: doctest:options:{ a: 1 },{ a: 1 }\n" + } + ] +} \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/input.md b/packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/input.md new file mode 100644 index 0000000..d0e92bc --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.invalid-options/input.md @@ -0,0 +1,10 @@ +Async Code test. + + +```js +1; // => 1 +``` + +```js +2; // => 2 +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/error.txt b/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/error.txt new file mode 100644 index 0000000..c33a696 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/error.txt @@ -0,0 +1,8 @@ +{ + "message": "Throw 1 error in 1 code blocks", + "errors": [ + { + "message": "Timeout error\n\nIf you use { \"runMode\": \"all\" }, you should check all condition flow is passed. Maybe, you should use { \"runMode\": \"any\" }" + } + ] +} \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/input.md b/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/input.md new file mode 100644 index 0000000..ba42458 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/input.md @@ -0,0 +1,10 @@ +Expected Error + + +```js +if (1 === 1) { + console.log(1); // => 1 +} else{ + console.log(2); // => 2 +} +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/options.json b/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/options.json new file mode 100644 index 0000000..8f2f2dd --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.runMode-all-timeout/options.json @@ -0,0 +1,3 @@ +{ + "timeout": 100 +} diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.simple/error.txt b/packages/@power-doctest/markdown/test/snapshots/ng.simple/error.txt new file mode 100644 index 0000000..2fb3503 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.simple/error.txt @@ -0,0 +1,11 @@ +{ + "message": "Throw 2 error in 2 code blocks", + "errors": [ + { + "message": "Expected values to be strictly equal:\n\n1 !== 2\n" + }, + { + "message": "Expected values to be strictly equal:\n\n'str' !== 'ng'\n" + } + ] +} \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.simple/input.md b/packages/@power-doctest/markdown/test/snapshots/ng.simple/input.md new file mode 100644 index 0000000..2924495 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.simple/input.md @@ -0,0 +1,13 @@ +This is Markdown. + +`js` CodeBlock + +```js +console.log(1); // => 2 +``` + +`javascript` codeBlock + +```javascript +console.log("str"); // => "ng" +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.with-meta/error.txt b/packages/@power-doctest/markdown/test/snapshots/ng.with-meta/error.txt new file mode 100644 index 0000000..c9cbd29 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.with-meta/error.txt @@ -0,0 +1,11 @@ +{ + "message": "Throw 1 error in 1 code blocks", + "errors": [ + { + "meta": { + "ECMAScript": 2020 + }, + "message": "Identifier directly after number (1:10)" + } + ] +} \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ng.with-meta/input.md b/packages/@power-doctest/markdown/test/snapshots/ng.with-meta/input.md new file mode 100644 index 0000000..282b1c8 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ng.with-meta/input.md @@ -0,0 +1,6 @@ +Attach Metadata to error + + +```javascript +typeof 123n; // => "bigint" +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.disable/input.md b/packages/@power-doctest/markdown/test/snapshots/ok.disable/input.md new file mode 100644 index 0000000..8acd49c --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.disable/input.md @@ -0,0 +1,7 @@ +This code block is not evaluated. + + +```js +console.log(true); // => "not eval" +``` +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.disable/pass.txt b/packages/@power-doctest/markdown/test/snapshots/ok.disable/pass.txt new file mode 100644 index 0000000..465701e --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.disable/pass.txt @@ -0,0 +1 @@ +PASS \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/input.md b/packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/input.md new file mode 100644 index 0000000..bf40ae0 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/input.md @@ -0,0 +1,6 @@ +Expected Error + + +```js +++++++++; +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/pass.txt b/packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/pass.txt new file mode 100644 index 0000000..465701e --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.doctest-error/pass.txt @@ -0,0 +1 @@ +PASS \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/input.md b/packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/input.md new file mode 100644 index 0000000..ce98ba2 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/input.md @@ -0,0 +1,10 @@ +Expected Error + + +```js +if (1 === 1) { + console.log(1); // => 1 +} else{ + console.log(2); // => 2 +} +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/pass.txt b/packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/pass.txt new file mode 100644 index 0000000..465701e --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.runMode-any/pass.txt @@ -0,0 +1 @@ +PASS \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.simple/input.md b/packages/@power-doctest/markdown/test/snapshots/ok.simple/input.md new file mode 100644 index 0000000..53c9eb4 --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.simple/input.md @@ -0,0 +1,13 @@ +This is Markdown. + +`js` CodeBlock + +```js +console.log(1); // => 1 +``` + +`javascript` codeBlock + +```javascript +console.log("str"); // => "str" +``` diff --git a/packages/@power-doctest/markdown/test/snapshots/ok.simple/pass.txt b/packages/@power-doctest/markdown/test/snapshots/ok.simple/pass.txt new file mode 100644 index 0000000..465701e --- /dev/null +++ b/packages/@power-doctest/markdown/test/snapshots/ok.simple/pass.txt @@ -0,0 +1 @@ +PASS \ No newline at end of file diff --git a/packages/@power-doctest/markdown/test/tsconfig.json b/packages/@power-doctest/markdown/test/tsconfig.json new file mode 100644 index 0000000..cb359a9 --- /dev/null +++ b/packages/@power-doctest/markdown/test/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "declaration": false, + "noEmit": true + }, + "include": [ + "../src/**/*", + "./**/*" + ] +} \ No newline at end of file diff --git a/packages/@power-doctest/markdown/tsconfig.json b/packages/@power-doctest/markdown/tsconfig.json new file mode 100644 index 0000000..046336d --- /dev/null +++ b/packages/@power-doctest/markdown/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + /* Basic Options */ + "module": "commonjs", + "moduleResolution": "node", + "esModuleInterop": true, + "newLine": "LF", + "outDir": "./lib/", + "target": "es5", + "sourceMap": true, + "declaration": true, + "jsx": "preserve", + "lib": [ + "esnext", + "dom" + ], + /* Strict Type-Checking Options */ + "strict": true, + /* Additional Checks */ + /* Report errors on unused locals. */ + "noUnusedLocals": true, + /* Report errors on unused parameters. */ + "noUnusedParameters": true, + /* Report error when not all code paths in function return a value. */ + "noImplicitReturns": true, + /* Report errors for fallthrough cases in switch statement. */ + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + ".git", + "node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock index b7daea9..f825407 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1039,6 +1039,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + "@zkochan/cmd-shim@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" @@ -1395,6 +1400,11 @@ babylon@^6.6.5: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +bail@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.4.tgz#7181b66d508aa3055d3f6c13f0a0c720641dde9b" + integrity sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1429,6 +1439,11 @@ bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== +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= + brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -1600,6 +1615,11 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +ccount@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.4.tgz#9cf2de494ca84060a2a8d2854edd6dfb0445f386" + integrity sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w== + chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1620,6 +1640,26 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +character-entities-html4@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.3.tgz#5ce6e01618e47048ac22f34f7f39db5c6fd679ef" + integrity sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg== + +character-entities-legacy@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz#3c729991d9293da0ede6dddcaf1f2ce1009ee8b4" + integrity sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww== + +character-entities@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.3.tgz#bbed4a52fe7ef98cc713c6d80d9faa26916d54e6" + integrity sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w== + +character-reference-invalid@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz#1647f4f726638d3ea4a750cf5d1975c1c7919a85" + integrity sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -1689,6 +1729,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collapse-white-space@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" + integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -1929,6 +1974,11 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +css-selector-parser@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.3.0.tgz#5f1ad43e2d8eefbfdc304fcd39a521664943e3eb" + integrity sha1-XxrUPi2O77/cME/NOaUhZklD4+s= + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -2057,6 +2107,13 @@ define-properties@^1.1.2: foreach "^2.0.5" object-keys "^1.0.8" +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" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -2269,7 +2326,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1: +es-abstract@^1.13.0, es-abstract@^1.5.1: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -2546,7 +2603,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -3314,6 +3371,24 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.3.tgz#eb04cc47219a8895d8450ace4715abff2258a1f8" + integrity sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA== + +is-alphanumeric@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" + integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= + +is-alphanumerical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz#57ae21c374277b3defe0274c640a5704b8f6657c" + integrity sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3324,7 +3399,7 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@~2.0.3: +is-buffer@^2.0.0, is-buffer@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== @@ -3360,6 +3435,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= +is-decimal@^1.0.0, is-decimal@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.3.tgz#381068759b9dc807d8c0dc0bfbae2b68e1da48b7" + integrity sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -3433,6 +3513,11 @@ is-glob@^4.0.0, is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz#e8a426a69b6d31470d3a33a47bb825cda02506ee" + integrity sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -3472,6 +3557,11 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.0.0.tgz#7fd1a7f1b69e160cde9181d2313f445c68aa2679" + integrity sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -3549,10 +3639,20 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-whitespace-character@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz#b3ad9546d916d7d3ffa78204bca0c26b56257fac" + integrity sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ== + is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" +is-word-character@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.3.tgz#264d15541cbad0ba833d3992c34e6b40873b08aa" + integrity sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A== + isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -3935,6 +4035,11 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" +longest-streak@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.3.tgz#3de7a3f47ee18e9074ded8575b5c091f5d0a4105" + integrity sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw== + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -4021,6 +4126,23 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-escapes@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.3.tgz#6155e10416efaafab665d466ce598216375195f5" + integrity sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw== + +markdown-table@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + +mdast-util-compact@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.3.tgz#98a25cc8a7865761a41477b3a87d1dcef0b1e79d" + integrity sha512-nRiU5GpNy62rZppDKbLwhhtw5DXoFMqw9UNZFmlPsNaQCZ//WLjGKUwWMdJrUH+Se7UvtO2gXtAMe0g/N+eI5w== + dependencies: + unist-util-visit "^1.1.0" + mem@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" @@ -4386,6 +4508,11 @@ normalize-url@^3.3.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +not@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/not/-/not-0.1.0.tgz#c9691c1746c55dcfbe54cbd8bd4ff041bc2b519d" + integrity sha1-yWkcF0bFXc++VMvYvU/wQbwrUZ0= + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -4456,6 +4583,13 @@ npm-run-path@^3.0.0: gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@^1.0.1: + 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" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -4722,6 +4856,18 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parse-entities@^1.0.2, parse-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + 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-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" @@ -5048,6 +5194,15 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" +promise.allsettled@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.1.tgz#afe4bfcc13b26e2263a97a7fbbb19b8ca6eb619c" + integrity sha512-3ST7RS7TY3TYLOIe+OACZFvcWVe1osbgz2x07nTb446pa3t4GUZWidMDzQ4zf9jC2l6mRa1/3X81icFYbi+D/g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.13.0" + function-bind "^1.1.1" + promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -5271,12 +5426,62 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +remark-parse@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-7.0.1.tgz#0c13d67e0d7b82c2ad2d8b6604ec5fae6c333c2b" + integrity sha512-WOZLa545jYXtSy+txza6ACudKWByQac4S2DmGk+tAGO/3XnVTOxwyCIxB7nTcLlk8Aayhcuf3cV1WV6U6L7/DQ== + dependencies: + 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 "^1.1.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 "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-stringify@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-7.0.2.tgz#1b87716e3bf278ef5dd6c230e47c633d89b81d76" + integrity sha512-+Fr2xUe+P9b4XwRBjtIQF6DuHtQEQAVsBv8Uv+Gz3d3gkFxwEIzKFjzHo13KgWkASn/MQIY1C9vmOTm0kwlGXw== + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^1.1.0" + mdast-util-compact "^1.0.0" + parse-entities "^1.0.2" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^2.0.0" + unherit "^1.0.4" + xtend "^4.0.1" + +remark@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/remark/-/remark-11.0.1.tgz#3c16e1ed84c78a661299991bb8d5fa7ee5d18e3c" + integrity sha512-Fl2AvN+yU6sOBAjUz3xNC5iEvLkXV8PZicLOOLifjU8uKGusNvhHfGRCfETsqyvRHZ24JXqEyDY4hRLhoUd30A== + dependencies: + remark-parse "^7.0.0" + remark-stringify "^7.0.0" + unified "^8.2.0" + repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -5288,6 +5493,11 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +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= + request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -5692,6 +5902,11 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +state-toggle@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.2.tgz#75e93a61944116b4959d665c8db2d243631d6ddc" + integrity sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -5767,6 +5982,17 @@ stringifier@^1.0.1, stringifier@^1.3.0: traverse "^0.6.6" type-name "^2.0.1" +stringify-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-2.0.0.tgz#fa7ca6614b355fb6c28448140a20c4ede7462827" + integrity sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A== + 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" + stringify-object@^3.1.0, stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -6026,6 +6252,21 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +trim-trailing-lines@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz#d2f1e153161152e9f02fabc670fb40bec2ea2e3a" + integrity sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q== + +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.4" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" + integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q== + ts-node-test-register@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ts-node-test-register/-/ts-node-test-register-8.0.1.tgz#457c5284c2632d8e04f82378db4cb54cd6fd7901" @@ -6120,6 +6361,25 @@ umask@^1.1.0: resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= +unherit@^1.0.4: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.2.tgz#14f1f397253ee4ec95cec167762e77df83678449" + integrity sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w== + dependencies: + inherits "^2.0.1" + xtend "^4.0.1" + +unified@^8.2.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-8.3.2.tgz#aed69d0e577d6ef27268431c63a10faef60e63ab" + integrity sha512-NDtUAXcd4c+mKppCbsZHzmhkKEQuhveZNBrFYmNgMIMk2K9bc8hmG3mLEGVtRmSNodobwyMePAnvIGVWZfPdzQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -6144,6 +6404,76 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unist-util-find-all-between@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/unist-util-find-all-between/-/unist-util-find-all-between-1.0.6.tgz#b6a3e25a9f1371b40b5351a9788766b57f4a25e4" + integrity sha512-YdtB/KI/7Jr03L1TqHrNma/4xZMv5moYPfFPm1/1M12wcgGLSqYfFIFoQRwfnsBRKB79RoZNlH8kbLMLRQzxLg== + dependencies: + unist-util-is "^2.0.0" + +unist-util-find-before@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/unist-util-find-before/-/unist-util-find-before-2.0.4.tgz#30f669f20b01e92587b4f03ef908b5f09b513a7b" + integrity sha512-NzfojFvLbV+51EThEE/I5hs1NyZE71zQ5L983lENuMhwcdd8COtp4P66heK6CsjxEgjT/AXGWTD1NrAK6KOo3g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-is@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.3.tgz#459182db31f4742fceaea88d429693cbf0043d20" + integrity sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA== + +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-parents@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unist-util-parents/-/unist-util-parents-1.0.2.tgz#f982bf0feb4fa472d60209224bfb42f513468673" + integrity sha512-GwY81F/q2KMYi+A7+A0QZCJX/GlmRfeU4fRlEmndSgLGPWLBBcR/xKb5B5irFSzzrbTK94XgBQ++s7c9/Jdoig== + dependencies: + es6-weak-map "^2.0.1" + +unist-util-remove-position@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz#d91aa8b89b30cb38bad2924da11072faa64fd972" + integrity sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-select@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unist-util-select/-/unist-util-select-2.0.2.tgz#cb2774b599695172e7b60a8b5f50793e418f7ea6" + integrity sha512-Yv5Z5ShMxv7Z9Dw175tKvOiRVXV4FrMHG778DSD9Z0jALgb3wAx9DoeInr3200QlYp71rYUXzzJdCb76xKdrCw== + dependencies: + css-selector-parser "^1.1.0" + not "^0.1.0" + nth-check "^1.0.1" + unist-util-is "^3.0.0" + zwitch "^1.0.3" + +unist-util-stringify-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz#de2a2bc8d3febfa606652673a91455b6a36fb9f3" + integrity sha512-Zqlf6+FRI39Bah8Q6ZnNGrEHUhwJOkHde2MHVk96lLyftfJJckaPslKgzhVcviXj8KcE9UJM9F+a4JEiBUTYgA== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + universal-deep-strict-equal@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz#0da4ac2f73cff7924c81fa4de018ca562ca2b0a7" @@ -6235,6 +6565,30 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-location@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.5.tgz#c83eb02f8040228a8d2b3f10e485be3e3433e0a2" + integrity sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ== + +vfile-message@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.1.tgz#951881861c22fc1eb39f873c0b93e336a64e8f6d" + integrity sha512-KtasSV+uVU7RWhUn4Lw+wW1Zl/nW8JWx7JCPps10Y9JRRIDeDXf8wfBLoOSsJLyo27DqMyAi54C6Jf/d6Kr2Bw== + dependencies: + "@types/unist" "^2.0.2" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.0.1.tgz#fc3d43a1c71916034216bf65926d5ee3c64ed60c" + integrity sha512-lRHFCuC4SQBFr7Uq91oJDJxlnftoTLQ7eKIpMdubhYcVMho4781a8MWXLy3qZrZ0/STD1kRiKc0cQOHm4OkPeA== + 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" + vm2@^3.8.3: version "3.8.3" resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.8.3.tgz#608d71f12584a1e898e60db5c4a61933bd7044bd" @@ -6364,7 +6718,7 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, 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== @@ -6451,3 +6805,8 @@ yn@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zwitch@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.4.tgz#93b1b993b13c8926753a41afaf8f27bbfac6be8b" + integrity sha512-YO803/X+13GNaZB7fVopjvHH0uWQKgJkgKnU1YCjxShjKGVuN9PPHHW8g+uFDpkHpSTNi3rCMKMewIcbC1BAYg==