pax_global_header00006660000000000000000000000064140232240230014502gustar00rootroot0000000000000052 comment=4cdcde632ece71155f3108ec0120c1a0329a6914 yaml-1.10.2/000077500000000000000000000000001402322402300125255ustar00rootroot00000000000000yaml-1.10.2/.editorconfig000066400000000000000000000002751402322402300152060ustar00rootroot00000000000000root = true [*] end_of_line = lf indent_style = space indent_size = 2 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = false [*.md] trim_trailing_whitespace = false yaml-1.10.2/.eslintignore000066400000000000000000000001331402322402300152250ustar00rootroot00000000000000/browser/ /dist/ /docs-slate/ /package-lock.json /playground/dist/ /tests/yaml-test-suite/ yaml-1.10.2/.eslintrc.yaml000066400000000000000000000011621402322402300153120ustar00rootroot00000000000000root: true parser: babel-eslint env: node: true extends: - eslint:recommended - prettier rules: array-callback-return: error camelcase: error consistent-return: error eqeqeq: [error, always, 'null': ignore] no-constant-condition: [error, checkLoops: false] no-control-regex: 0 no-implicit-globals: error no-template-curly-in-string: warn no-unused-labels: 0 no-var: error prefer-const: [warn, destructuring: all] overrides: - files: src/**/*.js env: es6: true node: false - files: - tests/**/*.js env: es6: true jest: true rules: camelcase: 0 yaml-1.10.2/.github/000077500000000000000000000000001402322402300140655ustar00rootroot00000000000000yaml-1.10.2/.github/workflows/000077500000000000000000000000001402322402300161225ustar00rootroot00000000000000yaml-1.10.2/.github/workflows/browsers.yml000066400000000000000000000017451402322402300205220ustar00rootroot00000000000000name: Browsers on: - push - workflow_dispatch jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Checkout submodules uses: textbook/git-checkout-submodule-action@master - name: Use Node.js uses: actions/setup-node@v1 with: node-version: 14.x - name: Cache BrowserStackLocal uses: actions/cache@v1 with: path: ~/.browserstack key: bsl-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | bsl-${{ runner.os }}- - run: npm ci - run: npm run build:browser - name: Playground setup working-directory: ./playground run: npm ci - name: Run tests on BrowserStack working-directory: ./playground run: npm test env: BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} yaml-1.10.2/.github/workflows/nodejs.yml000066400000000000000000000014531402322402300201320ustar00rootroot00000000000000name: Node.js on: - pull_request - push - workflow_dispatch jobs: test: runs-on: ubuntu-latest strategy: matrix: node-version: [10.x, 12.x, 14.x] steps: - uses: actions/checkout@v2 - name: Checkout submodules uses: textbook/git-checkout-submodule-action@master - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm test - run: npm run test:dist lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Use Node.js uses: actions/setup-node@v1 with: node-version: 14.x - run: npm ci - run: npm run lint - run: npm run test:types yaml-1.10.2/.gitignore000066400000000000000000000000411402322402300145100ustar00rootroot00000000000000.* coverage/ dist/ node_modules/ yaml-1.10.2/.gitmodules000066400000000000000000000005021402322402300146770ustar00rootroot00000000000000[submodule "tests/yaml-test-suite"] path = tests/yaml-test-suite url = https://github.com/eemeli/yaml-test-suite.git branch = fixed-data [submodule "docs"] path = docs-slate url = https://github.com/eemeli/yaml-docs.git [submodule "playground"] path = playground url = https://github.com/eemeli/yaml-playground.git yaml-1.10.2/.prettierignore000066400000000000000000000001031402322402300155620ustar00rootroot00000000000000coverage/ dist/ node_modules/ /docs-slate/ /tests/yaml-test-suite/ yaml-1.10.2/CONTRIBUTING.md000066400000000000000000000104761402322402300147660ustar00rootroot00000000000000# Contributing to `yaml` The YAML spec is somewhat complicated, and `yaml` tries its best to make it as easy as possible to work with it. The primary goal of this project is to make YAML as safe and pleasant as possible to work with. To that end, the order of priorities is: 1. **Be safe**. Be gracious with bad input, and make dangerous things at least difficult if not impossible. Don't allow resource exhaustion attacks. Reading or writing external files or URLs is rather explicitly left out of the core functionality for security reasons. 2. **Maintain compatibility**. There exists a number of YAML libraries written in and for various languages, based on various versions of the specification. This library currently passes more of the [YAML Test Matrix](https://matrix.yaml.io/) than any other, and it should be kept that way. 3. **Support all YAML features**. Everything that you might want to do with YAML should be possible with `yaml`. In a somewhat perverse way, this means that we need to break the spec a bit in order to allow working with comments. This also means that we want to simultaneously maintain compatibility with multiple versions of the spec, in particular the most widely used 1.1 and 1.2. 4. **Keep it simple**. Extending the library needs to be done carefully, and keep in all of its users. Different applications have different needs and so are provided with different APIs. In particular, custom tags are supported, but aren't part of the built-in schemas. ## Getting Started To start hacking `yaml`, this should get you set up: ```sh git clone https://github.com/eemeli/yaml.git # or your own fork cd yaml git submodule update --init # required by tests; also fetches the docs & playground npm install npm test # just to be sure ``` ## Repository Directory & File Structure - **`browser/`** - Browser-optimised build of the library, which should work in IE 11 & later. Used automatically by e.g. Webpack & Rollup via the `"browser"` value in `package.json`. A corresponding minimal set of the library's required polyfills is available at `playground/src/polyfill.js` - **`dist/`** - Node-optimised build of the library, which should work in Node.js 6.0.0 and later without polyfills. - **`docs/`** - Sources for the library's [documentation site](https://eemeli.org/yaml). - **`docs-slate/`** - Compiler for the library's [documentation site](https://eemeli.org/yaml). Maintained as a git submodule to allow merges from its upstream source, [Slate](https://github.com/slatedocs/slate). See its [`README`](./docs-slate/README.md) for installation instructions. Note that the build target is the `gh-pages` branch of _this_ repo. - **`playground/`** - Source files for a browser-based [playground](https://eemeli.org/yaml-playground/) using this library. Also contains the Selenium browser tests for the library. Maintained as a git submodule to allow for easier publication. - **`src/`** - Source files for the library: - **`src/cst/`** - The CST parser. Does not depend on other parts of the library. - **`src/schema/`** - Classes and utilities for working with the data schema - **`src/tags/`** - Implementations of the standard schemas' tags - **`tests/`** - Tests for the library: - **`tests/artifacts/`** - YAML files used by some of the tests - **`tests/cst/`** - Tests for the CST parser - **`tests/doc/`** - Tests for the AST level of the library - **`tests/yaml-test-suite/`** - Git submodule of a custom fork of the [YAML Test Suite](https://github.com/yaml/yaml-test-suite) - **`{index,parse-cst,types,util}.js`** - The library's published API; see the documentation site for more details. Not transpiled, so written as backwards-compatible CommonJS. ## Contributing Code First of all, make sure that all the tests pass, and that you've added test cases covering your changes. Our set of test suites is rather extensive, and is a significant help in making sure no regressions are introduced. Note that the CI environment runs tests in e.g. Node.js 6.0 and IE 11, so using new language features may require extending the minimal set of [polyfills](./playground/src/polyfill.js) If you're intending to contribute to the upstream repo, please make sure that your code style matches the Prettier and ESLint rules. The easiest way to do that is to configure your editor to do that for you, but `lint` and `prettier` npm scripts are also provided. yaml-1.10.2/LICENSE000066400000000000000000000013471402322402300135370ustar00rootroot00000000000000Copyright 2018 Eemeli Aro 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. 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. yaml-1.10.2/README.md000066400000000000000000000106731402322402300140130ustar00rootroot00000000000000# YAML `yaml` is a JavaScript parser and stringifier for [YAML](http://yaml.org/), a human friendly data serialization standard. It supports both parsing and stringifying data using all versions of YAML, along with all common data schemas. As a particularly distinguishing feature, `yaml` fully supports reading and writing comments and blank lines in YAML documents. The library is released under the ISC open source license, and the code is [available on GitHub](https://github.com/eemeli/yaml/). It has no external dependencies and runs on Node.js 6 and later, and in browsers from IE 11 upwards. For the purposes of versioning, any changes that break any of the endpoints or APIs documented here will be considered semver-major breaking changes. Undocumented library internals may change between minor versions, and previous APIs may be deprecated (but not removed). For more information, see the project's documentation site: [**eemeli.org/yaml/v1**](https://eemeli.org/yaml/v1/) To install: ```sh npm install yaml ``` **Note:** This is `yaml@1`. You may also be interested in the next version, currently available as [`yaml@next`](https://www.npmjs.com/package/yaml/v/next). ## API Overview The API provided by `yaml` has three layers, depending on how deep you need to go: [Parse & Stringify](https://eemeli.org/yaml/v1/#parse-amp-stringify), [Documents](https://eemeli.org/yaml/#documents), and the [CST Parser](https://eemeli.org/yaml/#cst-parser). The first has the simplest API and "just works", the second gets you all the bells and whistles supported by the library along with a decent [AST](https://eemeli.org/yaml/#content-nodes), and the third is the closest to YAML source, making it fast, raw, and crude. ```js import YAML from 'yaml' // or const YAML = require('yaml') ``` ### Parse & Stringify - [`YAML.parse(str, options): value`](https://eemeli.org/yaml/v1/#yaml-parse) - [`YAML.stringify(value, options): string`](https://eemeli.org/yaml/v1/#yaml-stringify) ### YAML Documents - [`YAML.createNode(value, wrapScalars, tag): Node`](https://eemeli.org/yaml/v1/#creating-nodes) - [`YAML.defaultOptions`](https://eemeli.org/yaml/v1/#options) - [`YAML.Document`](https://eemeli.org/yaml/v1/#yaml-documents) - [`constructor(options)`](https://eemeli.org/yaml/v1/#creating-documents) - [`defaults`](https://eemeli.org/yaml/v1/#options) - [`#anchors`](https://eemeli.org/yaml/v1/#working-with-anchors) - [`#contents`](https://eemeli.org/yaml/v1/#content-nodes) - [`#errors`](https://eemeli.org/yaml/v1/#errors) - [`YAML.parseAllDocuments(str, options): YAML.Document[]`](https://eemeli.org/yaml/v1/#parsing-documents) - [`YAML.parseDocument(str, options): YAML.Document`](https://eemeli.org/yaml/v1/#parsing-documents) ```js import { Pair, YAMLMap, YAMLSeq } from 'yaml/types' ``` - [`new Pair(key, value)`](https://eemeli.org/yaml/v1/#creating-nodes) - [`new YAMLMap()`](https://eemeli.org/yaml/v1/#creating-nodes) - [`new YAMLSeq()`](https://eemeli.org/yaml/v1/#creating-nodes) ### CST Parser ```js import parseCST from 'yaml/parse-cst' ``` - [`parseCST(str): CSTDocument[]`](https://eemeli.org/yaml/v1/#parsecst) - [`YAML.parseCST(str): CSTDocument[]`](https://eemeli.org/yaml/v1/#parsecst) ## YAML.parse ```yaml # file.yml YAML: - A human-readable data serialization language - https://en.wikipedia.org/wiki/YAML yaml: - A complete JavaScript implementation - https://www.npmjs.com/package/yaml ``` ```js import fs from 'fs' import YAML from 'yaml' YAML.parse('3.14159') // 3.14159 YAML.parse('[ true, false, maybe, null ]\n') // [ true, false, 'maybe', null ] const file = fs.readFileSync('./file.yml', 'utf8') YAML.parse(file) // { YAML: // [ 'A human-readable data serialization language', // 'https://en.wikipedia.org/wiki/YAML' ], // yaml: // [ 'A complete JavaScript implementation', // 'https://www.npmjs.com/package/yaml' ] } ``` ## YAML.stringify ```js import YAML from 'yaml' YAML.stringify(3.14159) // '3.14159\n' YAML.stringify([true, false, 'maybe', null]) // `- true // - false // - maybe // - null // ` YAML.stringify({ number: 3, plain: 'string', block: 'two\nlines\n' }) // `number: 3 // plain: string // block: > // two // // lines // ` ``` --- Browser testing provided by: yaml-1.10.2/babel.config.js000066400000000000000000000003651402322402300154000ustar00rootroot00000000000000module.exports = { plugins: [ '@babel/plugin-proposal-class-properties', ['babel-plugin-trace', { strip: true }] ] } if (process.env.NODE_ENV === 'test') module.exports.presets = [['@babel/env', { targets: { node: 'current' } }]] yaml-1.10.2/browser/000077500000000000000000000000001402322402300142105ustar00rootroot00000000000000yaml-1.10.2/browser/dist/000077500000000000000000000000001402322402300151535ustar00rootroot00000000000000yaml-1.10.2/browser/dist/package.json000066400000000000000000000000251402322402300174360ustar00rootroot00000000000000{ "type": "module" } yaml-1.10.2/browser/index.js000066400000000000000000000000501402322402300156500ustar00rootroot00000000000000module.exports = require('./dist').YAML yaml-1.10.2/browser/map.js000066400000000000000000000001621402322402300153220ustar00rootroot00000000000000module.exports = require('./dist/types').YAMLMap require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/browser/pair.js000066400000000000000000000001571402322402300155040ustar00rootroot00000000000000module.exports = require('./dist/types').Pair require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/browser/parse-cst.js000066400000000000000000000000631402322402300164460ustar00rootroot00000000000000module.exports = require('./dist/parse-cst').parse yaml-1.10.2/browser/scalar.js000066400000000000000000000001611402322402300160110ustar00rootroot00000000000000module.exports = require('./dist/types').Scalar require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/browser/schema.js000066400000000000000000000004671402322402300160150ustar00rootroot00000000000000const types = require('./dist/types') const util = require('./dist/util') module.exports = types.Schema module.exports.nullOptions = types.nullOptions module.exports.strOptions = types.strOptions module.exports.stringify = util.stringifyString require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/browser/seq.js000066400000000000000000000001621402322402300153350ustar00rootroot00000000000000module.exports = require('./dist/types').YAMLSeq require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/browser/types.js000066400000000000000000000000511402322402300157060ustar00rootroot00000000000000module.exports = require('./dist/types') yaml-1.10.2/browser/types/000077500000000000000000000000001402322402300153545ustar00rootroot00000000000000yaml-1.10.2/browser/types/binary.js000066400000000000000000000003471402322402300172020ustar00rootroot00000000000000'use strict' Object.defineProperty(exports, '__esModule', { value: true }) const legacy = require('../dist/legacy-exports') exports.binary = legacy.binary exports.default = [exports.binary] legacy.warnFileDeprecation(__filename) yaml-1.10.2/browser/types/omap.js000066400000000000000000000001651402322402300166500ustar00rootroot00000000000000const legacy = require('../dist/legacy-exports') module.exports = legacy.omap legacy.warnFileDeprecation(__filename) yaml-1.10.2/browser/types/pairs.js000066400000000000000000000001661402322402300170330ustar00rootroot00000000000000const legacy = require('../dist/legacy-exports') module.exports = legacy.pairs legacy.warnFileDeprecation(__filename) yaml-1.10.2/browser/types/set.js000066400000000000000000000001641402322402300165060ustar00rootroot00000000000000const legacy = require('../dist/legacy-exports') module.exports = legacy.set legacy.warnFileDeprecation(__filename) yaml-1.10.2/browser/types/timestamp.js000066400000000000000000000005271402322402300177210ustar00rootroot00000000000000'use strict' Object.defineProperty(exports, '__esModule', { value: true }) const legacy = require('../dist/legacy-exports') exports.default = [legacy.intTime, legacy.floatTime, legacy.timestamp] exports.floatTime = legacy.floatTime exports.intTime = legacy.intTime exports.timestamp = legacy.timestamp legacy.warnFileDeprecation(__filename) yaml-1.10.2/browser/util.js000066400000000000000000000000501402322402300155160ustar00rootroot00000000000000module.exports = require('./dist/util') yaml-1.10.2/docs-slate/000077500000000000000000000000001402322402300145635ustar00rootroot00000000000000yaml-1.10.2/docs/000077500000000000000000000000001402322402300134555ustar00rootroot00000000000000yaml-1.10.2/docs/01_intro.md000066400000000000000000000047031402322402300154360ustar00rootroot00000000000000# YAML > To install: ```sh npm install yaml # or yarn add yaml ``` `yaml` is a new definitive library for [YAML](http://yaml.org/), a human friendly data serialization standard. This library: - Supports all versions of the standard (1.0, 1.1, and 1.2), - Passes all of the [yaml-test-suite](https://github.com/yaml/yaml-test-suite) tests, - Can accept any string as input without throwing, parsing as much YAML out of it as it can, and - Supports parsing, modifying, and writing YAML comments. The library is released under the ISC open source license, and the code is [available on GitHub](https://github.com/eemeli/yaml/). It has no external dependencies and runs on Node.js 6 and later, and in browsers from IE 11 upwards. For the purposes of versioning, any changes that break any of the endpoints or APIs documented here will be considered semver-major breaking changes. Undocumented library internals may change between minor versions, and previous APIs may be deprecated (but not removed). ## API Overview The API provided by `yaml` has three layers, depending on how deep you need to go: [Parse & Stringify](#parse-amp-stringify), [Documents](#documents), and the [CST Parser](#cst-parser). The first has the simplest API and "just works", the second gets you all the bells and whistles supported by the library along with a decent [AST](#content-nodes), and the third is the closest to YAML source, making it fast, raw, and crude.

Parse & Stringify

```js import YAML from 'yaml' // or const YAML = require('yaml') ``` - [`YAML.parse(str, options): value`](#yaml-parse) - [`YAML.stringify(value, options): string`](#yaml-stringify)

Documents

- [`YAML.createNode(value, wrapScalars, tag): Node`](#creating-nodes) - [`YAML.defaultOptions`](#options) - [`YAML.Document`](#documents) - [`constructor(options)`](#creating-documents) - [`defaults`](#options) - [`#anchors`](#working-with-anchors) - [`#contents`](#content-nodes) - [`#errors`](#errors) - [`YAML.parseAllDocuments(str, options): YAML.Document[]`](#parsing-documents) - [`YAML.parseDocument(str, options): YAML.Document`](#parsing-documents) ```js import { Pair, YAMLMap, YAMLSeq } from 'yaml/types' ``` - [`new Pair(key, value)`](#creating-nodes) - [`new YAMLMap()`](#creating-nodes) - [`new YAMLSeq()`](#creating-nodes)

CST Parser

```js import parseCST from 'yaml/parse-cst' ``` - [`parseCST(str): CSTDocument[]`](#parsecst) - [`YAML.parseCST(str): CSTDocument[]`](#parsecst) yaml-1.10.2/docs/02_parse_stringify.md000066400000000000000000000050011402322402300175040ustar00rootroot00000000000000# Parse & Stringify ```yaml # file.yml YAML: - A human-readable data serialization language - https://en.wikipedia.org/wiki/YAML yaml: - A complete JavaScript implementation - https://www.npmjs.com/package/yaml ``` At its simplest, you can use `YAML.parse(str)` and `YAML.stringify(value)` just as you'd use `JSON.parse(str)` and `JSON.stringify(value)`. If that's enough for you, everything else in these docs is really just implementation details. ## YAML.parse ```js import fs from 'fs' import YAML from 'yaml' YAML.parse('3.14159') // 3.14159 YAML.parse('[ true, false, maybe, null ]\n') // [ true, false, 'maybe', null ] const file = fs.readFileSync('./file.yml', 'utf8') YAML.parse(file) // { YAML: // [ 'A human-readable data serialization language', // 'https://en.wikipedia.org/wiki/YAML' ], // yaml: // [ 'A complete JavaScript implementation', // 'https://www.npmjs.com/package/yaml' ] } ``` #### `YAML.parse(str, options = {}): any` `str` should be a string with YAML formatting. See [Options](#options) for more information on the second parameter, an optional configuration object. The returned value will match the type of the root value of the parsed YAML document, so Maps become objects, Sequences arrays, and scalars result in nulls, booleans, numbers and strings. `YAML.parse` may throw on error, and it may log warnings using `console.warn`. It only supports input consisting of a single YAML document; for multi-document support you should use [`YAML.parseAllDocuments`](#parsing-documents). ## YAML.stringify ```js YAML.stringify(3.14159) // '3.14159\n' YAML.stringify([true, false, 'maybe', null]) // `- true // - false // - maybe // - null // ` YAML.stringify({ number: 3, plain: 'string', block: 'two\nlines\n' }) // `number: 3 // plain: string // block: > // two // // lines // ` ``` #### `YAML.stringify(value, options = {}): string` `value` can be of any type. The returned string will always include `\n` as the last character, as is expected of YAML documents. See [Options](#options) for more information on the second parameter, an optional configuration object. As strings in particular may be represented in a number of different styles, the simplest option for the value in question will always be chosen, depending mostly on the presence of escaped or control characters and leading & trailing whitespace. To create a stream of documents, you may call `YAML.stringify` separately for each document's `value`, and concatenate the documents with the string `...\n` as a separator. yaml-1.10.2/docs/03_options.md000066400000000000000000000244601402322402300160020ustar00rootroot00000000000000# Options ```js YAML.defaultOptions // { keepBlobsInJSON: true, // keepNodeTypes: true, // version: '1.2' } YAML.Document.defaults // { '1.0': { merge: true, schema: 'yaml-1.1' }, // '1.1': { merge: true, schema: 'yaml-1.1' }, // '1.2': { merge: false, schema: 'core' } } ``` #### `YAML.defaultOptions` #### `YAML.Document.defaults` `yaml` defines document-specific options in three places: as an argument of parse, create and stringify calls, in the values of `YAML.defaultOptions`, and in the version-dependent `YAML.Document.defaults` object. Values set in `YAML.defaultOptions` override version-dependent defaults, and argument options override both. The `version` option value (`'1.2'` by default) may be overridden by any document-specific `%YAML` directive. | Option | Type | Description | | --------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | anchorPrefix | `string` | Default prefix for anchors. By default `'a'`, resulting in anchors `a1`, `a2`, etc. | | customTags | `Tag[] ⎮ function` | Array of [additional tags](#custom-data-types) to include in the schema | | indent | `number` | The number of spaces to use when indenting code. By default `2`. | | indentSeq | `boolean` | Whether block sequences should be indented. By default `true`. | | keepBlobsInJSON | `boolean` | Allow non-JSON JavaScript objects to remain in the `toJSON` output. Relevant with the YAML 1.1 `!!timestamp` and `!!binary` tags as well as BigInts. By default `true`. | | keepCstNodes | `boolean` | Include references in the AST to each node's corresponding CST node. By default `false`. | | keepNodeTypes | `boolean` | Store the original node type when parsing documents. By default `true`. | | mapAsMap | `boolean` | When outputting JS, use Map rather than Object to represent mappings. By default `false`. | | maxAliasCount | `number` | Prevent [exponential entity expansion attacks] by limiting data aliasing count; set to `-1` to disable checks; `0` disallows all alias nodes. By default `100`. | | merge | `boolean` | Enable support for `<<` merge keys. By default `false` for YAML 1.2 and `true` for earlier versions. | | prettyErrors | `boolean` | Include line position & node type directly in errors; drop their verbose source and context. By default `false`. | | schema | `'core' ⎮ 'failsafe' ⎮` `'json' ⎮ 'yaml-1.1'` | The base schema to use. By default `'core'` for YAML 1.2 and `'yaml-1.1'` for earlier versions. | | simpleKeys | `boolean` | When stringifying, require keys to be scalars and to use implicit rather than explicit notation. By default `false`. | | sortMapEntries | `boolean ⎮` `(a, b: Pair) => number` | When stringifying, sort map entries. If `true`, sort by comparing key values with `<`. By default `false`. | | version | `'1.0' ⎮ '1.1' ⎮ '1.2'` | The YAML version used by documents without a `%YAML` directive. By default `'1.2'`. | [exponential entity expansion attacks]: https://en.wikipedia.org/wiki/Billion_laughs_attack ## Data Schemas ```js YAML.parse('3') // 3 YAML.parse('3', { schema: 'failsafe' }) // '3' YAML.parse('No') // 'No' YAML.parse('No', { schema: 'json' }) // SyntaxError: Unresolved plain scalar "No" YAML.parse('No', { schema: 'yaml-1.1' }) // false YAML.parse('No', { version: '1.1' }) // false YAML.parse('{[1, 2]: many}') // { '[1,2]': 'many' } YAML.parse('{[1, 2]: many}', { mapAsMap: true }) // Map { [ 1, 2 ] => 'many' } ``` Aside from defining the language structure, the YAML 1.2 spec defines a number of different _schemas_ that may be used. The default is the [`core`](http://yaml.org/spec/1.2/spec.html#id2804923) schema, which is the most common one. The [`json`](http://yaml.org/spec/1.2/spec.html#id2803231) schema is effectively the minimum schema required to parse JSON; both it and the core schema are supersets of the minimal [`failsafe`](http://yaml.org/spec/1.2/spec.html#id2802346) schema. The `yaml-1.1` schema matches the more liberal [YAML 1.1 types](http://yaml.org/type/) (also used by YAML 1.0), including binary data and timestamps as distinct tags as well as accepting greater variance in scalar values (with e.g. `'No'` being parsed as `false` rather than a string value). The `!!value` and `!!yaml` types are not supported. ```js YAML.defaultOptions.merge = true const mergeResult = YAML.parse(` source: &base { a: 1, b: 2 } target: <<: *base b: base `) mergeResult.target // { a: 1, b: 'base' } ``` **Merge** keys are a [YAML 1.1 feature](http://yaml.org/type/merge.html) that is not a part of the 1.2 spec. To use a merge key, assign an alias node or an array of alias nodes as the value of a `<<` key in a mapping. ## Scalar Options ```js // Without simpleKeys, an all-null-values object uses explicit keys & no values YAML.stringify({ 'this is': null }, { simpleKeys: true }) // this is: null YAML.scalarOptions.null.nullStr = '~' YAML.scalarOptions.str.defaultType = 'QUOTE_SINGLE' YAML.stringify({ 'this is': null }, { simpleKeys: true }) // 'this is': ~ ``` #### `YAML.scalarOptions` Some customization options are availabe to control the parsing and stringification of scalars. Note that these values are used by all documents. These options objects are also exported individually from `'yaml/types'`. | Option | Type | Default value | Description | | ------------------ | --------- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | binary.defaultType | `Type` | `'BLOCK_LITERAL'` | The type of string literal used to stringify `!!binary` values | | binary.lineWidth | `number` | `76` | Maximum line width for `!!binary` values | | bool.trueStr | `string` | `'true'` | String representation for `true` values | | bool.falseStr | `string` | `'false'` | String representation for `false` values | | int.asBigInt | `boolean` | `false` | Whether integers should be parsed into [BigInt] values | | null.nullStr | `string` | `'null'` | String representation for `null` values | | str.defaultType | `Type` | `'PLAIN'` | The default type of string literal used to stringify values | | str.doubleQuoted | `object` | `{ jsonEncoding: false,` `minMultiLineLength: 40 }` | `jsonEncoding`: Whether to restrict double-quoted strings to use JSON-compatible syntax; `minMultiLineLength`: Minimum length to use multiple lines to represent the value | | str.fold | `object` | `{ lineWidth: 80,` `minContentWidth: 20 }` | `lineWidth`: Maximum line width (set to `0` to disable folding); `minContentWidth`: Minimum width for highly-indented content | [bigint]: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/BigInt ## Silencing Warnings By default, the library will emit warnings for uses of deprecated APIs and as required by the YAML spec during parsing. If you'd like to silence these, define a global variable `YAML_SILENCE_WARNINGS` with a true-ish value. To silence only deprecation warnings, use `YAML_SILENCE_DEPRECATION_WARNINGS`. These values may also be set in `process.env`. yaml-1.10.2/docs/04_documents.md000066400000000000000000000361121402322402300163060ustar00rootroot00000000000000# Documents In order to work with YAML features not directly supported by native JavaScript data types, such as comments, anchors and aliases, `yaml` provides the `YAML.Document` API. ## Parsing Documents ```js import fs from 'fs' import YAML from 'yaml' const file = fs.readFileSync('./file.yml', 'utf8') const doc = YAML.parseDocument(file) doc.contents // YAMLMap { // items: // [ Pair { // key: Scalar { value: 'YAML', range: [ 0, 4 ] }, // value: // YAMLSeq { // items: // [ Scalar { // value: 'A human-readable data serialization language', // range: [ 10, 55 ] }, // Scalar { // value: 'https://en.wikipedia.org/wiki/YAML', // range: [ 59, 94 ] } ], // tag: 'tag:yaml.org,2002:seq', // range: [ 8, 94 ] } }, // Pair { // key: Scalar { value: 'yaml', range: [ 94, 98 ] }, // value: // YAMLSeq { // items: // [ Scalar { // value: 'A complete JavaScript implementation', // range: [ 104, 141 ] }, // Scalar { // value: 'https://www.npmjs.com/package/yaml', // range: [ 145, 180 ] } ], // tag: 'tag:yaml.org,2002:seq', // range: [ 102, 180 ] } } ], // tag: 'tag:yaml.org,2002:map', // range: [ 0, 180 ] } ``` #### `YAML.parseDocument(str, options = {}): YAML.Document` Parses a single `YAML.Document` from the input `str`; used internally by `YAML.parse`. Will include an error if `str` contains more than one document. See [Options](#options) for more information on the second parameter.
#### `YAML.parseAllDocuments(str, options = {}): YAML.Document[]` When parsing YAML, the input string `str` may consist of a stream of documents separated from each other by `...` document end marker lines. `YAML.parseAllDocuments` will return an array of `Document` objects that allow these documents to be parsed and manipulated with more control. See [Options](#options) for more information on the second parameter.
These functions should never throw; errors and warnings are included in the documents' `errors` and `warnings` arrays. In particular, if `errors` is not empty it's likely that the document's parsed `contents` are not entirely correct. The `contents` of a parsed document will always consist of `Scalar`, `Map`, `Seq` or `null` values. ## Creating Documents #### `new YAML.Document(options = {})` | Member | Type | Description | | ------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | anchors | [`Anchors`](#anchors) | Anchors associated with the document's nodes; also provides alias & merge node creators. | | commentBefore | `string?` | A comment at the very beginning of the document. If not empty, separated from the rest of the document by a blank line or the directives-end indicator when stringified. | | comment | `string?` | A comment at the end of the document. If not empty, separated from the rest of the document by a blank line when stringified. | | contents | [`Node`](#content-nodes)|`any` | The document contents. | | directivesEndMarker | `boolean?` | Whether the document should always include a directives-end marker `---` at its start, even if it includes no directives. | | errors | `Error[]` | Errors encountered during parsing. | | schema | `Schema` | The schema used with the document. | | tagPrefixes | `Prefix[]` | Array of prefixes; each will have a string `handle` that starts and ends with `!` and a string `prefix` that the handle will be replaced by. | | version | `string?` | The parsed version of the source document; if true-ish, stringified output will include a `%YAML` directive. | | warnings | `Error[]` | Warnings encountered during parsing. | ```js const doc = new YAML.Document() doc.version = true doc.commentBefore = ' A commented document' doc.contents = ['some', 'values', { balloons: 99 }] String(doc) // # A commented document // %YAML 1.2 // --- // - some // - values // - balloons: 99 ``` The Document members are all modifiable, though it's unlikely that you'll have reason to change `errors`, `schema` or `warnings`. In particular you may be interested in both reading and writing **`contents`**. Although `YAML.parseDocument()` and `YAML.parseAllDocuments()` will leave it with `Map`, `Seq`, `Scalar` or `null` contents, it can be set to anything. During stringification, a document with a true-ish `version` value will include a `%YAML` directive; the version number will be set to `1.2` unless the `yaml-1.1` schema is in use. ## Document Methods | Method | Returns | Description | | ---------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | listNonDefaultTags() | `string[]` | List the tags used in the document that are not in the default `tag:yaml.org,2002:` namespace. | | parse(cst) | `Document` | Parse a CST into this document. Mostly an internal method, modifying the document according to the contents of the parsed `cst`. Calling this multiple times on a Document is not recommended. | | setSchema(id, customTags) | `void` | When a document is created with `new YAML.Document()`, the schema object is not set as it may be influenced by parsed directives; call this with no arguments to set it manually, or with arguments to change the schema used by the document. `id` may either be a YAML version, or the identifier of a YAML 1.2 schema; if set, `customTags` should have the same shape as the similarly-named option. | | setTagPrefix(handle, prefix) | `void` | Set `handle` as a shorthand string for the `prefix` tag namespace. | | toJSON() | `any` | A plain JavaScript representation of the document `contents`. | | toString() | `string` | A YAML representation of the document. | ```js const doc = YAML.parseDocument('a: 1\nb: [2, 3]\n') doc.get('a') // 1 doc.getIn([]) // YAMLMap { items: [Pair, Pair], ... } doc.hasIn(['b', 0]) // true doc.addIn(['b'], 4) // -> doc.get('b').items.length === 3 doc.deleteIn(['b', 1]) // true doc.getIn(['b', 1]) // 4 ``` In addition to the above, the document object also provides the same **accessor methods** as [collections](#collections), based on the top-level collection: `add`, `delete`, `get`, `has`, and `set`, along with their deeper variants `addIn`, `deleteIn`, `getIn`, `hasIn`, and `setIn`. For the `*In` methods using an empty `path` value (i.e. `null`, `undefined`, or `[]`) will refer to the document's top-level `contents`. To define a tag prefix to use when stringifying, use **`setTagPrefix(handle, prefix)`** rather than setting a value directly in `tagPrefixes`. This will guarantee that the `handle` is valid (by throwing an error), and will overwrite any previous definition for the `handle`. Use an empty `prefix` value to remove a prefix. ```js const src = '1969-07-21T02:56:15Z' const doc = YAML.parseDocument(src, { customTags: ['timestamp'] }) doc.toJSON() // Date { 1969-07-21T02:56:15.000Z } doc.options.keepBlobsInJSON = false doc.toJSON() // '1969-07-21T02:56:15.000Z' String(doc) // '1969-07-21T02:56:15\n' ``` For a plain JavaScript representation of the document, **`toJSON()`** is your friend. By default the values wrapped in scalar nodes will not be forced to JSON, so e.g. a `!!timestamp` will remain a `Date` in the output. To change this behaviour and enforce JSON values only, set the [`keepBlobsInJSON` option](#options) to `false`. Conversely, to stringify a document as YAML, use **`toString()`**. This will also be called by `String(doc)`. This method will throw if the `errors` array is not empty. ## Working with Anchors A description of [alias and merge nodes](#alias-nodes) is included in the next section.
#### `YAML.Document#anchors` | Method | Returns | Description | | -------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------- | | createAlias(node: Node, name?: string) | `Alias` | Create a new `Alias` node, adding the required anchor for `node`. If `name` is empty, a new anchor name will be generated. | | createMergePair(...Node) | `Merge` | Create a new `Merge` node with the given source nodes. Non-`Alias` sources will be automatically wrapped. | | getName(node: Node) | `string?` | The anchor name associated with `node`, if set. | | getNames() | `string[]` | List of all defined anchor names. | | getNode(name: string) | `Node?` | The node associated with the anchor `name`, if set. | | newName(prefix: string) | `string` | Find an available anchor name with the given `prefix` and a numerical suffix. | | setAnchor(node: Node, name?: string) | `string?` | Associate an anchor with `node`. If `name` is empty, a new name will be generated. | ```js const src = '[{ a: A }, { b: B }]' const doc = YAML.parseDocument(src) const { anchors, contents } = doc const [a, b] = contents.items anchors.setAnchor(a.items[0].value) // 'a1' anchors.setAnchor(b.items[0].value) // 'a2' anchors.setAnchor(null, 'a1') // 'a1' anchors.getName(a) // undefined anchors.getNode('a2') // { value: 'B', range: [ 16, 18 ], type: 'PLAIN' } String(doc) // [ { a: A }, { b: &a2 B } ] const alias = anchors.createAlias(a, 'AA') contents.items.push(alias) doc.toJSON() // [ { a: 'A' }, { b: 'B' }, { a: 'A' } ] String(doc) // [ &AA { a: A }, { b: &a2 B }, *AA ] const merge = anchors.createMergePair(alias) b.items.push(merge) doc.toJSON() // [ { a: 'A' }, { b: 'B', a: 'A' }, { a: 'A' } ] String(doc) // [ &AA { a: A }, { b: &a2 B, <<: *AA }, *AA ] // This creates a circular reference merge.value.items.push(anchors.createAlias(b)) doc.toJSON() // [RangeError: Maximum call stack size exceeded] String(doc) // [ // &AA { a: A }, // &a3 { // b: &a2 B, // <<: // [ *AA, *a3 ] // }, // *AA // ] ``` The constructors for `Alias` and `Merge` are not directly exported by the library, as they depend on the document's anchors; instead you'll need to use **`createAlias(node, name)`** and **`createMergePair(...sources)`**. You should make sure to only add alias and merge nodes to the document after the nodes to which they refer, or the document's YAML stringification will fail. It is valid to have an anchor associated with a node even if it has no aliases. `yaml` will not allow you to associate the same name with more than one node, even though this is allowed by the YAML spec (all but the last instance will have numerical suffixes added). To add or reassign an anchor, use **`setAnchor(node, name)`**. The second parameter is optional, and if left out either the pre-existing anchor name of the node will be used, or a new one generated. To remove an anchor, use `setAnchor(null, name)`. The function will return the new anchor's name, or `null` if both of its arguments are `null`. While the `merge` option needs to be true to parse `Merge` nodes as such, this is not required during stringification. yaml-1.10.2/docs/05_content_nodes.md000066400000000000000000000322031402322402300171450ustar00rootroot00000000000000# Content Nodes After parsing, the `contents` value of each `YAML.Document` is the root of an [Abstract Syntax Tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree) of nodes representing the document (or `null` for an empty document). ## Scalar Values ```js class Node { comment: ?string, // a comment on or immediately after this commentBefore: ?string, // a comment before this range: ?[number, number], // the [start, end] range of characters of the source parsed // into this node (undefined for pairs or if not parsed) spaceBefore: ?boolean, // a blank line before this node and its commentBefore tag: ?string, // a fully qualified tag, if required toJSON(): any // a plain JS representation of this node } ``` For scalar values, the `tag` will not be set unless it was explicitly defined in the source document; this also applies for unsupported tags that have been resolved using a fallback tag (string, `Map`, or `Seq`). ```js class Scalar extends Node { format: 'BIN' | 'HEX' | 'OCT' | 'TIME' | undefined, // By default (undefined), numbers use decimal notation. // The YAML 1.2 core schema only supports 'HEX' and 'OCT'. type: 'BLOCK_FOLDED' | 'BLOCK_LITERAL' | 'PLAIN' | 'QUOTE_DOUBLE' | 'QUOTE_SINGLE' | undefined, value: any } ``` A parsed document's contents will have all of its non-object values wrapped in `Scalar` objects, which themselves may be in some hierarchy of `Map` and `Seq` collections. However, this is not a requirement for the document's stringification, which is rather tolerant regarding its input values, and will use [`YAML.createNode`](#yaml-createnode) when encountering an unwrapped value. When stringifying, the node `type` will be taken into account by `!!str` and `!!binary` values, and ignored by other scalars. On the other hand, `!!int` and `!!float` stringifiers will take `format` into account. ## Collections ```js class Pair extends Node { key: Node | any, // key and value are always Node or null value: Node | any, // when parsed, but can be set to anything type: 'PAIR' } class Map extends Node { items: Array, type: 'FLOW_MAP' | 'MAP' | undefined } class Seq extends Node { items: Array, type: 'FLOW_SEQ' | 'SEQ' | undefined } ``` Within all YAML documents, two forms of collections are supported: sequential `Seq` collections and key-value `Map` collections. The JavaScript representations of these collections both have an `items` array, which may (`Seq`) or must (`Map`) consist of `Pair` objects that contain a `key` and a `value` of any type, including `null`. The `items` array of a `Seq` object may contain values of any type. When stringifying collections, by default block notation will be used. Flow notation will be selected if `type` is `FLOW_MAP` or `FLOW_SEQ`, the collection is within a surrounding flow collection, or if the collection is in an implicit key. The `yaml-1.1` schema includes [additional collections](https://yaml.org/type/index.html) that are based on `Map` and `Seq`: `OMap` and `Pairs` are sequences of `Pair` objects (`OMap` requires unique keys & corresponds to the JS Map object), and `Set` is a map of keys with null values that corresponds to the JS Set object. All of the collections provide the following accessor methods: | Method | Returns | Description | | --------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | add(value) | `void` | Adds a value to the collection. For `!!map` and `!!omap` the value must be a Pair instance or a `{ key, value }` object, which may not have a key that already exists in the map. | | delete(key) | `boolean` | Removes a value from the collection. Returns `true` if the item was found and removed. | | get(key, [keepScalar]) | `any` | Returns item at `key`, or `undefined` if not found. By default unwraps scalar values from their surrounding node; to disable set `keepScalar` to `true` (collections are always returned intact). | | has(key) | `boolean` | Checks if the collection includes a value with the key `key`. | | set(key, value) | `any` | Sets a value in this collection. For `!!set`, `value` needs to be a boolean to add/remove the item from the set. | ```js const map = YAML.createNode({ a: 1, b: [2, 3] }) map.add({ key: 'c', value: 4 }) // => map.get('c') === 4 && map.has('c') === true map.addIn(['b'], 5) // -> map.getIn(['b', 2]) === 5 map.delete('c') // true map.deleteIn(['c', 'f']) // false map.get('a') // 1 map.get(YAML.createNode('a'), true) // Scalar { value: 1 } map.getIn(['b', 1]) // 3 map.has('c') // false map.hasIn(['b', '0']) // true map.set('c', null) // => map.get('c') === null && map.has('c') === true map.setIn(['c', 'x']) // throws Error: // Expected YAML collection at c. Remaining path: x ``` For all of these methods, the keys may be nodes or their wrapped scalar values (i.e. `42` will match `Scalar { value: 42 }`) . Keys for `!!seq` should be positive integers, or their string representations. `add()` and `set()` do not automatically call `createNode()` to wrap the value. Each of the methods also has a variant that requires an iterable as the first parameter, and allows fetching or modifying deeper collections: `addIn(path, value)`, `deleteIn(path)`, `getIn(path, keepScalar)`, `hasIn(path)`, `setIn(path, value)`. If any intermediate node in `path` is a scalar rather than a collection, an error will be thrown. If any of the intermediate collections is not found: - `getIn` and `hasIn` will return `undefined` or `false` (respectively) - `addIn` and `setIn` will create missing collections; non-negative integer keys will create sequences, all other keys create maps - `deleteIn` will throw an error Note that for `addIn` the path argument points to the collection rather than the item; for maps its `value` should be a `Pair` or an object with `{ key, value }` fields. ## Alias Nodes ```js class Alias extends Node { source: Scalar | Map | Seq, type: 'ALIAS' } const obj = YAML.parse('[ &x { X: 42 }, Y, *x ]') // => [ { X: 42 }, 'Y', { X: 42 } ] obj[2].Z = 13 // => [ { X: 42, Z: 13 }, 'Y', { X: 42, Z: 13 } ] YAML.stringify(obj) // - &a1 // X: 42 // Z: 13 // - Y // - *a1 ``` `Alias` nodes provide a way to include a single node in multiple places in a document; the `source` of an alias node must be a preceding node in the document. Circular references are fully supported, and where possible the JS representation of alias nodes will be the actual source object. When directly stringifying JS structures with `YAML.stringify()`, multiple references to the same object will result in including an autogenerated anchor at its first instance, and alias nodes to that anchor at later references. Directly calling `YAML.createNode()` will not create anchors or alias nodes, allowing for greater manual control. ```js class Merge extends Pair { key: Scalar('<<'), // defined by the type specification value: Seq, // stringified as *A if length = 1 type: 'MERGE_PAIR' } ``` `Merge` nodes are not a core YAML 1.2 feature, but are defined as a [YAML 1.1 type](http://yaml.org/type/merge.html). They are only valid directly within a `Map#items` array and must contain one or more `Alias` nodes that themselves refer to `Map` nodes. When the surrounding map is resolved as a plain JS object, the key-value pairs of the aliased maps will be included in the object. Earlier `Alias` nodes override later ones, as do values set in the object directly. To create and work with alias and merge nodes, you should use the [`YAML.Document#anchors`](#working-with-anchors) object. ## Creating Nodes ```js const seq = YAML.createNode(['some', 'values', { balloons: 99 }]) // YAMLSeq { // items: // [ Scalar { value: 'some' }, // Scalar { value: 'values' }, // YAMLMap { // items: // [ Pair { // key: Scalar { value: 'balloons' }, // value: Scalar { value: 99 } } ] } ] } const doc = new YAML.Document() doc.contents = seq seq.items[0].comment = ' A commented item' String(doc) // - some # A commented item // - values // - balloons: 99 ``` #### `YAML.createNode(value, wrapScalars?, tag?): Node` `YAML.createNode` recursively turns objects into [collections](#collections). Generic objects as well as `Map` and its descendants become mappings, while arrays and other iterable objects result in sequences. If `wrapScalars` is undefined or `true`, it also wraps plain values in `Scalar` objects; if it is false and `value` is not an object, it will be returned directly. To specify the collection type, set `tag` to its identifying string, e.g. `"!!omap"`. Note that this requires the corresponding tag to be available based on the default options. To use a specific document's schema, use the wrapped method `doc.schema.createNode(value, wrapScalars, tag)`. The primary purpose of this function is to enable attaching comments or other metadata to a value, or to otherwise exert more fine-grained control over the stringified output. To that end, you'll need to assign its return value to the `contents` of a Document (or somewhere within said contents), as the document's schema is required for YAML string output.

new Map(), new Seq(), new Pair(key, value)

```js import YAML from 'yaml' import { Pair, YAMLSeq } from 'yaml/types' const doc = new YAML.Document() doc.contents = new YAMLSeq() doc.contents.items = [ 'some values', 42, { including: 'objects', 3: 'a string' } ] doc.contents.items.push(new Pair(1, 'a number')) doc.toString() // - some values // - 42 // - "3": a string // including: objects // - 1: a number ``` To construct a `YAMLSeq` or `YAMLMap`, use [`YAML.createNode()`](#yaml-createnode) with array, object or iterable input, or create the collections directly by importing the classes from `yaml/types`. Once created, normal array operations may be used to modify the `items` array. New `Pair` objects may created either by importing the class from `yaml/types` and using its `new Pair(key, value)` constructor, or by using the `doc.schema.createPair(key, value)` method. The latter will recursively wrap the `key` and `value` as nodes. ## Comments ```js const doc = YAML.parseDocument(` # This is YAML. --- it has: - an array - of values `) doc.toJSON() // { 'it has': [ 'an array', 'of values' ] } doc.commentBefore // ' This is YAML.' const seq = doc.contents.items[0].value seq.items[0].comment = ' item comment' seq.comment = ' collection end comment' doc.toString() // # This is YAML. // // it has: // - an array # item comment // - of values // # collection end comment ``` A primary differentiator between this and other YAML libraries is the ability to programmatically handle comments, which according to [the spec](http://yaml.org/spec/1.2/spec.html#id2767100) "must not have any effect on the serialization tree or representation graph. In particular, comments are not associated with a particular node." This library does allow comments to be handled programmatically, and does attach them to particular nodes (most often, the following node). Each `Scalar`, `Map`, `Seq` and the `Document` itself has `comment` and `commentBefore` members that may be set to a stringifiable value. The string contents of comments are not processed by the library, except for merging adjacent comment lines together and prefixing each line with the `#` comment indicator. Document comments will be separated from the rest of the document by a blank line. **Note**: Due to implementation details, the library's comment handling is not completely stable. In particular, when creating, writing, and then reading a YAML file, comments may sometimes be associated with a different node. ## Blank Lines ```js const doc = YAML.parseDocument('[ one, two, three ]') doc.contents.items[0].comment = ' item comment' doc.contents.items[1].spaceBefore = true doc.comment = ' document end comment' doc.toString() // [ // one, # item comment // // two, // three // ] // // # document end comment ``` Similarly to comments, the YAML spec instructs non-content blank lines to be discarded. Instead of doing that, `yaml` provides a `spaceBefore` boolean property for each node. If true, the node (and its `commentBefore`, if any) will be separated from the preceding node by a blank line. Note that scalar block values with "keep" chomping (i.e. with `+` in their header) consider any trailing empty lines to be a part of their content, so the `spaceBefore` setting of a node following such a value is ignored. yaml-1.10.2/docs/06_custom_tags.md000066400000000000000000000301741402322402300166410ustar00rootroot00000000000000# Custom Data Types ```js YAML.parse('!!timestamp 2001-12-15 2:59:43') // YAMLWarning: // The tag tag:yaml.org,2002:timestamp is unavailable, // falling back to tag:yaml.org,2002:str // '2001-12-15 2:59:43' YAML.defaultOptions.customTags = ['timestamp'] YAML.parse('2001-12-15 2:59:43') // returns a Date instance // 2001-12-15T02:59:43.000Z const doc = YAML.parseDocument('2001-12-15 2:59:43') doc.contents.value.toDateString() // 'Sat Dec 15 2001' ``` The easiest way to extend a [schema](#data-schemas) is by defining the additional **tags** that you wish to support. To do that, the `customTags` option allows you to provide an array of custom tag objects or tag identifiers. In particular, the built-in tags that are a part of the `core` and `yaml-1.1` schemas may be referred to by their string identifiers. For those tags that are available in both, only the `core` variant is provided as a custom tag. For further customisation, `customTags` may also be a function `(Tag[]) => (Tag[])` that may modify the schema's base tag array. ## Built-in Custom Tags ```js YAML.parse('[ one, true, 42 ]').map(v => typeof v) // [ 'string', 'boolean', 'number' ] let opt = { schema: 'failsafe' } YAML.parse('[ one, true, 42 ]', opt).map(v => typeof v) // [ 'string', 'string', 'string' ] opt = { schema: 'failsafe', customTags: ['int'] } YAML.parse('[ one, true, 42 ]', opt).map(v => typeof v) // [ 'string', 'string', 'number' ] ``` ### YAML 1.2 Core Schema These tags are a part of the YAML 1.2 [Core Schema](https://yaml.org/spec/1.2/spec.html#id2804923), and may be useful when constructing a parser or stringifier for a more limited set of types, based on the `failsafe` schema. Some of these define a `format` value; this will be added to the parsed nodes and affects the node's stringification. If including more than one custom tag from this set, make sure that the `'float'` and `'int'` tags precede any of the other `!!float` and `!!int` tags. | Identifier | Regular expression | YAML Type | Format | Example values | | ------------ | ------------------------------------------------ | --------- | ------- | --------------- | | `'bool'` | `true⎮True⎮TRUE⎮false⎮False⎮FALSE` | `!!bool` | | `true`, `false` | | `'float'` | `[-+]?(0⎮[1-9][0-9]*)\.[0-9]*` | `!!float` | | `4.2`, `-0.0` | | `'floatExp'` | `[-+]?(0⎮[1-9][0-9]*)(\.[0-9]*)?[eE][-+]?[0-9]+` | `!!float` | `'EXP'` | `4.2e9` | | `'floatNaN'` | `[-+]?(\.inf⎮\.Inf⎮\.INF)⎮\.nan⎮\.NaN⎮\.NAN` | `!!float` | | `-Infinity` | | `'int'` | `[-+]?[0-9]+` | `!!int` | | `42`, `-0` | | `'intHex'` | `0x[0-9a-fA-F]+` | `!!int` | `'HEX'` | `0xff0033` | | `'intOct'` | `0o[0-7]+` | `!!int` | `'OCT'` | `0o127` | | `'null'` | `~⎮null⎮Null⎮NULL` | `!!null` | | `null` | ### YAML 1.1 These tags are a part of the YAML 1.1 [language-independent types](https://yaml.org/type/), but are not a part of any default YAML 1.2 schema. | Identifier | YAML Type | JS Type | Description | | ------------- | ----------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `'binary'` | [`!!binary`](https://yaml.org/type/binary.html) | `Uint8Array` | Binary data, represented in YAML as base64 encoded characters. | | `'floatTime'` | [`!!float`](https://yaml.org/type/float.html) | `Number` | Sexagesimal floating-point number format, e.g. `190:20:30.15`. To stringify with this tag, the node `format` must be `'TIME'`. | | `'intTime'` | [`!!int`](https://yaml.org/type/int.html) | `Number` | Sexagesimal integer number format, e.g. `190:20:30`. To stringify with this tag, the node `format` must be `'TIME'`. | | `'omap'` | [`!!omap`](https://yaml.org/type/omap.html) | `Map` | Ordered sequence of key: value pairs without duplicates. Using `mapAsMap: true` together with this tag is not recommended, as it makes the parse → stringify loop non-idempotent. | | `'pairs'` | [`!!pairs`](https://yaml.org/type/pairs.html) | `Array` | Ordered sequence of key: value pairs allowing duplicates. To create from JS, you'll need to explicitly use `'!!pairs'` as the third argument of [`createNode()`](#creating-nodes). | | `'set'` | [`!!set`](https://yaml.org/type/set.html) | `Set` | Unordered set of non-equal values. | | `'timestamp'` | [`!!timestamp`](https://yaml.org/type/timestamp.html) | `Date` | A point in time, e.g. `2001-12-15T02:59:43`. | ## Writing Custom Tags ```js import { stringifyString } from 'yaml/util' const regexp = { identify: value => value instanceof RegExp, tag: '!re', resolve(doc, cst) { const match = cst.strValue.match(/^\/([\s\S]+)\/([gimuy]*)$/) return new RegExp(match[1], match[2]) } } const sharedSymbol = { identify: value => value.constructor === Symbol, tag: '!symbol/shared', resolve: (doc, cst) => Symbol.for(cst.strValue), stringify(item, ctx, onComment, onChompKeep) { const key = Symbol.keyFor(item.value) if (key === undefined) throw new Error('Only shared symbols are supported') return stringifyString({ value: key }, ctx, onComment, onChompKeep) } } YAML.defaultOptions.customTags = [regexp, sharedSymbol] YAML.stringify({ regexp: /foo/gi, symbol: Symbol.for('bar') }) // regexp: !re /foo/gi // symbol: !symbol/shared bar ``` In YAML-speak, a custom data type is represented by a _tag_. To define your own tag, you need to account for the ways that your data is both parsed and stringified. Furthermore, both of those processes are split into two stages by the intermediate AST node structure. If you wish to implement your own custom tags, the [`!!binary`](https://github.com/eemeli/yaml/blob/master/src/tags/yaml-1.1/binary.js) and [`!!set`](https://github.com/eemeli/yaml/blob/master/src/tags/yaml-1.1/set.js) tags provide relatively cohesive examples to study in addition to the simple examples in the sidebar here. ### Parsing Custom Data At the lowest level, [`YAML.parseCST()`](#cst-parser) will take care of turning string input into a concrete syntax tree (CST). In the CST all scalar values are available as strings, and maps & sequences as collections of nodes. Each schema includes a set of default data types, which handle converting at least strings, maps and sequences into their AST nodes. These are considered to have _implicit_ tags, and are autodetected. Custom tags, on the other hand, should almost always define an _explicit_ `tag` with which their value will be prefixed. This may be application-specific local `!tag`, a shorthand `!ns!tag`, or a verbatim `!`. Once identified by matching the `tag`, the `resolve(doc, cstNode): Node | any` function will turn a CST node into an AST node. For scalars, this is relatively simple, as the stringified node value is directly available, and should be converted to its actual value. Collections are trickier, and it's almost certain that it'll make sense to use the `parseMap(doc, cstNode)` and `parseSeq(doc, cstNode)` functions exported from `'yaml/util'` to initially resolve the CST collection into a `YAMLMap` or `YAMLSeq` object, and to work with that instead -- this is for instance what the YAML 1.1 collections do. Note that during the CST -> AST parsing, the anchors and comments attached to each node are also resolved for each node. This metadata will unfortunately be lost when converting the values to JS objects, so collections should have values that extend one of the existing collection classes. Collections should therefore either fall back to their parent classes' `toJSON()` methods, or define their own in order to allow their contents to be expressed as the appropriate JS object. ### Creating Nodes and Stringifying Custom Data As with parsing, turning input data into its YAML string representation is a two-stage process as the input is first turned into an AST tree before stringifying it. This allows for metadata and comments to be attached to each node, and for e.g. circular references to be resolved. For scalar values, this means just wrapping the value within a `Scalar` class while keeping it unchanged. As values may be wrapped within objects and arrays, `YAML.createNode()` uses each tag's `identify(value): boolean` function to detect custom data types. For the same reason, collections need to define their own `createNode(schema, value, ctx): Collection` functions that may recursively construct their equivalent collection class instances. Finally, `stringify(item, ctx, ...): string` defines how your data should be represented as a YAML string, in case the default stringifiers aren't enough. For collections in particular, the default stringifier should be perfectly sufficient. `'yaml/util'` exports `stringifyNumber(item)` and `stringifyString(item, ctx, ...)`, which may be of use for custom scalar data. ### Custom Tag API ```js import { findPair, // (items, key) => Pair? -- Given a key, find a matching Pair parseMap, // (doc, cstNode) => new YAMLMap parseSeq, // (doc, cstNode) => new YAMLSeq stringifyNumber, // (node) => string stringifyString, // (node, ctx, ...) => string toJSON, // (value, arg, ctx) => any -- Recursively convert to plain JS Type, // { [string]: string } -- Used as enum for node types YAMLReferenceError, YAMLSemanticError, YAMLSyntaxError, YAMLWarning } from 'yaml/util' ``` To define your own tag, you'll need to define an object comprising of some of the following fields. Those in bold are required: - `createNode(schema, value, ctx): Node` is an optional factory function, used e.g. by collections when wrapping JS objects as AST nodes. - `format: string` If a tag has multiple forms that should be parsed and/or stringified differently, use `format` to identify them. Used by `!!int` and `!!float`. - **`identify(value): boolean`** is used by `YAML.createNode` to detect your data type, e.g. using `typeof` or `instanceof`. Required. - `nodeClass: Node` is the `Node` child class that implements this tag. Required for collections and tags that have overlapping JS representations. - `options: Object` is used by some tags to configure their stringification. - **`resolve(doc, cstNode): Node | any`** turns a CST node into an AST node; `doc` is the resulting `YAML.Document` instance. If returning a non-`Node` value, the output will be wrapped as a `Scalar`. Required. - `stringify(item, ctx, onComment, onChompKeep): string` is an optional function stringifying the `item` AST node in the current context `ctx`. `onComment` and `onChompKeep` are callback functions for a couple of special cases. If your data includes a suitable `.toString()` method, you can probably leave this undefined and use the default stringifier. - **`tag: string`** is the identifier for your data type, with which its stringified form will be prefixed. Should either be a !-prefixed local `!tag`, or a fully qualified `tag:domain,date:foo`. Required. - `test: RegExp` and `default: boolean` allow for values to be stringified without an explicit tag and detected using a regular expression. For most cases, it's unlikely that you'll actually want to use these, even if you first think you do. yaml-1.10.2/docs/07_cst_parser.md000066400000000000000000000246131402322402300164600ustar00rootroot00000000000000# CST Parser For ease of implementation and to provide better error handling and reporting, the lowest level of the library's parser turns any input string into a [**Concrete Syntax Tree**](https://en.wikipedia.org/wiki/Concrete_syntax_tree) of nodes as if the input were YAML. This level of the API has not been designed to be particularly user-friendly for external users, but it is fast, robust, and not dependent on the rest of the library. ## parseCST ```js import parseCST from 'yaml/parse-cst' const cst = parseCST(` sequence: [ one, two, ] mapping: { sky: blue, sea: green } --- - "flow in block" - > Block scalar - !!map # Block collection foo : bar `) cst[0] // first document, containing a map with two keys .contents[0] // document contents (as opposed to directives) .items[3].node // the last item, a flow map .items[3] // the fourth token, parsed as a plain value .strValue // 'blue' cst[1] // second document, containing a sequence .contents[0] // document contents (as opposed to directives) .items[1].node // the second item, a block value .strValue // 'Block scalar\n' ``` #### `parseCST(string): CSTDocument[]` #### `YAML.parseCST(string): CSTDocument[]` The CST parser will not produce a CST that is necessarily valid YAML, and in particular its representation of collections of items is expected to undergo further processing and validation. The parser should never throw errors, but may include them as a value of the relevant node. On the other hand, if you feed it garbage, you'll likely get a garbage CST as well. The public API of the CST layer is a single function which returns an array of parsed CST documents. The array and its contained nodes override the default `toString` method, each returning a YAML string representation of its contents. The same function is exported as a part of the default `YAML` object, as well as seprately at `yaml/parse-cst`. It has no dependency on the rest of the library, so importing only `parseCST` should add about 9kB to your gzipped bundle size, when the whole library will add about 27kB. Care should be taken when modifying the CST, as no error checks are included to verify that the resulting YAML is valid, or that e.g. indentation levels aren't broken. In other words, this is an engineering tool and you may hurt yourself. If you're looking to generate a brand new YAML document, see the section on [Creating Documents](#creating-documents). For more usage examples and CST trees, have a look through the [extensive test suite](https://github.com/eemeli/yaml/tree/master/tests/cst) included in the project's repository.

Error detection

```js import YAML from 'yaml' const cst = YAML.parseCST('this: is: bad YAML') cst[0].contents[0] // Note: Simplified for clarity // { type: 'MAP', // items: [ // { type: 'PLAIN', strValue: 'this' }, // { type: 'MAP_VALUE', // node: { // type: 'MAP', // items: [ // { type: 'PLAIN', strValue: 'is' }, // { type: 'MAP_VALUE', // node: { type: 'PLAIN', strValue: 'bad YAML' } } ] } } ] } const doc = new YAML.Document() doc.parse(cst[0]) doc.errors // [ { // name: 'YAMLSemanticError', // message: 'Nested mappings are not allowed in compact mappings', // source: { // type: 'MAP', // range: { start: 6, end: 18 }, // ..., // rawValue: 'is: bad YAML' } } ] doc.contents.items[0].value.items[0].value.value // 'bad YAML' ``` While the YAML spec considers e.g. block collections within a flow collection to be an error, this error will not be detected by the CST parser. For complete validation, you will need to parse the CST into a `YAML.Document`. If the document contains errors, they will be included in the document's `errors` array, and each error will will contain a `source` reference to the CST node where it was encountered. Do note that even if an error is encountered, the document contents might still be available. In such a case, the error will be a [`YAMLSemanticError`](#yamlsemanticerror) rather than a [`YAMLSyntaxError`](#yamlsyntaxerror).

Dealing with CRLF line terminators

```js import parseCST from 'yaml/parse-cst' const src = '- foo\r\n- bar\r\n' const cst = parseCST(src) cst.setOrigRanges() // true const { range, valueRange } = cst[0].contents[0].items[1].node src.slice(range.origStart, range.origEnd) // 'bar\r\n' src.slice(valueRange.origStart, valueRange.origEnd) // 'bar' ``` #### `CST#setOrigRanges(): bool` The array returned by `parseCST()` will also include a method `setOrigRanges` to help deal with input that includes `\r\n` line terminators, which are converted to just `\n` before parsing into documents. This conversion will obviously change the total length of the string, as well as the offsets of all ranges. If the method returns `false`, the input did not include `\r\n` line terminators and no changes were made. However, if the method returns `true`, each `Range` object within the CST will have its `origStart` and `origEnd` values set appropriately to refer to the original input string. ## CST Nodes > Node type definitions use Flow-ish notation, so `+` as a prefix indicates a read-only getter property. ```js class Range { start: number, // offset of first character end: number, // offset after last character isEmpty(): boolean, // true if end is not greater than start origStart: ?number, // set by CST#setOrigRanges(), source origEnd: ?number // offsets for input with CRLF terminators } ``` **Note**: The `Node`, `Scalar` and other values referred to in this section are the CST representations of said objects, and are not the same as those used in preceding parts. Actual values in the CST nodes are stored as `start`, `end` indices of the input string. This allows for memory consumption to be minimised by making string generation really lazy.

Node

```js class Node { context: { // not enumerable, to simplify logging atLineStart: boolean, // is this node the first one on this line indent: number, // current level of indentation (may be -1) root: CSTDocument, // a reference to the parent document src: string // the full original source }, error: ?Error, // if not null, indicates a parser failure props: Array, // anchors, tags and comments range: Range, // span of context.src parsed into this node type: // specific node type 'ALIAS' | 'BLOCK_FOLDED' | 'BLOCK_LITERAL' | 'COMMENT' | 'DIRECTIVE' | 'DOCUMENT' | 'FLOW_MAP' | 'FLOW_SEQ' | 'MAP' | 'MAP_KEY' | 'MAP_VALUE' | 'PLAIN' | 'QUOTE_DOUBLE' | 'QUOTE_SINGLE' | 'SEQ' | 'SEQ_ITEM', value: ?string // if set to a non-null value, overrides // source value when stringified +anchor: ?string, // anchor, if set +comment: ?string, // newline-delimited comment(s), if any +rangeAsLinePos: // human-friendly source location ?{ start: LinePos, end: ?LinePos }, // LinePos here is { line: number, col: number } +rawValue: ?string, // an unprocessed slice of context.src // determining this node's value +tag: // this node's tag, if set null | { verbatim: string } | { handle: string, suffix: string }, toString(): string // a YAML string representation of this node } type ContentNode = Comment | Alias | Scalar | Map | Seq | FlowCollection ``` Each node in the CST extends a common ancestor `Node`. Additional undocumented properties are available, but are likely only useful during parsing. If a node has its `value` set, that will be used when re-stringifying (initially `undefined` for all nodes).

Scalars

```js class Alias extends Node { // rawValue will contain the anchor without the * prefix type: 'ALIAS' } class Scalar extends Node { type: 'PLAIN' | 'QUOTE_DOUBLE' | 'QUOTE_SINGLE' | 'BLOCK_FOLDED' | 'BLOCK_LITERAL' +strValue: ?string | // unescaped string value { str: string, errors: YAMLSyntaxError[] } } class Comment extends Node { type: 'COMMENT', // PLAIN nodes may also be comment-only +anchor: null, +comment: string, +rawValue: null, +tag: null } class BlankLine extends Comment { type: 'BLANK_LINE', // represents a single blank line, which +comment: null // may include whitespace } ``` While `Alias`, `BlankLine` and `Comment` nodes are not technically scalars, they are parsed as such at this level. Due to parsing differences, each scalar type is implemented using its own class.

Collections

```js class MapItem extends Node { node: ContentNode | null, type: 'MAP_KEY' | 'MAP_VALUE' } class Map extends Node { // implicit keys are not wrapped items: Array, type: 'MAP' } class SeqItem extends Node { node: ContentNode | null, type: 'SEQ_ITEM' } class Seq extends Node { items: Array, type: 'SEQ' } type FlowChar = '{' | '}' | '[' | ']' | ',' | '?' | ':' class FlowCollection extends Node { items: Array, type: 'FLOW_MAP' | 'FLOW_SEQ' } ``` Block and flow collections are parsed rather differently, due to their representation differences. An `Alias` or `Scalar` item directly within a `Map` should be treated as an implicit map key. In actual code, `MapItem` and `SeqItem` are implemented as `CollectionItem`, and correspondingly `Map` and `Seq` as `Collection`.

Document Structure

```js class Directive extends Node { name: string, // should only be 'TAG' or 'YAML' type: 'DIRECTIVE', +anchor: null, +parameters: Array, +tag: null } class CSTDocument extends Node { directives: Array, contents: Array, type: 'DOCUMENT', directivesEndMarker: Range | null, documentEndMarker: Range | null, +anchor: null, +comment: null, +tag: null } ``` The CST tree of a valid YAML document should have a single non-`Comment` `ContentNode` in its `contents` array. Multiple values indicates that the input is malformed in a way that made it impossible to determine the proper structure of the document. If `directivesEndMarker` or `documentEndMarker` are non-empty, the document includes (respectively) a directives-end marker `---` or a document-end marker `...` with the indicated range. yaml-1.10.2/docs/08_errors.md000066400000000000000000000057051402322402300156310ustar00rootroot00000000000000# Errors Nearly all errors and warnings produced by the `yaml` parser functions contain the following fields: | Member | Type | Description | | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | `string` | One of `YAMLReferenceError`, `YAMLSemanticError`, `YAMLSyntaxError`, or `YAMLWarning` | | message | `string` | A human-readable description of the error | | source | `CST Node` | The CST node at which this error or warning was encountered. Note that in particular `source.context` is likely to be a complex object and include some circular references. | If the `prettyErrors` option is enabled, `source` is dropped from the errors and the following fields are added with summary information regarding the error's source node, if available: | Member | Type | Description | | -------- | ----------------------------------- | --------------------------------------------------------------------------------------------- | | nodeType | `string` | A string constant identifying the type of node | | range | `{ start: number, end: ?number }` | Character offset in the input string | | linePos | `{ start: LinePos, end: ?LinePos }` | One-indexed human-friendly source location. `LinePos` here is `{ line: number, col: number }` | In rare cases, the library may produce a more generic error. In particular, `TypeError` may occur when parsing invalid input using the `json` schema, and `ReferenceError` when the `maxAliasCount` limit is enountered. ## YAMLReferenceError An error resolving a tag or an anchor that is referred to in the source. It is likely that the contents of the `source` node have not been completely parsed into the document. Not used by the CST parser. ## YAMLSemanticError An error related to the metadata of the document, or an error with limitations imposed by the YAML spec. The data contents of the document should be valid, but the metadata may be broken. ## YAMLSyntaxError A serious parsing error; the document contents will not be complete, and the CST is likely to be rather broken. ## YAMLWarning Not an error, but a spec-mandated warning about unsupported directives or a fallback resolution being used for a node with an unavailable tag. Not used by the CST parser. yaml-1.10.2/docs/09_yaml_syntax.md000066400000000000000000000145671402322402300166740ustar00rootroot00000000000000# YAML Syntax A YAML _schema_ is a combination of a set of tags and a mechanism for resolving non-specific tags, i.e. values that do not have an explicit tag such as `!!int`. The [default schema](#data-schemas) is the `'core'` schema, which is the recommended one for YAML 1.2. For YAML 1.0 and YAML 1.1 documents the default is `'yaml-1.1'`. ## Tags ```js YAML.parse('"42"') // '42' YAML.parse('!!int "42"') // 42 YAML.parse(` %TAG ! tag:example.com,2018:app/ --- !foo 42 `) // YAMLWarning: // The tag tag:example.com,2018:app/foo is unavailable, // falling back to tag:yaml.org,2002:str // '42' ``` The default prefix for YAML tags is `tag:yaml.org,2002:`, for which the shorthand `!!` is used when stringified. Shorthands for other prefixes may also be defined by document-specific directives, e.g. `!e!` or just `!` for `tag:example.com,2018:app/`, but this is not required to use a tag with a different prefix. During parsing, unresolved tags should not result in errors (though they will be noted as `warnings`), with the tagged value being parsed according to the data type that it would have under automatic tag resolution rules. This should not result in any data loss, allowing such tags to be handled by the calling app. In order to have `yaml` provide you with automatic parsing and stringification of non-standard data types, it will need to be configured with a suitable tag object. For more information, see [Custom Tags](#custom-tags). The YAML 1.0 tag specification is [slightly different](#changes-from-yaml-1-0-to-1-1) from that used in later versions, and implements prefixing shorthands rather differently. ## Version Differences This library's parser is based on the 1.2 version of the [YAML spec](http://yaml.org/spec/1.2/spec.html), which is mostly backwards-compatible with [YAML 1.1](http://yaml.org/spec/1.1/) as well as [YAML 1.0](http://yaml.org/spec/1.0/). Some specific relaxations have been added for backwards compatibility, but if you encounter an issue please [report it](https://github.com/eemeli/yaml/issues). ### Changes from YAML 1.1 to 1.2 ```yaml %YAML 1.1 --- true: Yes octal: 014 sexagesimal: 3:25:45 picture: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs= ``` ```js { true: true, octal: 12, sexagesimal: 12345, picture: Buffer [Uint8Array] [ 71, 73, 70, 56, 57, 97, 12, 0, 12, 0, 132, 0, 0, 255, 255, 247, 245, 245, 238, 233, 233, 229, 102, 102, 102, 0, 0, 0, 231, 231, 231, 94, 94, 94, 243, 243, 237, 142, 142, 142, 224, 224, 224, 159, 159, 159, 147, 147, 147, 167, 167, 167, 158, 158, 158, 105, 94, 16, 39, 32, 130, 10, 1, 0, 59 ] } ``` The most significant difference between YAML 1.1 and YAML 1.2 is the introduction of the core data schema as the recommended default, replacing the YAML 1.1 type library: - Only `true` and `false` strings are parsed as booleans (including `True` and `TRUE`); `y`, `yes`, `on`, and their negative counterparts are parsed as strings. - Underlines `_` cannot be used within numerical values. - Octal values need a `0o` prefix; e.g. `010` is now parsed with the value 10 rather than 8. - The binary and sexagesimal integer formats have been dropped. - The `!!pairs`, `!!omap`, `!!set`, `!!timestamp` and `!!binary` types have been dropped. - The merge `<<` and value `=` special mapping keys have been removed. The other major change has been to make sure that YAML 1.2 is a valid superset of JSON. Additionally there are some minor differences between the parsing rules: - The next-line `\x85`, line-separator `\u2028` and paragraph-separator `\u2029` characters are no longer considered line-break characters. Within scalar values, this means that next-line characters will not be included in the white-space normalisation. Using any of these outside scalar values is likely to result in errors during parsing. For a relatively robust solution, try replacing `\x85` and `\u2028` with `\n` and `\u2029` with `\n\n`. - Tag shorthands can no longer include any of the characters `,[]{}`, but can include `#`. To work around this, either fix your tag names or use verbatim tags. - Anchors can no longer include any of the characters `,[]{}`. - Inside double-quoted strings `\/` is now a valid escape for the `/` character. - Quoted content can include practically all Unicode characters. - Documents in streams are now independent of each other, and no longer inherit preceding document directives if they do not define their own. ### Changes from YAML 1.0 to 1.1 ```text %YAML:1.0 --- date: 2001-01-23 number: !int '123' string: !str 123 pool: !!ball { number: 8 } invoice: !domain.tld,2002/^invoice customers: !seq - !^customer given : Chris family : Dumars ``` ```js // YAMLWarning: // The tag tag:private.yaml.org,2002:ball is unavailable, // falling back to tag:yaml.org,2002:map // YAMLWarning: // The tag tag:domain.tld,2002/^invoice is unavailable, // falling back to tag:yaml.org,2002:map // YAMLWarning: // The tag ^customer is unavailable, // falling back to tag:yaml.org,2002:map { date: '2001-01-23T00:00:00.000Z', number: 123, string: '123', pool: { number: 8 }, invoice: { customers: [ { given: 'Chris', family: 'Dumars' } ] } } ``` The most significant difference between these versions is the complete refactoring of the tag syntax: - The `%TAG` directive has been added, along with the `!foo!` tag prefix shorthand notation. - The `^` character no longer enables tag prefixing. - The private vs. default scoping of `!` and `!!` tag prefixes has been switched around; `!!str` is now a default tag while `!bar` is an application-specific tag. - Verbatim `!` tag notation has been added. - The formal `tag:domain,date/path` format for tag names has been dropped as a requirement. Additionally, the formal description of the language describing the document structure has been completely refactored between these versions, but the described intent has not changed. Other changes include: - A `\` escape has been added for the tab character, in addition to the pre-existing `\t` - The `\^` escape has been removed - Directives now use a blank space `' '` rather than `:` as the separator between the name and its parameter/value. `yaml` supports parsing and stringifying YAML 1.0 tags, but does not expand tags using the `^` notation. If this is something you'd find useful, please file a [GitHub issue](https://github.com/eemeli/yaml/issues) about it. yaml-1.10.2/docs/README.md000066400000000000000000000020241402322402300147320ustar00rootroot00000000000000## YAML Docs These documentation source files are compiled into [eemeli.org/yaml](https://eemeli.org/yaml) using a [Slate](https://github.com/slatedocs/slate) instance that's a git submodule of this repo at `docs-slate/`. ### How to Preview Changes 1. Modify these source files, noting that sections are defined in `index.html.md` 2. Make sure that the Slate submodule is properly initialised. If you've just cloned the repo, the command you'll want is `git submodule update --init` 3. Note that `docs-slate/source` contains symlinks to this folder, which may need extra configuration to work in Windows environments 4. See [docs-slate/README.md](../docs-slate/README.md) for its install instructions 5. Use `npm run docs` from this repo's root to preview the site at http://localhost:4567 ### How to Publish Changes In addition to the preview steps: 1. Add this repo as the "yaml" remote for the `docs-slate` submodule repo: `git remote add yaml git@github.com:eemeli/yaml.git` 2. Run the `deploy.sh` script from the `docs-slate` folder yaml-1.10.2/docs/index.html.md000066400000000000000000000007431402322402300160550ustar00rootroot00000000000000--- title: YAML toc_footers: - Version 1.x.y (changelog) - github.com/eemeli/yaml - npm install yaml includes: - 01_intro - 02_parse_stringify - 03_options - 04_documents - 05_content_nodes - 06_custom_tags - 07_cst_parser - 08_errors - 09_yaml_syntax search: true --- yaml-1.10.2/index.d.ts000066400000000000000000000247701402322402300144400ustar00rootroot00000000000000import { CST } from './parse-cst' import { AST, Alias, Collection, Merge, Node, Scalar, Schema, YAMLMap, YAMLSeq } from './types' import { Type, YAMLError, YAMLWarning } from './util' export { AST, CST } export { default as parseCST } from './parse-cst' /** * `yaml` defines document-specific options in three places: as an argument of * parse, create and stringify calls, in the values of `YAML.defaultOptions`, * and in the version-dependent `YAML.Document.defaults` object. Values set in * `YAML.defaultOptions` override version-dependent defaults, and argument * options override both. */ export const defaultOptions: Options export interface Options extends Schema.Options { /** * Default prefix for anchors. * * Default: `'a'`, resulting in anchors `a1`, `a2`, etc. */ anchorPrefix?: string /** * The number of spaces to use when indenting code. * * Default: `2` */ indent?: number /** * Whether block sequences should be indented. * * Default: `true` */ indentSeq?: boolean /** * Allow non-JSON JavaScript objects to remain in the `toJSON` output. * Relevant with the YAML 1.1 `!!timestamp` and `!!binary` tags as well as BigInts. * * Default: `true` */ keepBlobsInJSON?: boolean /** * Include references in the AST to each node's corresponding CST node. * * Default: `false` */ keepCstNodes?: boolean /** * Store the original node type when parsing documents. * * Default: `true` */ keepNodeTypes?: boolean /** * When outputting JS, use Map rather than Object to represent mappings. * * Default: `false` */ mapAsMap?: boolean /** * Prevent exponential entity expansion attacks by limiting data aliasing count; * set to `-1` to disable checks; `0` disallows all alias nodes. * * Default: `100` */ maxAliasCount?: number /** * Include line position & node type directly in errors; drop their verbose source and context. * * Default: `false` */ prettyErrors?: boolean /** * When stringifying, require keys to be scalars and to use implicit rather than explicit notation. * * Default: `false` */ simpleKeys?: boolean /** * The YAML version used by documents without a `%YAML` directive. * * Default: `"1.2"` */ version?: '1.0' | '1.1' | '1.2' } /** * Some customization options are availabe to control the parsing and * stringification of scalars. Note that these values are used by all documents. */ export const scalarOptions: { binary: scalarOptions.Binary bool: scalarOptions.Bool int: scalarOptions.Int null: scalarOptions.Null str: scalarOptions.Str } export namespace scalarOptions { interface Binary { /** * The type of string literal used to stringify `!!binary` values. * * Default: `'BLOCK_LITERAL'` */ defaultType: Scalar.Type /** * Maximum line width for `!!binary`. * * Default: `76` */ lineWidth: number } interface Bool { /** * String representation for `true`. With the core schema, use `'true' | 'True' | 'TRUE'`. * * Default: `'true'` */ trueStr: string /** * String representation for `false`. With the core schema, use `'false' | 'False' | 'FALSE'`. * * Default: `'false'` */ falseStr: string } interface Int { /** * Whether integers should be parsed into BigInt values. * * Default: `false` */ asBigInt: boolean } interface Null { /** * String representation for `null`. With the core schema, use `'null' | 'Null' | 'NULL' | '~' | ''`. * * Default: `'null'` */ nullStr: string } interface Str { /** * The default type of string literal used to stringify values * * Default: `'PLAIN'` */ defaultType: Scalar.Type doubleQuoted: { /** * Whether to restrict double-quoted strings to use JSON-compatible syntax. * * Default: `false` */ jsonEncoding: boolean /** * Minimum length to use multiple lines to represent the value. * * Default: `40` */ minMultiLineLength: number } fold: { /** * Maximum line width (set to `0` to disable folding). * * Default: `80` */ lineWidth: number /** * Minimum width for highly-indented content. * * Default: `20` */ minContentWidth: number } } } export class Document extends Collection { cstNode?: CST.Document constructor(options?: Options) tag: never directivesEndMarker?: boolean type: Type.DOCUMENT /** * Anchors associated with the document's nodes; * also provides alias & merge node creators. */ anchors: Document.Anchors /** The document contents. */ contents: any /** Errors encountered during parsing. */ errors: YAMLError[] /** * The schema used with the document. Use `setSchema()` to change or * initialise. */ schema?: Schema /** * Array of prefixes; each will have a string `handle` that * starts and ends with `!` and a string `prefix` that the handle will be replaced by. */ tagPrefixes: Document.TagPrefix[] /** * The parsed version of the source document; * if true-ish, stringified output will include a `%YAML` directive. */ version?: string /** Warnings encountered during parsing. */ warnings: YAMLWarning[] /** * List the tags used in the document that are not in the default * `tag:yaml.org,2002:` namespace. */ listNonDefaultTags(): string[] /** Parse a CST into this document */ parse(cst: CST.Document): this /** * When a document is created with `new YAML.Document()`, the schema object is * not set as it may be influenced by parsed directives; call this with no * arguments to set it manually, or with arguments to change the schema used * by the document. **/ setSchema( id?: Options['version'] | Schema.Name, customTags?: (Schema.TagId | Schema.Tag)[] ): void /** Set `handle` as a shorthand string for the `prefix` tag namespace. */ setTagPrefix(handle: string, prefix: string): void /** * A plain JavaScript representation of the document `contents`. * * @param arg Used by `JSON.stringify` to indicate the array index or property * name. If its value is a `string` and the document `contents` has a scalar * value, the `keepBlobsInJSON` option has no effect. * @param onAnchor If defined, called with the resolved `value` and reference * `count` for each anchor in the document. * */ toJSON(arg?: string, onAnchor?: (value: any, count: number) => void): any /** A YAML representation of the document. */ toString(): string } export namespace Document { interface Parsed extends Document { contents: Scalar | YAMLMap | YAMLSeq | null /** The schema used with the document. */ schema: Schema } interface Anchors { /** * Create a new `Alias` node, adding the required anchor for `node`. * If `name` is empty, a new anchor name will be generated. */ createAlias(node: Node, name?: string): Alias /** * Create a new `Merge` node with the given source nodes. * Non-`Alias` sources will be automatically wrapped. */ createMergePair(...nodes: Node[]): Merge /** The anchor name associated with `node`, if set. */ getName(node: Node): undefined | string /** List of all defined anchor names. */ getNames(): string[] /** The node associated with the anchor `name`, if set. */ getNode(name: string): undefined | Node /** * Find an available anchor name with the given `prefix` and a * numerical suffix. */ newName(prefix: string): string /** * Associate an anchor with `node`. If `name` is empty, a new name will be generated. * To remove an anchor, use `setAnchor(null, name)`. */ setAnchor(node: Node | null, name?: string): void | string } interface TagPrefix { handle: string prefix: string } } /** * Recursively turns objects into collections. Generic objects as well as `Map` * and its descendants become mappings, while arrays and other iterable objects * result in sequences. * * The primary purpose of this function is to enable attaching comments or other * metadata to a value, or to otherwise exert more fine-grained control over the * stringified output. To that end, you'll need to assign its return value to * the `contents` of a Document (or somewhere within said contents), as the * document's schema is required for YAML string output. * * @param wrapScalars If undefined or `true`, also wraps plain values in * `Scalar` objects; if `false` and `value` is not an object, it will be * returned directly. * @param tag Use to specify the collection type, e.g. `"!!omap"`. Note that * this requires the corresponding tag to be available based on the default * options. To use a specific document's schema, use `doc.schema.createNode`. */ export function createNode( value: any, wrapScalars?: true, tag?: string ): YAMLMap | YAMLSeq | Scalar /** * YAML.createNode recursively turns objects into Map and arrays to Seq collections. * Its primary use is to enable attaching comments or other metadata to a value, * or to otherwise exert more fine-grained control over the stringified output. * * Doesn't wrap plain values in Scalar objects. */ export function createNode( value: any, wrapScalars: false, tag?: string ): YAMLMap | YAMLSeq | string | number | boolean | null /** * Parse an input string into a single YAML.Document. */ export function parseDocument(str: string, options?: Options): Document.Parsed /** * Parse the input as a stream of YAML documents. * * Documents should be separated from each other by `...` or `---` marker lines. */ export function parseAllDocuments( str: string, options?: Options ): Document.Parsed[] /** * Parse an input string into JavaScript. * * Only supports input consisting of a single YAML document; for multi-document * support you should use `YAML.parseAllDocuments`. May throw on error, and may * log warnings using `console.warn`. * * @param str A string with YAML formatting. * @returns The value will match the type of the root value of the parsed YAML * document, so Maps become objects, Sequences arrays, and scalars result in * nulls, booleans, numbers and strings. */ export function parse(str: string, options?: Options): any /** * @returns Will always include \n as the last character, as is expected of YAML documents. */ export function stringify(value: any, options?: Options): string yaml-1.10.2/index.js000066400000000000000000000000501402322402300141650ustar00rootroot00000000000000module.exports = require('./dist').YAML yaml-1.10.2/jest.config.js000066400000000000000000000020301402322402300152670ustar00rootroot00000000000000let moduleNameMapper const testPathIgnorePatterns = ['tests/common', 'cst/common'] // The npm script name is significant. switch (process.env.npm_lifecycle_event) { case 'test:dist': moduleNameMapper = {} testPathIgnorePatterns.push( 'cst/Node', 'cst/set-value', 'cst/source-utils', 'cst/YAML-1.2', 'doc/createNode', 'doc/errors', 'doc/foldFlowLines', 'doc/types' ) break case 'test': default: process.env.TRACE_LEVEL = 'log' moduleNameMapper = { '^\\./dist$': '/src/index.js', '^\\./dist/parse-cst(\\.js)?$': '/src/cst/parse.js', '^\\./dist/types(\\.js)?$': '/src/types.js', '^\\./dist/(.+)$': '/src/$1', '^\\.\\./dist/test-events.js$': '/src/test-events.js' } } module.exports = { collectCoverageFrom: ['src/**/*.js'], moduleNameMapper, testEnvironment: 'node', testMatch: ['**/tests/**/*.js'], testPathIgnorePatterns, transform: { '/(src|tests)/.*\\.js$': 'babel-jest' } } yaml-1.10.2/map.js000066400000000000000000000001621402322402300136370ustar00rootroot00000000000000module.exports = require('./dist/types').YAMLMap require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/package-lock.json000066400000000000000000024116371402322402300157570ustar00rootroot00000000000000{ "name": "yaml", "version": "1.10.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "version": "1.10.2", "license": "ISC", "devDependencies": { "@babel/core": "^7.12.10", "@babel/plugin-proposal-class-properties": "^7.12.1", "@babel/preset-env": "^7.12.11", "@rollup/plugin-babel": "^5.2.3", "babel-eslint": "^10.1.0", "babel-jest": "^26.6.3", "babel-plugin-trace": "^1.1.0", "common-tags": "^1.8.0", "cross-env": "^7.0.3", "eslint": "^7.19.0", "eslint-config-prettier": "^7.2.0", "fast-check": "^2.12.0", "jest": "^26.6.3", "prettier": "^2.2.1", "rollup": "^2.38.2", "typescript": "^4.1.3" }, "engines": { "node": ">= 6" } }, "node_modules/@babel/code-frame": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "dependencies": { "@babel/highlight": "^7.12.13" } }, "node_modules/@babel/compat-data": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.8.tgz", "integrity": "sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog==", "dev": true }, "node_modules/@babel/core": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.9", "@babel/helper-compilation-targets": "^7.13.10", "@babel/helper-module-transforms": "^7.13.0", "@babel/helpers": "^7.13.10", "@babel/parser": "^7.13.10", "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "lodash": "^4.17.19", "semver": "^6.3.0", "source-map": "^0.5.0" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/generator": { "version": "7.13.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, "dependencies": { "@babel/types": "^7.13.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, "dependencies": { "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.12.13", "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.13.8", "@babel/helper-validator-option": "^7.12.17", "browserslist": "^4.14.5", "semver": "^6.3.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.10.tgz", "integrity": "sha512-YV7r2YxdTUaw84EwNkyrRke/TJHR/UXGiyvACRqvdVJ2/syV2rQuJNnaRLSuYiop8cMRXOgseTGoJCWX0q2fFg==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.12.13", "@babel/helper-member-expression-to-functions": "^7.13.0", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-split-export-declaration": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.12.17", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.12.13", "regexpu-core": "^4.7.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", "@babel/helper-plugin-utils": "^7.13.0", "@babel/traverse": "^7.13.0", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "peerDependencies": { "@babel/core": "^7.4.0-0" } }, "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "dev": true, "dependencies": { "@babel/types": "^7.13.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, "dependencies": { "@babel/helper-get-function-arity": "^7.12.13", "@babel/template": "^7.12.13", "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-get-function-arity": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, "dependencies": { "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", "dev": true, "dependencies": { "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", "dev": true, "dependencies": { "@babel/types": "^7.13.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", "dev": true, "dependencies": { "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.12.13", "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-simple-access": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", "@babel/helper-validator-identifier": "^7.12.11", "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0", "lodash": "^4.17.19" } }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, "dependencies": { "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.12.13", "@babel/helper-wrap-function": "^7.13.0", "@babel/types": "^7.13.0" } }, "node_modules/@babel/helper-replace-supers": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", "dev": true, "dependencies": { "@babel/helper-member-expression-to-functions": "^7.13.0", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", "dev": true, "dependencies": { "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "dependencies": { "@babel/types": "^7.12.1" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "dependencies": { "@babel/types": "^7.12.13" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "node_modules/@babel/helper-validator-option": { "version": "7.12.17", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", "dev": true }, "node_modules/@babel/helper-wrap-function": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.12.13", "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "node_modules/@babel/helpers": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", "dev": true, "dependencies": { "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "node_modules/@babel/highlight": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "node_modules/@babel/parser": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.10.tgz", "integrity": "sha512-0s7Mlrw9uTWkYua7xWr99Wpk2bnGa0ANleKfksYAES8LpWH4gW1OUr42vqKNf0us5UQNfru2wPqMqRITzq/SIQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-remap-async-to-generator": "^7.13.0", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "dependencies": { "@babel/compat-data": "^7.13.8", "@babel/helper-compilation-targets": "^7.13.8", "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz", "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" }, "engines": { "node": ">=4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.12.13", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-remap-async-to-generator": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.12.13", "@babel/helper-function-name": "^7.12.13", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-simple-access": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.13.0", "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-replace-supers": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", "dev": true, "dependencies": { "regenerator-transform": "^0.14.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.10.tgz", "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.13.8", "@babel/helper-compilation-targets": "^7.13.10", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-validator-option": "^7.12.17", "@babel/plugin-proposal-async-generator-functions": "^7.13.8", "@babel/plugin-proposal-class-properties": "^7.13.0", "@babel/plugin-proposal-dynamic-import": "^7.13.8", "@babel/plugin-proposal-export-namespace-from": "^7.12.13", "@babel/plugin-proposal-json-strings": "^7.13.8", "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", "@babel/plugin-proposal-numeric-separator": "^7.12.13", "@babel/plugin-proposal-object-rest-spread": "^7.13.8", "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", "@babel/plugin-proposal-optional-chaining": "^7.13.8", "@babel/plugin-proposal-private-methods": "^7.13.0", "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.12.13", "@babel/plugin-transform-arrow-functions": "^7.13.0", "@babel/plugin-transform-async-to-generator": "^7.13.0", "@babel/plugin-transform-block-scoped-functions": "^7.12.13", "@babel/plugin-transform-block-scoping": "^7.12.13", "@babel/plugin-transform-classes": "^7.13.0", "@babel/plugin-transform-computed-properties": "^7.13.0", "@babel/plugin-transform-destructuring": "^7.13.0", "@babel/plugin-transform-dotall-regex": "^7.12.13", "@babel/plugin-transform-duplicate-keys": "^7.12.13", "@babel/plugin-transform-exponentiation-operator": "^7.12.13", "@babel/plugin-transform-for-of": "^7.13.0", "@babel/plugin-transform-function-name": "^7.12.13", "@babel/plugin-transform-literals": "^7.12.13", "@babel/plugin-transform-member-expression-literals": "^7.12.13", "@babel/plugin-transform-modules-amd": "^7.13.0", "@babel/plugin-transform-modules-commonjs": "^7.13.8", "@babel/plugin-transform-modules-systemjs": "^7.13.8", "@babel/plugin-transform-modules-umd": "^7.13.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", "@babel/plugin-transform-new-target": "^7.12.13", "@babel/plugin-transform-object-super": "^7.12.13", "@babel/plugin-transform-parameters": "^7.13.0", "@babel/plugin-transform-property-literals": "^7.12.13", "@babel/plugin-transform-regenerator": "^7.12.13", "@babel/plugin-transform-reserved-words": "^7.12.13", "@babel/plugin-transform-shorthand-properties": "^7.12.13", "@babel/plugin-transform-spread": "^7.13.0", "@babel/plugin-transform-sticky-regex": "^7.12.13", "@babel/plugin-transform-template-literals": "^7.13.0", "@babel/plugin-transform-typeof-symbol": "^7.12.13", "@babel/plugin-transform-unicode-escapes": "^7.12.13", "@babel/plugin-transform-unicode-regex": "^7.12.13", "@babel/preset-modules": "^0.1.4", "@babel/types": "^7.13.0", "babel-plugin-polyfill-corejs2": "^0.1.4", "babel-plugin-polyfill-corejs3": "^0.1.3", "babel-plugin-polyfill-regenerator": "^0.1.2", "core-js-compat": "^3.9.0", "semver": "^6.3.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-modules": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/runtime": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" } }, "node_modules/@babel/template": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/parser": "^7.12.13", "@babel/types": "^7.12.13" } }, "node_modules/@babel/traverse": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.0", "@babel/helper-function-name": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", "@babel/parser": "^7.13.0", "@babel/types": "^7.13.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "node_modules/@babel/types": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "node_modules/@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "dependencies": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" }, "bin": { "watch": "cli.js" }, "engines": { "node": ">=0.1.95" } }, "node_modules/@eslint/eslintrc": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", "dev": true, "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", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "dependencies": { "type-fest": "^0.8.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^26.6.2", "jest-util": "^26.6.2", "slash": "^3.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/console/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/core": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "dependencies": { "@jest/console": "^26.6.2", "@jest/reporters": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^26.6.2", "jest-config": "^26.6.3", "jest-haste-map": "^26.6.2", "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.6.2", "jest-resolve-dependencies": "^26.6.3", "jest-runner": "^26.6.3", "jest-runtime": "^26.6.3", "jest-snapshot": "^26.6.2", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "jest-watcher": "^26.6.2", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/core/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/environment": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "dependencies": { "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "jest-mock": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/fake-timers": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", "jest-message-util": "^26.6.2", "jest-mock": "^26.6.2", "jest-util": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/globals": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "dependencies": { "@jest/environment": "^26.6.2", "@jest/types": "^26.6.2", "expect": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/reporters": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^4.0.3", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", "jest-haste-map": "^26.6.2", "jest-resolve": "^26.6.2", "jest-util": "^26.6.2", "jest-worker": "^26.6.2", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", "v8-to-istanbul": "^7.0.0" }, "engines": { "node": ">= 10.14.2" }, "optionalDependencies": { "node-notifier": "^8.0.0" } }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/reporters/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/reporters/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/source-map": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/source-map/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@jest/test-result": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "dependencies": { "@jest/console": "^26.6.2", "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/test-sequencer": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "dependencies": { "@jest/test-result": "^26.6.2", "graceful-fs": "^4.2.4", "jest-haste-map": "^26.6.2", "jest-runner": "^26.6.3", "jest-runtime": "^26.6.3" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/transform": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^26.6.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", "jest-haste-map": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-util": "^26.6.2", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/transform/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/transform/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/transform/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/@jest/types/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/types/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/types/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" }, "engines": { "node": ">= 10.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0", "@types/babel__core": "^7.1.9", "rollup": "^1.20.0||^2.0.0" }, "peerDependenciesMeta": { "@types/babel__core": { "optional": true } } }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "engines": { "node": ">= 8.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@sinonjs/commons": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "node_modules/@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "dev": true, "dependencies": { "@babel/types": "^7.3.0" } }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/node": { "version": "14.14.34", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz", "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==", "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, "node_modules/@types/prettier": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.2.tgz", "integrity": "sha512-i99hy7Ki19EqVOl77WplDrvgNugHnsSjECVR/wUrzw2TJXz1zlUfT2ngGckR6xN7yFYaijsMAqPkOLx9HgUqHg==", "dev": true }, "node_modules/@types/stack-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, "node_modules/@types/yargs": { "version": "15.0.13", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "20.2.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, "node_modules/abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-globals": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" } }, "node_modules/acorn-jsx": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "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" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "dependencies": { "type-fest": "^0.11.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, "engines": { "node": ">=0.8" } }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, "bin": { "atob": "bin/atob.js" }, "engines": { "node": ">= 4.5.0" } }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true, "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "node_modules/babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", "@babel/traverse": "^7.7.0", "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" }, "engines": { "node": ">=6" }, "peerDependencies": { "eslint": ">= 4.12.1" } }, "node_modules/babel-jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "dependencies": { "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "engines": { "node": ">= 10.14.2" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/babel-jest/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "dependencies": { "object.assign": "^4.1.0" } }, "node_modules/babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^4.0.0", "test-exclude": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-jest-hoist": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.13.0", "@babel/helper-define-polyfill-provider": "^0.1.5", "semver": "^6.1.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.1.5", "core-js-compat": "^3.8.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.1.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-trace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-trace/-/babel-plugin-trace-1.1.0.tgz", "integrity": "sha512-joLw8IjwmBNcvQKQsJOxNTI7pXN8ipKU1HeZt7DeyIXPgZCd0EuDIxyZPv01PjKQsW8IbSLDZGZ4zafQXI+6Hw==", "dev": true }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^26.6.2", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { "node": ">= 10.14.2" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/base/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "node_modules/browserslist": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "dependencies": { "caniuse-lite": "^1.0.30001181", "colorette": "^1.2.1", "electron-to-chromium": "^1.3.649", "escalade": "^3.1.1", "node-releases": "^1.1.70" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" } }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "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" }, "engines": { "node": ">=0.10.0" } }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { "version": "1.0.30001199", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001199.tgz", "integrity": "sha512-ifbK2eChUCFUwGhlEzIoVwzFt1+iriSjyKKFYNfv6hN34483wyWpLLavYQXhnR036LhkdUYaSDpHg1El++VgHQ==", "dev": true }, "node_modules/capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "dependencies": { "rsvp": "^4.8.4" }, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "node_modules/cjs-module-lexer": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "node_modules/colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/common-tags": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true, "engines": { "node": ">=4.0.0" } }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "node_modules/convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } }, "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/core-js-compat": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", "dev": true, "dependencies": { "browserslist": "^4.16.3", "semver": "7.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat/node_modules/semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" }, "engines": { "node": ">=10.14", "npm": ">=6", "yarn": ">=1" } }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, "node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "dependencies": { "cssom": "~0.3.6" }, "engines": { "node": ">=8" } }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, "engines": { "node": ">=0.10" } }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0" }, "engines": { "node": ">=10" } }, "node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true, "engines": { "node": ">=0.10" } }, "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "dependencies": { "object-keys": "^1.0.12" }, "engines": { "node": ">= 0.4" } }, "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true, "engines": { "node": ">= 10.14.2" } }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "dependencies": { "webidl-conversions": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/domexception/node_modules/webidl-conversions": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "node_modules/electron-to-chromium": { "version": "1.3.687", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.687.tgz", "integrity": "sha512-IpzksdQNl3wdgkzf7dnA7/v10w0Utf1dF2L+B4+gKrloBrxCut+au+kky3PYvle3RMdSxZP+UiCZtLbcYRxSNQ==", "dev": true }, "node_modules/emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "dependencies": { "ansi-colors": "^4.1.1" }, "engines": { "node": ">=8.6" } }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, "node_modules/escodegen/node_modules/estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/escodegen/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "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", "word-wrap": "~1.2.3" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/escodegen/node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "dependencies": { "prelude-ls": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/eslint": { "version": "7.22.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz", "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==", "dev": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.0", "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": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^13.6.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.21", "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": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-prettier": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { "eslint-visitor-keys": "^1.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/eslint/node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/globals": { "version": "13.6.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz", "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esquery/node_modules/estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/exec-sh": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, "node_modules/execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" } }, "node_modules/expand-brackets/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node_modules/expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", "jest-matcher-utils": "^26.6.2", "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/expect/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/expect/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/expect/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "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.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/extglob/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/extglob/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/extglob/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true, "engines": [ "node >=0.6.0" ] }, "node_modules/fast-check": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.13.0.tgz", "integrity": "sha512-IOfzKm/SCA+jpUEgAfqAuxHYPmgtmpnnwljQmYPRGrqYczcTKApXKHza/SNxFxYkecWfZilYa0DJdBvqz1bcSw==", "dev": true, "dependencies": { "pure-rand": "^4.1.1" }, "engines": { "node": ">=8.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/fast-check" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "dependencies": { "bser": "2.1.1" } }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true, "engines": { "node": "*" } }, "node_modules/form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" }, "engines": { "node": ">= 0.12" } }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "dependencies": { "map-cache": "^0.2.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "engines": { "node": ">=8.0.0" } }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "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" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true, "optional": true }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", "dev": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" }, "engines": { "node": ">=6" } }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { "function-bind": "^1.1.1" }, "engines": { "node": ">= 0.4.0" } }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values/node_modules/kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, "engines": { "node": ">=10" } }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" }, "engines": { "node": ">=0.8", "npm": ">=1.3.7" } }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, "engines": { "node": ">=8.12.0" } }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, "engines": { "node": ">=0.8.19" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "dependencies": { "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "dependencies": { "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, "node_modules/is-core-module": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "dependencies": { "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "dependencies": { "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-docker": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true, "optional": true, "bin": { "is-docker": "cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "dependencies": { "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", "dev": true }, "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "optional": true, "dependencies": { "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "dependencies": { "@jest/core": "^26.6.3", "import-local": "^3.0.2", "jest-cli": "^26.6.3" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-changed-files": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "execa": "^4.0.0", "throat": "^5.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-cli": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "dependencies": { "@jest/core": "^26.6.3", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", "jest-config": "^26.6.3", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "prompts": "^2.0.1", "yargs": "^15.4.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-config": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", "@jest/test-sequencer": "^26.6.3", "@jest/types": "^26.6.2", "babel-jest": "^26.6.3", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "jest-environment-jsdom": "^26.6.2", "jest-environment-node": "^26.6.2", "jest-get-type": "^26.3.0", "jest-jasmine2": "^26.6.3", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.6.2", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "micromatch": "^4.0.2", "pretty-format": "^26.6.2" }, "engines": { "node": ">= 10.14.2" }, "peerDependencies": { "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "ts-node": { "optional": true } } }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-config/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-config/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-diff": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^26.6.2", "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-diff/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-docblock": { "version": "26.0.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-each": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "jest-util": "^26.6.2", "pretty-format": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-each/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-each/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-environment-jsdom": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "dependencies": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "jest-mock": "^26.6.2", "jest-util": "^26.6.2", "jsdom": "^16.4.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-environment-node": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "dependencies": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "jest-mock": "^26.6.2", "jest-util": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-get-type": { "version": "26.3.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-haste-map": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", "jest-serializer": "^26.6.2", "jest-util": "^26.6.2", "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" }, "engines": { "node": ">= 10.14.2" }, "optionalDependencies": { "fsevents": "^2.1.2" } }, "node_modules/jest-jasmine2": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", "@jest/environment": "^26.6.2", "@jest/source-map": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "expect": "^26.6.2", "is-generator-fn": "^2.0.0", "jest-each": "^26.6.2", "jest-matcher-utils": "^26.6.2", "jest-message-util": "^26.6.2", "jest-runtime": "^26.6.3", "jest-snapshot": "^26.6.2", "jest-util": "^26.6.2", "pretty-format": "^26.6.2", "throat": "^5.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-jasmine2/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-jasmine2/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-jasmine2/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-jasmine2/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-jasmine2/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-jasmine2/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-leak-detector": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "dependencies": { "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-matcher-utils": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-matcher-utils/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-message-util": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "@jest/types": "^26.6.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-message-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-mock": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "@types/node": "*" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true, "engines": { "node": ">=6" }, "peerDependencies": { "jest-resolve": "*" }, "peerDependenciesMeta": { "jest-resolve": { "optional": true } } }, "node_modules/jest-regex-util": { "version": "26.0.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^26.6.2", "read-pkg-up": "^7.0.1", "resolve": "^1.18.1", "slash": "^3.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-resolve-dependencies": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-snapshot": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-resolve/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-resolve/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-resolve/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-runner": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "dependencies": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-config": "^26.6.3", "jest-docblock": "^26.0.0", "jest-haste-map": "^26.6.2", "jest-leak-detector": "^26.6.2", "jest-message-util": "^26.6.2", "jest-resolve": "^26.6.2", "jest-runtime": "^26.6.3", "jest-util": "^26.6.2", "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-runner/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runner/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-runner/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-runtime": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", "dev": true, "dependencies": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/globals": "^26.6.2", "@jest/source-map": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", "jest-config": "^26.6.3", "jest-haste-map": "^26.6.2", "jest-message-util": "^26.6.2", "jest-mock": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.6.2", "jest-snapshot": "^26.6.2", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.4.1" }, "bin": { "jest-runtime": "bin/jest-runtime.js" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-runtime/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-runtime/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-serializer": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.4" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-snapshot": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "dependencies": { "@babel/types": "^7.0.0", "@jest/types": "^26.6.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", "expect": "^26.6.2", "graceful-fs": "^4.2.4", "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", "jest-haste-map": "^26.6.2", "jest-matcher-utils": "^26.6.2", "jest-message-util": "^26.6.2", "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", "pretty-format": "^26.6.2", "semver": "^7.3.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-snapshot/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-util": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "micromatch": "^4.0.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-validate": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", "pretty-format": "^26.6.2" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-validate/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-validate/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-watcher": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "dependencies": { "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "jest-util": "^26.6.2", "string-length": "^4.0.1" }, "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-watcher/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-watcher/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-watcher/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "node_modules/jsdom": { "version": "16.5.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz", "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==", "dev": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.0.5", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", "data-urls": "^2.0.0", "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", "html-encoding-sniffer": "^2.0.1", "is-potential-custom-element-name": "^1.0.0", "nwsapi": "^2.2.0", "parse5": "6.0.1", "request": "^2.88.2", "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0", "ws": "^7.4.4", "xml-name-validator": "^3.0.0" }, "engines": { "node": ">=10" }, "peerDependencies": { "canvas": "^2.5.0" }, "peerDependenciesMeta": { "canvas": { "optional": true } } }, "node_modules/jsdom/node_modules/acorn": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "dependencies": { "minimist": "^1.2.5" }, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "engines": [ "node >=0.6.0" ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "dependencies": { "tmpl": "1.0.x" } }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "dependencies": { "object-visit": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "node_modules/micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "dependencies": { "braces": "^3.0.1", "picomatch": "^2.0.5" }, "engines": { "node": ">=8" } }, "node_modules/mime-db": { "version": "1.46.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.29", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", "dev": true, "dependencies": { "mime-db": "1.46.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "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.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, "node_modules/node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/node-notifier": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, "optional": true, "dependencies": { "growly": "^1.3.0", "is-wsl": "^2.2.0", "semver": "^7.3.2", "shellwords": "^0.1.1", "uuid": "^8.3.0", "which": "^2.0.2" } }, "node_modules/node-notifier/node_modules/semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "optional": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/node-releases": { "version": "1.1.71", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "dependencies": { "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "dependencies": { "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "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" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "dependencies": { "node-modules-regexp": "^1.0.0" }, "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" } }, "node_modules/pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^17.0.1" }, "engines": { "node": ">= 10" } }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/pretty-format/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/pretty-format/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/prompts": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" }, "engines": { "node": ">= 6" } }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-4.1.2.tgz", "integrity": "sha512-uLzZpQWfroIqyFWmX/pl0OL2JHJdoU3dbh0dvZ25fChHFJJi56J5oQZhW6QgbT2Llwh1upki84LnTwlZvsungA==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/fast-check" } }, "node_modules/qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true, "engines": { "node": ">=0.6" } }, "node_modules/react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", "dev": true }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" }, "engines": { "node": ">=8" } }, "node_modules/read-pkg-up": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "dependencies": { "regenerate": "^1.4.0" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "node_modules/regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/regexpu-core": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "dependencies": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", "regjsgen": "^0.5.1", "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", "unicode-match-property-value-ecmascript": "^1.2.0" }, "engines": { "node": ">=4" } }, "node_modules/regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "node_modules/regjsparser": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "node_modules/repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true, "engines": { "node": ">=0.10" } }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "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.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "engines": { "node": ">= 6" } }, "node_modules/request-promise-core": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "dependencies": { "lodash": "^4.17.19" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { "request": "^2.34" } }, "node_modules/request-promise-native": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, "engines": { "node": ">=0.12.0" }, "peerDependencies": { "request": "^2.34" } }, "node_modules/request-promise-native/node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" }, "engines": { "node": ">=0.8" } }, "node_modules/request/node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" }, "engines": { "node": ">=0.8" } }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true, "bin": { "uuid": "bin/uuid" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, "engines": { "node": ">=0.12" } }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { "version": "2.41.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.2.tgz", "integrity": "sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=10.0.0" }, "optionalDependencies": { "fsevents": "~2.3.1" } }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true, "engines": { "node": "6.* || >= 7.*" } }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "dependencies": { "ret": "~0.1.10" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "node_modules/sane": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "dependencies": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", "capture-exit": "^2.0.0", "exec-sh": "^0.3.2", "execa": "^1.0.0", "fb-watchman": "^2.0.0", "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" }, "bin": { "sane": "src/cli.js" }, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/sane/node_modules/anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" } }, "node_modules/sane/node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "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.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "engines": { "node": ">=4.8" } }, "node_modules/sane/node_modules/execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.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" }, "engines": { "node": ">=6" } }, "node_modules/sane/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/sane/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "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.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "dependencies": { "remove-trailing-separator": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "dependencies": { "path-key": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/sane/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/sane/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/sane/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "dependencies": { "xmlchars": "^2.2.0" }, "engines": { "node": ">=10" } }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/set-value/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/set-value/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true, "optional": true }, "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-node/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "dependencies": { "kind-of": "^3.2.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-util/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" } }, "node_modules/snapdragon/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "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" } }, "node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "dependencies": { "extend-shallow": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" }, "engines": { "node": ">=0.10.0" } }, "node_modules/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/supports-hyperlinks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">=8" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "node_modules/table": { "version": "6.0.7", "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", "dev": true, "dependencies": { "ajv": "^7.0.2", "lodash": "^4.17.20", "slice-ansi": "^4.0.0", "string-width": "^4.2.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/table/node_modules/ajv": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz", "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, "engines": { "node": ">=8" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, "node_modules/tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/to-object-path/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.1.2" }, "engines": { "node": ">=6" } }, "node_modules/tr46": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "dependencies": { "punycode": "^2.1.1" }, "engines": { "node": ">=8" } }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, "engines": { "node": "*" } }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=4.2.0" } }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/union-value/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "dependencies": { "isarray": "1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "optional": true, "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "node_modules/v8-to-istanbul": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" }, "engines": { "node": ">=10.10.0" } }, "node_modules/v8-to-istanbul/node_modules/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "engines": [ "node >=0.6.0" ], "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "node_modules/w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "dependencies": { "xml-name-validator": "^3.0.0" }, "engines": { "node": ">=10" } }, "node_modules/walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "dependencies": { "makeerror": "1.0.x" } }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, "engines": { "node": ">=10.4" } }, "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "dependencies": { "iconv-lite": "0.4.24" } }, "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "node_modules/whatwg-url": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "dev": true, "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^2.0.2", "webidl-conversions": "^6.1.0" }, "engines": { "node": ">=10" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "node_modules/ws": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", "dev": true, "engines": { "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "node_modules/y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" }, "engines": { "node": ">=8" } }, "node_modules/yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, "engines": { "node": ">=6" } } }, "dependencies": { "@babel/code-frame": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { "@babel/highlight": "^7.12.13" } }, "@babel/compat-data": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.8.tgz", "integrity": "sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog==", "dev": true }, "@babel/core": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.9", "@babel/helper-compilation-targets": "^7.13.10", "@babel/helper-module-transforms": "^7.13.0", "@babel/helpers": "^7.13.10", "@babel/parser": "^7.13.10", "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "lodash": "^4.17.19", "semver": "^6.3.0", "source-map": "^0.5.0" } }, "@babel/generator": { "version": "7.13.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, "requires": { "@babel/types": "^7.13.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, "requires": { "@babel/types": "^7.12.13" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.12.13", "@babel/types": "^7.12.13" } }, "@babel/helper-compilation-targets": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", "dev": true, "requires": { "@babel/compat-data": "^7.13.8", "@babel/helper-validator-option": "^7.12.17", "browserslist": "^4.14.5", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.10.tgz", "integrity": "sha512-YV7r2YxdTUaw84EwNkyrRke/TJHR/UXGiyvACRqvdVJ2/syV2rQuJNnaRLSuYiop8cMRXOgseTGoJCWX0q2fFg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.12.13", "@babel/helper-member-expression-to-functions": "^7.13.0", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { "version": "7.12.17", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", "regexpu-core": "^4.7.1" } }, "@babel/helper-define-polyfill-provider": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", "@babel/helper-plugin-utils": "^7.13.0", "@babel/traverse": "^7.13.0", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" } }, "@babel/helper-explode-assignable-expression": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "dev": true, "requires": { "@babel/types": "^7.13.0" } }, "@babel/helper-function-name": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.12.13", "@babel/template": "^7.12.13", "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, "requires": { "@babel/types": "^7.12.13" } }, "@babel/helper-hoist-variables": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", "dev": true, "requires": { "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "@babel/helper-member-expression-to-functions": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", "dev": true, "requires": { "@babel/types": "^7.13.0" } }, "@babel/helper-module-imports": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", "dev": true, "requires": { "@babel/types": "^7.12.13" } }, "@babel/helper-module-transforms": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.12.13", "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-simple-access": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", "@babel/helper-validator-identifier": "^7.12.11", "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0", "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, "requires": { "@babel/types": "^7.12.13" } }, "@babel/helper-plugin-utils": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", "@babel/helper-wrap-function": "^7.13.0", "@babel/types": "^7.13.0" } }, "@babel/helper-replace-supers": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.13.0", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "@babel/helper-simple-access": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", "dev": true, "requires": { "@babel/types": "^7.12.13" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "requires": { "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/helper-validator-option": { "version": "7.12.17", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", "dev": true }, "@babel/helper-wrap-function": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "dev": true, "requires": { "@babel/helper-function-name": "^7.12.13", "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "@babel/helpers": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", "dev": true, "requires": { "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, "@babel/highlight": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.10.tgz", "integrity": "sha512-0s7Mlrw9uTWkYua7xWr99Wpk2bnGa0ANleKfksYAES8LpWH4gW1OUr42vqKNf0us5UQNfru2wPqMqRITzq/SIQ==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-remap-async-to-generator": "^7.13.0", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-dynamic-import": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "requires": { "@babel/compat-data": "^7.13.8", "@babel/helper-compilation-targets": "^7.13.8", "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz", "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-arrow-functions": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.12.13", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-remap-async-to-generator": "^7.13.0" } }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-block-scoping": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-classes": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", "@babel/helper-function-name": "^7.12.13", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-destructuring": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-duplicate-keys": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-for-of": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-function-name": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, "requires": { "@babel/helper-function-name": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-literals": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-modules-amd": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-simple-access": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { "version": "7.13.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.13.0", "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, "@babel/plugin-transform-new-target": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-object-super": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-replace-supers": "^7.12.13" } }, "@babel/plugin-transform-parameters": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-property-literals": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-regenerator": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-spread": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-template-literals": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-unicode-escapes": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/preset-env": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.10.tgz", "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==", "dev": true, "requires": { "@babel/compat-data": "^7.13.8", "@babel/helper-compilation-targets": "^7.13.10", "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-validator-option": "^7.12.17", "@babel/plugin-proposal-async-generator-functions": "^7.13.8", "@babel/plugin-proposal-class-properties": "^7.13.0", "@babel/plugin-proposal-dynamic-import": "^7.13.8", "@babel/plugin-proposal-export-namespace-from": "^7.12.13", "@babel/plugin-proposal-json-strings": "^7.13.8", "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", "@babel/plugin-proposal-numeric-separator": "^7.12.13", "@babel/plugin-proposal-object-rest-spread": "^7.13.8", "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", "@babel/plugin-proposal-optional-chaining": "^7.13.8", "@babel/plugin-proposal-private-methods": "^7.13.0", "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.12.13", "@babel/plugin-transform-arrow-functions": "^7.13.0", "@babel/plugin-transform-async-to-generator": "^7.13.0", "@babel/plugin-transform-block-scoped-functions": "^7.12.13", "@babel/plugin-transform-block-scoping": "^7.12.13", "@babel/plugin-transform-classes": "^7.13.0", "@babel/plugin-transform-computed-properties": "^7.13.0", "@babel/plugin-transform-destructuring": "^7.13.0", "@babel/plugin-transform-dotall-regex": "^7.12.13", "@babel/plugin-transform-duplicate-keys": "^7.12.13", "@babel/plugin-transform-exponentiation-operator": "^7.12.13", "@babel/plugin-transform-for-of": "^7.13.0", "@babel/plugin-transform-function-name": "^7.12.13", "@babel/plugin-transform-literals": "^7.12.13", "@babel/plugin-transform-member-expression-literals": "^7.12.13", "@babel/plugin-transform-modules-amd": "^7.13.0", "@babel/plugin-transform-modules-commonjs": "^7.13.8", "@babel/plugin-transform-modules-systemjs": "^7.13.8", "@babel/plugin-transform-modules-umd": "^7.13.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", "@babel/plugin-transform-new-target": "^7.12.13", "@babel/plugin-transform-object-super": "^7.12.13", "@babel/plugin-transform-parameters": "^7.13.0", "@babel/plugin-transform-property-literals": "^7.12.13", "@babel/plugin-transform-regenerator": "^7.12.13", "@babel/plugin-transform-reserved-words": "^7.12.13", "@babel/plugin-transform-shorthand-properties": "^7.12.13", "@babel/plugin-transform-spread": "^7.13.0", "@babel/plugin-transform-sticky-regex": "^7.12.13", "@babel/plugin-transform-template-literals": "^7.13.0", "@babel/plugin-transform-typeof-symbol": "^7.12.13", "@babel/plugin-transform-unicode-escapes": "^7.12.13", "@babel/plugin-transform-unicode-regex": "^7.12.13", "@babel/preset-modules": "^0.1.4", "@babel/types": "^7.13.0", "babel-plugin-polyfill-corejs2": "^0.1.4", "babel-plugin-polyfill-corejs3": "^0.1.3", "babel-plugin-polyfill-regenerator": "^0.1.2", "core-js-compat": "^3.9.0", "semver": "^6.3.0" } }, "@babel/preset-modules": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } }, "@babel/runtime": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@babel/parser": "^7.12.13", "@babel/types": "^7.12.13" } }, "@babel/traverse": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.0", "@babel/helper-function-name": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", "@babel/parser": "^7.13.0", "@babel/types": "^7.13.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, "@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" } }, "@eslint/eslintrc": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", "dev": true, "requires": { "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", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" } }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^26.6.2", "jest-util": "^26.6.2", "slash": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/core": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { "@jest/console": "^26.6.2", "@jest/reporters": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^26.6.2", "jest-config": "^26.6.3", "jest-haste-map": "^26.6.2", "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.6.2", "jest-resolve-dependencies": "^26.6.3", "jest-runner": "^26.6.3", "jest-runtime": "^26.6.3", "jest-snapshot": "^26.6.2", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "jest-watcher": "^26.6.2", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/environment": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", "jest-message-util": "^26.6.2", "jest-mock": "^26.6.2", "jest-util": "^26.6.2" } }, "@jest/globals": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { "@jest/environment": "^26.6.2", "@jest/types": "^26.6.2", "expect": "^26.6.2" } }, "@jest/reporters": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^4.0.3", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", "jest-haste-map": "^26.6.2", "jest-resolve": "^26.6.2", "jest-util": "^26.6.2", "jest-worker": "^26.6.2", "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", "v8-to-istanbul": "^7.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/source-map": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "@jest/test-result": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { "@jest/console": "^26.6.2", "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "requires": { "@jest/test-result": "^26.6.2", "graceful-fs": "^4.2.4", "jest-haste-map": "^26.6.2", "jest-runner": "^26.6.3", "jest-runtime": "^26.6.3" } }, "@jest/transform": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { "@babel/core": "^7.1.0", "@jest/types": "^26.6.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", "jest-haste-map": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-util": "^26.6.2", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" } }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" } }, "@sinonjs/commons": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, "@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "@types/babel__generator": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, "@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/node": { "version": "14.14.34", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz", "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==", "dev": true }, "@types/normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, "@types/prettier": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.2.tgz", "integrity": "sha512-i99hy7Ki19EqVOl77WplDrvgNugHnsSjECVR/wUrzw2TJXz1zlUfT2ngGckR6xN7yFYaijsMAqPkOLx9HgUqHg==", "dev": true }, "@types/stack-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, "@types/yargs": { "version": "15.0.13", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { "version": "20.2.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-globals": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" } }, "acorn-jsx": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true, "requires": {} }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { "type-fest": "^0.11.0" } }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", "@babel/traverse": "^7.7.0", "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" } }, "babel-jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "requires": { "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^4.0.0", "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" } }, "babel-plugin-polyfill-corejs2": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", "dev": true, "requires": { "@babel/compat-data": "^7.13.0", "@babel/helper-define-polyfill-provider": "^0.1.5", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.1.5", "core-js-compat": "^3.8.1" } }, "babel-plugin-polyfill-regenerator": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.1.5" } }, "babel-plugin-trace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-trace/-/babel-plugin-trace-1.1.0.tgz", "integrity": "sha512-joLw8IjwmBNcvQKQsJOxNTI7pXN8ipKU1HeZt7DeyIXPgZCd0EuDIxyZPv01PjKQsW8IbSLDZGZ4zafQXI+6Hw==", "dev": true }, "babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, "babel-preset-jest": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "requires": { "babel-plugin-jest-hoist": "^26.6.2", "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } } } }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browserslist": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "requires": { "caniuse-lite": "^1.0.30001181", "colorette": "^1.2.1", "electron-to-chromium": "^1.3.649", "escalade": "^3.1.1", "node-releases": "^1.1.70" } }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" } }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "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" } }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caniuse-lite": { "version": "1.0.30001199", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001199.tgz", "integrity": "sha512-ifbK2eChUCFUwGhlEzIoVwzFt1+iriSjyKKFYNfv6hN34483wyWpLLavYQXhnR036LhkdUYaSDpHg1El++VgHQ==", "dev": true }, "capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { "rsvp": "^4.8.4" } }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "cjs-module-lexer": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "common-tags": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, "core-js-compat": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", "dev": true, "requires": { "browserslist": "^4.16.3", "semver": "7.0.0" }, "dependencies": { "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "dev": true } } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "requires": { "cross-spawn": "^7.0.1" } }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, "cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { "cssom": "~0.3.6" }, "dependencies": { "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true } } }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "requires": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0" } }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decimal.js": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, "diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "requires": { "webidl-conversions": "^5.0.0" }, "dependencies": { "webidl-conversions": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true } } }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "electron-to-chromium": { "version": "1.3.687", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.687.tgz", "integrity": "sha512-IpzksdQNl3wdgkzf7dnA7/v10w0Utf1dF2L+B4+gKrloBrxCut+au+kky3PYvle3RMdSxZP+UiCZtLbcYRxSNQ==", "dev": true }, "emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { "ansi-colors": "^4.1.1" } }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "escodegen": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" } }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { "prelude-ls": "~1.1.2" } } } }, "eslint": { "version": "7.22.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz", "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.0", "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": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^13.6.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.21", "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": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "eslint-visitor-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, "globals": { "version": "13.6.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz", "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true } } }, "eslint-config-prettier": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", "dev": true, "requires": {} }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" }, "dependencies": { "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "exec-sh": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, "execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", "jest-matcher-utils": "^26.6.2", "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "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.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fast-check": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.13.0.tgz", "integrity": "sha512-IOfzKm/SCA+jpUEgAfqAuxHYPmgtmpnnwljQmYPRGrqYczcTKApXKHza/SNxFxYkecWfZilYa0DJdBvqz1bcSw==", "dev": true, "requires": { "pure-rand": "^4.1.1" } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "requires": { "bser": "2.1.1" } }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { "flat-cache": "^3.0.4" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" } }, "flatted": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { "map-cache": "^0.2.2" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" } }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "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" } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true, "optional": true }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" } }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "dependencies": { "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "requires": { "whatwg-encoding": "^1.0.5" } }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "dependencies": { "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { "ci-info": "^2.0.0" } }, "is-core-module": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } }, "is-docker": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true, "optional": true }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" } }, "is-potential-custom-element-name": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", "dev": true }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "optional": true, "requires": { "is-docker": "^2.0.0" } }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" } }, "istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "requires": { "@jest/core": "^26.6.3", "import-local": "^3.0.2", "jest-cli": "^26.6.3" } }, "jest-changed-files": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "requires": { "@jest/types": "^26.6.2", "execa": "^4.0.0", "throat": "^5.0.0" } }, "jest-cli": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "requires": { "@jest/core": "^26.6.3", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", "jest-config": "^26.6.3", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "prompts": "^2.0.1", "yargs": "^15.4.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-config": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { "@babel/core": "^7.1.0", "@jest/test-sequencer": "^26.6.3", "@jest/types": "^26.6.2", "babel-jest": "^26.6.3", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "jest-environment-jsdom": "^26.6.2", "jest-environment-node": "^26.6.2", "jest-get-type": "^26.3.0", "jest-jasmine2": "^26.6.3", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.6.2", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "micromatch": "^4.0.2", "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-diff": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^26.6.2", "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-docblock": { "version": "26.0.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "jest-util": "^26.6.2", "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-environment-jsdom": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "jest-mock": "^26.6.2", "jest-util": "^26.6.2", "jsdom": "^16.4.0" } }, "jest-environment-node": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "jest-mock": "^26.6.2", "jest-util": "^26.6.2" } }, "jest-get-type": { "version": "26.3.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-haste-map": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", "jest-serializer": "^26.6.2", "jest-util": "^26.6.2", "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", "@jest/environment": "^26.6.2", "@jest/source-map": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "expect": "^26.6.2", "is-generator-fn": "^2.0.0", "jest-each": "^26.6.2", "jest-matcher-utils": "^26.6.2", "jest-message-util": "^26.6.2", "jest-runtime": "^26.6.3", "jest-snapshot": "^26.6.2", "jest-util": "^26.6.2", "pretty-format": "^26.6.2", "throat": "^5.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-leak-detector": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "requires": { "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" } }, "jest-matcher-utils": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { "chalk": "^4.0.0", "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-message-util": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@jest/types": "^26.6.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-mock": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { "@jest/types": "^26.6.2", "@types/node": "*" } }, "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true, "requires": {} }, "jest-regex-util": { "version": "26.0.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, "jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^26.6.2", "read-pkg-up": "^7.0.1", "resolve": "^1.18.1", "slash": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-resolve-dependencies": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { "@jest/types": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-snapshot": "^26.6.2" } }, "jest-runner": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-config": "^26.6.3", "jest-docblock": "^26.0.0", "jest-haste-map": "^26.6.2", "jest-leak-detector": "^26.6.2", "jest-message-util": "^26.6.2", "jest-resolve": "^26.6.2", "jest-runtime": "^26.6.3", "jest-util": "^26.6.2", "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-runtime": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", "dev": true, "requires": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", "@jest/globals": "^26.6.2", "@jest/source-map": "^26.6.2", "@jest/test-result": "^26.6.2", "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", "jest-config": "^26.6.3", "jest-haste-map": "^26.6.2", "jest-message-util": "^26.6.2", "jest-mock": "^26.6.2", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.6.2", "jest-snapshot": "^26.6.2", "jest-util": "^26.6.2", "jest-validate": "^26.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.4.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-serializer": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", "graceful-fs": "^4.2.4" } }, "jest-snapshot": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "requires": { "@babel/types": "^7.0.0", "@jest/types": "^26.6.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", "expect": "^26.6.2", "graceful-fs": "^4.2.4", "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", "jest-haste-map": "^26.6.2", "jest-matcher-utils": "^26.6.2", "jest-message-util": "^26.6.2", "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", "pretty-format": "^26.6.2", "semver": "^7.3.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-util": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "micromatch": "^4.0.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-validate": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-watcher": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "jest-util": "^26.6.2", "string-length": "^4.0.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "jsdom": { "version": "16.5.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz", "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==", "dev": true, "requires": { "abab": "^2.0.5", "acorn": "^8.0.5", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", "data-urls": "^2.0.0", "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", "html-encoding-sniffer": "^2.0.1", "is-potential-custom-element-name": "^1.0.0", "nwsapi": "^2.2.0", "parse5": "6.0.1", "request": "^2.88.2", "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0", "ws": "^7.4.4", "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", "dev": true } } }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" } }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" } }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { "tmpl": "1.0.x" } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { "object-visit": "^1.0.0" } }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.0.5" } }, "mime-db": { "version": "1.46.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", "dev": true }, "mime-types": { "version": "2.1.29", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", "dev": true, "requires": { "mime-db": "1.46.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "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.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, "node-notifier": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, "optional": true, "requires": { "growly": "^1.3.0", "is-wsl": "^2.2.0", "semver": "^7.3.2", "shellwords": "^0.1.1", "uuid": "^8.3.0", "which": "^2.0.2" }, "dependencies": { "semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "optional": true, "requires": { "lru-cache": "^6.0.0" } } } }, "node-releases": { "version": "1.1.71", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" }, "dependencies": { "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" } }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "^3.0.2" } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "^3.0.2" } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { "isobject": "^3.0.0" } }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { "isobject": "^3.0.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { "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-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" } }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { "node-modules-regexp": "^1.0.0" } }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" } }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", "dev": true }, "pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^17.0.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } } }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "prompts": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "pure-rand": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-4.1.2.tgz", "integrity": "sha512-uLzZpQWfroIqyFWmX/pl0OL2JHJdoU3dbh0dvZ25fChHFJJi56J5oQZhW6QgbT2Llwh1upki84LnTwlZvsungA==", "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", "dev": true }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" }, "dependencies": { "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } }, "read-pkg-up": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" }, "dependencies": { "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" } }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "regexpu-core": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", "regjsgen": "^0.5.1", "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", "dev": true, "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "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.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "dependencies": { "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true } } }, "request-promise-core": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { "lodash": "^4.17.19" } }, "request-promise-native": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "dev": true, "requires": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, "dependencies": { "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" } } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { "resolve-from": "^5.0.0" } }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "rollup": { "version": "2.41.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.2.tgz", "integrity": "sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg==", "dev": true, "requires": { "fsevents": "~2.3.1" } }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { "ret": "~0.1.10" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "sane": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", "capture-exit": "^2.0.0", "exec-sh": "^0.3.2", "execa": "^1.0.0", "fb-watchman": "^2.0.0", "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" }, "dependencies": { "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" } }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { "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.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.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" } }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "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.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" } }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "requires": { "xmlchars": "^2.2.0" } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true } } }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } } }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } } } }, "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, "stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "dev": true, "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" } }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "supports-hyperlinks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "table": { "version": "6.0.7", "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", "dev": true, "requires": { "ajv": "^7.0.2", "lodash": "^4.17.20", "slice-ansi": "^4.0.0", "string-width": "^4.2.0" }, "dependencies": { "ajv": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz", "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true } } }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" } }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } }, "tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.1.2" } }, "tr46": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "requires": { "punycode": "^2.1.1" } }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" } }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { "is-typedarray": "^1.0.0" } }, "typescript": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" }, "dependencies": { "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true } } }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { "isarray": "1.0.0" } } } }, "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true } } }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "optional": true }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8-to-istanbul": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" }, "dependencies": { "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "requires": { "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "requires": { "xml-name-validator": "^3.0.0" } }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { "makeerror": "1.0.x" } }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "requires": { "iconv-lite": "0.4.24" } }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "whatwg-url": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^2.0.2", "webidl-conversions": "^6.1.0" } }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "ws": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", "dev": true, "requires": {} }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } } yaml-1.10.2/package.json000066400000000000000000000060111402322402300150110ustar00rootroot00000000000000{ "name": "yaml", "version": "1.10.2", "license": "ISC", "author": "Eemeli Aro ", "repository": "github:eemeli/yaml", "description": "JavaScript parser and stringifier for YAML", "keywords": [ "YAML", "parser", "stringifier" ], "homepage": "https://eemeli.org/yaml/v1/", "files": [ "browser/", "dist/", "types/", "*.d.ts", "*.js", "*.mjs", "!*config.js" ], "type": "commonjs", "main": "./index.js", "browser": { "./index.js": "./browser/index.js", "./map.js": "./browser/map.js", "./pair.js": "./browser/pair.js", "./parse-cst.js": "./browser/parse-cst.js", "./scalar.js": "./browser/scalar.js", "./schema.js": "./browser/schema.js", "./seq.js": "./browser/seq.js", "./types.js": "./browser/types.js", "./types.mjs": "./browser/types.js", "./types/binary.js": "./browser/types/binary.js", "./types/omap.js": "./browser/types/omap.js", "./types/pairs.js": "./browser/types/pairs.js", "./types/set.js": "./browser/types/set.js", "./types/timestamp.js": "./browser/types/timestamp.js", "./util.js": "./browser/util.js", "./util.mjs": "./browser/util.js" }, "exports": { ".": "./index.js", "./parse-cst": "./parse-cst.js", "./types": [ { "import": "./types.mjs" }, "./types.js" ], "./util": [ { "import": "./util.mjs" }, "./util.js" ], "./": "./" }, "scripts": { "build": "npm run build:node && npm run build:browser", "build:browser": "rollup -c rollup.browser-config.js", "build:node": "rollup -c rollup.node-config.js", "clean": "git clean -fdxe node_modules", "lint": "eslint src/", "prettier": "prettier --write .", "start": "cross-env TRACE_LEVEL=log npm run build:node && node -i -e 'YAML=require(\".\")'", "test": "jest", "test:browsers": "cd playground && npm test", "test:dist": "npm run build:node && jest", "test:types": "tsc --lib ES2017 --noEmit tests/typings.ts", "docs:install": "cd docs-slate && bundle install", "docs:deploy": "cd docs-slate && ./deploy.sh", "docs": "cd docs-slate && bundle exec middleman server", "preversion": "npm test && npm run build", "prepublishOnly": "npm run clean && npm test && npm run build" }, "browserslist": "> 0.5%, not dead", "prettier": { "arrowParens": "avoid", "semi": false, "singleQuote": true, "trailingComma": "none" }, "devDependencies": { "@babel/core": "^7.12.10", "@babel/plugin-proposal-class-properties": "^7.12.1", "@babel/preset-env": "^7.12.11", "@rollup/plugin-babel": "^5.2.3", "babel-eslint": "^10.1.0", "babel-jest": "^26.6.3", "babel-plugin-trace": "^1.1.0", "common-tags": "^1.8.0", "cross-env": "^7.0.3", "eslint": "^7.19.0", "eslint-config-prettier": "^7.2.0", "fast-check": "^2.12.0", "jest": "^26.6.3", "prettier": "^2.2.1", "rollup": "^2.38.2", "typescript": "^4.1.3" }, "engines": { "node": ">= 6" } } yaml-1.10.2/pair.js000066400000000000000000000001571402322402300140210ustar00rootroot00000000000000module.exports = require('./dist/types').Pair require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/parse-cst.d.ts000066400000000000000000000106401402322402300152210ustar00rootroot00000000000000import { Type, YAMLSyntaxError } from './util' export default function parseCST(str: string): ParsedCST export interface ParsedCST extends Array { setOrigRanges(): boolean } export namespace CST { interface Range { start: number end: number origStart?: number origEnd?: number isEmpty(): boolean } interface ParseContext { /** Node starts at beginning of line */ atLineStart: boolean /** true if currently in a collection context */ inCollection: boolean /** true if currently in a flow context */ inFlow: boolean /** Current level of indentation */ indent: number /** Start of the current line */ lineStart: number /** The parent of the node */ parent: Node /** Source of the YAML document */ src: string } interface Node { context: ParseContext | null /** if not null, indicates a parser failure */ error: YAMLSyntaxError | null /** span of context.src parsed into this node */ range: Range | null valueRange: Range | null /** anchors, tags and comments */ props: Range[] /** specific node type */ type: Type /** if non-null, overrides source value */ value: string | null readonly anchor: string | null readonly comment: string | null readonly hasComment: boolean readonly hasProps: boolean readonly jsonLike: boolean readonly rangeAsLinePos: null | { start: { line: number; col: number } end?: { line: number; col: number } } readonly rawValue: string | null readonly tag: | null | { verbatim: string } | { handle: string; suffix: string } readonly valueRangeContainsNewline: boolean } interface Alias extends Node { type: Type.ALIAS /** contain the anchor without the * prefix */ readonly rawValue: string } type Scalar = BlockValue | PlainValue | QuoteValue interface BlockValue extends Node { type: Type.BLOCK_FOLDED | Type.BLOCK_LITERAL chomping: 'CLIP' | 'KEEP' | 'STRIP' blockIndent: number | null header: Range readonly strValue: string | null } interface BlockFolded extends BlockValue { type: Type.BLOCK_FOLDED } interface BlockLiteral extends BlockValue { type: Type.BLOCK_LITERAL } interface PlainValue extends Node { type: Type.PLAIN readonly strValue: string | null } interface QuoteValue extends Node { type: Type.QUOTE_DOUBLE | Type.QUOTE_SINGLE readonly strValue: | null | string | { str: string; errors: YAMLSyntaxError[] } } interface QuoteDouble extends QuoteValue { type: Type.QUOTE_DOUBLE } interface QuoteSingle extends QuoteValue { type: Type.QUOTE_SINGLE } interface Comment extends Node { type: Type.COMMENT readonly anchor: null readonly comment: string readonly rawValue: null readonly tag: null } interface BlankLine extends Node { type: Type.BLANK_LINE } interface MapItem extends Node { type: Type.MAP_KEY | Type.MAP_VALUE node: ContentNode | null } interface MapKey extends MapItem { type: Type.MAP_KEY } interface MapValue extends MapItem { type: Type.MAP_VALUE } interface Map extends Node { type: Type.MAP /** implicit keys are not wrapped */ items: Array } interface SeqItem extends Node { type: Type.SEQ_ITEM node: ContentNode | null } interface Seq extends Node { type: Type.SEQ items: Array } interface FlowChar { char: '{' | '}' | '[' | ']' | ',' | '?' | ':' offset: number origOffset?: number } interface FlowCollection extends Node { type: Type.FLOW_MAP | Type.FLOW_SEQ items: Array< FlowChar | BlankLine | Comment | Alias | Scalar | FlowCollection > } interface FlowMap extends FlowCollection { type: Type.FLOW_MAP } interface FlowSeq extends FlowCollection { type: Type.FLOW_SEQ } type ContentNode = Alias | Scalar | Map | Seq | FlowCollection interface Directive extends Node { type: Type.DIRECTIVE name: string readonly anchor: null readonly parameters: string[] readonly tag: null } interface Document extends Node { type: Type.DOCUMENT directives: Array contents: Array readonly anchor: null readonly comment: null readonly tag: null } } yaml-1.10.2/parse-cst.js000066400000000000000000000000631402322402300147630ustar00rootroot00000000000000module.exports = require('./dist/parse-cst').parse yaml-1.10.2/playground/000077500000000000000000000000001402322402300147115ustar00rootroot00000000000000yaml-1.10.2/rollup.browser-config.js000066400000000000000000000006301402322402300173240ustar00rootroot00000000000000import babel from '@rollup/plugin-babel' export default { input: { index: 'src/index.js', 'legacy-exports': 'src/legacy-exports.js', 'parse-cst': 'src/cst/parse.js', types: 'src/types.js', util: 'src/util.js' }, output: { dir: 'browser/dist', format: 'esm' }, plugins: [ babel({ babelHelpers: 'bundled', presets: [['@babel/env', { modules: false }]] }) ] } yaml-1.10.2/rollup.node-config.js000066400000000000000000000007441402322402300165740ustar00rootroot00000000000000import babel from '@rollup/plugin-babel' export default { input: { index: 'src/index.js', 'legacy-exports': 'src/legacy-exports.js', 'parse-cst': 'src/cst/parse.js', 'test-events': 'src/test-events.js', types: 'src/types.js', util: 'src/util.js' }, output: { dir: 'dist', format: 'cjs', esModule: false }, plugins: [ babel({ babelHelpers: 'bundled', presets: [['@babel/env', { modules: false, targets: { node: '6.5' } }]] }) ] } yaml-1.10.2/scalar.js000066400000000000000000000001611402322402300143260ustar00rootroot00000000000000module.exports = require('./dist/types').Scalar require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/schema.js000066400000000000000000000004671402322402300143320ustar00rootroot00000000000000const types = require('./dist/types') const util = require('./dist/util') module.exports = types.Schema module.exports.nullOptions = types.nullOptions module.exports.strOptions = types.strOptions module.exports.stringify = util.stringifyString require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/seq.js000066400000000000000000000001621402322402300136520ustar00rootroot00000000000000module.exports = require('./dist/types').YAMLSeq require('./dist/legacy-exports').warnFileDeprecation(__filename) yaml-1.10.2/src/000077500000000000000000000000001402322402300133145ustar00rootroot00000000000000yaml-1.10.2/src/ast/000077500000000000000000000000001402322402300141035ustar00rootroot00000000000000yaml-1.10.2/src/ast/Alias.js000066400000000000000000000050141402322402300154720ustar00rootroot00000000000000import { Type } from '../constants.js' import { YAMLReferenceError } from '../errors.js' import { Collection } from './Collection.js' import { Node } from './Node.js' import { Pair } from './Pair.js' import { toJSON } from './toJSON.js' const getAliasCount = (node, anchors) => { if (node instanceof Alias) { const anchor = anchors.get(node.source) return anchor.count * anchor.aliasCount } else if (node instanceof Collection) { let count = 0 for (const item of node.items) { const c = getAliasCount(item, anchors) if (c > count) count = c } return count } else if (node instanceof Pair) { const kc = getAliasCount(node.key, anchors) const vc = getAliasCount(node.value, anchors) return Math.max(kc, vc) } return 1 } export class Alias extends Node { static default = true static stringify( { range, source }, { anchors, doc, implicitKey, inStringifyKey } ) { let anchor = Object.keys(anchors).find(a => anchors[a] === source) if (!anchor && inStringifyKey) anchor = doc.anchors.getName(source) || doc.anchors.newName() if (anchor) return `*${anchor}${implicitKey ? ' ' : ''}` const msg = doc.anchors.getName(source) ? 'Alias node must be after source node' : 'Source node not found for alias node' throw new Error(`${msg} [${range}]`) } constructor(source) { super() this.source = source this.type = Type.ALIAS } set tag(t) { throw new Error('Alias nodes cannot have tags') } toJSON(arg, ctx) { if (!ctx) return toJSON(this.source, arg, ctx) const { anchors, maxAliasCount } = ctx const anchor = anchors.get(this.source) /* istanbul ignore if */ if (!anchor || anchor.res === undefined) { const msg = 'This should not happen: Alias anchor was not resolved?' if (this.cstNode) throw new YAMLReferenceError(this.cstNode, msg) else throw new ReferenceError(msg) } if (maxAliasCount >= 0) { anchor.count += 1 if (anchor.aliasCount === 0) anchor.aliasCount = getAliasCount(this.source, anchors) if (anchor.count * anchor.aliasCount > maxAliasCount) { const msg = 'Excessive alias count indicates a resource exhaustion attack' if (this.cstNode) throw new YAMLReferenceError(this.cstNode, msg) else throw new ReferenceError(msg) } } return anchor.res } // Only called when stringifying an alias mapping key while constructing // Object output. toString(ctx) { return Alias.stringify(this, ctx) } } yaml-1.10.2/src/ast/Collection.js000066400000000000000000000132471402322402300165430ustar00rootroot00000000000000import { addComment } from '../stringify/addComment.js' import { Type } from '../constants.js' import { Node } from './Node.js' import { Scalar } from './Scalar.js' function collectionFromPath(schema, path, value) { let v = value for (let i = path.length - 1; i >= 0; --i) { const k = path[i] if (Number.isInteger(k) && k >= 0) { const a = [] a[k] = v v = a } else { const o = {} Object.defineProperty(o, k, { value: v, writable: true, enumerable: true, configurable: true }) v = o } } return schema.createNode(v, false) } // null, undefined, or an empty non-string iterable (e.g. []) export const isEmptyPath = path => path == null || (typeof path === 'object' && path[Symbol.iterator]().next().done) export class Collection extends Node { static maxFlowStringSingleLineLength = 60 items = [] constructor(schema) { super() this.schema = schema } addIn(path, value) { if (isEmptyPath(path)) this.add(value) else { const [key, ...rest] = path const node = this.get(key, true) if (node instanceof Collection) node.addIn(rest, value) else if (node === undefined && this.schema) this.set(key, collectionFromPath(this.schema, rest, value)) else throw new Error( `Expected YAML collection at ${key}. Remaining path: ${rest}` ) } } deleteIn([key, ...rest]) { if (rest.length === 0) return this.delete(key) const node = this.get(key, true) if (node instanceof Collection) return node.deleteIn(rest) else throw new Error( `Expected YAML collection at ${key}. Remaining path: ${rest}` ) } getIn([key, ...rest], keepScalar) { const node = this.get(key, true) if (rest.length === 0) return !keepScalar && node instanceof Scalar ? node.value : node else return node instanceof Collection ? node.getIn(rest, keepScalar) : undefined } hasAllNullValues() { return this.items.every(node => { if (!node || node.type !== 'PAIR') return false const n = node.value return ( n == null || (n instanceof Scalar && n.value == null && !n.commentBefore && !n.comment && !n.tag) ) }) } hasIn([key, ...rest]) { if (rest.length === 0) return this.has(key) const node = this.get(key, true) return node instanceof Collection ? node.hasIn(rest) : false } setIn([key, ...rest], value) { if (rest.length === 0) { this.set(key, value) } else { const node = this.get(key, true) if (node instanceof Collection) node.setIn(rest, value) else if (node === undefined && this.schema) this.set(key, collectionFromPath(this.schema, rest, value)) else throw new Error( `Expected YAML collection at ${key}. Remaining path: ${rest}` ) } } // overridden in implementations /* istanbul ignore next */ toJSON() { return null } toString( ctx, { blockItem, flowChars, isMap, itemIndent }, onComment, onChompKeep ) { const { indent, indentStep, stringify } = ctx const inFlow = this.type === Type.FLOW_MAP || this.type === Type.FLOW_SEQ || ctx.inFlow if (inFlow) itemIndent += indentStep const allNullValues = isMap && this.hasAllNullValues() ctx = Object.assign({}, ctx, { allNullValues, indent: itemIndent, inFlow, type: null }) let chompKeep = false let hasItemWithNewLine = false const nodes = this.items.reduce((nodes, item, i) => { let comment if (item) { if (!chompKeep && item.spaceBefore) nodes.push({ type: 'comment', str: '' }) if (item.commentBefore) item.commentBefore.match(/^.*$/gm).forEach(line => { nodes.push({ type: 'comment', str: `#${line}` }) }) if (item.comment) comment = item.comment if ( inFlow && ((!chompKeep && item.spaceBefore) || item.commentBefore || item.comment || (item.key && (item.key.commentBefore || item.key.comment)) || (item.value && (item.value.commentBefore || item.value.comment))) ) hasItemWithNewLine = true } chompKeep = false let str = stringify( item, ctx, () => (comment = null), () => (chompKeep = true) ) if (inFlow && !hasItemWithNewLine && str.includes('\n')) hasItemWithNewLine = true if (inFlow && i < this.items.length - 1) str += ',' str = addComment(str, itemIndent, comment) if (chompKeep && (comment || inFlow)) chompKeep = false nodes.push({ type: 'item', str }) return nodes }, []) let str if (nodes.length === 0) { str = flowChars.start + flowChars.end } else if (inFlow) { const { start, end } = flowChars const strings = nodes.map(n => n.str) if ( hasItemWithNewLine || strings.reduce((sum, str) => sum + str.length + 2, 2) > Collection.maxFlowStringSingleLineLength ) { str = start for (const s of strings) { str += s ? `\n${indentStep}${indent}${s}` : '\n' } str += `\n${indent}${end}` } else { str = `${start} ${strings.join(' ')} ${end}` } } else { const strings = nodes.map(blockItem) str = strings.shift() for (const s of strings) str += s ? `\n${indent}${s}` : '\n' } if (this.comment) { str += '\n' + this.comment.replace(/^/gm, `${indent}#`) if (onComment) onComment() } else if (chompKeep && onChompKeep) onChompKeep() return str } } yaml-1.10.2/src/ast/Merge.js000066400000000000000000000040271402322402300155030ustar00rootroot00000000000000import { Pair } from './Pair.js' import { Scalar } from './Scalar.js' import { YAMLMap } from './YAMLMap.js' import { YAMLSeq } from './YAMLSeq.js' export const MERGE_KEY = '<<' export class Merge extends Pair { constructor(pair) { if (pair instanceof Pair) { let seq = pair.value if (!(seq instanceof YAMLSeq)) { seq = new YAMLSeq() seq.items.push(pair.value) seq.range = pair.value.range } super(pair.key, seq) this.range = pair.range } else { super(new Scalar(MERGE_KEY), new YAMLSeq()) } this.type = Pair.Type.MERGE_PAIR } // If the value associated with a merge key is a single mapping node, each of // its key/value pairs is inserted into the current mapping, unless the key // already exists in it. If the value associated with the merge key is a // sequence, then this sequence is expected to contain mapping nodes and each // of these nodes is merged in turn according to its order in the sequence. // Keys in mapping nodes earlier in the sequence override keys specified in // later mapping nodes. -- http://yaml.org/type/merge.html addToJSMap(ctx, map) { for (const { source } of this.value.items) { if (!(source instanceof YAMLMap)) throw new Error('Merge sources must be maps') const srcMap = source.toJSON(null, ctx, Map) for (const [key, value] of srcMap) { if (map instanceof Map) { if (!map.has(key)) map.set(key, value) } else if (map instanceof Set) { map.add(key) } else if (!Object.prototype.hasOwnProperty.call(map, key)) { Object.defineProperty(map, key, { value, writable: true, enumerable: true, configurable: true }) } } } return map } toString(ctx, onComment) { const seq = this.value if (seq.items.length > 1) return super.toString(ctx, onComment) this.value = seq.items[0] const str = super.toString(ctx, onComment) this.value = seq return str } } yaml-1.10.2/src/ast/Node.js000066400000000000000000000000251402322402300153230ustar00rootroot00000000000000export class Node {} yaml-1.10.2/src/ast/Pair.js000066400000000000000000000126361402322402300153440ustar00rootroot00000000000000import { Type } from '../constants.js' import { addComment } from '../stringify/addComment.js' import { Collection } from './Collection.js' import { Node } from './Node.js' import { Scalar } from './Scalar.js' import { YAMLSeq } from './YAMLSeq.js' import { toJSON } from './toJSON.js' const stringifyKey = (key, jsKey, ctx) => { if (jsKey === null) return '' if (typeof jsKey !== 'object') return String(jsKey) if (key instanceof Node && ctx && ctx.doc) return key.toString({ anchors: Object.create(null), doc: ctx.doc, indent: '', indentStep: ctx.indentStep, inFlow: true, inStringifyKey: true, stringify: ctx.stringify }) return JSON.stringify(jsKey) } export class Pair extends Node { static Type = { PAIR: 'PAIR', MERGE_PAIR: 'MERGE_PAIR' } constructor(key, value = null) { super() this.key = key this.value = value this.type = Pair.Type.PAIR } get commentBefore() { return this.key instanceof Node ? this.key.commentBefore : undefined } set commentBefore(cb) { if (this.key == null) this.key = new Scalar(null) if (this.key instanceof Node) this.key.commentBefore = cb else { const msg = 'Pair.commentBefore is an alias for Pair.key.commentBefore. To set it, the key must be a Node.' throw new Error(msg) } } addToJSMap(ctx, map) { const key = toJSON(this.key, '', ctx) if (map instanceof Map) { const value = toJSON(this.value, key, ctx) map.set(key, value) } else if (map instanceof Set) { map.add(key) } else { const stringKey = stringifyKey(this.key, key, ctx) const value = toJSON(this.value, stringKey, ctx) if (stringKey in map) Object.defineProperty(map, stringKey, { value, writable: true, enumerable: true, configurable: true }) else map[stringKey] = value } return map } toJSON(_, ctx) { const pair = ctx && ctx.mapAsMap ? new Map() : {} return this.addToJSMap(ctx, pair) } toString(ctx, onComment, onChompKeep) { if (!ctx || !ctx.doc) return JSON.stringify(this) const { indent: indentSize, indentSeq, simpleKeys } = ctx.doc.options let { key, value } = this let keyComment = key instanceof Node && key.comment if (simpleKeys) { if (keyComment) { throw new Error('With simple keys, key nodes cannot have comments') } if (key instanceof Collection) { const msg = 'With simple keys, collection cannot be used as a key value' throw new Error(msg) } } let explicitKey = !simpleKeys && (!key || keyComment || (key instanceof Node ? key instanceof Collection || key.type === Type.BLOCK_FOLDED || key.type === Type.BLOCK_LITERAL : typeof key === 'object')) const { doc, indent, indentStep, stringify } = ctx ctx = Object.assign({}, ctx, { implicitKey: !explicitKey, indent: indent + indentStep }) let chompKeep = false let str = stringify( key, ctx, () => (keyComment = null), () => (chompKeep = true) ) str = addComment(str, ctx.indent, keyComment) if (!explicitKey && str.length > 1024) { if (simpleKeys) throw new Error( 'With simple keys, single line scalar must not span more than 1024 characters' ) explicitKey = true } if (ctx.allNullValues && !simpleKeys) { if (this.comment) { str = addComment(str, ctx.indent, this.comment) if (onComment) onComment() } else if (chompKeep && !keyComment && onChompKeep) onChompKeep() return ctx.inFlow && !explicitKey ? str : `? ${str}` } str = explicitKey ? `? ${str}\n${indent}:` : `${str}:` if (this.comment) { // expected (but not strictly required) to be a single-line comment str = addComment(str, ctx.indent, this.comment) if (onComment) onComment() } let vcb = '' let valueComment = null if (value instanceof Node) { if (value.spaceBefore) vcb = '\n' if (value.commentBefore) { const cs = value.commentBefore.replace(/^/gm, `${ctx.indent}#`) vcb += `\n${cs}` } valueComment = value.comment } else if (value && typeof value === 'object') { value = doc.schema.createNode(value, true) } ctx.implicitKey = false if (!explicitKey && !this.comment && value instanceof Scalar) ctx.indentAtStart = str.length + 1 chompKeep = false if ( !indentSeq && indentSize >= 2 && !ctx.inFlow && !explicitKey && value instanceof YAMLSeq && value.type !== Type.FLOW_SEQ && !value.tag && !doc.anchors.getName(value) ) { // If indentSeq === false, consider '- ' as part of indentation where possible ctx.indent = ctx.indent.substr(2) } const valueStr = stringify( value, ctx, () => (valueComment = null), () => (chompKeep = true) ) let ws = ' ' if (vcb || this.comment) { ws = `${vcb}\n${ctx.indent}` } else if (!explicitKey && value instanceof Collection) { const flow = valueStr[0] === '[' || valueStr[0] === '{' if (!flow || valueStr.includes('\n')) ws = `\n${ctx.indent}` } else if (valueStr[0] === '\n') ws = '' if (chompKeep && !valueComment && onChompKeep) onChompKeep() return addComment(str + ws + valueStr, ctx.indent, valueComment) } } yaml-1.10.2/src/ast/Scalar.js000066400000000000000000000004751402322402300156540ustar00rootroot00000000000000import { Node } from './Node.js' import { toJSON } from './toJSON.js' export class Scalar extends Node { constructor(value) { super() this.value = value } toJSON(arg, ctx) { return ctx && ctx.keep ? this.value : toJSON(this.value, arg, ctx) } toString() { return String(this.value) } } yaml-1.10.2/src/ast/YAMLMap.js000066400000000000000000000047151402322402300156500ustar00rootroot00000000000000import { Collection } from './Collection.js' import { Pair } from './Pair.js' import { Scalar } from './Scalar.js' export function findPair(items, key) { const k = key instanceof Scalar ? key.value : key for (const it of items) { if (it instanceof Pair) { if (it.key === key || it.key === k) return it if (it.key && it.key.value === k) return it } } return undefined } export class YAMLMap extends Collection { add(pair, overwrite) { if (!pair) pair = new Pair(pair) else if (!(pair instanceof Pair)) pair = new Pair(pair.key || pair, pair.value) const prev = findPair(this.items, pair.key) const sortEntries = this.schema && this.schema.sortMapEntries if (prev) { if (overwrite) prev.value = pair.value else throw new Error(`Key ${pair.key} already set`) } else if (sortEntries) { const i = this.items.findIndex(item => sortEntries(pair, item) < 0) if (i === -1) this.items.push(pair) else this.items.splice(i, 0, pair) } else { this.items.push(pair) } } delete(key) { const it = findPair(this.items, key) if (!it) return false const del = this.items.splice(this.items.indexOf(it), 1) return del.length > 0 } get(key, keepScalar) { const it = findPair(this.items, key) const node = it && it.value return !keepScalar && node instanceof Scalar ? node.value : node } has(key) { return !!findPair(this.items, key) } set(key, value) { this.add(new Pair(key, value), true) } /** * @param {*} arg ignored * @param {*} ctx Conversion context, originally set in Document#toJSON() * @param {Class} Type If set, forces the returned collection type * @returns {*} Instance of Type, Map, or Object */ toJSON(_, ctx, Type) { const map = Type ? new Type() : ctx && ctx.mapAsMap ? new Map() : {} if (ctx && ctx.onCreate) ctx.onCreate(map) for (const item of this.items) item.addToJSMap(ctx, map) return map } toString(ctx, onComment, onChompKeep) { if (!ctx) return JSON.stringify(this) for (const item of this.items) { if (!(item instanceof Pair)) throw new Error( `Map items must all be pairs; found ${JSON.stringify(item)} instead` ) } return super.toString( ctx, { blockItem: n => n.str, flowChars: { start: '{', end: '}' }, isMap: true, itemIndent: ctx.indent || '' }, onComment, onChompKeep ) } } yaml-1.10.2/src/ast/YAMLSeq.js000066400000000000000000000031451402322402300156570ustar00rootroot00000000000000import { Collection } from './Collection.js' import { Scalar } from './Scalar.js' import { toJSON } from './toJSON.js' function asItemIndex(key) { let idx = key instanceof Scalar ? key.value : key if (idx && typeof idx === 'string') idx = Number(idx) return Number.isInteger(idx) && idx >= 0 ? idx : null } export class YAMLSeq extends Collection { add(value) { this.items.push(value) } delete(key) { const idx = asItemIndex(key) if (typeof idx !== 'number') return false const del = this.items.splice(idx, 1) return del.length > 0 } get(key, keepScalar) { const idx = asItemIndex(key) if (typeof idx !== 'number') return undefined const it = this.items[idx] return !keepScalar && it instanceof Scalar ? it.value : it } has(key) { const idx = asItemIndex(key) return typeof idx === 'number' && idx < this.items.length } set(key, value) { const idx = asItemIndex(key) if (typeof idx !== 'number') throw new Error(`Expected a valid index, not ${key}.`) this.items[idx] = value } toJSON(_, ctx) { const seq = [] if (ctx && ctx.onCreate) ctx.onCreate(seq) let i = 0 for (const item of this.items) seq.push(toJSON(item, String(i++), ctx)) return seq } toString(ctx, onComment, onChompKeep) { if (!ctx) return JSON.stringify(this) return super.toString( ctx, { blockItem: n => (n.type === 'comment' ? n.str : `- ${n.str}`), flowChars: { start: '[', end: ']' }, isMap: false, itemIndent: (ctx.indent || '') + ' ' }, onComment, onChompKeep ) } } yaml-1.10.2/src/ast/index.js000066400000000000000000000005451402322402300155540ustar00rootroot00000000000000export { Alias } from './Alias.js' export { Collection, isEmptyPath } from './Collection.js' export { Merge } from './Merge.js' export { Node } from './Node.js' export { Pair } from './Pair.js' export { Scalar } from './Scalar.js' export { YAMLMap, findPair } from './YAMLMap.js' export { YAMLSeq } from './YAMLSeq.js' export { toJSON } from './toJSON.js' yaml-1.10.2/src/ast/toJSON.js000066400000000000000000000010521402322402300155530ustar00rootroot00000000000000export function toJSON(value, arg, ctx) { if (Array.isArray(value)) return value.map((v, i) => toJSON(v, String(i), ctx)) if (value && typeof value.toJSON === 'function') { const anchor = ctx && ctx.anchors && ctx.anchors.get(value) if (anchor) ctx.onCreate = res => { anchor.res = res delete ctx.onCreate } const res = value.toJSON(arg, ctx) if (anchor && ctx.onCreate) ctx.onCreate(res) return res } if ((!ctx || !ctx.keep) && typeof value === 'bigint') return Number(value) return value } yaml-1.10.2/src/constants.js000066400000000000000000000013301402322402300156630ustar00rootroot00000000000000export const Char = { ANCHOR: '&', COMMENT: '#', TAG: '!', DIRECTIVES_END: '-', DOCUMENT_END: '.' } export const Type = { ALIAS: 'ALIAS', BLANK_LINE: 'BLANK_LINE', BLOCK_FOLDED: 'BLOCK_FOLDED', BLOCK_LITERAL: 'BLOCK_LITERAL', COMMENT: 'COMMENT', DIRECTIVE: 'DIRECTIVE', DOCUMENT: 'DOCUMENT', FLOW_MAP: 'FLOW_MAP', FLOW_SEQ: 'FLOW_SEQ', MAP: 'MAP', MAP_KEY: 'MAP_KEY', MAP_VALUE: 'MAP_VALUE', PLAIN: 'PLAIN', QUOTE_DOUBLE: 'QUOTE_DOUBLE', QUOTE_SINGLE: 'QUOTE_SINGLE', SEQ: 'SEQ', SEQ_ITEM: 'SEQ_ITEM' } export const defaultTagPrefix = 'tag:yaml.org,2002:' export const defaultTags = { MAP: 'tag:yaml.org,2002:map', SEQ: 'tag:yaml.org,2002:seq', STR: 'tag:yaml.org,2002:str' } yaml-1.10.2/src/cst/000077500000000000000000000000001402322402300141055ustar00rootroot00000000000000yaml-1.10.2/src/cst/Alias.js000066400000000000000000000013311402322402300154720ustar00rootroot00000000000000import { Node } from './Node.js' import { Range } from './Range.js' export class Alias extends Node { /** * Parses an *alias from the source * * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this scalar */ parse(context, start) { this.context = context const { src } = context let offset = Node.endOfIdentifier(src, start + 1) this.valueRange = new Range(start + 1, offset) offset = Node.endOfWhiteSpace(src, offset) offset = this.parseComment(offset) trace: this.type, { valueRange: this.valueRange, comment: this.comment }, JSON.stringify(this.rawValue) return offset } } yaml-1.10.2/src/cst/BlankLine.js000066400000000000000000000013531402322402300163040ustar00rootroot00000000000000import { Type } from '../constants.js' import { Node } from './Node.js' import { Range } from './Range.js' export class BlankLine extends Node { constructor() { super(Type.BLANK_LINE) } /* istanbul ignore next */ get includesTrailingLines() { // This is never called from anywhere, but if it were, // this is the value it should return. return true } /** * Parses a blank line from the source * * @param {ParseContext} context * @param {number} start - Index of first \n character * @returns {number} - Index of the character after this */ parse(context, start) { this.context = context this.range = new Range(start, start + 1) trace: this.type, this.range return start + 1 } } yaml-1.10.2/src/cst/BlockValue.js000066400000000000000000000136231402322402300164770ustar00rootroot00000000000000import { Type } from '../constants.js' import { YAMLSemanticError } from '../errors.js' import { Node } from './Node.js' import { Range } from './Range.js' export const Chomp = { CLIP: 'CLIP', KEEP: 'KEEP', STRIP: 'STRIP' } export class BlockValue extends Node { constructor(type, props) { super(type, props) this.blockIndent = null this.chomping = Chomp.CLIP this.header = null } get includesTrailingLines() { return this.chomping === Chomp.KEEP } get strValue() { if (!this.valueRange || !this.context) return null let { start, end } = this.valueRange const { indent, src } = this.context if (this.valueRange.isEmpty()) return '' let lastNewLine = null let ch = src[end - 1] while (ch === '\n' || ch === '\t' || ch === ' ') { end -= 1 if (end <= start) { if (this.chomping === Chomp.KEEP) break else return '' // probably never happens } if (ch === '\n') lastNewLine = end ch = src[end - 1] } let keepStart = end + 1 if (lastNewLine) { if (this.chomping === Chomp.KEEP) { keepStart = lastNewLine end = this.valueRange.end } else { end = lastNewLine } } const bi = indent + this.blockIndent const folded = this.type === Type.BLOCK_FOLDED let atStart = true let str = '' let sep = '' let prevMoreIndented = false for (let i = start; i < end; ++i) { for (let j = 0; j < bi; ++j) { if (src[i] !== ' ') break i += 1 } const ch = src[i] if (ch === '\n') { if (sep === '\n') str += '\n' else sep = '\n' } else { const lineEnd = Node.endOfLine(src, i) const line = src.slice(i, lineEnd) i = lineEnd if (folded && (ch === ' ' || ch === '\t') && i < keepStart) { if (sep === ' ') sep = '\n' else if (!prevMoreIndented && !atStart && sep === '\n') sep = '\n\n' str += sep + line //+ ((lineEnd < end && src[lineEnd]) || '') sep = (lineEnd < end && src[lineEnd]) || '' prevMoreIndented = true } else { str += sep + line sep = folded && i < keepStart ? ' ' : '\n' prevMoreIndented = false } if (atStart && line !== '') atStart = false } } return this.chomping === Chomp.STRIP ? str : str + '\n' } parseBlockHeader(start) { const { src } = this.context let offset = start + 1 let bi = '' while (true) { const ch = src[offset] switch (ch) { case '-': this.chomping = Chomp.STRIP break case '+': this.chomping = Chomp.KEEP break case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': bi += ch break default: this.blockIndent = Number(bi) || null this.header = new Range(start, offset) return offset } offset += 1 } } parseBlockValue(start) { const { indent, src } = this.context const explicit = !!this.blockIndent let offset = start let valueEnd = start let minBlockIndent = 1 for (let ch = src[offset]; ch === '\n'; ch = src[offset]) { offset += 1 if (Node.atDocumentBoundary(src, offset)) break const end = Node.endOfBlockIndent(src, indent, offset) // should not include tab? if (end === null) break const ch = src[end] const lineIndent = end - (offset + indent) if (!this.blockIndent) { // no explicit block indent, none yet detected if (src[end] !== '\n') { // first line with non-whitespace content if (lineIndent < minBlockIndent) { const msg = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator' this.error = new YAMLSemanticError(this, msg) } this.blockIndent = lineIndent } else if (lineIndent > minBlockIndent) { // empty line with more whitespace minBlockIndent = lineIndent } } else if (ch && ch !== '\n' && lineIndent < this.blockIndent) { if (src[end] === '#') break if (!this.error) { const src = explicit ? 'explicit indentation indicator' : 'first line' const msg = `Block scalars must not be less indented than their ${src}` this.error = new YAMLSemanticError(this, msg) } } if (src[end] === '\n') { offset = end } else { offset = valueEnd = Node.endOfLine(src, end) } } if (this.chomping !== Chomp.KEEP) { offset = src[valueEnd] ? valueEnd + 1 : valueEnd } this.valueRange = new Range(start + 1, offset) return offset } /** * Parses a block value from the source * * Accepted forms are: * ``` * BS * block * lines * * BS #comment * block * lines * ``` * where the block style BS matches the regexp `[|>][-+1-9]*` and block lines * are empty or have an indent level greater than `indent`. * * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this block */ parse(context, start) { this.context = context trace: 'block-start', context.pretty, { start } const { src } = context let offset = this.parseBlockHeader(start) offset = Node.endOfWhiteSpace(src, offset) offset = this.parseComment(offset) offset = this.parseBlockValue(offset) trace: this.type, { style: this.blockStyle, valueRange: this.valueRange, comment: this.comment }, JSON.stringify(this.rawValue) return offset } setOrigRanges(cr, offset) { offset = super.setOrigRanges(cr, offset) return this.header ? this.header.setOrigRange(cr, offset) : offset } } yaml-1.10.2/src/cst/Collection.js000066400000000000000000000174751402322402300165540ustar00rootroot00000000000000import { Type } from '../constants.js' import { YAMLSyntaxError } from '../errors.js' import { BlankLine } from './BlankLine.js' import { CollectionItem } from './CollectionItem.js' import { Comment } from './Comment.js' import { Node } from './Node.js' import { Range } from './Range.js' export function grabCollectionEndComments(node) { let cnode = node while (cnode instanceof CollectionItem) cnode = cnode.node if (!(cnode instanceof Collection)) return null const len = cnode.items.length let ci = -1 for (let i = len - 1; i >= 0; --i) { const n = cnode.items[i] if (n.type === Type.COMMENT) { // Keep sufficiently indented comments with preceding node const { indent, lineStart } = n.context if (indent > 0 && n.range.start >= lineStart + indent) break ci = i } else if (n.type === Type.BLANK_LINE) ci = i else break } if (ci === -1) return null const ca = cnode.items.splice(ci, len - ci) trace: 'item-end-comments', ca const prevEnd = ca[0].range.start while (true) { cnode.range.end = prevEnd if (cnode.valueRange && cnode.valueRange.end > prevEnd) cnode.valueRange.end = prevEnd if (cnode === node) break cnode = cnode.context.parent } return ca } export class Collection extends Node { static nextContentHasIndent(src, offset, indent) { const lineStart = Node.endOfLine(src, offset) + 1 offset = Node.endOfWhiteSpace(src, lineStart) const ch = src[offset] if (!ch) return false if (offset >= lineStart + indent) return true if (ch !== '#' && ch !== '\n') return false return Collection.nextContentHasIndent(src, offset, indent) } constructor(firstItem) { super(firstItem.type === Type.SEQ_ITEM ? Type.SEQ : Type.MAP) for (let i = firstItem.props.length - 1; i >= 0; --i) { if (firstItem.props[i].start < firstItem.context.lineStart) { // props on previous line are assumed by the collection this.props = firstItem.props.slice(0, i + 1) firstItem.props = firstItem.props.slice(i + 1) const itemRange = firstItem.props[0] || firstItem.valueRange firstItem.range.start = itemRange.start break } } this.items = [firstItem] const ec = grabCollectionEndComments(firstItem) if (ec) Array.prototype.push.apply(this.items, ec) } get includesTrailingLines() { return this.items.length > 0 } /** * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this */ parse(context, start) { trace: 'collection-start', context.pretty, { start } this.context = context const { parseNode, src } = context // It's easier to recalculate lineStart here rather than tracking down the // last context from which to read it -- eemeli/yaml#2 let lineStart = Node.startOfLine(src, start) const firstItem = this.items[0] // First-item context needs to be correct for later comment handling // -- eemeli/yaml#17 firstItem.context.parent = this this.valueRange = Range.copy(firstItem.valueRange) const indent = firstItem.range.start - firstItem.context.lineStart let offset = start offset = Node.normalizeOffset(src, offset) let ch = src[offset] let atLineStart = Node.endOfWhiteSpace(src, lineStart) === offset let prevIncludesTrailingLines = false trace: 'items-start', { offset, indent, lineStart, ch: JSON.stringify(ch) } while (ch) { while (ch === '\n' || ch === '#') { if (atLineStart && ch === '\n' && !prevIncludesTrailingLines) { const blankLine = new BlankLine() offset = blankLine.parse({ src }, offset) this.valueRange.end = offset if (offset >= src.length) { ch = null break } this.items.push(blankLine) trace: 'collection-blankline', blankLine.range offset -= 1 // blankLine.parse() consumes terminal newline } else if (ch === '#') { if ( offset < lineStart + indent && !Collection.nextContentHasIndent(src, offset, indent) ) { trace: 'end:comment-unindent', { offset, lineStart, indent } return offset } const comment = new Comment() offset = comment.parse({ indent, lineStart, src }, offset) this.items.push(comment) this.valueRange.end = offset if (offset >= src.length) { ch = null break } } lineStart = offset + 1 offset = Node.endOfIndent(src, lineStart) if (Node.atBlank(src, offset)) { const wsEnd = Node.endOfWhiteSpace(src, offset) const next = src[wsEnd] if (!next || next === '\n' || next === '#') { offset = wsEnd } } ch = src[offset] atLineStart = true } if (!ch) { trace: 'end:src', { offset } break } if (offset !== lineStart + indent && (atLineStart || ch !== ':')) { if (offset < lineStart + indent) { trace: 'end:unindent', { offset, lineStart, indent, ch: JSON.stringify(ch) } if (lineStart > start) offset = lineStart break } else if (!this.error) { const msg = 'All collection items must start at the same column' this.error = new YAMLSyntaxError(this, msg) } } if (firstItem.type === Type.SEQ_ITEM) { if (ch !== '-') { trace: 'end:typeswitch', { offset, lineStart, indent, ch: JSON.stringify(ch) } if (lineStart > start) offset = lineStart break } } else if (ch === '-' && !this.error) { // map key may start with -, as long as it's followed by a non-whitespace char const next = src[offset + 1] if (!next || next === '\n' || next === '\t' || next === ' ') { const msg = 'A collection cannot be both a mapping and a sequence' this.error = new YAMLSyntaxError(this, msg) } } trace: 'item-start', this.items.length, { ch: JSON.stringify(ch) } const node = parseNode( { atLineStart, inCollection: true, indent, lineStart, parent: this }, offset ) if (!node) return offset // at next document start this.items.push(node) this.valueRange.end = node.valueRange.end offset = Node.normalizeOffset(src, node.range.end) ch = src[offset] atLineStart = false prevIncludesTrailingLines = node.includesTrailingLines // Need to reset lineStart and atLineStart here if preceding node's range // has advanced to check the current line's indentation level // -- eemeli/yaml#10 & eemeli/yaml#38 if (ch) { let ls = offset - 1 let prev = src[ls] while (prev === ' ' || prev === '\t') prev = src[--ls] if (prev === '\n') { lineStart = ls + 1 atLineStart = true } } const ec = grabCollectionEndComments(node) if (ec) Array.prototype.push.apply(this.items, ec) trace: 'item-end', node.type, { offset, ch: JSON.stringify(ch) } } trace: 'items', this.items return offset } setOrigRanges(cr, offset) { offset = super.setOrigRanges(cr, offset) this.items.forEach(node => { offset = node.setOrigRanges(cr, offset) }) return offset } toString() { const { context: { src }, items, range, value } = this if (value != null) return value let str = src.slice(range.start, items[0].range.start) + String(items[0]) for (let i = 1; i < items.length; ++i) { const item = items[i] const { atLineStart, indent } = item.context if (atLineStart) for (let i = 0; i < indent; ++i) str += ' ' str += String(item) } return Node.addStringTerminator(src, range.end, str) } } yaml-1.10.2/src/cst/CollectionItem.js000066400000000000000000000067631402322402300173710ustar00rootroot00000000000000import { Type } from '../constants.js' import { YAMLSemanticError } from '../errors.js' import { BlankLine } from './BlankLine.js' import { Node } from './Node.js' import { Range } from './Range.js' export class CollectionItem extends Node { constructor(type, props) { super(type, props) this.node = null } get includesTrailingLines() { return !!this.node && this.node.includesTrailingLines } /** * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this */ parse(context, start) { this.context = context trace: 'item-start', context.pretty, { start } const { parseNode, src } = context let { atLineStart, lineStart } = context if (!atLineStart && this.type === Type.SEQ_ITEM) this.error = new YAMLSemanticError( this, 'Sequence items must not have preceding content on the same line' ) const indent = atLineStart ? start - lineStart : context.indent let offset = Node.endOfWhiteSpace(src, start + 1) let ch = src[offset] const inlineComment = ch === '#' const comments = [] let blankLine = null while (ch === '\n' || ch === '#') { if (ch === '#') { const end = Node.endOfLine(src, offset + 1) comments.push(new Range(offset, end)) offset = end } else { atLineStart = true lineStart = offset + 1 const wsEnd = Node.endOfWhiteSpace(src, lineStart) if (src[wsEnd] === '\n' && comments.length === 0) { blankLine = new BlankLine() lineStart = blankLine.parse({ src }, lineStart) } offset = Node.endOfIndent(src, lineStart) } ch = src[offset] } trace: 'item-parse?', { indentDiff: offset - (lineStart + indent), ch: ch && JSON.stringify(ch) } if ( Node.nextNodeIsIndented( ch, offset - (lineStart + indent), this.type !== Type.SEQ_ITEM ) ) { this.node = parseNode( { atLineStart, inCollection: false, indent, lineStart, parent: this }, offset ) } else if (ch && lineStart > start + 1) { offset = lineStart - 1 } if (this.node) { if (blankLine) { // Only blank lines preceding non-empty nodes are captured. Note that // this means that collection item range start indices do not always // increase monotonically. -- eemeli/yaml#126 const items = context.parent.items || context.parent.contents if (items) items.push(blankLine) } if (comments.length) Array.prototype.push.apply(this.props, comments) offset = this.node.range.end } else { if (inlineComment) { const c = comments[0] this.props.push(c) offset = c.end } else { offset = Node.endOfLine(src, start + 1) } } const end = this.node ? this.node.valueRange.end : offset trace: 'item-end', { start, end, offset } this.valueRange = new Range(start, end) return offset } setOrigRanges(cr, offset) { offset = super.setOrigRanges(cr, offset) return this.node ? this.node.setOrigRanges(cr, offset) : offset } toString() { const { context: { src }, node, range, value } = this if (value != null) return value const str = node ? src.slice(range.start, node.range.start) + String(node) : src.slice(range.start, range.end) return Node.addStringTerminator(src, range.end, str) } } yaml-1.10.2/src/cst/Comment.js000066400000000000000000000011501402322402300160420ustar00rootroot00000000000000import { Type } from '../constants.js' import { Node } from './Node.js' import { Range } from './Range.js' export class Comment extends Node { constructor() { super(Type.COMMENT) } /** * Parses a comment line from the source * * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this scalar */ parse(context, start) { this.context = context const offset = this.parseComment(start) this.range = new Range(start, offset) trace: this.type, this.range, this.comment return offset } } yaml-1.10.2/src/cst/Directive.js000066400000000000000000000020511402322402300163570ustar00rootroot00000000000000import { Type } from '../constants.js' import { Node } from './Node.js' import { Range } from './Range.js' export class Directive extends Node { constructor() { super(Type.DIRECTIVE) this.name = null } get parameters() { const raw = this.rawValue return raw ? raw.trim().split(/[ \t]+/) : [] } parseName(start) { const { src } = this.context let offset = start let ch = src[offset] while (ch && ch !== '\n' && ch !== '\t' && ch !== ' ') ch = src[(offset += 1)] this.name = src.slice(start, offset) return offset } parseParameters(start) { const { src } = this.context let offset = start let ch = src[offset] while (ch && ch !== '\n' && ch !== '#') ch = src[(offset += 1)] this.valueRange = new Range(start, offset) return offset } parse(context, start) { this.context = context let offset = this.parseName(start + 1) offset = this.parseParameters(offset) offset = this.parseComment(offset) this.range = new Range(start, offset) return offset } } yaml-1.10.2/src/cst/Document.js000066400000000000000000000157461402322402300162360ustar00rootroot00000000000000import { Char, Type } from '../constants.js' import { YAMLSemanticError, YAMLSyntaxError } from '../errors.js' import { BlankLine } from './BlankLine.js' import { grabCollectionEndComments } from './Collection.js' import { Comment } from './Comment.js' import { Directive } from './Directive.js' import { Node } from './Node.js' import { Range } from './Range.js' export class Document extends Node { static startCommentOrEndBlankLine(src, start) { const offset = Node.endOfWhiteSpace(src, start) const ch = src[offset] return ch === '#' || ch === '\n' ? offset : start } constructor() { super(Type.DOCUMENT) this.directives = null this.contents = null this.directivesEndMarker = null this.documentEndMarker = null } parseDirectives(start) { const { src } = this.context this.directives = [] let atLineStart = true let hasDirectives = false let offset = start while (!Node.atDocumentBoundary(src, offset, Char.DIRECTIVES_END)) { offset = Document.startCommentOrEndBlankLine(src, offset) switch (src[offset]) { case '\n': if (atLineStart) { const blankLine = new BlankLine() offset = blankLine.parse({ src }, offset) if (offset < src.length) { this.directives.push(blankLine) trace: 'directive-blankline', blankLine.range } } else { offset += 1 atLineStart = true } break case '#': { const comment = new Comment() offset = comment.parse({ src }, offset) this.directives.push(comment) atLineStart = false trace: 'directive-comment', comment.comment } break case '%': { const directive = new Directive() offset = directive.parse({ parent: this, src }, offset) this.directives.push(directive) hasDirectives = true atLineStart = false trace: 'directive', { valueRange: directive.valueRange, comment: directive.comment }, JSON.stringify(directive.rawValue) } break default: if (hasDirectives) { this.error = new YAMLSemanticError( this, 'Missing directives-end indicator line' ) } else if (this.directives.length > 0) { this.contents = this.directives this.directives = [] } return offset } } if (src[offset]) { this.directivesEndMarker = new Range(offset, offset + 3) return offset + 3 } if (hasDirectives) { this.error = new YAMLSemanticError( this, 'Missing directives-end indicator line' ) } else if (this.directives.length > 0) { this.contents = this.directives this.directives = [] } return offset } parseContents(start) { const { parseNode, src } = this.context if (!this.contents) this.contents = [] let lineStart = start while (src[lineStart - 1] === '-') lineStart -= 1 let offset = Node.endOfWhiteSpace(src, start) let atLineStart = lineStart === start this.valueRange = new Range(offset) while (!Node.atDocumentBoundary(src, offset, Char.DOCUMENT_END)) { switch (src[offset]) { case '\n': if (atLineStart) { const blankLine = new BlankLine() offset = blankLine.parse({ src }, offset) if (offset < src.length) { this.contents.push(blankLine) trace: 'content-blankline', blankLine.range } } else { offset += 1 atLineStart = true } lineStart = offset break case '#': { const comment = new Comment() offset = comment.parse({ src }, offset) this.contents.push(comment) trace: 'content-comment', comment.comment atLineStart = false } break default: { const iEnd = Node.endOfIndent(src, offset) const context = { atLineStart, indent: -1, inFlow: false, inCollection: false, lineStart, parent: this } const node = parseNode(context, iEnd) if (!node) return (this.valueRange.end = iEnd) // at next document start this.contents.push(node) offset = node.range.end atLineStart = false const ec = grabCollectionEndComments(node) if (ec) Array.prototype.push.apply(this.contents, ec) trace: 'content-node', { valueRange: node.valueRange, comment: node.comment }, JSON.stringify(node.rawValue) } } offset = Document.startCommentOrEndBlankLine(src, offset) } this.valueRange.end = offset if (src[offset]) { this.documentEndMarker = new Range(offset, offset + 3) offset += 3 if (src[offset]) { offset = Node.endOfWhiteSpace(src, offset) if (src[offset] === '#') { const comment = new Comment() offset = comment.parse({ src }, offset) this.contents.push(comment) trace: 'document-suffix-comment', comment.comment } switch (src[offset]) { case '\n': offset += 1 break case undefined: break default: this.error = new YAMLSyntaxError( this, 'Document end marker line cannot have a non-comment suffix' ) } } } return offset } /** * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this */ parse(context, start) { context.root = this this.context = context const { src } = context trace: 'DOC START', JSON.stringify(src.slice(start)) let offset = src.charCodeAt(start) === 0xfeff ? start + 1 : start // skip BOM offset = this.parseDirectives(offset) offset = this.parseContents(offset) trace: 'DOC', this.contents return offset } setOrigRanges(cr, offset) { offset = super.setOrigRanges(cr, offset) this.directives.forEach(node => { offset = node.setOrigRanges(cr, offset) }) if (this.directivesEndMarker) offset = this.directivesEndMarker.setOrigRange(cr, offset) this.contents.forEach(node => { offset = node.setOrigRanges(cr, offset) }) if (this.documentEndMarker) offset = this.documentEndMarker.setOrigRange(cr, offset) return offset } toString() { const { contents, directives, value } = this if (value != null) return value let str = directives.join('') if (contents.length > 0) { if (directives.length > 0 || contents[0].type === Type.COMMENT) str += '---\n' str += contents.join('') } if (str[str.length - 1] !== '\n') str += '\n' return str } } yaml-1.10.2/src/cst/FlowCollection.js000066400000000000000000000117341402322402300173740ustar00rootroot00000000000000import { Type } from '../constants.js' import { YAMLSemanticError } from '../errors.js' import { BlankLine } from './BlankLine.js' import { Comment } from './Comment.js' import { Node } from './Node.js' import { Range } from './Range.js' export class FlowCollection extends Node { constructor(type, props) { super(type, props) this.items = null } prevNodeIsJsonLike(idx = this.items.length) { const node = this.items[idx - 1] return ( !!node && (node.jsonLike || (node.type === Type.COMMENT && this.prevNodeIsJsonLike(idx - 1))) ) } /** * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this */ parse(context, start) { trace: 'flow-start', context.pretty, { start } this.context = context const { parseNode, src } = context let { indent, lineStart } = context let char = src[start] // { or [ this.items = [{ char, offset: start }] let offset = Node.endOfWhiteSpace(src, start + 1) char = src[offset] while (char && char !== ']' && char !== '}') { trace: 'item-start', this.items.length, char switch (char) { case '\n': { lineStart = offset + 1 const wsEnd = Node.endOfWhiteSpace(src, lineStart) if (src[wsEnd] === '\n') { const blankLine = new BlankLine() lineStart = blankLine.parse({ src }, lineStart) this.items.push(blankLine) } offset = Node.endOfIndent(src, lineStart) if (offset <= lineStart + indent) { char = src[offset] if ( offset < lineStart + indent || (char !== ']' && char !== '}') ) { const msg = 'Insufficient indentation in flow collection' this.error = new YAMLSemanticError(this, msg) } } } break case ',': { this.items.push({ char, offset }) offset += 1 } break case '#': { const comment = new Comment() offset = comment.parse({ src }, offset) this.items.push(comment) } break case '?': case ':': { const next = src[offset + 1] if ( next === '\n' || next === '\t' || next === ' ' || next === ',' || // in-flow : after JSON-like key does not need to be followed by whitespace (char === ':' && this.prevNodeIsJsonLike()) ) { this.items.push({ char, offset }) offset += 1 break } } // fallthrough default: { const node = parseNode( { atLineStart: false, inCollection: false, inFlow: true, indent: -1, lineStart, parent: this }, offset ) if (!node) { // at next document start this.valueRange = new Range(start, offset) return offset } this.items.push(node) offset = Node.normalizeOffset(src, node.range.end) } } offset = Node.endOfWhiteSpace(src, offset) char = src[offset] } this.valueRange = new Range(start, offset + 1) if (char) { this.items.push({ char, offset }) offset = Node.endOfWhiteSpace(src, offset + 1) offset = this.parseComment(offset) } trace: 'items', this.items, JSON.stringify(this.comment) return offset } setOrigRanges(cr, offset) { offset = super.setOrigRanges(cr, offset) this.items.forEach(node => { if (node instanceof Node) { offset = node.setOrigRanges(cr, offset) } else if (cr.length === 0) { node.origOffset = node.offset } else { let i = offset while (i < cr.length) { if (cr[i] > node.offset) break else ++i } node.origOffset = node.offset + i offset = i } }) return offset } toString() { const { context: { src }, items, range, value } = this if (value != null) return value const nodes = items.filter(item => item instanceof Node) let str = '' let prevEnd = range.start nodes.forEach(node => { const prefix = src.slice(prevEnd, node.range.start) prevEnd = node.range.end str += prefix + String(node) if ( str[str.length - 1] === '\n' && src[prevEnd - 1] !== '\n' && src[prevEnd] === '\n' ) { // Comment range does not include the terminal newline, but its // stringified value does. Without this fix, newlines at comment ends // get duplicated. prevEnd += 1 } }) str += src.slice(prevEnd, range.end) return Node.addStringTerminator(src, range.end, str) } } yaml-1.10.2/src/cst/Node.js000066400000000000000000000201451402322402300153320ustar00rootroot00000000000000import { Char, Type } from '../constants.js' import { getLinePos } from './source-utils.js' import { Range } from './Range.js' /** Root class of all nodes */ export class Node { static addStringTerminator(src, offset, str) { if (str[str.length - 1] === '\n') return str const next = Node.endOfWhiteSpace(src, offset) return next >= src.length || src[next] === '\n' ? str + '\n' : str } // ^(---|...) static atDocumentBoundary(src, offset, sep) { const ch0 = src[offset] if (!ch0) return true const prev = src[offset - 1] if (prev && prev !== '\n') return false if (sep) { if (ch0 !== sep) return false } else { if (ch0 !== Char.DIRECTIVES_END && ch0 !== Char.DOCUMENT_END) return false } const ch1 = src[offset + 1] const ch2 = src[offset + 2] if (ch1 !== ch0 || ch2 !== ch0) return false const ch3 = src[offset + 3] return !ch3 || ch3 === '\n' || ch3 === '\t' || ch3 === ' ' } static endOfIdentifier(src, offset) { let ch = src[offset] const isVerbatim = ch === '<' const notOk = isVerbatim ? ['\n', '\t', ' ', '>'] : ['\n', '\t', ' ', '[', ']', '{', '}', ','] while (ch && notOk.indexOf(ch) === -1) ch = src[(offset += 1)] if (isVerbatim && ch === '>') offset += 1 return offset } static endOfIndent(src, offset) { let ch = src[offset] while (ch === ' ') ch = src[(offset += 1)] return offset } static endOfLine(src, offset) { let ch = src[offset] while (ch && ch !== '\n') ch = src[(offset += 1)] return offset } static endOfWhiteSpace(src, offset) { let ch = src[offset] while (ch === '\t' || ch === ' ') ch = src[(offset += 1)] return offset } static startOfLine(src, offset) { let ch = src[offset - 1] if (ch === '\n') return offset while (ch && ch !== '\n') ch = src[(offset -= 1)] return offset + 1 } /** * End of indentation, or null if the line's indent level is not more * than `indent` * * @param {string} src * @param {number} indent * @param {number} lineStart * @returns {?number} */ static endOfBlockIndent(src, indent, lineStart) { const inEnd = Node.endOfIndent(src, lineStart) if (inEnd > lineStart + indent) { return inEnd } else { const wsEnd = Node.endOfWhiteSpace(src, inEnd) const ch = src[wsEnd] if (!ch || ch === '\n') return wsEnd } return null } static atBlank(src, offset, endAsBlank) { const ch = src[offset] return ch === '\n' || ch === '\t' || ch === ' ' || (endAsBlank && !ch) } static nextNodeIsIndented(ch, indentDiff, indicatorAsIndent) { if (!ch || indentDiff < 0) return false if (indentDiff > 0) return true return indicatorAsIndent && ch === '-' } // should be at line or string end, or at next non-whitespace char static normalizeOffset(src, offset) { const ch = src[offset] return !ch ? offset : ch !== '\n' && src[offset - 1] === '\n' ? offset - 1 : Node.endOfWhiteSpace(src, offset) } // fold single newline into space, multiple newlines to N - 1 newlines // presumes src[offset] === '\n' static foldNewline(src, offset, indent) { let inCount = 0 let error = false let fold = '' let ch = src[offset + 1] while (ch === ' ' || ch === '\t' || ch === '\n') { switch (ch) { case '\n': inCount = 0 offset += 1 fold += '\n' break case '\t': if (inCount <= indent) error = true offset = Node.endOfWhiteSpace(src, offset + 2) - 1 break case ' ': inCount += 1 offset += 1 break } ch = src[offset + 1] } if (!fold) fold = ' ' if (ch && inCount <= indent) error = true return { fold, offset, error } } constructor(type, props, context) { Object.defineProperty(this, 'context', { value: context || null, writable: true }) this.error = null this.range = null this.valueRange = null this.props = props || [] this.type = type this.value = null } getPropValue(idx, key, skipKey) { if (!this.context) return null const { src } = this.context const prop = this.props[idx] return prop && src[prop.start] === key ? src.slice(prop.start + (skipKey ? 1 : 0), prop.end) : null } get anchor() { for (let i = 0; i < this.props.length; ++i) { const anchor = this.getPropValue(i, Char.ANCHOR, true) if (anchor != null) return anchor } return null } get comment() { const comments = [] for (let i = 0; i < this.props.length; ++i) { const comment = this.getPropValue(i, Char.COMMENT, true) if (comment != null) comments.push(comment) } return comments.length > 0 ? comments.join('\n') : null } commentHasRequiredWhitespace(start) { const { src } = this.context if (this.header && start === this.header.end) return false if (!this.valueRange) return false const { end } = this.valueRange return start !== end || Node.atBlank(src, end - 1) } get hasComment() { if (this.context) { const { src } = this.context for (let i = 0; i < this.props.length; ++i) { if (src[this.props[i].start] === Char.COMMENT) return true } } return false } get hasProps() { if (this.context) { const { src } = this.context for (let i = 0; i < this.props.length; ++i) { if (src[this.props[i].start] !== Char.COMMENT) return true } } return false } get includesTrailingLines() { return false } get jsonLike() { const jsonLikeTypes = [ Type.FLOW_MAP, Type.FLOW_SEQ, Type.QUOTE_DOUBLE, Type.QUOTE_SINGLE ] return jsonLikeTypes.indexOf(this.type) !== -1 } get rangeAsLinePos() { if (!this.range || !this.context) return undefined const start = getLinePos(this.range.start, this.context.root) if (!start) return undefined const end = getLinePos(this.range.end, this.context.root) return { start, end } } get rawValue() { if (!this.valueRange || !this.context) return null const { start, end } = this.valueRange return this.context.src.slice(start, end) } get tag() { for (let i = 0; i < this.props.length; ++i) { const tag = this.getPropValue(i, Char.TAG, false) if (tag != null) { if (tag[1] === '<') { return { verbatim: tag.slice(2, -1) } } else { // eslint-disable-next-line no-unused-vars const [_, handle, suffix] = tag.match(/^(.*!)([^!]*)$/) return { handle, suffix } } } } return null } get valueRangeContainsNewline() { if (!this.valueRange || !this.context) return false const { start, end } = this.valueRange const { src } = this.context for (let i = start; i < end; ++i) { if (src[i] === '\n') return true } return false } parseComment(start) { const { src } = this.context if (src[start] === Char.COMMENT) { const end = Node.endOfLine(src, start + 1) const commentRange = new Range(start, end) this.props.push(commentRange) trace: commentRange, JSON.stringify( this.getPropValue(this.props.length - 1, Char.COMMENT, true) ) return end } return start } /** * Populates the `origStart` and `origEnd` values of all ranges for this * node. Extended by child classes to handle descendant nodes. * * @param {number[]} cr - Positions of dropped CR characters * @param {number} offset - Starting index of `cr` from the last call * @returns {number} - The next offset, matching the one found for `origStart` */ setOrigRanges(cr, offset) { if (this.range) offset = this.range.setOrigRange(cr, offset) if (this.valueRange) this.valueRange.setOrigRange(cr, offset) this.props.forEach(prop => prop.setOrigRange(cr, offset)) return offset } toString() { const { context: { src }, range, value } = this if (value != null) return value const str = src.slice(range.start, range.end) return Node.addStringTerminator(src, range.end, str) } } yaml-1.10.2/src/cst/ParseContext.js000066400000000000000000000173451402322402300170740ustar00rootroot00000000000000import { Char, Type } from '../constants.js' import { YAMLSyntaxError } from '../errors.js' import { Alias } from './Alias.js' import { BlockValue } from './BlockValue.js' import { Collection } from './Collection.js' import { CollectionItem } from './CollectionItem.js' import { FlowCollection } from './FlowCollection.js' import { Node } from './Node.js' import { PlainValue } from './PlainValue.js' import { QuoteDouble } from './QuoteDouble.js' import { QuoteSingle } from './QuoteSingle.js' import { Range } from './Range.js' function createNewNode(type, props) { switch (type) { case Type.ALIAS: return new Alias(type, props) case Type.BLOCK_FOLDED: case Type.BLOCK_LITERAL: return new BlockValue(type, props) case Type.FLOW_MAP: case Type.FLOW_SEQ: return new FlowCollection(type, props) case Type.MAP_KEY: case Type.MAP_VALUE: case Type.SEQ_ITEM: return new CollectionItem(type, props) case Type.COMMENT: case Type.PLAIN: return new PlainValue(type, props) case Type.QUOTE_DOUBLE: return new QuoteDouble(type, props) case Type.QUOTE_SINGLE: return new QuoteSingle(type, props) /* istanbul ignore next */ default: return null // should never happen } } /** * @param {boolean} atLineStart - Node starts at beginning of line * @param {boolean} inFlow - true if currently in a flow context * @param {boolean} inCollection - true if currently in a collection context * @param {number} indent - Current level of indentation * @param {number} lineStart - Start of the current line * @param {Node} parent - The parent of the node * @param {string} src - Source of the YAML document */ export class ParseContext { static parseType(src, offset, inFlow) { switch (src[offset]) { case '*': return Type.ALIAS case '>': return Type.BLOCK_FOLDED case '|': return Type.BLOCK_LITERAL case '{': return Type.FLOW_MAP case '[': return Type.FLOW_SEQ case '?': return !inFlow && Node.atBlank(src, offset + 1, true) ? Type.MAP_KEY : Type.PLAIN case ':': return !inFlow && Node.atBlank(src, offset + 1, true) ? Type.MAP_VALUE : Type.PLAIN case '-': return !inFlow && Node.atBlank(src, offset + 1, true) ? Type.SEQ_ITEM : Type.PLAIN case '"': return Type.QUOTE_DOUBLE case "'": return Type.QUOTE_SINGLE default: return Type.PLAIN } } constructor( orig = {}, { atLineStart, inCollection, inFlow, indent, lineStart, parent } = {} ) { this.atLineStart = atLineStart != null ? atLineStart : orig.atLineStart || false this.inCollection = inCollection != null ? inCollection : orig.inCollection || false this.inFlow = inFlow != null ? inFlow : orig.inFlow || false this.indent = indent != null ? indent : orig.indent this.lineStart = lineStart != null ? lineStart : orig.lineStart this.parent = parent != null ? parent : orig.parent || {} this.root = orig.root this.src = orig.src } nodeStartsCollection(node) { const { inCollection, inFlow, src } = this if (inCollection || inFlow) return false if (node instanceof CollectionItem) return true // check for implicit key let offset = node.range.end if (src[offset] === '\n' || src[offset - 1] === '\n') return false offset = Node.endOfWhiteSpace(src, offset) return src[offset] === ':' } // Anchor and tag are before type, which determines the node implementation // class; hence this intermediate step. parseProps(offset) { const { inFlow, parent, src } = this const props = [] let lineHasProps = false offset = this.atLineStart ? Node.endOfIndent(src, offset) : Node.endOfWhiteSpace(src, offset) let ch = src[offset] while ( ch === Char.ANCHOR || ch === Char.COMMENT || ch === Char.TAG || ch === '\n' ) { if (ch === '\n') { let inEnd = offset let lineStart do { lineStart = inEnd + 1 inEnd = Node.endOfIndent(src, lineStart) } while (src[inEnd] === '\n') const indentDiff = inEnd - (lineStart + this.indent) const noIndicatorAsIndent = parent.type === Type.SEQ_ITEM && parent.context.atLineStart if ( src[inEnd] !== '#' && !Node.nextNodeIsIndented(src[inEnd], indentDiff, !noIndicatorAsIndent) ) break this.atLineStart = true this.lineStart = lineStart lineHasProps = false offset = inEnd } else if (ch === Char.COMMENT) { const end = Node.endOfLine(src, offset + 1) props.push(new Range(offset, end)) offset = end } else { let end = Node.endOfIdentifier(src, offset + 1) if ( ch === Char.TAG && src[end] === ',' && /^[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+,\d\d\d\d(-\d\d){0,2}\/\S/.test( src.slice(offset + 1, end + 13) ) ) { // Let's presume we're dealing with a YAML 1.0 domain tag here, rather // than an empty but 'foo.bar' private-tagged node in a flow collection // followed without whitespace by a plain string starting with a year // or date divided by something. end = Node.endOfIdentifier(src, end + 5) } props.push(new Range(offset, end)) lineHasProps = true offset = Node.endOfWhiteSpace(src, end) } ch = src[offset] } // '- &a : b' has an anchor on an empty node if (lineHasProps && ch === ':' && Node.atBlank(src, offset + 1, true)) offset -= 1 const type = ParseContext.parseType(src, offset, inFlow) trace: 'props', type, { props, offset } return { props, type, valueStart: offset } } /** * Parses a node from the source * @param {ParseContext} overlay * @param {number} start - Index of first non-whitespace character for the node * @returns {?Node} - null if at a document boundary */ parseNode = (overlay, start) => { if (Node.atDocumentBoundary(this.src, start)) return null const context = new ParseContext(this, overlay) const { props, type, valueStart } = context.parseProps(start) trace: 'START', { start, valueStart, type, props }, { start: `${context.lineStart} + ${context.indent}`, atLineStart: context.atLineStart, inCollection: context.inCollection, inFlow: context.inFlow, parent: context.parent.type } const node = createNewNode(type, props) let offset = node.parse(context, valueStart) node.range = new Range(start, offset) /* istanbul ignore if */ if (offset <= start) { // This should never happen, but if it does, let's make sure to at least // step one character forward to avoid a busy loop. node.error = new Error(`Node#parse consumed no characters`) node.error.parseEnd = offset node.error.source = node node.range.end = start + 1 } trace: node.type, node.range, JSON.stringify(node.rawValue) if (context.nodeStartsCollection(node)) { trace: 'collection-start' if ( !node.error && !context.atLineStart && context.parent.type === Type.DOCUMENT ) { node.error = new YAMLSyntaxError( node, 'Block collection must not have preceding content here (e.g. directives-end indicator)' ) } const collection = new Collection(node) offset = collection.parse(new ParseContext(context), offset) collection.range = new Range(start, offset) trace: collection.type, collection.range, JSON.stringify(collection.rawValue) return collection } return node } } yaml-1.10.2/src/cst/PlainValue.js000066400000000000000000000100071402322402300165010ustar00rootroot00000000000000import { YAMLSemanticError } from '../errors.js' import { Node } from './Node.js' import { Range } from './Range.js' export class PlainValue extends Node { static endOfLine(src, start, inFlow) { let ch = src[start] let offset = start while (ch && ch !== '\n') { if ( inFlow && (ch === '[' || ch === ']' || ch === '{' || ch === '}' || ch === ',') ) break const next = src[offset + 1] if ( ch === ':' && (!next || next === '\n' || next === '\t' || next === ' ' || (inFlow && next === ',')) ) break if ((ch === ' ' || ch === '\t') && next === '#') break offset += 1 ch = next } return offset } get strValue() { if (!this.valueRange || !this.context) return null let { start, end } = this.valueRange const { src } = this.context let ch = src[end - 1] while (start < end && (ch === '\n' || ch === '\t' || ch === ' ')) ch = src[--end - 1] let str = '' for (let i = start; i < end; ++i) { const ch = src[i] if (ch === '\n') { const { fold, offset } = Node.foldNewline(src, i, -1) str += fold i = offset } else if (ch === ' ' || ch === '\t') { // trim trailing whitespace const wsStart = i let next = src[i + 1] while (i < end && (next === ' ' || next === '\t')) { i += 1 next = src[i + 1] } if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : ch } else { str += ch } } const ch0 = src[start] switch (ch0) { case '\t': { const msg = 'Plain value cannot start with a tab character' const errors = [new YAMLSemanticError(this, msg)] return { errors, str } } case '@': case '`': { const msg = `Plain value cannot start with reserved character ${ch0}` const errors = [new YAMLSemanticError(this, msg)] return { errors, str } } default: return str } } parseBlockValue(start) { const { indent, inFlow, src } = this.context let offset = start let valueEnd = start for (let ch = src[offset]; ch === '\n'; ch = src[offset]) { if (Node.atDocumentBoundary(src, offset + 1)) break const end = Node.endOfBlockIndent(src, indent, offset + 1) if (end === null || src[end] === '#') break if (src[end] === '\n') { offset = end } else { valueEnd = PlainValue.endOfLine(src, end, inFlow) offset = valueEnd } } if (this.valueRange.isEmpty()) this.valueRange.start = start this.valueRange.end = valueEnd trace: this.valueRange, JSON.stringify(this.rawValue) return valueEnd } /** * Parses a plain value from the source * * Accepted forms are: * ``` * #comment * * first line * * first line #comment * * first line * block * lines * * #comment * block * lines * ``` * where block lines are empty or have an indent level greater than `indent`. * * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this scalar, may be `\n` */ parse(context, start) { this.context = context trace: 'plain-start', context.pretty, { start } const { inFlow, src } = context let offset = start const ch = src[offset] if (ch && ch !== '#' && ch !== '\n') { offset = PlainValue.endOfLine(src, start, inFlow) } this.valueRange = new Range(start, offset) offset = Node.endOfWhiteSpace(src, offset) offset = this.parseComment(offset) trace: 'first line', { offset, valueRange: this.valueRange, comment: this.comment }, JSON.stringify(this.rawValue) if (!this.hasComment || this.valueRange.isEmpty()) { offset = this.parseBlockValue(offset) } trace: this.type, { offset, valueRange: this.valueRange }, JSON.stringify(this.rawValue) return offset } } yaml-1.10.2/src/cst/QuoteDouble.js000066400000000000000000000122741402322402300167010ustar00rootroot00000000000000import { YAMLSemanticError, YAMLSyntaxError } from '../errors.js' import { Node } from './Node.js' import { Range } from './Range.js' export class QuoteDouble extends Node { static endOfQuote(src, offset) { let ch = src[offset] while (ch && ch !== '"') { offset += ch === '\\' ? 2 : 1 ch = src[offset] } return offset + 1 } /** * @returns {string | { str: string, errors: YAMLSyntaxError[] }} */ get strValue() { if (!this.valueRange || !this.context) return null const errors = [] const { start, end } = this.valueRange const { indent, src } = this.context if (src[end - 1] !== '"') errors.push(new YAMLSyntaxError(this, 'Missing closing "quote')) // Using String#replace is too painful with escaped newlines preceded by // escaped backslashes; also, this should be faster. let str = '' for (let i = start + 1; i < end - 1; ++i) { const ch = src[i] if (ch === '\n') { if (Node.atDocumentBoundary(src, i + 1)) errors.push( new YAMLSemanticError( this, 'Document boundary indicators are not allowed within string values' ) ) const { fold, offset, error } = Node.foldNewline(src, i, indent) str += fold i = offset if (error) errors.push( new YAMLSemanticError( this, 'Multi-line double-quoted string needs to be sufficiently indented' ) ) } else if (ch === '\\') { i += 1 switch (src[i]) { case '0': str += '\0' break // null character case 'a': str += '\x07' break // bell character case 'b': str += '\b' break // backspace case 'e': str += '\x1b' break // escape character case 'f': str += '\f' break // form feed case 'n': str += '\n' break // line feed case 'r': str += '\r' break // carriage return case 't': str += '\t' break // horizontal tab case 'v': str += '\v' break // vertical tab case 'N': str += '\u0085' break // Unicode next line case '_': str += '\u00a0' break // Unicode non-breaking space case 'L': str += '\u2028' break // Unicode line separator case 'P': str += '\u2029' break // Unicode paragraph separator case ' ': str += ' ' break case '"': str += '"' break case '/': str += '/' break case '\\': str += '\\' break case '\t': str += '\t' break case 'x': str += this.parseCharCode(i + 1, 2, errors) i += 2 break case 'u': str += this.parseCharCode(i + 1, 4, errors) i += 4 break case 'U': str += this.parseCharCode(i + 1, 8, errors) i += 8 break case '\n': // skip escaped newlines, but still trim the following line while (src[i + 1] === ' ' || src[i + 1] === '\t') i += 1 break default: errors.push( new YAMLSyntaxError( this, `Invalid escape sequence ${src.substr(i - 1, 2)}` ) ) str += '\\' + src[i] } } else if (ch === ' ' || ch === '\t') { // trim trailing whitespace const wsStart = i let next = src[i + 1] while (next === ' ' || next === '\t') { i += 1 next = src[i + 1] } if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : ch } else { str += ch } } return errors.length > 0 ? { errors, str } : str } parseCharCode(offset, length, errors) { const { src } = this.context const cc = src.substr(offset, length) const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc) const code = ok ? parseInt(cc, 16) : NaN if (isNaN(code)) { errors.push( new YAMLSyntaxError( this, `Invalid escape sequence ${src.substr(offset - 2, length + 2)}` ) ) return src.substr(offset - 2, length + 2) } return String.fromCodePoint(code) } /** * Parses a "double quoted" value from the source * * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this scalar */ parse(context, start) { this.context = context const { src } = context let offset = QuoteDouble.endOfQuote(src, start + 1) this.valueRange = new Range(start, offset) offset = Node.endOfWhiteSpace(src, offset) offset = this.parseComment(offset) trace: this.type, { valueRange: this.valueRange, comment: this.comment }, JSON.stringify(this.rawValue) return offset } } yaml-1.10.2/src/cst/QuoteSingle.js000066400000000000000000000053431402322402300167070ustar00rootroot00000000000000import { YAMLSemanticError, YAMLSyntaxError } from '../errors.js' import { Node } from './Node.js' import { Range } from './Range.js' export class QuoteSingle extends Node { static endOfQuote(src, offset) { let ch = src[offset] while (ch) { if (ch === "'") { if (src[offset + 1] !== "'") break ch = src[(offset += 2)] } else { ch = src[(offset += 1)] } } return offset + 1 } /** * @returns {string | { str: string, errors: YAMLSyntaxError[] }} */ get strValue() { if (!this.valueRange || !this.context) return null const errors = [] const { start, end } = this.valueRange const { indent, src } = this.context if (src[end - 1] !== "'") errors.push(new YAMLSyntaxError(this, "Missing closing 'quote")) let str = '' for (let i = start + 1; i < end - 1; ++i) { const ch = src[i] if (ch === '\n') { if (Node.atDocumentBoundary(src, i + 1)) errors.push( new YAMLSemanticError( this, 'Document boundary indicators are not allowed within string values' ) ) const { fold, offset, error } = Node.foldNewline(src, i, indent) str += fold i = offset if (error) errors.push( new YAMLSemanticError( this, 'Multi-line single-quoted string needs to be sufficiently indented' ) ) } else if (ch === "'") { str += ch i += 1 if (src[i] !== "'") errors.push( new YAMLSyntaxError( this, 'Unescaped single quote? This should not happen.' ) ) } else if (ch === ' ' || ch === '\t') { // trim trailing whitespace const wsStart = i let next = src[i + 1] while (next === ' ' || next === '\t') { i += 1 next = src[i + 1] } if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : ch } else { str += ch } } return errors.length > 0 ? { errors, str } : str } /** * Parses a 'single quoted' value from the source * * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this scalar */ parse(context, start) { this.context = context const { src } = context let offset = QuoteSingle.endOfQuote(src, start + 1) this.valueRange = new Range(start, offset) offset = Node.endOfWhiteSpace(src, offset) offset = this.parseComment(offset) trace: this.type, { valueRange: this.valueRange, comment: this.comment }, JSON.stringify(this.rawValue) return offset } } yaml-1.10.2/src/cst/README.md000066400000000000000000000001571402322402300153670ustar00rootroot00000000000000# YAML CST Parser Documentation for the CST parser has been moved to yaml-1.10.2/src/cst/Range.js000066400000000000000000000022231402322402300154760ustar00rootroot00000000000000export class Range { static copy(orig) { return new Range(orig.start, orig.end) } constructor(start, end) { this.start = start this.end = end || start } isEmpty() { return typeof this.start !== 'number' || !this.end || this.end <= this.start } /** * Set `origStart` and `origEnd` to point to the original source range for * this node, which may differ due to dropped CR characters. * * @param {number[]} cr - Positions of dropped CR characters * @param {number} offset - Starting index of `cr` from the last call * @returns {number} - The next offset, matching the one found for `origStart` */ setOrigRange(cr, offset) { const { start, end } = this if (cr.length === 0 || end <= cr[0]) { this.origStart = start this.origEnd = end return offset } let i = offset while (i < cr.length) { if (cr[i] > start) break else ++i } this.origStart = start + i const nextOffset = i while (i < cr.length) { // if end was at \n, it should now be at \r if (cr[i] >= end) break else ++i } this.origEnd = end + i return nextOffset } } yaml-1.10.2/src/cst/parse.js000066400000000000000000000016431402322402300155610ustar00rootroot00000000000000// Published as 'yaml/parse-cst' import { Document } from './Document.js' import { ParseContext } from './ParseContext.js' export function parse(src) { const cr = [] if (src.indexOf('\r') !== -1) { src = src.replace(/\r\n?/g, (match, offset) => { if (match.length > 1) cr.push(offset) return '\n' }) } const documents = [] let offset = 0 do { const doc = new Document() const context = new ParseContext({ src }) offset = doc.parse(context, offset) documents.push(doc) } while (offset < src.length) documents.setOrigRanges = () => { if (cr.length === 0) return false for (let i = 1; i < cr.length; ++i) cr[i] -= i let crOffset = 0 for (let i = 0; i < documents.length; ++i) { crOffset = documents[i].setOrigRanges(cr, crOffset) } cr.splice(0, cr.length) return true } documents.toString = () => documents.join('...\n') return documents } yaml-1.10.2/src/cst/source-utils.js000066400000000000000000000076111402322402300171060ustar00rootroot00000000000000function findLineStarts(src) { const ls = [0] let offset = src.indexOf('\n') while (offset !== -1) { offset += 1 ls.push(offset) offset = src.indexOf('\n', offset) } return ls } function getSrcInfo(cst) { let lineStarts, src if (typeof cst === 'string') { lineStarts = findLineStarts(cst) src = cst } else { if (Array.isArray(cst)) cst = cst[0] if (cst && cst.context) { if (!cst.lineStarts) cst.lineStarts = findLineStarts(cst.context.src) lineStarts = cst.lineStarts src = cst.context.src } } return { lineStarts, src } } /** * @typedef {Object} LinePos - One-indexed position in the source * @property {number} line * @property {number} col */ /** * Determine the line/col position matching a character offset. * * Accepts a source string or a CST document as the second parameter. With * the latter, starting indices for lines are cached in the document as * `lineStarts: number[]`. * * Returns a one-indexed `{ line, col }` location if found, or * `undefined` otherwise. * * @param {number} offset * @param {string|Document|Document[]} cst * @returns {?LinePos} */ export function getLinePos(offset, cst) { if (typeof offset !== 'number' || offset < 0) return null const { lineStarts, src } = getSrcInfo(cst) if (!lineStarts || !src || offset > src.length) return null for (let i = 0; i < lineStarts.length; ++i) { const start = lineStarts[i] if (offset < start) { return { line: i, col: offset - lineStarts[i - 1] + 1 } } if (offset === start) return { line: i + 1, col: 1 } } const line = lineStarts.length return { line, col: offset - lineStarts[line - 1] + 1 } } /** * Get a specified line from the source. * * Accepts a source string or a CST document as the second parameter. With * the latter, starting indices for lines are cached in the document as * `lineStarts: number[]`. * * Returns the line as a string if found, or `null` otherwise. * * @param {number} line One-indexed line number * @param {string|Document|Document[]} cst * @returns {?string} */ export function getLine(line, cst) { const { lineStarts, src } = getSrcInfo(cst) if (!lineStarts || !(line >= 1) || line > lineStarts.length) return null const start = lineStarts[line - 1] let end = lineStarts[line] // undefined for last line; that's ok for slice() while (end && end > start && src[end - 1] === '\n') --end return src.slice(start, end) } /** * Pretty-print the starting line from the source indicated by the range `pos` * * Trims output to `maxWidth` chars while keeping the starting column visible, * using `…` at either end to indicate dropped characters. * * Returns a two-line string (or `null`) with `\n` as separator; the second line * will hold appropriately indented `^` marks indicating the column range. * * @param {Object} pos * @param {LinePos} pos.start * @param {LinePos} [pos.end] * @param {string|Document|Document[]*} cst * @param {number} [maxWidth=80] * @returns {?string} */ export function getPrettyContext({ start, end }, cst, maxWidth = 80) { let src = getLine(start.line, cst) if (!src) return null let { col } = start if (src.length > maxWidth) { if (col <= maxWidth - 10) { src = src.substr(0, maxWidth - 1) + '…' } else { const halfWidth = Math.round(maxWidth / 2) if (src.length > col + halfWidth) src = src.substr(0, col + halfWidth - 1) + '…' col -= src.length - maxWidth src = '…' + src.substr(1 - maxWidth) } } let errLen = 1 let errEnd = '' if (end) { if ( end.line === start.line && col + (end.col - start.col) <= maxWidth + 1 ) { errLen = end.col - start.col } else { errLen = Math.min(src.length + 1, maxWidth) - col errEnd = '…' } } const offset = col > 1 ? ' '.repeat(col - 1) : '' const err = '^'.repeat(errLen) return `${src}\n${offset}${err}${errEnd}` } yaml-1.10.2/src/doc/000077500000000000000000000000001402322402300140615ustar00rootroot00000000000000yaml-1.10.2/src/doc/Anchors.js000066400000000000000000000042761402322402300160250ustar00rootroot00000000000000import { Alias, Merge, Scalar, YAMLMap, YAMLSeq } from '../ast/index.js' export class Anchors { static validAnchorNode(node) { return ( node instanceof Scalar || node instanceof YAMLSeq || node instanceof YAMLMap ) } map = Object.create(null) constructor(prefix) { this.prefix = prefix } createAlias(node, name) { this.setAnchor(node, name) return new Alias(node) } createMergePair(...sources) { const merge = new Merge() merge.value.items = sources.map(s => { if (s instanceof Alias) { if (s.source instanceof YAMLMap) return s } else if (s instanceof YAMLMap) { return this.createAlias(s) } throw new Error('Merge sources must be Map nodes or their Aliases') }) return merge } getName(node) { const { map } = this return Object.keys(map).find(a => map[a] === node) } getNames() { return Object.keys(this.map) } getNode(name) { return this.map[name] } newName(prefix) { if (!prefix) prefix = this.prefix const names = Object.keys(this.map) for (let i = 1; true; ++i) { const name = `${prefix}${i}` if (!names.includes(name)) return name } } // During parsing, map & aliases contain CST nodes resolveNodes() { const { map, _cstAliases } = this Object.keys(map).forEach(a => { map[a] = map[a].resolved }) _cstAliases.forEach(a => { a.source = a.source.resolved }) delete this._cstAliases } setAnchor(node, name) { if (node != null && !Anchors.validAnchorNode(node)) { throw new Error('Anchors may only be set for Scalar, Seq and Map nodes') } if (name && /[\x00-\x19\s,[\]{}]/.test(name)) { throw new Error( 'Anchor names must not contain whitespace or control characters' ) } const { map } = this const prev = node && Object.keys(map).find(a => map[a] === node) if (prev) { if (!name) { return prev } else if (prev !== name) { delete map[prev] map[name] = node } } else { if (!name) { if (!node) return null name = this.newName() } map[name] = node } return name } } yaml-1.10.2/src/doc/Document.js000066400000000000000000000177241402322402300162100ustar00rootroot00000000000000import { Collection, Node, Scalar, isEmptyPath, toJSON } from '../ast/index.js' import { YAMLError } from '../errors.js' import { documentOptions } from '../options.js' import { addComment } from '../stringify/addComment.js' import { stringify } from '../stringify/stringify.js' import { Anchors } from './Anchors.js' import { Schema } from './Schema.js' import { listTagNames } from './listTagNames.js' import { parseContents } from './parseContents.js' import { parseDirectives } from './parseDirectives.js' function assertCollection(contents) { if (contents instanceof Collection) return true throw new Error('Expected a YAML collection as document contents') } export class Document { static defaults = documentOptions constructor(options) { this.anchors = new Anchors(options.anchorPrefix) this.commentBefore = null this.comment = null this.contents = null this.directivesEndMarker = null this.errors = [] this.options = options this.schema = null this.tagPrefixes = [] this.version = null this.warnings = [] } add(value) { assertCollection(this.contents) return this.contents.add(value) } addIn(path, value) { assertCollection(this.contents) this.contents.addIn(path, value) } delete(key) { assertCollection(this.contents) return this.contents.delete(key) } deleteIn(path) { if (isEmptyPath(path)) { if (this.contents == null) return false this.contents = null return true } assertCollection(this.contents) return this.contents.deleteIn(path) } getDefaults() { return ( Document.defaults[this.version] || Document.defaults[this.options.version] || {} ) } get(key, keepScalar) { return this.contents instanceof Collection ? this.contents.get(key, keepScalar) : undefined } getIn(path, keepScalar) { if (isEmptyPath(path)) return !keepScalar && this.contents instanceof Scalar ? this.contents.value : this.contents return this.contents instanceof Collection ? this.contents.getIn(path, keepScalar) : undefined } has(key) { return this.contents instanceof Collection ? this.contents.has(key) : false } hasIn(path) { if (isEmptyPath(path)) return this.contents !== undefined return this.contents instanceof Collection ? this.contents.hasIn(path) : false } set(key, value) { assertCollection(this.contents) this.contents.set(key, value) } setIn(path, value) { if (isEmptyPath(path)) this.contents = value else { assertCollection(this.contents) this.contents.setIn(path, value) } } setSchema(id, customTags) { if (!id && !customTags && this.schema) return if (typeof id === 'number') id = id.toFixed(1) if (id === '1.0' || id === '1.1' || id === '1.2') { if (this.version) this.version = id else this.options.version = id delete this.options.schema } else if (id && typeof id === 'string') { this.options.schema = id } if (Array.isArray(customTags)) this.options.customTags = customTags const opt = Object.assign({}, this.getDefaults(), this.options) this.schema = new Schema(opt) } parse(node, prevDoc) { if (this.options.keepCstNodes) this.cstNode = node if (this.options.keepNodeTypes) this.type = 'DOCUMENT' const { directives = [], contents = [], directivesEndMarker, error, valueRange } = node if (error) { if (!error.source) error.source = this this.errors.push(error) } parseDirectives(this, directives, prevDoc) if (directivesEndMarker) this.directivesEndMarker = true this.range = valueRange ? [valueRange.start, valueRange.end] : null this.setSchema() this.anchors._cstAliases = [] parseContents(this, contents) this.anchors.resolveNodes() if (this.options.prettyErrors) { for (const error of this.errors) if (error instanceof YAMLError) error.makePretty() for (const warn of this.warnings) if (warn instanceof YAMLError) warn.makePretty() } return this } listNonDefaultTags() { return listTagNames(this.contents).filter( t => t.indexOf(Schema.defaultPrefix) !== 0 ) } setTagPrefix(handle, prefix) { if (handle[0] !== '!' || handle[handle.length - 1] !== '!') throw new Error('Handle must start and end with !') if (prefix) { const prev = this.tagPrefixes.find(p => p.handle === handle) if (prev) prev.prefix = prefix else this.tagPrefixes.push({ handle, prefix }) } else { this.tagPrefixes = this.tagPrefixes.filter(p => p.handle !== handle) } } toJSON(arg, onAnchor) { const { keepBlobsInJSON, mapAsMap, maxAliasCount } = this.options const keep = keepBlobsInJSON && (typeof arg !== 'string' || !(this.contents instanceof Scalar)) const ctx = { doc: this, indentStep: ' ', keep, mapAsMap: keep && !!mapAsMap, maxAliasCount, stringify // Requiring directly in Pair would create circular dependencies } const anchorNames = Object.keys(this.anchors.map) if (anchorNames.length > 0) ctx.anchors = new Map( anchorNames.map(name => [ this.anchors.map[name], { alias: [], aliasCount: 0, count: 1 } ]) ) const res = toJSON(this.contents, arg, ctx) if (typeof onAnchor === 'function' && ctx.anchors) for (const { count, res } of ctx.anchors.values()) onAnchor(res, count) return res } toString() { if (this.errors.length > 0) throw new Error('Document with errors cannot be stringified') const indentSize = this.options.indent if (!Number.isInteger(indentSize) || indentSize <= 0) { const s = JSON.stringify(indentSize) throw new Error(`"indent" option must be a positive integer, not ${s}`) } this.setSchema() const lines = [] let hasDirectives = false if (this.version) { let vd = '%YAML 1.2' if (this.schema.name === 'yaml-1.1') { if (this.version === '1.0') vd = '%YAML:1.0' else if (this.version === '1.1') vd = '%YAML 1.1' } lines.push(vd) hasDirectives = true } const tagNames = this.listNonDefaultTags() this.tagPrefixes.forEach(({ handle, prefix }) => { if (tagNames.some(t => t.indexOf(prefix) === 0)) { lines.push(`%TAG ${handle} ${prefix}`) hasDirectives = true } }) if (hasDirectives || this.directivesEndMarker) lines.push('---') if (this.commentBefore) { if (hasDirectives || !this.directivesEndMarker) lines.unshift('') lines.unshift(this.commentBefore.replace(/^/gm, '#')) } const ctx = { anchors: Object.create(null), doc: this, indent: '', indentStep: ' '.repeat(indentSize), stringify // Requiring directly in nodes would create circular dependencies } let chompKeep = false let contentComment = null if (this.contents) { if (this.contents instanceof Node) { if ( this.contents.spaceBefore && (hasDirectives || this.directivesEndMarker) ) lines.push('') if (this.contents.commentBefore) lines.push(this.contents.commentBefore.replace(/^/gm, '#')) // top-level block scalars need to be indented if followed by a comment ctx.forceBlockIndent = !!this.comment contentComment = this.contents.comment } const onChompKeep = contentComment ? null : () => (chompKeep = true) const body = stringify( this.contents, ctx, () => (contentComment = null), onChompKeep ) lines.push(addComment(body, '', contentComment)) } else if (this.contents !== undefined) { lines.push(stringify(this.contents, ctx)) } if (this.comment) { if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '') lines.push('') lines.push(this.comment.replace(/^/gm, '#')) } return lines.join('\n') + '\n' } } yaml-1.10.2/src/doc/Schema.js000066400000000000000000000027661402322402300156320ustar00rootroot00000000000000import { Pair } from '../ast/Pair.js' import { defaultTagPrefix, defaultTags } from '../constants.js' import { schemas, tags } from '../tags/index.js' import { warnOptionDeprecation } from '../warnings.js' import { createNode } from './createNode.js' import { getSchemaTags } from './getSchemaTags.js' const sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0 export class Schema { static defaultPrefix = defaultTagPrefix // TODO: remove in v2 static defaultTags = defaultTags // TODO: remove in v2 constructor({ customTags, merge, schema, sortMapEntries, tags: deprecatedCustomTags }) { this.merge = !!merge this.name = schema this.sortMapEntries = sortMapEntries === true ? sortMapEntriesByKey : sortMapEntries || null if (!customTags && deprecatedCustomTags) warnOptionDeprecation('tags', 'customTags') this.tags = getSchemaTags( schemas, tags, customTags || deprecatedCustomTags, schema ) } createNode(value, wrapScalars, tagName, ctx) { const baseCtx = { defaultPrefix: Schema.defaultPrefix, schema: this, wrapScalars } const createCtx = ctx ? Object.assign(ctx, baseCtx) : baseCtx return createNode(value, tagName, createCtx) } createPair(key, value, ctx) { if (!ctx) ctx = { wrapScalars: true } const k = this.createNode(key, ctx.wrapScalars, null, ctx) const v = this.createNode(value, ctx.wrapScalars, null, ctx) return new Pair(k, v) } } yaml-1.10.2/src/doc/createNode.js000066400000000000000000000040501402322402300164670ustar00rootroot00000000000000import { Alias } from '../ast/Alias.js' import { Node } from '../ast/Node.js' import { Scalar } from '../ast/Scalar.js' import { map } from '../tags/failsafe/map.js' import { seq } from '../tags/failsafe/seq.js' function findTagObject(value, tagName, tags) { if (tagName) { const match = tags.filter(t => t.tag === tagName) const tagObj = match.find(t => !t.format) || match[0] if (!tagObj) throw new Error(`Tag ${tagName} not found`) return tagObj } // TODO: deprecate/remove class check return tags.find( t => ((t.identify && t.identify(value)) || (t.class && value instanceof t.class)) && !t.format ) } export function createNode(value, tagName, ctx) { if (value instanceof Node) return value const { defaultPrefix, onTagObj, prevObjects, schema, wrapScalars } = ctx if (tagName && tagName.startsWith('!!')) tagName = defaultPrefix + tagName.slice(2) let tagObj = findTagObject(value, tagName, schema.tags) if (!tagObj) { if (typeof value.toJSON === 'function') value = value.toJSON() if (!value || typeof value !== 'object') return wrapScalars ? new Scalar(value) : value tagObj = value instanceof Map ? map : value[Symbol.iterator] ? seq : map } if (onTagObj) { onTagObj(tagObj) delete ctx.onTagObj } // Detect duplicate references to the same object & use Alias nodes for all // after first. The `obj` wrapper allows for circular references to resolve. const obj = { value: undefined, node: undefined } if (value && typeof value === 'object' && prevObjects) { const prev = prevObjects.get(value) if (prev) { const alias = new Alias(prev) // leaves source dirty; must be cleaned by caller ctx.aliasNodes.push(alias) // defined along with prevObjects return alias } obj.value = value prevObjects.set(value, obj) } obj.node = tagObj.createNode ? tagObj.createNode(ctx.schema, value, ctx) : wrapScalars ? new Scalar(value) : value if (tagName && obj.node instanceof Node) obj.node.tag = tagName return obj.node } yaml-1.10.2/src/doc/getSchemaTags.js000066400000000000000000000016301402322402300171360ustar00rootroot00000000000000export function getSchemaTags(schemas, knownTags, customTags, schemaId) { let tags = schemas[schemaId.replace(/\W/g, '')] // 'yaml-1.1' -> 'yaml11' if (!tags) { const keys = Object.keys(schemas) .map(key => JSON.stringify(key)) .join(', ') throw new Error(`Unknown schema "${schemaId}"; use one of ${keys}`) } if (Array.isArray(customTags)) { for (const tag of customTags) tags = tags.concat(tag) } else if (typeof customTags === 'function') { tags = customTags(tags.slice()) } for (let i = 0; i < tags.length; ++i) { const tag = tags[i] if (typeof tag === 'string') { const tagObj = knownTags[tag] if (!tagObj) { const keys = Object.keys(knownTags) .map(key => JSON.stringify(key)) .join(', ') throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`) } tags[i] = tagObj } } return tags } yaml-1.10.2/src/doc/listTagNames.js000066400000000000000000000010311402322402300170050ustar00rootroot00000000000000import { Collection, Pair, Scalar } from '../ast/index.js' const visit = (node, tags) => { if (node && typeof node === 'object') { const { tag } = node if (node instanceof Collection) { if (tag) tags[tag] = true node.items.forEach(n => visit(n, tags)) } else if (node instanceof Pair) { visit(node.key, tags) visit(node.value, tags) } else if (node instanceof Scalar) { if (tag) tags[tag] = true } } return tags } export const listTagNames = node => Object.keys(visit(node, {})) yaml-1.10.2/src/doc/parseContents.js000066400000000000000000000032611402322402300172510ustar00rootroot00000000000000import { Collection } from '../ast/index.js' import { Type } from '../constants.js' import { YAMLSyntaxError } from '../errors.js' import { resolveNode } from '../resolve/resolveNode.js' export function parseContents(doc, contents) { const comments = { before: [], after: [] } let body = undefined let spaceBefore = false for (const node of contents) { if (node.valueRange) { if (body !== undefined) { const msg = 'Document contains trailing content not separated by a ... or --- line' doc.errors.push(new YAMLSyntaxError(node, msg)) break } const res = resolveNode(doc, node) if (spaceBefore) { res.spaceBefore = true spaceBefore = false } body = res } else if (node.comment !== null) { const cc = body === undefined ? comments.before : comments.after cc.push(node.comment) } else if (node.type === Type.BLANK_LINE) { spaceBefore = true if ( body === undefined && comments.before.length > 0 && !doc.commentBefore ) { // space-separated comments at start are parsed as document comments doc.commentBefore = comments.before.join('\n') comments.before = [] } } } doc.contents = body || null if (!body) { doc.comment = comments.before.concat(comments.after).join('\n') || null } else { const cb = comments.before.join('\n') if (cb) { const cbNode = body instanceof Collection && body.items[0] ? body.items[0] : body cbNode.commentBefore = cbNode.commentBefore ? `${cb}\n${cbNode.commentBefore}` : cb } doc.comment = comments.after.join('\n') || null } } yaml-1.10.2/src/doc/parseDirectives.js000066400000000000000000000050511402322402300175540ustar00rootroot00000000000000import { YAMLSemanticError, YAMLWarning } from '../errors.js' import { documentOptions } from '../options.js' function resolveTagDirective({ tagPrefixes }, directive) { const [handle, prefix] = directive.parameters if (!handle || !prefix) { const msg = 'Insufficient parameters given for %TAG directive' throw new YAMLSemanticError(directive, msg) } if (tagPrefixes.some(p => p.handle === handle)) { const msg = 'The %TAG directive must only be given at most once per handle in the same document.' throw new YAMLSemanticError(directive, msg) } return { handle, prefix } } function resolveYamlDirective(doc, directive) { let [version] = directive.parameters if (directive.name === 'YAML:1.0') version = '1.0' if (!version) { const msg = 'Insufficient parameters given for %YAML directive' throw new YAMLSemanticError(directive, msg) } if (!documentOptions[version]) { const v0 = doc.version || doc.options.version const msg = `Document will be parsed as YAML ${v0} rather than YAML ${version}` doc.warnings.push(new YAMLWarning(directive, msg)) } return version } export function parseDirectives(doc, directives, prevDoc) { const directiveComments = [] let hasDirectives = false for (const directive of directives) { const { comment, name } = directive switch (name) { case 'TAG': try { doc.tagPrefixes.push(resolveTagDirective(doc, directive)) } catch (error) { doc.errors.push(error) } hasDirectives = true break case 'YAML': case 'YAML:1.0': if (doc.version) { const msg = 'The %YAML directive must only be given at most once per document.' doc.errors.push(new YAMLSemanticError(directive, msg)) } try { doc.version = resolveYamlDirective(doc, directive) } catch (error) { doc.errors.push(error) } hasDirectives = true break default: if (name) { const msg = `YAML only supports %TAG and %YAML directives, and not %${name}` doc.warnings.push(new YAMLWarning(directive, msg)) } } if (comment) directiveComments.push(comment) } if ( prevDoc && !hasDirectives && '1.1' === (doc.version || prevDoc.version || doc.options.version) ) { const copyTagPrefix = ({ handle, prefix }) => ({ handle, prefix }) doc.tagPrefixes = prevDoc.tagPrefixes.map(copyTagPrefix) doc.version = prevDoc.version } doc.commentBefore = directiveComments.join('\n') || null } yaml-1.10.2/src/errors.js000066400000000000000000000034001402322402300151630ustar00rootroot00000000000000import { Node } from './cst/Node.js' import { getLinePos, getPrettyContext } from './cst/source-utils.js' import { Range } from './cst/Range.js' export class YAMLError extends Error { constructor(name, source, message) { if (!message || !(source instanceof Node)) throw new Error(`Invalid arguments for new ${name}`) super() this.name = name this.message = message this.source = source } makePretty() { if (!this.source) return this.nodeType = this.source.type const cst = this.source.context && this.source.context.root if (typeof this.offset === 'number') { this.range = new Range(this.offset, this.offset + 1) const start = cst && getLinePos(this.offset, cst) if (start) { const end = { line: start.line, col: start.col + 1 } this.linePos = { start, end } } delete this.offset } else { this.range = this.source.range this.linePos = this.source.rangeAsLinePos } if (this.linePos) { const { line, col } = this.linePos.start this.message += ` at line ${line}, column ${col}` const ctx = cst && getPrettyContext(this.linePos, cst) if (ctx) this.message += `:\n\n${ctx}\n` } delete this.source } } export class YAMLReferenceError extends YAMLError { constructor(source, message) { super('YAMLReferenceError', source, message) } } export class YAMLSemanticError extends YAMLError { constructor(source, message) { super('YAMLSemanticError', source, message) } } export class YAMLSyntaxError extends YAMLError { constructor(source, message) { super('YAMLSyntaxError', source, message) } } export class YAMLWarning extends YAMLError { constructor(source, message) { super('YAMLWarning', source, message) } } yaml-1.10.2/src/index.js000066400000000000000000000034451402322402300147670ustar00rootroot00000000000000import { parse as parseCST } from './cst/parse.js' import { Document as YAMLDocument } from './doc/Document.js' import { Schema } from './doc/Schema.js' import { YAMLSemanticError } from './errors.js' import { defaultOptions, scalarOptions } from './options.js' import { warn } from './warnings.js' function createNode(value, wrapScalars = true, tag) { if (tag === undefined && typeof wrapScalars === 'string') { tag = wrapScalars wrapScalars = true } const options = Object.assign( {}, YAMLDocument.defaults[defaultOptions.version], defaultOptions ) const schema = new Schema(options) return schema.createNode(value, wrapScalars, tag) } class Document extends YAMLDocument { constructor(options) { super(Object.assign({}, defaultOptions, options)) } } function parseAllDocuments(src, options) { const stream = [] let prev for (const cstDoc of parseCST(src)) { const doc = new Document(options) doc.parse(cstDoc, prev) stream.push(doc) prev = doc } return stream } function parseDocument(src, options) { const cst = parseCST(src) const doc = new Document(options).parse(cst[0]) if (cst.length > 1) { const errMsg = 'Source contains multiple documents; please use YAML.parseAllDocuments()' doc.errors.unshift(new YAMLSemanticError(cst[1], errMsg)) } return doc } function parse(src, options) { const doc = parseDocument(src, options) doc.warnings.forEach(warning => warn(warning)) if (doc.errors.length > 0) throw doc.errors[0] return doc.toJSON() } function stringify(value, options) { const doc = new Document(options) doc.contents = value return String(doc) } export const YAML = { createNode, defaultOptions, Document, parse, parseAllDocuments, parseCST, parseDocument, scalarOptions, stringify } yaml-1.10.2/src/legacy-exports.js000066400000000000000000000004771402322402300166300ustar00rootroot00000000000000export { binary } from './tags/yaml-1.1/binary.js' export { omap } from './tags/yaml-1.1/omap.js' export { pairs } from './tags/yaml-1.1/pairs.js' export { set } from './tags/yaml-1.1/set.js' export { floatTime, intTime, timestamp } from './tags/yaml-1.1/timestamp.js' export { warnFileDeprecation } from './warnings' yaml-1.10.2/src/options.js000066400000000000000000000030311402322402300153420ustar00rootroot00000000000000import { defaultTagPrefix } from './constants.js' import { binaryOptions, boolOptions, intOptions, nullOptions, strOptions } from './tags/options.js' export const defaultOptions = { anchorPrefix: 'a', customTags: null, indent: 2, indentSeq: true, keepCstNodes: false, keepNodeTypes: true, keepBlobsInJSON: true, mapAsMap: false, maxAliasCount: 100, prettyErrors: false, // TODO Set true in v2 simpleKeys: false, version: '1.2' } export const scalarOptions = { get binary() { return binaryOptions }, set binary(opt) { Object.assign(binaryOptions, opt) }, get bool() { return boolOptions }, set bool(opt) { Object.assign(boolOptions, opt) }, get int() { return intOptions }, set int(opt) { Object.assign(intOptions, opt) }, get null() { return nullOptions }, set null(opt) { Object.assign(nullOptions, opt) }, get str() { return strOptions }, set str(opt) { Object.assign(strOptions, opt) } } export const documentOptions = { '1.0': { schema: 'yaml-1.1', merge: true, tagPrefixes: [ { handle: '!', prefix: defaultTagPrefix }, { handle: '!!', prefix: 'tag:private.yaml.org,2002:' } ] }, 1.1: { schema: 'yaml-1.1', merge: true, tagPrefixes: [ { handle: '!', prefix: '!' }, { handle: '!!', prefix: defaultTagPrefix } ] }, 1.2: { schema: 'core', merge: false, tagPrefixes: [ { handle: '!', prefix: '!' }, { handle: '!!', prefix: defaultTagPrefix } ] } } yaml-1.10.2/src/resolve/000077500000000000000000000000001402322402300147735ustar00rootroot00000000000000yaml-1.10.2/src/resolve/collection-utils.js000066400000000000000000000043051402322402300206240ustar00rootroot00000000000000import { YAMLSemanticError } from '../errors.js' import { Type } from '../constants.js' export function checkFlowCollectionEnd(errors, cst) { let char, name switch (cst.type) { case Type.FLOW_MAP: char = '}' name = 'flow map' break case Type.FLOW_SEQ: char = ']' name = 'flow sequence' break default: errors.push(new YAMLSemanticError(cst, 'Not a flow collection!?')) return } let lastItem for (let i = cst.items.length - 1; i >= 0; --i) { const item = cst.items[i] if (!item || item.type !== Type.COMMENT) { lastItem = item break } } if (lastItem && lastItem.char !== char) { const msg = `Expected ${name} to end with ${char}` let err if (typeof lastItem.offset === 'number') { err = new YAMLSemanticError(cst, msg) err.offset = lastItem.offset + 1 } else { err = new YAMLSemanticError(lastItem, msg) if (lastItem.range && lastItem.range.end) err.offset = lastItem.range.end - lastItem.range.start } errors.push(err) } } export function checkFlowCommentSpace(errors, comment) { const prev = comment.context.src[comment.range.start - 1] if (prev !== '\n' && prev !== '\t' && prev !== ' ') { const msg = 'Comments must be separated from other tokens by white space characters' errors.push(new YAMLSemanticError(comment, msg)) } } export function getLongKeyError(source, key) { const sk = String(key) const k = sk.substr(0, 8) + '...' + sk.substr(-8) return new YAMLSemanticError(source, `The "${k}" key is too long`) } export function resolveComments(collection, comments) { for (const { afterKey, before, comment } of comments) { let item = collection.items[before] if (!item) { if (comment !== undefined) { if (collection.comment) collection.comment += '\n' + comment else collection.comment = comment } } else { if (afterKey && item.value) item = item.value if (comment === undefined) { if (afterKey || !item.commentBefore) item.spaceBefore = true } else { if (item.commentBefore) item.commentBefore += '\n' + comment else item.commentBefore = comment } } } } yaml-1.10.2/src/resolve/resolveMap.js000066400000000000000000000217241402322402300174540ustar00rootroot00000000000000import { Alias } from '../ast/Alias.js' import { Collection } from '../ast/Collection.js' import { Merge, MERGE_KEY } from '../ast/Merge.js' import { Pair } from '../ast/Pair.js' import { YAMLMap } from '../ast/YAMLMap.js' import { Char, Type } from '../constants.js' import { PlainValue } from '../cst/PlainValue.js' import { YAMLSemanticError, YAMLSyntaxError, YAMLWarning } from '../errors.js' import { checkFlowCollectionEnd, checkFlowCommentSpace, getLongKeyError, resolveComments } from './collection-utils.js' import { resolveNode } from './resolveNode.js' export function resolveMap(doc, cst) { if (cst.type !== Type.MAP && cst.type !== Type.FLOW_MAP) { const msg = `A ${cst.type} node cannot be resolved as a mapping` doc.errors.push(new YAMLSyntaxError(cst, msg)) return null } const { comments, items } = cst.type === Type.FLOW_MAP ? resolveFlowMapItems(doc, cst) : resolveBlockMapItems(doc, cst) const map = new YAMLMap() map.items = items resolveComments(map, comments) let hasCollectionKey = false for (let i = 0; i < items.length; ++i) { const { key: iKey } = items[i] if (iKey instanceof Collection) hasCollectionKey = true if (doc.schema.merge && iKey && iKey.value === MERGE_KEY) { items[i] = new Merge(items[i]) const sources = items[i].value.items let error = null sources.some(node => { if (node instanceof Alias) { // During parsing, alias sources are CST nodes; to account for // circular references their resolved values can't be used here. const { type } = node.source if (type === Type.MAP || type === Type.FLOW_MAP) return false return (error = 'Merge nodes aliases can only point to maps') } return (error = 'Merge nodes can only have Alias nodes as values') }) if (error) doc.errors.push(new YAMLSemanticError(cst, error)) } else { for (let j = i + 1; j < items.length; ++j) { const { key: jKey } = items[j] if ( iKey === jKey || (iKey && jKey && Object.prototype.hasOwnProperty.call(iKey, 'value') && iKey.value === jKey.value) ) { const msg = `Map keys must be unique; "${iKey}" is repeated` doc.errors.push(new YAMLSemanticError(cst, msg)) break } } } } if (hasCollectionKey && !doc.options.mapAsMap) { const warn = 'Keys with collection values will be stringified as YAML due to JS Object restrictions. Use mapAsMap: true to avoid this.' doc.warnings.push(new YAMLWarning(cst, warn)) } cst.resolved = map return map } const valueHasPairComment = ({ context: { lineStart, node, src }, props }) => { if (props.length === 0) return false const { start } = props[0] if (node && start > node.valueRange.start) return false if (src[start] !== Char.COMMENT) return false for (let i = lineStart; i < start; ++i) if (src[i] === '\n') return false return true } function resolvePairComment(item, pair) { if (!valueHasPairComment(item)) return const comment = item.getPropValue(0, Char.COMMENT, true) let found = false const cb = pair.value.commentBefore if (cb && cb.startsWith(comment)) { pair.value.commentBefore = cb.substr(comment.length + 1) found = true } else { const cc = pair.value.comment if (!item.node && cc && cc.startsWith(comment)) { pair.value.comment = cc.substr(comment.length + 1) found = true } } if (found) pair.comment = comment } function resolveBlockMapItems(doc, cst) { const comments = [] const items = [] let key = undefined let keyStart = null for (let i = 0; i < cst.items.length; ++i) { const item = cst.items[i] switch (item.type) { case Type.BLANK_LINE: comments.push({ afterKey: !!key, before: items.length }) break case Type.COMMENT: comments.push({ afterKey: !!key, before: items.length, comment: item.comment }) break case Type.MAP_KEY: if (key !== undefined) items.push(new Pair(key)) if (item.error) doc.errors.push(item.error) key = resolveNode(doc, item.node) keyStart = null break case Type.MAP_VALUE: { if (key === undefined) key = null if (item.error) doc.errors.push(item.error) if ( !item.context.atLineStart && item.node && item.node.type === Type.MAP && !item.node.context.atLineStart ) { const msg = 'Nested mappings are not allowed in compact mappings' doc.errors.push(new YAMLSemanticError(item.node, msg)) } let valueNode = item.node if (!valueNode && item.props.length > 0) { // Comments on an empty mapping value need to be preserved, so we // need to construct a minimal empty node here to use instead of the // missing `item.node`. -- eemeli/yaml#19 valueNode = new PlainValue(Type.PLAIN, []) valueNode.context = { parent: item, src: item.context.src } const pos = item.range.start + 1 valueNode.range = { start: pos, end: pos } valueNode.valueRange = { start: pos, end: pos } if (typeof item.range.origStart === 'number') { const origPos = item.range.origStart + 1 valueNode.range.origStart = valueNode.range.origEnd = origPos valueNode.valueRange.origStart = valueNode.valueRange.origEnd = origPos } } const pair = new Pair(key, resolveNode(doc, valueNode)) resolvePairComment(item, pair) items.push(pair) if (key && typeof keyStart === 'number') { if (item.range.start > keyStart + 1024) doc.errors.push(getLongKeyError(cst, key)) } key = undefined keyStart = null } break default: if (key !== undefined) items.push(new Pair(key)) key = resolveNode(doc, item) keyStart = item.range.start if (item.error) doc.errors.push(item.error) next: for (let j = i + 1; ; ++j) { const nextItem = cst.items[j] switch (nextItem && nextItem.type) { case Type.BLANK_LINE: case Type.COMMENT: continue next case Type.MAP_VALUE: break next default: { const msg = 'Implicit map keys need to be followed by map values' doc.errors.push(new YAMLSemanticError(item, msg)) break next } } } if (item.valueRangeContainsNewline) { const msg = 'Implicit map keys need to be on a single line' doc.errors.push(new YAMLSemanticError(item, msg)) } } } if (key !== undefined) items.push(new Pair(key)) return { comments, items } } function resolveFlowMapItems(doc, cst) { const comments = [] const items = [] let key = undefined let explicitKey = false let next = '{' for (let i = 0; i < cst.items.length; ++i) { const item = cst.items[i] if (typeof item.char === 'string') { const { char, offset } = item if (char === '?' && key === undefined && !explicitKey) { explicitKey = true next = ':' continue } if (char === ':') { if (key === undefined) key = null if (next === ':') { next = ',' continue } } else { if (explicitKey) { if (key === undefined && char !== ',') key = null explicitKey = false } if (key !== undefined) { items.push(new Pair(key)) key = undefined if (char === ',') { next = ':' continue } } } if (char === '}') { if (i === cst.items.length - 1) continue } else if (char === next) { next = ':' continue } const msg = `Flow map contains an unexpected ${char}` const err = new YAMLSyntaxError(cst, msg) err.offset = offset doc.errors.push(err) } else if (item.type === Type.BLANK_LINE) { comments.push({ afterKey: !!key, before: items.length }) } else if (item.type === Type.COMMENT) { checkFlowCommentSpace(doc.errors, item) comments.push({ afterKey: !!key, before: items.length, comment: item.comment }) } else if (key === undefined) { if (next === ',') doc.errors.push( new YAMLSemanticError(item, 'Separator , missing in flow map') ) key = resolveNode(doc, item) } else { if (next !== ',') doc.errors.push( new YAMLSemanticError(item, 'Indicator : missing in flow map entry') ) items.push(new Pair(key, resolveNode(doc, item))) key = undefined explicitKey = false } } checkFlowCollectionEnd(doc.errors, cst) if (key !== undefined) items.push(new Pair(key)) return { comments, items } } yaml-1.10.2/src/resolve/resolveNode.js000066400000000000000000000104341402322402300176200ustar00rootroot00000000000000import { Alias } from '../ast/Alias.js' import { Char, Type } from '../constants.js' import { YAMLReferenceError, YAMLSemanticError, YAMLSyntaxError } from '../errors.js' import { resolveScalar } from './resolveScalar.js' import { resolveString } from './resolveString.js' import { resolveTagName } from './resolveTagName.js' import { resolveTag } from './resolveTag.js' const isCollectionItem = node => { if (!node) return false const { type } = node return ( type === Type.MAP_KEY || type === Type.MAP_VALUE || type === Type.SEQ_ITEM ) } function resolveNodeProps(errors, node) { const comments = { before: [], after: [] } let hasAnchor = false let hasTag = false const props = isCollectionItem(node.context.parent) ? node.context.parent.props.concat(node.props) : node.props for (const { start, end } of props) { switch (node.context.src[start]) { case Char.COMMENT: { if (!node.commentHasRequiredWhitespace(start)) { const msg = 'Comments must be separated from other tokens by white space characters' errors.push(new YAMLSemanticError(node, msg)) } const { header, valueRange } = node const cc = valueRange && (start > valueRange.start || (header && start > header.start)) ? comments.after : comments.before cc.push(node.context.src.slice(start + 1, end)) break } // Actual anchor & tag resolution is handled by schema, here we just complain case Char.ANCHOR: if (hasAnchor) { const msg = 'A node can have at most one anchor' errors.push(new YAMLSemanticError(node, msg)) } hasAnchor = true break case Char.TAG: if (hasTag) { const msg = 'A node can have at most one tag' errors.push(new YAMLSemanticError(node, msg)) } hasTag = true break } } return { comments, hasAnchor, hasTag } } function resolveNodeValue(doc, node) { const { anchors, errors, schema } = doc if (node.type === Type.ALIAS) { const name = node.rawValue const src = anchors.getNode(name) if (!src) { const msg = `Aliased anchor not found: ${name}` errors.push(new YAMLReferenceError(node, msg)) return null } // Lazy resolution for circular references const res = new Alias(src) anchors._cstAliases.push(res) return res } const tagName = resolveTagName(doc, node) if (tagName) return resolveTag(doc, node, tagName) if (node.type !== Type.PLAIN) { const msg = `Failed to resolve ${node.type} node here` errors.push(new YAMLSyntaxError(node, msg)) return null } try { const str = resolveString(doc, node) return resolveScalar(str, schema.tags, schema.tags.scalarFallback) } catch (error) { if (!error.source) error.source = node errors.push(error) return null } } // sets node.resolved on success export function resolveNode(doc, node) { if (!node) return null if (node.error) doc.errors.push(node.error) const { comments, hasAnchor, hasTag } = resolveNodeProps(doc.errors, node) if (hasAnchor) { const { anchors } = doc const name = node.anchor const prev = anchors.getNode(name) // At this point, aliases for any preceding node with the same anchor // name have already been resolved, so it may safely be renamed. if (prev) anchors.map[anchors.newName(name)] = prev // During parsing, we need to store the CST node in anchors.map as // anchors need to be available during resolution to allow for // circular references. anchors.map[name] = node } if (node.type === Type.ALIAS && (hasAnchor || hasTag)) { const msg = 'An alias node must not specify any properties' doc.errors.push(new YAMLSemanticError(node, msg)) } const res = resolveNodeValue(doc, node) if (res) { res.range = [node.range.start, node.range.end] if (doc.options.keepCstNodes) res.cstNode = node if (doc.options.keepNodeTypes) res.type = node.type const cb = comments.before.join('\n') if (cb) { res.commentBefore = res.commentBefore ? `${res.commentBefore}\n${cb}` : cb } const ca = comments.after.join('\n') if (ca) res.comment = res.comment ? `${res.comment}\n${ca}` : ca } return (node.resolved = res) } yaml-1.10.2/src/resolve/resolveScalar.js000066400000000000000000000010041402322402300201310ustar00rootroot00000000000000import { Scalar } from '../ast/Scalar.js' // falls back to string on no match export function resolveScalar(str, tags, scalarFallback) { for (const { format, test, resolve } of tags) { if (test) { const match = str.match(test) if (match) { let res = resolve.apply(null, match) if (!(res instanceof Scalar)) res = new Scalar(res) if (format) res.format = format return res } } } if (scalarFallback) str = scalarFallback(str) return new Scalar(str) } yaml-1.10.2/src/resolve/resolveSeq.js000066400000000000000000000117001402322402300174600ustar00rootroot00000000000000import { Collection } from '../ast/Collection.js' import { Pair } from '../ast/Pair.js' import { YAMLSeq } from '../ast/YAMLSeq.js' import { Type } from '../constants.js' import { YAMLSemanticError, YAMLSyntaxError, YAMLWarning } from '../errors.js' import { checkFlowCollectionEnd, checkFlowCommentSpace, getLongKeyError, resolveComments } from './collection-utils.js' import { resolveNode } from './resolveNode.js' export function resolveSeq(doc, cst) { if (cst.type !== Type.SEQ && cst.type !== Type.FLOW_SEQ) { const msg = `A ${cst.type} node cannot be resolved as a sequence` doc.errors.push(new YAMLSyntaxError(cst, msg)) return null } const { comments, items } = cst.type === Type.FLOW_SEQ ? resolveFlowSeqItems(doc, cst) : resolveBlockSeqItems(doc, cst) const seq = new YAMLSeq() seq.items = items resolveComments(seq, comments) if ( !doc.options.mapAsMap && items.some(it => it instanceof Pair && it.key instanceof Collection) ) { const warn = 'Keys with collection values will be stringified as YAML due to JS Object restrictions. Use mapAsMap: true to avoid this.' doc.warnings.push(new YAMLWarning(cst, warn)) } cst.resolved = seq return seq } function resolveBlockSeqItems(doc, cst) { const comments = [] const items = [] for (let i = 0; i < cst.items.length; ++i) { const item = cst.items[i] switch (item.type) { case Type.BLANK_LINE: comments.push({ before: items.length }) break case Type.COMMENT: comments.push({ comment: item.comment, before: items.length }) break case Type.SEQ_ITEM: if (item.error) doc.errors.push(item.error) items.push(resolveNode(doc, item.node)) if (item.hasProps) { const msg = 'Sequence items cannot have tags or anchors before the - indicator' doc.errors.push(new YAMLSemanticError(item, msg)) } break default: if (item.error) doc.errors.push(item.error) doc.errors.push( new YAMLSyntaxError(item, `Unexpected ${item.type} node in sequence`) ) } } return { comments, items } } function resolveFlowSeqItems(doc, cst) { const comments = [] const items = [] let explicitKey = false let key = undefined let keyStart = null let next = '[' let prevItem = null for (let i = 0; i < cst.items.length; ++i) { const item = cst.items[i] if (typeof item.char === 'string') { const { char, offset } = item if (char !== ':' && (explicitKey || key !== undefined)) { if (explicitKey && key === undefined) key = next ? items.pop() : null items.push(new Pair(key)) explicitKey = false key = undefined keyStart = null } if (char === next) { next = null } else if (!next && char === '?') { explicitKey = true } else if (next !== '[' && char === ':' && key === undefined) { if (next === ',') { key = items.pop() if (key instanceof Pair) { const msg = 'Chaining flow sequence pairs is invalid' const err = new YAMLSemanticError(cst, msg) err.offset = offset doc.errors.push(err) } if (!explicitKey && typeof keyStart === 'number') { const keyEnd = item.range ? item.range.start : item.offset if (keyEnd > keyStart + 1024) doc.errors.push(getLongKeyError(cst, key)) const { src } = prevItem.context for (let i = keyStart; i < keyEnd; ++i) if (src[i] === '\n') { const msg = 'Implicit keys of flow sequence pairs need to be on a single line' doc.errors.push(new YAMLSemanticError(prevItem, msg)) break } } } else { key = null } keyStart = null explicitKey = false next = null } else if (next === '[' || char !== ']' || i < cst.items.length - 1) { const msg = `Flow sequence contains an unexpected ${char}` const err = new YAMLSyntaxError(cst, msg) err.offset = offset doc.errors.push(err) } } else if (item.type === Type.BLANK_LINE) { comments.push({ before: items.length }) } else if (item.type === Type.COMMENT) { checkFlowCommentSpace(doc.errors, item) comments.push({ comment: item.comment, before: items.length }) } else { if (next) { const msg = `Expected a ${next} in flow sequence` doc.errors.push(new YAMLSemanticError(item, msg)) } const value = resolveNode(doc, item) if (key === undefined) { items.push(value) prevItem = item } else { items.push(new Pair(key, value)) key = undefined } keyStart = item.range.start next = ',' } } checkFlowCollectionEnd(doc.errors, cst) if (key !== undefined) items.push(new Pair(key)) return { comments, items } } yaml-1.10.2/src/resolve/resolveString.js000066400000000000000000000004771402322402300202070ustar00rootroot00000000000000// on error, will return { str: string, errors: Error[] } export function resolveString(doc, node) { const res = node.strValue if (!res) return '' if (typeof res === 'string') return res res.errors.forEach(error => { if (!error.source) error.source = node doc.errors.push(error) }) return res.str } yaml-1.10.2/src/resolve/resolveTag.js000066400000000000000000000036321402322402300174500ustar00rootroot00000000000000import { Collection } from '../ast/Collection.js' import { Scalar } from '../ast/Scalar.js' import { Type, defaultTags } from '../constants.js' import { YAMLReferenceError, YAMLWarning } from '../errors.js' import { resolveScalar } from './resolveScalar.js' import { resolveString } from './resolveString.js' function resolveByTagName(doc, node, tagName) { const { tags } = doc.schema const matchWithTest = [] for (const tag of tags) { if (tag.tag === tagName) { if (tag.test) matchWithTest.push(tag) else { const res = tag.resolve(doc, node) return res instanceof Collection ? res : new Scalar(res) } } } const str = resolveString(doc, node) if (typeof str === 'string' && matchWithTest.length > 0) return resolveScalar(str, matchWithTest, tags.scalarFallback) return null } function getFallbackTagName({ type }) { switch (type) { case Type.FLOW_MAP: case Type.MAP: return defaultTags.MAP case Type.FLOW_SEQ: case Type.SEQ: return defaultTags.SEQ default: return defaultTags.STR } } export function resolveTag(doc, node, tagName) { try { const res = resolveByTagName(doc, node, tagName) if (res) { if (tagName && node.tag) res.tag = tagName return res } } catch (error) { /* istanbul ignore if */ if (!error.source) error.source = node doc.errors.push(error) return null } try { const fallback = getFallbackTagName(node) if (!fallback) throw new Error(`The tag ${tagName} is unavailable`) const msg = `The tag ${tagName} is unavailable, falling back to ${fallback}` doc.warnings.push(new YAMLWarning(node, msg)) const res = resolveByTagName(doc, node, fallback) res.tag = tagName return res } catch (error) { const refError = new YAMLReferenceError(node, error.message) refError.stack = error.stack doc.errors.push(refError) return null } } yaml-1.10.2/src/resolve/resolveTagName.js000066400000000000000000000041471402322402300202530ustar00rootroot00000000000000import { Type, defaultTags } from '../constants.js' import { YAMLSemanticError, YAMLWarning } from '../errors.js' function resolveTagHandle(doc, node) { const { handle, suffix } = node.tag let prefix = doc.tagPrefixes.find(p => p.handle === handle) if (!prefix) { const dtp = doc.getDefaults().tagPrefixes if (dtp) prefix = dtp.find(p => p.handle === handle) if (!prefix) throw new YAMLSemanticError( node, `The ${handle} tag handle is non-default and was not declared.` ) } if (!suffix) throw new YAMLSemanticError(node, `The ${handle} tag has no suffix.`) if (handle === '!' && (doc.version || doc.options.version) === '1.0') { if (suffix[0] === '^') { doc.warnings.push( new YAMLWarning(node, 'YAML 1.0 ^ tag expansion is not supported') ) return suffix } if (/[:/]/.test(suffix)) { // word/foo -> tag:word.yaml.org,2002:foo const vocab = suffix.match(/^([a-z0-9-]+)\/(.*)/i) return vocab ? `tag:${vocab[1]}.yaml.org,2002:${vocab[2]}` : `tag:${suffix}` } } return prefix.prefix + decodeURIComponent(suffix) } export function resolveTagName(doc, node) { const { tag, type } = node let nonSpecific = false if (tag) { const { handle, suffix, verbatim } = tag if (verbatim) { if (verbatim !== '!' && verbatim !== '!!') return verbatim const msg = `Verbatim tags aren't resolved, so ${verbatim} is invalid.` doc.errors.push(new YAMLSemanticError(node, msg)) } else if (handle === '!' && !suffix) { nonSpecific = true } else { try { return resolveTagHandle(doc, node) } catch (error) { doc.errors.push(error) } } } switch (type) { case Type.BLOCK_FOLDED: case Type.BLOCK_LITERAL: case Type.QUOTE_DOUBLE: case Type.QUOTE_SINGLE: return defaultTags.STR case Type.FLOW_MAP: case Type.MAP: return defaultTags.MAP case Type.FLOW_SEQ: case Type.SEQ: return defaultTags.SEQ case Type.PLAIN: return nonSpecific ? defaultTags.STR : null default: return null } } yaml-1.10.2/src/stringify/000077500000000000000000000000001402322402300153325ustar00rootroot00000000000000yaml-1.10.2/src/stringify/addComment.js000066400000000000000000000006011402322402300177400ustar00rootroot00000000000000export function addCommentBefore(str, indent, comment) { if (!comment) return str const cc = comment.replace(/[\s\S]^/gm, `$&${indent}#`) return `#${cc}\n${indent}${str}` } export function addComment(str, indent, comment) { return !comment ? str : comment.indexOf('\n') === -1 ? `${str} #${comment}` : `${str}\n` + comment.replace(/^/gm, `${indent || ''}#`) } yaml-1.10.2/src/stringify/foldFlowLines.js000066400000000000000000000103321402322402300204360ustar00rootroot00000000000000export const FOLD_FLOW = 'flow' export const FOLD_BLOCK = 'block' export const FOLD_QUOTED = 'quoted' // presumes i+1 is at the start of a line // returns index of last newline in more-indented block const consumeMoreIndentedLines = (text, i) => { let ch = text[i + 1] while (ch === ' ' || ch === '\t') { do { ch = text[(i += 1)] } while (ch && ch !== '\n') ch = text[i + 1] } return i } /** * Tries to keep input at up to `lineWidth` characters, splitting only on spaces * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are * terminated with `\n` and started with `indent`. * * @param {string} text * @param {string} indent * @param {string} [mode='flow'] `'block'` prevents more-indented lines * from being folded; `'quoted'` allows for `\` escapes, including escaped * newlines * @param {Object} options * @param {number} [options.indentAtStart] Accounts for leading contents on * the first line, defaulting to `indent.length` * @param {number} [options.lineWidth=80] * @param {number} [options.minContentWidth=20] Allow highly indented lines to * stretch the line width or indent content from the start * @param {function} options.onFold Called once if the text is folded * @param {function} options.onFold Called once if any line of text exceeds * lineWidth characters */ export function foldFlowLines( text, indent, mode, { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } ) { if (!lineWidth || lineWidth < 0) return text const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length) if (text.length <= endStep) return text const folds = [] const escapedFolds = {} let end = lineWidth - indent.length if (typeof indentAtStart === 'number') { if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) folds.push(0) else end = lineWidth - indentAtStart } let split = undefined let prev = undefined let overflow = false let i = -1 let escStart = -1 let escEnd = -1 if (mode === FOLD_BLOCK) { i = consumeMoreIndentedLines(text, i) if (i !== -1) end = i + endStep } for (let ch; (ch = text[(i += 1)]); ) { if (mode === FOLD_QUOTED && ch === '\\') { escStart = i switch (text[i + 1]) { case 'x': i += 3 break case 'u': i += 5 break case 'U': i += 9 break default: i += 1 } escEnd = i } if (ch === '\n') { if (mode === FOLD_BLOCK) i = consumeMoreIndentedLines(text, i) end = i + endStep split = undefined } else { if ( ch === ' ' && prev && prev !== ' ' && prev !== '\n' && prev !== '\t' ) { // space surrounded by non-space can be replaced with newline + indent const next = text[i + 1] if (next && next !== ' ' && next !== '\n' && next !== '\t') split = i } if (i >= end) { if (split) { folds.push(split) end = split + endStep split = undefined } else if (mode === FOLD_QUOTED) { // white-space collected at end may stretch past lineWidth while (prev === ' ' || prev === '\t') { prev = ch ch = text[(i += 1)] overflow = true } // Account for newline escape, but don't break preceding escape const j = i > escEnd + 1 ? i - 2 : escStart - 1 // Bail out if lineWidth & minContentWidth are shorter than an escape string if (escapedFolds[j]) return text folds.push(j) escapedFolds[j] = true end = j + endStep split = undefined } else { overflow = true } } } prev = ch } if (overflow && onOverflow) onOverflow() if (folds.length === 0) return text if (onFold) onFold() let res = text.slice(0, folds[0]) for (let i = 0; i < folds.length; ++i) { const fold = folds[i] const end = folds[i + 1] || text.length if (fold === 0) res = `\n${indent}${text.slice(0, end)}` else { if (mode === FOLD_QUOTED && escapedFolds[fold]) res += `${text[fold]}\\` res += `\n${indent}${text.slice(fold + 1, end)}` } } return res } yaml-1.10.2/src/stringify/stringify.js000066400000000000000000000054151402322402300177130ustar00rootroot00000000000000import { Alias } from '../ast/Alias.js' import { Node } from '../ast/Node.js' import { Pair } from '../ast/Pair.js' import { Scalar } from '../ast/Scalar.js' import { stringifyString } from './stringifyString.js' import { stringifyTag } from './stringifyTag.js' function getTagObject(tags, item) { if (item instanceof Alias) return Alias if (item.tag) { const match = tags.filter(t => t.tag === item.tag) if (match.length > 0) return match.find(t => t.format === item.format) || match[0] } let tagObj, obj if (item instanceof Scalar) { obj = item.value // TODO: deprecate/remove class check const match = tags.filter( t => (t.identify && t.identify(obj)) || (t.class && obj instanceof t.class) ) tagObj = match.find(t => t.format === item.format) || match.find(t => !t.format) } else { obj = item tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass) } if (!tagObj) { const name = obj && obj.constructor ? obj.constructor.name : typeof obj throw new Error(`Tag not resolved for ${name} value`) } return tagObj } // needs to be called before value stringifier to allow for circular anchor refs function stringifyProps(node, tagObj, { anchors, doc }) { const props = [] const anchor = doc.anchors.getName(node) if (anchor) { anchors[anchor] = node props.push(`&${anchor}`) } if (node.tag) { props.push(stringifyTag(doc, node.tag)) } else if (!tagObj.default) { props.push(stringifyTag(doc, tagObj.tag)) } return props.join(' ') } export function stringify(item, ctx, onComment, onChompKeep) { const { anchors, schema } = ctx.doc let tagObj if (!(item instanceof Node)) { const createCtx = { aliasNodes: [], onTagObj: o => (tagObj = o), prevObjects: new Map() } item = schema.createNode(item, true, null, createCtx) for (const alias of createCtx.aliasNodes) { alias.source = alias.source.node let name = anchors.getName(alias.source) if (!name) { name = anchors.newName() anchors.map[name] = alias.source } } } if (item instanceof Pair) return item.toString(ctx, onComment, onChompKeep) if (!tagObj) tagObj = getTagObject(schema.tags, item) const props = stringifyProps(item, tagObj, ctx) if (props.length > 0) ctx.indentAtStart = (ctx.indentAtStart || 0) + props.length + 1 const str = typeof tagObj.stringify === 'function' ? tagObj.stringify(item, ctx, onComment, onChompKeep) : item instanceof Scalar ? stringifyString(item, ctx, onComment, onChompKeep) : item.toString(ctx, onComment, onChompKeep) if (!props) return str return item instanceof Scalar || str[0] === '{' || str[0] === '[' ? `${props} ${str}` : `${props}\n${ctx.indent}${str}` } yaml-1.10.2/src/stringify/stringifyNumber.js000066400000000000000000000010521402322402300210550ustar00rootroot00000000000000export function stringifyNumber({ format, minFractionDigits, tag, value }) { if (typeof value === 'bigint') return String(value) if (!isFinite(value)) return isNaN(value) ? '.nan' : value < 0 ? '-.inf' : '.inf' let n = JSON.stringify(value) if ( !format && minFractionDigits && (!tag || tag === 'tag:yaml.org,2002:float') && /^\d/.test(n) ) { let i = n.indexOf('.') if (i < 0) { i = n.length n += '.' } let d = minFractionDigits - (n.length - i - 1) while (d-- > 0) n += '0' } return n } yaml-1.10.2/src/stringify/stringifyString.js000066400000000000000000000232371402322402300211040ustar00rootroot00000000000000import { addCommentBefore } from './addComment.js' import { Type } from '../constants.js' import { resolveScalar } from '../resolve/resolveScalar.js' import { foldFlowLines, FOLD_BLOCK, FOLD_FLOW, FOLD_QUOTED } from './foldFlowLines.js' import { strOptions } from '../tags/options.js' const getFoldOptions = ({ indentAtStart }) => indentAtStart ? Object.assign({ indentAtStart }, strOptions.fold) : strOptions.fold // Also checks for lines starting with %, as parsing the output as YAML 1.1 will // presume that's starting a new document. const containsDocumentMarker = str => /^(%|---|\.\.\.)/m.test(str) function lineLengthOverLimit(str, lineWidth, indentLength) { if (!lineWidth || lineWidth < 0) return false const limit = lineWidth - indentLength const strLen = str.length if (strLen <= limit) return false for (let i = 0, start = 0; i < strLen; ++i) { if (str[i] === '\n') { if (i - start > limit) return true start = i + 1 if (strLen - start <= limit) return false } } return true } function doubleQuotedString(value, ctx) { const { implicitKey } = ctx const { jsonEncoding, minMultiLineLength } = strOptions.doubleQuoted const json = JSON.stringify(value) if (jsonEncoding) return json const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '') let str = '' let start = 0 for (let i = 0, ch = json[i]; ch; ch = json[++i]) { if (ch === ' ' && json[i + 1] === '\\' && json[i + 2] === 'n') { // space before newline needs to be escaped to not be folded str += json.slice(start, i) + '\\ ' i += 1 start = i ch = '\\' } if (ch === '\\') switch (json[i + 1]) { case 'u': { str += json.slice(start, i) const code = json.substr(i + 2, 4) switch (code) { case '0000': str += '\\0' break case '0007': str += '\\a' break case '000b': str += '\\v' break case '001b': str += '\\e' break case '0085': str += '\\N' break case '00a0': str += '\\_' break case '2028': str += '\\L' break case '2029': str += '\\P' break default: if (code.substr(0, 2) === '00') str += '\\x' + code.substr(2) else str += json.substr(i, 6) } i += 5 start = i + 1 } break case 'n': if ( implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength ) { i += 1 } else { // folding will eat first newline str += json.slice(start, i) + '\n\n' while ( json[i + 2] === '\\' && json[i + 3] === 'n' && json[i + 4] !== '"' ) { str += '\n' i += 2 } str += indent // space after newline needs to be escaped to not be folded if (json[i + 2] === ' ') str += '\\' i += 1 start = i + 1 } break default: i += 1 } } str = start ? str + json.slice(start) : json return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx)) } function singleQuotedString(value, ctx) { if (ctx.implicitKey) { if (/\n/.test(value)) return doubleQuotedString(value, ctx) } else { // single quoted string can't have leading or trailing whitespace around newline if (/[ \t]\n|\n[ \t]/.test(value)) return doubleQuotedString(value, ctx) } const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '') const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$&\n${indent}`) + "'" return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx)) } function blockString({ comment, type, value }, ctx, onComment, onChompKeep) { // 1. Block can't end in whitespace unless the last line is non-empty. // 2. Strings consisting of only whitespace are best rendered explicitly. if (/\n[\t ]+$/.test(value) || /^\s*$/.test(value)) { return doubleQuotedString(value, ctx) } const indent = ctx.indent || (ctx.forceBlockIndent || containsDocumentMarker(value) ? ' ' : '') const indentSize = indent ? '2' : '1' // root is at -1 const literal = type === Type.BLOCK_FOLDED ? false : type === Type.BLOCK_LITERAL ? true : !lineLengthOverLimit(value, strOptions.fold.lineWidth, indent.length) let header = literal ? '|' : '>' if (!value) return header + '\n' let wsStart = '' let wsEnd = '' value = value .replace(/[\n\t ]*$/, ws => { const n = ws.indexOf('\n') if (n === -1) { header += '-' // strip } else if (value === ws || n !== ws.length - 1) { header += '+' // keep if (onChompKeep) onChompKeep() } wsEnd = ws.replace(/\n$/, '') return '' }) .replace(/^[\n ]*/, ws => { if (ws.indexOf(' ') !== -1) header += indentSize const m = ws.match(/ +$/) if (m) { wsStart = ws.slice(0, -m[0].length) return m[0] } else { wsStart = ws return '' } }) if (wsEnd) wsEnd = wsEnd.replace(/\n+(?!\n|$)/g, `$&${indent}`) if (wsStart) wsStart = wsStart.replace(/\n+/g, `$&${indent}`) if (comment) { header += ' #' + comment.replace(/ ?[\r\n]+/g, ' ') if (onComment) onComment() } if (!value) return `${header}${indentSize}\n${indent}${wsEnd}` if (literal) { value = value.replace(/\n+/g, `$&${indent}`) return `${header}\n${indent}${wsStart}${value}${wsEnd}` } value = value .replace(/\n+/g, '\n$&') .replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, '$1$2') // more-indented lines aren't folded // ^ ind.line ^ empty ^ capture next empty lines only at end of indent .replace(/\n+/g, `$&${indent}`) const body = foldFlowLines( `${wsStart}${value}${wsEnd}`, indent, FOLD_BLOCK, strOptions.fold ) return `${header}\n${indent}${body}` } function plainString(item, ctx, onComment, onChompKeep) { const { comment, type, value } = item const { actualString, implicitKey, indent, inFlow } = ctx if ( (implicitKey && /[\n[\]{},]/.test(value)) || (inFlow && /[[\]{},]/.test(value)) ) { return doubleQuotedString(value, ctx) } if ( !value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test( value ) ) { // not allowed: // - empty string, '-' or '?' // - start with an indicator character (except [?:-]) or /[?-] / // - '\n ', ': ' or ' \n' anywhere // - '#' not preceded by a non-space char // - end with ' ' or ':' return implicitKey || inFlow || value.indexOf('\n') === -1 ? value.indexOf('"') !== -1 && value.indexOf("'") === -1 ? singleQuotedString(value, ctx) : doubleQuotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep) } if ( !implicitKey && !inFlow && type !== Type.PLAIN && value.indexOf('\n') !== -1 ) { // Where allowed & type not set explicitly, prefer block style for multiline strings return blockString(item, ctx, onComment, onChompKeep) } if (indent === '' && containsDocumentMarker(value)) { ctx.forceBlockIndent = true return blockString(item, ctx, onComment, onChompKeep) } const str = value.replace(/\n+/g, `$&\n${indent}`) // Verify that output will be parsed as a string, as e.g. plain numbers and // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'), // and others in v1.1. if (actualString) { const { tags } = ctx.doc.schema const resolved = resolveScalar(str, tags, tags.scalarFallback).value if (typeof resolved !== 'string') return doubleQuotedString(value, ctx) } const body = implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx)) if ( comment && !inFlow && (body.indexOf('\n') !== -1 || comment.indexOf('\n') !== -1) ) { if (onComment) onComment() return addCommentBefore(body, indent, comment) } return body } export function stringifyString(item, ctx, onComment, onChompKeep) { const { defaultType } = strOptions const { implicitKey, inFlow } = ctx let { type, value } = item if (typeof value !== 'string') { value = String(value) item = Object.assign({}, item, { value }) } const _stringify = _type => { switch (_type) { case Type.BLOCK_FOLDED: case Type.BLOCK_LITERAL: return blockString(item, ctx, onComment, onChompKeep) case Type.QUOTE_DOUBLE: return doubleQuotedString(value, ctx) case Type.QUOTE_SINGLE: return singleQuotedString(value, ctx) case Type.PLAIN: return plainString(item, ctx, onComment, onChompKeep) default: return null } } if ( type !== Type.QUOTE_DOUBLE && /[\x00-\x08\x0b-\x1f\x7f-\x9f]/.test(value) ) { // force double quotes on control characters type = Type.QUOTE_DOUBLE } else if ( (implicitKey || inFlow) && (type === Type.BLOCK_FOLDED || type === Type.BLOCK_LITERAL) ) { // should not happen; blocks are not valid inside flow containers type = Type.QUOTE_DOUBLE } let res = _stringify(type) if (res === null) { res = _stringify(defaultType) if (res === null) throw new Error(`Unsupported default string type ${defaultType}`) } return res } yaml-1.10.2/src/stringify/stringifyTag.js000066400000000000000000000015231402322402300203430ustar00rootroot00000000000000export function stringifyTag(doc, tag) { if ((doc.version || doc.options.version) === '1.0') { const priv = tag.match(/^tag:private\.yaml\.org,2002:([^:/]+)$/) if (priv) return '!' + priv[1] const vocab = tag.match(/^tag:([a-zA-Z0-9-]+)\.yaml\.org,2002:(.*)/) return vocab ? `!${vocab[1]}/${vocab[2]}` : `!${tag.replace(/^tag:/, '')}` } let p = doc.tagPrefixes.find(p => tag.indexOf(p.prefix) === 0) if (!p) { const dtp = doc.getDefaults().tagPrefixes p = dtp && dtp.find(p => tag.indexOf(p.prefix) === 0) } if (!p) return tag[0] === '!' ? tag : `!<${tag}>` const suffix = tag.substr(p.prefix.length).replace( /[!,[\]{}]/g, ch => ({ '!': '%21', ',': '%2C', '[': '%5B', ']': '%5D', '{': '%7B', '}': '%7D' }[ch]) ) return p.handle + suffix } yaml-1.10.2/src/tags/000077500000000000000000000000001402322402300142525ustar00rootroot00000000000000yaml-1.10.2/src/tags/core.js000066400000000000000000000062721402322402300155470ustar00rootroot00000000000000/* global BigInt */ import { Scalar } from '../ast/Scalar.js' import { stringifyNumber } from '../stringify/stringifyNumber.js' import { failsafe } from './failsafe/index.js' import { boolOptions, intOptions, nullOptions } from './options.js' const intIdentify = value => typeof value === 'bigint' || Number.isInteger(value) const intResolve = (src, part, radix) => intOptions.asBigInt ? BigInt(src) : parseInt(part, radix) function intStringify(node, radix, prefix) { const { value } = node if (intIdentify(value) && value >= 0) return prefix + value.toString(radix) return stringifyNumber(node) } export const nullObj = { identify: value => value == null, createNode: (schema, value, ctx) => ctx.wrapScalars ? new Scalar(null) : null, default: true, tag: 'tag:yaml.org,2002:null', test: /^(?:~|[Nn]ull|NULL)?$/, resolve: () => null, options: nullOptions, stringify: () => nullOptions.nullStr } export const boolObj = { identify: value => typeof value === 'boolean', default: true, tag: 'tag:yaml.org,2002:bool', test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, resolve: str => str[0] === 't' || str[0] === 'T', options: boolOptions, stringify: ({ value }) => (value ? boolOptions.trueStr : boolOptions.falseStr) } export const octObj = { identify: value => intIdentify(value) && value >= 0, default: true, tag: 'tag:yaml.org,2002:int', format: 'OCT', test: /^0o([0-7]+)$/, resolve: (str, oct) => intResolve(str, oct, 8), options: intOptions, stringify: node => intStringify(node, 8, '0o') } export const intObj = { identify: intIdentify, default: true, tag: 'tag:yaml.org,2002:int', test: /^[-+]?[0-9]+$/, resolve: str => intResolve(str, str, 10), options: intOptions, stringify: stringifyNumber } export const hexObj = { identify: value => intIdentify(value) && value >= 0, default: true, tag: 'tag:yaml.org,2002:int', format: 'HEX', test: /^0x([0-9a-fA-F]+)$/, resolve: (str, hex) => intResolve(str, hex, 16), options: intOptions, stringify: node => intStringify(node, 16, '0x') } export const nanObj = { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', test: /^(?:[-+]?\.inf|(\.nan))$/i, resolve: (str, nan) => nan ? NaN : str[0] === '-' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, stringify: stringifyNumber } export const expObj = { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', format: 'EXP', test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, resolve: str => parseFloat(str), stringify: ({ value }) => Number(value).toExponential() } export const floatObj = { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', test: /^[-+]?(?:\.([0-9]+)|[0-9]+\.([0-9]*))$/, resolve(str, frac1, frac2) { const frac = frac1 || frac2 const node = new Scalar(parseFloat(str)) if (frac && frac[frac.length - 1] === '0') node.minFractionDigits = frac.length return node }, stringify: stringifyNumber } export const core = failsafe.concat([ nullObj, boolObj, octObj, intObj, hexObj, nanObj, expObj, floatObj ]) yaml-1.10.2/src/tags/failsafe/000077500000000000000000000000001402322402300160245ustar00rootroot00000000000000yaml-1.10.2/src/tags/failsafe/index.js000066400000000000000000000002171402322402300174710ustar00rootroot00000000000000import { map } from './map.js' import { seq } from './seq.js' import { string } from './string.js' export const failsafe = [map, seq, string] yaml-1.10.2/src/tags/failsafe/map.js000066400000000000000000000013021402322402300171330ustar00rootroot00000000000000import { YAMLMap } from '../../ast/YAMLMap.js' import { resolveMap } from '../../resolve/resolveMap.js' function createMap(schema, obj, ctx) { const map = new YAMLMap(schema) if (obj instanceof Map) { for (const [key, value] of obj) map.items.push(schema.createPair(key, value, ctx)) } else if (obj && typeof obj === 'object') { for (const key of Object.keys(obj)) map.items.push(schema.createPair(key, obj[key], ctx)) } if (typeof schema.sortMapEntries === 'function') { map.items.sort(schema.sortMapEntries) } return map } export const map = { createNode: createMap, default: true, nodeClass: YAMLMap, tag: 'tag:yaml.org,2002:map', resolve: resolveMap } yaml-1.10.2/src/tags/failsafe/seq.js000066400000000000000000000007641402322402300171610ustar00rootroot00000000000000import { YAMLSeq } from '../../ast/YAMLSeq.js' import { resolveSeq } from '../../resolve/resolveSeq.js' function createSeq(schema, obj, ctx) { const seq = new YAMLSeq(schema) if (obj && obj[Symbol.iterator]) { for (const it of obj) { const v = schema.createNode(it, ctx.wrapScalars, null, ctx) seq.items.push(v) } } return seq } export const seq = { createNode: createSeq, default: true, nodeClass: YAMLSeq, tag: 'tag:yaml.org,2002:seq', resolve: resolveSeq } yaml-1.10.2/src/tags/failsafe/string.js000066400000000000000000000010041402322402300176630ustar00rootroot00000000000000import { resolveString } from '../../resolve/resolveString.js' import { stringifyString } from '../../stringify/stringifyString.js' import { strOptions } from '../options.js' export const string = { identify: value => typeof value === 'string', default: true, tag: 'tag:yaml.org,2002:str', resolve: resolveString, stringify(item, ctx, onComment, onChompKeep) { ctx = Object.assign({ actualString: true }, ctx) return stringifyString(item, ctx, onComment, onChompKeep) }, options: strOptions } yaml-1.10.2/src/tags/index.js000066400000000000000000000015561402322402300157260ustar00rootroot00000000000000import { core, nullObj, boolObj, octObj, intObj, hexObj, nanObj, expObj, floatObj } from './core.js' import { failsafe } from './failsafe/index.js' import { json } from './json.js' import { yaml11 } from './yaml-1.1/index.js' import { map } from './failsafe/map.js' import { seq } from './failsafe/seq.js' import { binary } from './yaml-1.1/binary.js' import { omap } from './yaml-1.1/omap.js' import { pairs } from './yaml-1.1/pairs.js' import { set } from './yaml-1.1/set.js' import { floatTime, intTime, timestamp } from './yaml-1.1/timestamp.js' export const schemas = { core, failsafe, json, yaml11 } export const tags = { binary, bool: boolObj, float: floatObj, floatExp: expObj, floatNaN: nanObj, floatTime, int: intObj, intHex: hexObj, intOct: octObj, intTime, map, null: nullObj, omap, pairs, seq, set, timestamp } yaml-1.10.2/src/tags/json.js000066400000000000000000000032711402322402300155640ustar00rootroot00000000000000/* global BigInt */ import { Scalar } from '../ast/Scalar.js' import { resolveString } from '../resolve/resolveString.js' import { map } from './failsafe/map.js' import { seq } from './failsafe/seq.js' import { intOptions } from './options.js' const intIdentify = value => typeof value === 'bigint' || Number.isInteger(value) const stringifyJSON = ({ value }) => JSON.stringify(value) export const json = [ map, seq, { identify: value => typeof value === 'string', default: true, tag: 'tag:yaml.org,2002:str', resolve: resolveString, stringify: stringifyJSON }, { identify: value => value == null, createNode: (schema, value, ctx) => ctx.wrapScalars ? new Scalar(null) : null, default: true, tag: 'tag:yaml.org,2002:null', test: /^null$/, resolve: () => null, stringify: stringifyJSON }, { identify: value => typeof value === 'boolean', default: true, tag: 'tag:yaml.org,2002:bool', test: /^true|false$/, resolve: str => str === 'true', stringify: stringifyJSON }, { identify: intIdentify, default: true, tag: 'tag:yaml.org,2002:int', test: /^-?(?:0|[1-9][0-9]*)$/, resolve: str => (intOptions.asBigInt ? BigInt(str) : parseInt(str, 10)), stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value) }, { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, resolve: str => parseFloat(str), stringify: stringifyJSON } ] json.scalarFallback = str => { throw new SyntaxError(`Unresolved plain scalar ${JSON.stringify(str)}`) } yaml-1.10.2/src/tags/options.js000066400000000000000000000007341402322402300163070ustar00rootroot00000000000000import { Type } from '../constants.js' export const binaryOptions = { defaultType: Type.BLOCK_LITERAL, lineWidth: 76 } export const boolOptions = { trueStr: 'true', falseStr: 'false' } export const intOptions = { asBigInt: false } export const nullOptions = { nullStr: 'null' } export const strOptions = { defaultType: Type.PLAIN, doubleQuoted: { jsonEncoding: false, minMultiLineLength: 40 }, fold: { lineWidth: 80, minContentWidth: 20 } } yaml-1.10.2/src/tags/yaml-1.1/000077500000000000000000000000001402322402300155115ustar00rootroot00000000000000yaml-1.10.2/src/tags/yaml-1.1/binary.js000066400000000000000000000047611402322402300173430ustar00rootroot00000000000000/* global atob, btoa, Buffer */ import { Type } from '../../constants.js' import { YAMLReferenceError } from '../../errors.js' import { resolveString } from '../../resolve/resolveString.js' import { stringifyString } from '../../stringify/stringifyString.js' import { binaryOptions as options } from '../options.js' export const binary = { identify: value => value instanceof Uint8Array, // Buffer inherits from Uint8Array default: false, tag: 'tag:yaml.org,2002:binary', /** * Returns a Buffer in node and an Uint8Array in browsers * * To use the resulting buffer as an image, you'll want to do something like: * * const blob = new Blob([buffer], { type: 'image/jpeg' }) * document.querySelector('#photo').src = URL.createObjectURL(blob) */ resolve: (doc, node) => { const src = resolveString(doc, node) if (typeof Buffer === 'function') { return Buffer.from(src, 'base64') } else if (typeof atob === 'function') { // On IE 11, atob() can't handle newlines const str = atob(src.replace(/[\n\r]/g, '')) const buffer = new Uint8Array(str.length) for (let i = 0; i < str.length; ++i) buffer[i] = str.charCodeAt(i) return buffer } else { const msg = 'This environment does not support reading binary tags; either Buffer or atob is required' doc.errors.push(new YAMLReferenceError(node, msg)) return null } }, options, stringify: ({ comment, type, value }, ctx, onComment, onChompKeep) => { let src if (typeof Buffer === 'function') { src = value instanceof Buffer ? value.toString('base64') : Buffer.from(value.buffer).toString('base64') } else if (typeof btoa === 'function') { let s = '' for (let i = 0; i < value.length; ++i) s += String.fromCharCode(value[i]) src = btoa(s) } else { throw new Error( 'This environment does not support writing binary tags; either Buffer or btoa is required' ) } if (!type) type = options.defaultType if (type === Type.QUOTE_DOUBLE) { value = src } else { const { lineWidth } = options const n = Math.ceil(src.length / lineWidth) const lines = new Array(n) for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { lines[i] = src.substr(o, lineWidth) } value = lines.join(type === Type.BLOCK_LITERAL ? '\n' : ' ') } return stringifyString( { comment, type, value }, ctx, onComment, onChompKeep ) } } yaml-1.10.2/src/tags/yaml-1.1/index.js000066400000000000000000000106431402322402300171620ustar00rootroot00000000000000/* global BigInt */ import { Scalar } from '../../ast/Scalar.js' import { stringifyNumber } from '../../stringify/stringifyNumber.js' import { failsafe } from '../failsafe/index.js' import { boolOptions, intOptions, nullOptions } from '../options.js' import { binary } from './binary.js' import { omap } from './omap.js' import { pairs } from './pairs.js' import { set } from './set.js' import { intTime, floatTime, timestamp } from './timestamp.js' const boolStringify = ({ value }) => value ? boolOptions.trueStr : boolOptions.falseStr const intIdentify = value => typeof value === 'bigint' || Number.isInteger(value) function intResolve(sign, src, radix) { let str = src.replace(/_/g, '') if (intOptions.asBigInt) { switch (radix) { case 2: str = `0b${str}` break case 8: str = `0o${str}` break case 16: str = `0x${str}` break } const n = BigInt(str) return sign === '-' ? BigInt(-1) * n : n } const n = parseInt(str, radix) return sign === '-' ? -1 * n : n } function intStringify(node, radix, prefix) { const { value } = node if (intIdentify(value)) { const str = value.toString(radix) return value < 0 ? '-' + prefix + str.substr(1) : prefix + str } return stringifyNumber(node) } export const yaml11 = failsafe.concat( [ { identify: value => value == null, createNode: (schema, value, ctx) => ctx.wrapScalars ? new Scalar(null) : null, default: true, tag: 'tag:yaml.org,2002:null', test: /^(?:~|[Nn]ull|NULL)?$/, resolve: () => null, options: nullOptions, stringify: () => nullOptions.nullStr }, { identify: value => typeof value === 'boolean', default: true, tag: 'tag:yaml.org,2002:bool', test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, resolve: () => true, options: boolOptions, stringify: boolStringify }, { identify: value => typeof value === 'boolean', default: true, tag: 'tag:yaml.org,2002:bool', test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i, resolve: () => false, options: boolOptions, stringify: boolStringify }, { identify: intIdentify, default: true, tag: 'tag:yaml.org,2002:int', format: 'BIN', test: /^([-+]?)0b([0-1_]+)$/, resolve: (str, sign, bin) => intResolve(sign, bin, 2), stringify: node => intStringify(node, 2, '0b') }, { identify: intIdentify, default: true, tag: 'tag:yaml.org,2002:int', format: 'OCT', test: /^([-+]?)0([0-7_]+)$/, resolve: (str, sign, oct) => intResolve(sign, oct, 8), stringify: node => intStringify(node, 8, '0') }, { identify: intIdentify, default: true, tag: 'tag:yaml.org,2002:int', test: /^([-+]?)([0-9][0-9_]*)$/, resolve: (str, sign, abs) => intResolve(sign, abs, 10), stringify: stringifyNumber }, { identify: intIdentify, default: true, tag: 'tag:yaml.org,2002:int', format: 'HEX', test: /^([-+]?)0x([0-9a-fA-F_]+)$/, resolve: (str, sign, hex) => intResolve(sign, hex, 16), stringify: node => intStringify(node, 16, '0x') }, { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', test: /^(?:[-+]?\.inf|(\.nan))$/i, resolve: (str, nan) => nan ? NaN : str[0] === '-' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, stringify: stringifyNumber }, { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', format: 'EXP', test: /^[-+]?([0-9][0-9_]*)?(\.[0-9_]*)?[eE][-+]?[0-9]+$/, resolve: str => parseFloat(str.replace(/_/g, '')), stringify: ({ value }) => Number(value).toExponential() }, { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', test: /^[-+]?(?:[0-9][0-9_]*)?\.([0-9_]*)$/, resolve(str, frac) { const node = new Scalar(parseFloat(str.replace(/_/g, ''))) if (frac) { const f = frac.replace(/_/g, '') if (f[f.length - 1] === '0') node.minFractionDigits = f.length } return node }, stringify: stringifyNumber } ], binary, omap, pairs, set, intTime, floatTime, timestamp ) yaml-1.10.2/src/tags/yaml-1.1/omap.js000066400000000000000000000036431402322402300170110ustar00rootroot00000000000000import { YAMLSemanticError } from '../../errors.js' import { Pair } from '../../ast/Pair.js' import { Scalar } from '../../ast/Scalar.js' import { YAMLMap } from '../../ast/YAMLMap.js' import { YAMLSeq } from '../../ast/YAMLSeq.js' import { toJSON } from '../../ast/toJSON.js' import { createPairs, parsePairs } from './pairs.js' export class YAMLOMap extends YAMLSeq { static tag = 'tag:yaml.org,2002:omap' constructor() { super() this.tag = YAMLOMap.tag } add = YAMLMap.prototype.add.bind(this) delete = YAMLMap.prototype.delete.bind(this) get = YAMLMap.prototype.get.bind(this) has = YAMLMap.prototype.has.bind(this) set = YAMLMap.prototype.set.bind(this) toJSON(_, ctx) { const map = new Map() if (ctx && ctx.onCreate) ctx.onCreate(map) for (const pair of this.items) { let key, value if (pair instanceof Pair) { key = toJSON(pair.key, '', ctx) value = toJSON(pair.value, key, ctx) } else { key = toJSON(pair, '', ctx) } if (map.has(key)) throw new Error('Ordered maps must not include duplicate keys') map.set(key, value) } return map } } function parseOMap(doc, cst) { const pairs = parsePairs(doc, cst) const seenKeys = [] for (const { key } of pairs.items) { if (key instanceof Scalar) { if (seenKeys.includes(key.value)) { const msg = 'Ordered maps must not include duplicate keys' throw new YAMLSemanticError(cst, msg) } else { seenKeys.push(key.value) } } } return Object.assign(new YAMLOMap(), pairs) } function createOMap(schema, iterable, ctx) { const pairs = createPairs(schema, iterable, ctx) const omap = new YAMLOMap() omap.items = pairs.items return omap } export const omap = { identify: value => value instanceof Map, nodeClass: YAMLOMap, default: false, tag: 'tag:yaml.org,2002:omap', resolve: parseOMap, createNode: createOMap } yaml-1.10.2/src/tags/yaml-1.1/pairs.js000066400000000000000000000036071402322402300171730ustar00rootroot00000000000000import { YAMLSemanticError } from '../../errors.js' import { Pair } from '../../ast/Pair.js' import { YAMLMap } from '../../ast/YAMLMap.js' import { YAMLSeq } from '../../ast/YAMLSeq.js' import { resolveSeq } from '../../resolve/resolveSeq.js' export function parsePairs(doc, cst) { const seq = resolveSeq(doc, cst) for (let i = 0; i < seq.items.length; ++i) { let item = seq.items[i] if (item instanceof Pair) continue else if (item instanceof YAMLMap) { if (item.items.length > 1) { const msg = 'Each pair must have its own sequence indicator' throw new YAMLSemanticError(cst, msg) } const pair = item.items[0] || new Pair() if (item.commentBefore) pair.commentBefore = pair.commentBefore ? `${item.commentBefore}\n${pair.commentBefore}` : item.commentBefore if (item.comment) pair.comment = pair.comment ? `${item.comment}\n${pair.comment}` : item.comment item = pair } seq.items[i] = item instanceof Pair ? item : new Pair(item) } return seq } export function createPairs(schema, iterable, ctx) { const pairs = new YAMLSeq(schema) pairs.tag = 'tag:yaml.org,2002:pairs' for (const it of iterable) { let key, value if (Array.isArray(it)) { if (it.length === 2) { key = it[0] value = it[1] } else throw new TypeError(`Expected [key, value] tuple: ${it}`) } else if (it && it instanceof Object) { const keys = Object.keys(it) if (keys.length === 1) { key = keys[0] value = it[key] } else throw new TypeError(`Expected { key: value } tuple: ${it}`) } else { key = it } const pair = schema.createPair(key, value, ctx) pairs.items.push(pair) } return pairs } export const pairs = { default: false, tag: 'tag:yaml.org,2002:pairs', resolve: parsePairs, createNode: createPairs } yaml-1.10.2/src/tags/yaml-1.1/set.js000066400000000000000000000037511402322402300166500ustar00rootroot00000000000000import { YAMLSemanticError } from '../../errors.js' import { Pair } from '../../ast/Pair.js' import { Scalar } from '../../ast/Scalar.js' import { YAMLMap, findPair } from '../../ast/YAMLMap.js' import { resolveMap } from '../../resolve/resolveMap.js' export class YAMLSet extends YAMLMap { static tag = 'tag:yaml.org,2002:set' constructor() { super() this.tag = YAMLSet.tag } add(key) { const pair = key instanceof Pair ? key : new Pair(key) const prev = findPair(this.items, pair.key) if (!prev) this.items.push(pair) } get(key, keepPair) { const pair = findPair(this.items, key) return !keepPair && pair instanceof Pair ? pair.key instanceof Scalar ? pair.key.value : pair.key : pair } set(key, value) { if (typeof value !== 'boolean') throw new Error( `Expected boolean value for set(key, value) in a YAML set, not ${typeof value}` ) const prev = findPair(this.items, key) if (prev && !value) { this.items.splice(this.items.indexOf(prev), 1) } else if (!prev && value) { this.items.push(new Pair(key)) } } toJSON(_, ctx) { return super.toJSON(_, ctx, Set) } toString(ctx, onComment, onChompKeep) { if (!ctx) return JSON.stringify(this) if (this.hasAllNullValues()) return super.toString(ctx, onComment, onChompKeep) else throw new Error('Set items must all have null values') } } function parseSet(doc, cst) { const map = resolveMap(doc, cst) if (!map.hasAllNullValues()) throw new YAMLSemanticError(cst, 'Set items must all have null values') return Object.assign(new YAMLSet(), map) } function createSet(schema, iterable, ctx) { const set = new YAMLSet() for (const value of iterable) set.items.push(schema.createPair(value, null, ctx)) return set } export const set = { identify: value => value instanceof Set, nodeClass: YAMLSet, default: false, tag: 'tag:yaml.org,2002:set', resolve: parseSet, createNode: createSet } yaml-1.10.2/src/tags/yaml-1.1/timestamp.js000066400000000000000000000054211402322402300200540ustar00rootroot00000000000000import { stringifyNumber } from '../../stringify/stringifyNumber.js' const parseSexagesimal = (sign, parts) => { const n = parts.split(':').reduce((n, p) => n * 60 + Number(p), 0) return sign === '-' ? -n : n } // hhhh:mm:ss.sss const stringifySexagesimal = ({ value }) => { if (isNaN(value) || !isFinite(value)) return stringifyNumber(value) let sign = '' if (value < 0) { sign = '-' value = Math.abs(value) } const parts = [value % 60] // seconds, including ms if (value < 60) { parts.unshift(0) // at least one : is required } else { value = Math.round((value - parts[0]) / 60) parts.unshift(value % 60) // minutes if (value >= 60) { value = Math.round((value - parts[0]) / 60) parts.unshift(value) // hours } } return ( sign + parts .map(n => (n < 10 ? '0' + String(n) : String(n))) .join(':') .replace(/000000\d*$/, '') // % 60 may introduce error ) } export const intTime = { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:int', format: 'TIME', test: /^([-+]?)([0-9][0-9_]*(?::[0-5]?[0-9])+)$/, resolve: (str, sign, parts) => parseSexagesimal(sign, parts.replace(/_/g, '')), stringify: stringifySexagesimal } export const floatTime = { identify: value => typeof value === 'number', default: true, tag: 'tag:yaml.org,2002:float', format: 'TIME', test: /^([-+]?)([0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*)$/, resolve: (str, sign, parts) => parseSexagesimal(sign, parts.replace(/_/g, '')), stringify: stringifySexagesimal } export const timestamp = { identify: value => value instanceof Date, default: true, tag: 'tag:yaml.org,2002:timestamp', // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part // may be omitted altogether, resulting in a date format. In such a case, the time part is // assumed to be 00:00:00Z (start of day, UTC). test: RegExp( '^(?:' + '([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})' + // YYYY-Mm-Dd '(?:(?:t|T|[ \\t]+)' + // t | T | whitespace '([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)' + // Hh:Mm:Ss(.ss)? '(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?' + // Z | +5 | -03:30 ')?' + ')$' ), resolve: (str, year, month, day, hour, minute, second, millisec, tz) => { if (millisec) millisec = (millisec + '00').substr(1, 3) let date = Date.UTC( year, month - 1, day, hour || 0, minute || 0, second || 0, millisec || 0 ) if (tz && tz !== 'Z') { let d = parseSexagesimal(tz[0], tz.slice(1)) if (Math.abs(d) < 30) d *= 60 date -= 60000 * d } return new Date(date) }, stringify: ({ value }) => value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, '') } yaml-1.10.2/src/test-events.js000066400000000000000000000072731402322402300161440ustar00rootroot00000000000000import { parse } from './cst/parse.js' import { Document } from './doc/Document.js' // test harness for yaml-test-suite event tests export function testEvents(src, options) { const opt = Object.assign( { keepCstNodes: true, keepNodeTypes: true, version: '1.2' }, options ) const docs = parse(src).map(cstDoc => new Document(opt).parse(cstDoc)) const errDoc = docs.find(doc => doc.errors.length > 0) const error = errDoc ? errDoc.errors[0].message : null const events = ['+STR'] try { for (let i = 0; i < docs.length; ++i) { const doc = docs[i] let root = doc.contents if (Array.isArray(root)) root = root[0] const [rootStart, rootEnd] = doc.range || [0, 0] let e = doc.errors[0] && doc.errors[0].source if (e && e.type === 'SEQ_ITEM') e = e.node if (e && (e.type === 'DOCUMENT' || e.range.start < rootStart)) throw new Error() let docStart = '+DOC' const pre = src.slice(0, rootStart) const explicitDoc = /---\s*$/.test(pre) if (explicitDoc) docStart += ' ---' else if (!doc.contents) continue events.push(docStart) addEvents(events, doc, e, root) if (doc.contents && doc.contents.length > 1) throw new Error() let docEnd = '-DOC' if (rootEnd) { const post = src.slice(rootEnd) if (/^\.\.\./.test(post)) docEnd += ' ...' } events.push(docEnd) } } catch (e) { return { events, error: error || e } } events.push('-STR') return { events, error } } function addEvents(events, doc, e, node) { if (!node) { events.push('=VAL :') return } if (e && node.cstNode === e) throw new Error() let props = '' let anchor = doc.anchors.getName(node) if (anchor) { if (/\d$/.test(anchor)) { const alt = anchor.replace(/\d$/, '') if (doc.anchors.getNode(alt)) anchor = alt } props = ` &${anchor}` } if (node.cstNode && node.cstNode.tag) { const { handle, suffix } = node.cstNode.tag props += handle === '!' && !suffix ? ' ' : ` <${node.tag}>` } let scalar = null switch (node.type) { case 'ALIAS': { let alias = doc.anchors.getName(node.source) if (/\d$/.test(alias)) { const alt = alias.replace(/\d$/, '') if (doc.anchors.getNode(alt)) alias = alt } events.push(`=ALI${props} *${alias}`) } break case 'BLOCK_FOLDED': scalar = '>' break case 'BLOCK_LITERAL': scalar = '|' break case 'PLAIN': scalar = ':' break case 'QUOTE_DOUBLE': scalar = '"' break case 'QUOTE_SINGLE': scalar = "'" break case 'PAIR': events.push(`+MAP${props}`) addEvents(events, doc, e, node.key) addEvents(events, doc, e, node.value) events.push('-MAP') break case 'FLOW_SEQ': case 'SEQ': events.push(`+SEQ${props}`) node.items.forEach(item => { addEvents(events, doc, e, item) }) events.push('-SEQ') break case 'FLOW_MAP': case 'MAP': events.push(`+MAP${props}`) node.items.forEach(({ key, value }) => { addEvents(events, doc, e, key) addEvents(events, doc, e, value) }) events.push('-MAP') break default: throw new Error(`Unexpected node type ${node.type}`) } if (scalar) { const value = node.cstNode.strValue .replace(/\\/g, '\\\\') .replace(/\0/g, '\\0') .replace(/\x07/g, '\\a') .replace(/\x08/g, '\\b') .replace(/\t/g, '\\t') .replace(/\n/g, '\\n') .replace(/\v/g, '\\v') .replace(/\f/g, '\\f') .replace(/\r/g, '\\r') .replace(/\x1b/g, '\\e') events.push(`=VAL${props} ${scalar}${value}`) } } yaml-1.10.2/src/types.js000066400000000000000000000004101402322402300150110ustar00rootroot00000000000000export { binaryOptions, boolOptions, intOptions, nullOptions, strOptions } from './tags/options.js' export { Schema } from './doc/Schema.js' export { Alias, Collection, Merge, Node, Pair, Scalar, YAMLMap, YAMLSeq } from './ast/index.js' yaml-1.10.2/src/util.js000066400000000000000000000007251402322402300146330ustar00rootroot00000000000000export { findPair, toJSON } from './ast/index.js' export { resolveMap as parseMap } from './resolve/resolveMap.js' export { resolveSeq as parseSeq } from './resolve/resolveSeq.js' export { stringifyNumber } from './stringify/stringifyNumber.js' export { stringifyString } from './stringify/stringifyString.js' export { Type } from './constants.js' export { YAMLError, YAMLReferenceError, YAMLSemanticError, YAMLSyntaxError, YAMLWarning } from './errors.js' yaml-1.10.2/src/warnings.js000066400000000000000000000030401402322402300154770ustar00rootroot00000000000000/* global console, process, YAML_SILENCE_DEPRECATION_WARNINGS, YAML_SILENCE_WARNINGS */ function shouldWarn(deprecation) { const env = (typeof process !== 'undefined' && process.env) || {} if (deprecation) { if (typeof YAML_SILENCE_DEPRECATION_WARNINGS !== 'undefined') return !YAML_SILENCE_DEPRECATION_WARNINGS return !env.YAML_SILENCE_DEPRECATION_WARNINGS } if (typeof YAML_SILENCE_WARNINGS !== 'undefined') return !YAML_SILENCE_WARNINGS return !env.YAML_SILENCE_WARNINGS } export function warn(warning, type) { if (shouldWarn(false)) { const emit = typeof process !== 'undefined' && process.emitWarning // This will throw in Jest if `warning` is an Error instance due to // https://github.com/facebook/jest/issues/2549 if (emit) emit(warning, type) else { // eslint-disable-next-line no-console console.warn(type ? `${type}: ${warning}` : warning) } } } export function warnFileDeprecation(filename) { if (shouldWarn(true)) { const path = filename .replace(/.*yaml[/\\]/i, '') .replace(/\.js$/, '') .replace(/\\/g, '/') warn( `The endpoint 'yaml/${path}' will be removed in a future release.`, 'DeprecationWarning' ) } } const warned = {} export function warnOptionDeprecation(name, alternative) { if (!warned[name] && shouldWarn(true)) { warned[name] = true let msg = `The option '${name}' will be removed in a future release` msg += alternative ? `, use '${alternative}' instead.` : '.' warn(msg, 'DeprecationWarning') } } yaml-1.10.2/tests/000077500000000000000000000000001402322402300136675ustar00rootroot00000000000000yaml-1.10.2/tests/artifacts/000077500000000000000000000000001402322402300156475ustar00rootroot00000000000000yaml-1.10.2/tests/artifacts/pr104/000077500000000000000000000000001402322402300165155ustar00rootroot00000000000000yaml-1.10.2/tests/artifacts/pr104/billion-laughs.yml000066400000000000000000000006141402322402300221520ustar00rootroot00000000000000a: &a [lol, lol, lol, lol, lol, lol, lol, lol, lol] b: &b [*a, *a, *a, *a, *a, *a, *a, *a, *a] c: &c [*b, *b, *b, *b, *b, *b, *b, *b, *b] d: &d [*c, *c, *c, *c, *c, *c, *c, *c, *c] e: &e [*d, *d, *d, *d, *d, *d, *d, *d, *d] f: &f [*e, *e, *e, *e, *e, *e, *e, *e, *e] g: &g [*f, *f, *f, *f, *f, *f, *f, *f, *f] h: &h [*g, *g, *g, *g, *g, *g, *g, *g, *g] i: &i [*h, *h, *h, *h, *h, *h, *h, *h, *h] yaml-1.10.2/tests/artifacts/pr104/case1.yml000066400000000000000000000114311402322402300202340ustar00rootroot00000000000000# From https://github.com/nodeca/js-yaml/blob/a567ef3c6e61eb319f0bfc2671d91061afb01235/test/issues/0475-case1.yml ? - - &id057 - &id055 - &id053 - &id051 - &id049 - &id047 - &id045 - &id043 - &id041 - &id039 - &id037 - &id035 - &id033 - &id031 - &id029 - &id027 - &id025 - &id023 - &id021 - &id019 - &id017 - &id015 - &id013 - &id011 - &id009 - &id007 - &id005 - &id003 - &id001 [lol] - &id002 [lol] - &id004 - *id001 - *id002 - &id006 - *id003 - *id004 - &id008 - *id005 - *id006 - &id010 - *id007 - *id008 - &id012 - *id009 - *id010 - &id014 - *id011 - *id012 - &id016 - *id013 - *id014 - &id018 - *id015 - *id016 - &id020 - *id017 - *id018 - &id022 - *id019 - *id020 - &id024 - *id021 - *id022 - &id026 - *id023 - *id024 - &id028 - *id025 - *id026 - &id030 - *id027 - *id028 - &id032 - *id029 - *id030 - &id034 - *id031 - *id032 - &id036 - *id033 - *id034 - &id038 - *id035 - *id036 - &id040 - *id037 - *id038 - &id042 - *id039 - *id040 - &id044 - *id041 - *id042 - &id046 - *id043 - *id044 - &id048 - *id045 - *id046 - &id050 - *id047 - *id048 - &id052 - *id049 - *id050 - &id054 - *id051 - *id052 - &id056 - *id053 - *id054 - &id058 - *id055 - *id056 - - *id057 - *id058 : key yaml-1.10.2/tests/artifacts/pr104/case2.yml000066400000000000000000000104371402322402300202420ustar00rootroot00000000000000# From https://github.com/nodeca/js-yaml/blob/a567ef3c6e61eb319f0bfc2671d91061afb01235/test/issues/0475-case2.yml - &id057 - &id055 - &id053 - &id051 - &id049 - &id047 - &id045 - &id043 - &id041 - &id039 - &id037 - &id035 - &id033 - &id031 - &id029 - &id027 - &id025 - &id023 - &id021 - &id019 - &id017 - &id015 - &id013 - &id011 - &id009 - &id007 - &id005 - &id003 - &id001 [lol] - &id002 [lol] - &id004 - *id001 - *id002 - &id006 - *id003 - *id004 - &id008 - *id005 - *id006 - &id010 - *id007 - *id008 - &id012 - *id009 - *id010 - &id014 - *id011 - *id012 - &id016 - *id013 - *id014 - &id018 - *id015 - *id016 - &id020 - *id017 - *id018 - &id022 - *id019 - *id020 - &id024 - *id021 - *id022 - &id026 - *id023 - *id024 - &id028 - *id025 - *id026 - &id030 - *id027 - *id028 - &id032 - *id029 - *id030 - &id034 - *id031 - *id032 - &id036 - *id033 - *id034 - &id038 - *id035 - *id036 - &id040 - *id037 - *id038 - &id042 - *id039 - *id040 - &id044 - *id041 - *id042 - &id046 - *id043 - *id044 - &id048 - *id045 - *id046 - &id050 - *id047 - *id048 - &id052 - *id049 - *id050 - &id054 - *id051 - *id052 - &id056 - *id053 - *id054 - *id057 : 1 yaml-1.10.2/tests/artifacts/pr104/quadratic.yml000066400000000000000000000007541402322402300212230ustar00rootroot00000000000000a: &a [lol, lol, lol, lol, lol, lol, lol, lol, lol] b: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] c: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] d: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] e: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] f: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] g: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] h: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] i: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] j: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] k: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a] yaml-1.10.2/tests/artifacts/prettier-circleci-config.yml000066400000000000000000000035671402322402300232610ustar00rootroot00000000000000aliases: # Cache management - &restore_yarn_cache restore_cache: keys: - v1-yarn-cache - &save_yarn_cache save_cache: paths: - ~/.cache/yarn key: v1-yarn-cache - &restore_deps_cache restore_cache: keys: - v1-deps-cache-{{ checksum "yarn.lock" }} - &save_deps_cache save_cache: paths: - node_modules key: v1-yarn-deps-{{ checksum "yarn.lock" }} # Default - &defaults working_directory: ~/prettier docker: - image: circleci/node:9 version: 2 jobs: # Install dependencies and cache everything checkout_code: <<: *defaults steps: - checkout - *restore_yarn_cache - *restore_deps_cache - run: yarn install - run: yarn check-deps - *save_deps_cache - *save_yarn_cache - persist_to_workspace: root: . paths: - . # Create the production bundle and cache build_prod: <<: *defaults environment: NODE_ENV: production steps: - attach_workspace: at: ~/prettier - run: yarn build - persist_to_workspace: root: . paths: - dist - store_artifacts: path: ~/prettier/dist # Run tests on the production bundle test_prod_node4: <<: *defaults docker: - image: circleci/node:4 steps: - attach_workspace: at: ~/prettier - run: yarn test:dist # Run tests on the production bundle test_prod_node9: <<: *defaults steps: - attach_workspace: at: ~/prettier - run: yarn test:dist workflows: version: 2 prod: jobs: - checkout_code - build_prod: requires: - checkout_code - test_prod_node4: requires: - build_prod - test_prod_node9: requires: - build_prod yaml-1.10.2/tests/cst/000077500000000000000000000000001402322402300144605ustar00rootroot00000000000000yaml-1.10.2/tests/cst/Node.js000066400000000000000000000020251402322402300157020ustar00rootroot00000000000000import { Type } from '../../src/constants.js' import { Node } from '../../src/cst/Node.js' import { Range } from '../../src/cst/Range.js' describe('internals', () => { test('constructor', () => { const src = '&anchor !tag src' const props = [new Range(0, 7), new Range(8, 12)] const node = new Node(Type.PLAIN, props, { src }) expect(node.context.src).toBe(src) expect(node.anchor).toBe('anchor') expect(node.tag).toMatchObject({ handle: '!', suffix: 'tag' }) expect(node.type).toBe(Type.PLAIN) }) test('.endOfIndent', () => { const src = ' - value\n- other\n' const in1 = Node.endOfIndent(src, 0) expect(in1).toBe(2) const offset = src.indexOf('\n') + 1 const in2 = Node.endOfIndent(src, offset) expect(in2).toBe(offset) }) test('#parseComment', () => { const src = '#comment here\nnext' const node = new Node(Type.COMMENT, null, { src }) const end = node.parseComment(0) expect(node.comment).toBe('comment here') expect(end).toBe(src.indexOf('\n')) }) }) yaml-1.10.2/tests/cst/YAML-1.2.spec.js000066400000000000000000002534731402322402300170250ustar00rootroot00000000000000import { Type } from '../../src/constants.js' import { parse } from '../../src/cst/parse.js' import { pretty, testSpec } from './common.js' const spec = { '2.1. Collections': { 'Example 2.1. Sequence of Scalars': { src: `- Mark McGwire\r - Sammy Sosa\r - Ken Griffey\r`, tgt: [ { contents: [ { type: Type.SEQ, items: [ { type: Type.SEQ_ITEM, node: 'Mark McGwire' }, { type: Type.SEQ_ITEM, node: 'Sammy Sosa' }, { type: Type.SEQ_ITEM, node: 'Ken Griffey' } ] } ] } ] }, 'Example 2.2. Mapping Scalars to Scalars': { src: `hr: 65 # Home runs\r avg: 0.278 # Batting average\r rbi: 147 # Runs Batted In`, tgt: [ { contents: [ { type: Type.MAP, items: [ 'hr', { type: Type.MAP_VALUE, node: { comment: ' Home runs', strValue: '65' } }, 'avg', { type: Type.MAP_VALUE, node: { comment: ' Batting average', strValue: '0.278' } }, 'rbi', { type: Type.MAP_VALUE, node: { comment: ' Runs Batted In', strValue: '147' } } ] } ] } ] }, 'Example 2.3. Mapping Scalars to Sequences': { src: `american:\r - Boston Red Sox\r - Detroit Tigers\r - New York Yankees\r national:\r - New York Mets\r - Chicago Cubs\r - Atlanta Braves`, tgt: [ { contents: [ { items: [ 'american', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'Boston Red Sox' }, { type: Type.SEQ_ITEM, node: 'Detroit Tigers' }, { type: Type.SEQ_ITEM, node: 'New York Yankees' } ] } }, 'national', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'New York Mets' }, { type: Type.SEQ_ITEM, node: 'Chicago Cubs' }, { type: Type.SEQ_ITEM, node: 'Atlanta Braves' } ] } } ] } ] } ] }, 'Example 2.4. Sequence of Mappings': { src: `- name: Mark McGwire hr: 65 avg: 0.278 - name: Sammy Sosa hr: 63 avg: 0.288`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: [ 'name', { type: Type.MAP_VALUE, node: 'Mark McGwire' }, 'hr', { type: Type.MAP_VALUE, node: '65' }, 'avg', { type: Type.MAP_VALUE, node: '0.278' } ] } }, { type: Type.SEQ_ITEM, node: { items: [ 'name', { type: Type.MAP_VALUE, node: 'Sammy Sosa' }, 'hr', { type: Type.MAP_VALUE, node: '63' }, 'avg', { type: Type.MAP_VALUE, node: '0.288' } ] } } ] } ] } ] }, 'Example 2.5. Sequence of Sequences': { src: `- [name , hr, avg ] - [Mark McGwire, 65, 0.278] - [Sammy Sosa , 63, 0.288]`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: ['[', 'name', ',', 'hr', ',', 'avg', ']'] } }, { type: Type.SEQ_ITEM, node: { items: ['[', 'Mark McGwire', ',', '65', ',', '0.278', ']'] } }, { type: Type.SEQ_ITEM, node: { items: ['[', 'Sammy Sosa', ',', '63', ',', '0.288', ']'] } } ] } ] } ] }, 'Example 2.6. Mapping of Mappings': { src: `Mark McGwire: {hr: 65, avg: 0.278} Sammy Sosa: { hr: 63, avg: 0.288 }`, tgt: [ { contents: [ { items: [ 'Mark McGwire', { type: Type.MAP_VALUE, node: { items: ['{', 'hr', ':', '65', ',', 'avg', ':', '0.278', '}'] } }, 'Sammy Sosa', { type: Type.MAP_VALUE, node: { items: ['{', 'hr', ':', '63', ',', 'avg', ':', '0.288', '}'] } } ] } ] } ] } }, '2.2. Structures': { 'Example 2.7. Two Documents in a Stream': { src: `# Ranking of 1998 home runs --- - Mark McGwire - Sammy Sosa - Ken Griffey # Team ranking --- - Chicago Cubs - St Louis Cardinals`, tgt: [ { directives: [{ comment: ' Ranking of 1998 home runs' }], contents: [ { items: [ { type: Type.SEQ_ITEM, node: 'Mark McGwire' }, { type: Type.SEQ_ITEM, node: 'Sammy Sosa' }, { type: Type.SEQ_ITEM, node: 'Ken Griffey' } ] }, { type: Type.BLANK_LINE }, { comment: ' Team ranking' } ] }, { contents: [ { items: [ { type: Type.SEQ_ITEM, node: 'Chicago Cubs' }, { type: Type.SEQ_ITEM, node: 'St Louis Cardinals' } ] } ] } ] }, 'Example 2.8. Play by Play Feed': { src: `--- time: 20:03:20 player: Sammy Sosa action: strike (miss) ... --- time: 20:03:47 player: Sammy Sosa action: grand slam ...`, tgt: [ { contents: [ { items: [ 'time', { type: Type.MAP_VALUE, node: '20:03:20' }, 'player', { type: Type.MAP_VALUE, node: 'Sammy Sosa' }, 'action', { type: Type.MAP_VALUE, node: 'strike (miss)' } ] } ] }, { contents: [ { items: [ 'time', { type: Type.MAP_VALUE, node: '20:03:47' }, 'player', { type: Type.MAP_VALUE, node: 'Sammy Sosa' }, 'action', { type: Type.MAP_VALUE, node: 'grand slam' } ] } ] } ] }, 'Example 2.9. Single Document with Two Comments': { src: `--- hr: # 1998 hr ranking - Mark McGwire - Sammy Sosa rbi: # 1998 rbi ranking - Sammy Sosa - Ken Griffey`, tgt: [ { contents: [ { items: [ 'hr', { comment: ' 1998 hr ranking', type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'Mark McGwire' }, { type: Type.SEQ_ITEM, node: 'Sammy Sosa' } ] } }, 'rbi', { comment: ' 1998 rbi ranking', type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'Sammy Sosa' }, { type: Type.SEQ_ITEM, node: 'Ken Griffey' } ] } } ] } ] } ] }, 'Example 2.10. Node for “Sammy Sosa” appears twice in this document': { src: `--- hr: - Mark McGwire # Following node labeled SS - &SS Sammy Sosa rbi: - *SS # Subsequent occurrence - Ken Griffey`, tgt: [ { contents: [ { items: [ 'hr', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'Mark McGwire' }, { comment: ' Following node labeled SS' }, { type: Type.SEQ_ITEM, node: { anchor: 'SS', strValue: 'Sammy Sosa' } } ] } }, 'rbi', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: { comment: ' Subsequent occurrence', type: Type.ALIAS, rawValue: 'SS' } }, { type: Type.SEQ_ITEM, node: 'Ken Griffey' } ] } } ] } ] } ] }, 'Example 2.11. Mapping between Sequences': { src: `? - Detroit Tigers - Chicago cubs : - 2001-07-23 ? [ New York Yankees, Atlanta Braves ] : [ 2001-07-02, 2001-08-12, 2001-08-14 ]`, tgt: [ { contents: [ { items: [ { type: Type.MAP_KEY, node: { items: [ { type: Type.SEQ_ITEM, node: 'Detroit Tigers' }, { type: Type.SEQ_ITEM, node: 'Chicago cubs' } ] } }, { type: Type.MAP_VALUE, node: { items: [{ type: Type.SEQ_ITEM, node: '2001-07-23' }] } }, { type: Type.BLANK_LINE }, { type: Type.MAP_KEY, node: { items: ['[', 'New York Yankees', ',', 'Atlanta Braves', ']'] } }, { type: Type.MAP_VALUE, node: { items: [ '[', '2001-07-02', ',', '2001-08-12', ',', '2001-08-14', ']' ] } } ] } ] } ] }, 'Example 2.12. Compact Nested Mapping': { src: `--- # Products purchased - item : Super Hoop quantity: 1 - item : Basketball quantity: 4 - item : Big Shoes quantity: 1`, tgt: [ { contents: [ { comment: ' Products purchased' }, { items: [ { type: Type.SEQ_ITEM, node: { items: [ 'item', { type: Type.MAP_VALUE, node: 'Super Hoop' }, 'quantity', { type: Type.MAP_VALUE, node: '1' } ] } }, { type: Type.SEQ_ITEM, node: { items: [ 'item', { type: Type.MAP_VALUE, node: 'Basketball' }, 'quantity', { type: Type.MAP_VALUE, node: '4' } ] } }, { type: Type.SEQ_ITEM, node: { items: [ 'item', { type: Type.MAP_VALUE, node: 'Big Shoes' }, 'quantity', { type: Type.MAP_VALUE, node: '1' } ] } } ] } ] } ] } }, '2.3. Scalars': { 'Example 2.13. In literals, newlines are preserved': { src: `# ASCII Art --- | \\//||\\/|| // || ||__`, tgt: [ { directives: [{ comment: ' ASCII Art' }], contents: ['\\//||\\/||\n// || ||__\n'] } ] }, 'Example 2.14. In the folded scalars, newlines become spaces': { src: `--- > Mark McGwire's year was crippled by a knee injury.`, tgt: [ { contents: ["Mark McGwire's year was crippled by a knee injury.\n"] } ] }, 'Example 2.15. Folded newlines are preserved for "more indented" and blank lines': { src: `> Sammy Sosa completed another fine season with great stats. 63 Home Runs 0.288 Batting Average What a year!`, tgt: [ { contents: [ `Sammy Sosa completed another fine season with great stats. 63 Home Runs 0.288 Batting Average What a year!\n` ] } ] }, 'Example 2.16. Indentation determines scope': { src: `name: Mark McGwire accomplishment: > Mark set a major league home run record in 1998. stats: | 65 Home Runs 0.278 Batting Average`, tgt: [ { contents: [ { items: [ 'name', { type: Type.MAP_VALUE, node: 'Mark McGwire' }, 'accomplishment', { type: Type.MAP_VALUE, node: 'Mark set a major league home run record in 1998.\n' }, 'stats', { type: Type.MAP_VALUE, node: '65 Home Runs\n0.278 Batting Average\n' } ] } ] } ] }, 'Example 2.17. Quoted Scalars': { src: `unicode: "Sosa did fine.\\u263A" control: "\\b1998\\t1999\\t2000\\n" hex esc: "\\x0d\\x0a is \\r\\n" single: '"Howdy!" he cried.' quoted: ' # Not a ''comment''.' tie-fighter: '|\\-*-/|'`, tgt: [ { contents: [ { items: [ 'unicode', { type: Type.MAP_VALUE, node: 'Sosa did fine.☺' }, 'control', { type: Type.MAP_VALUE, node: '\b1998\t1999\t2000\n' }, 'hex esc', { type: Type.MAP_VALUE, node: '\r\n is \r\n' }, { type: Type.BLANK_LINE }, 'single', { type: Type.MAP_VALUE, node: '"Howdy!" he cried.' }, 'quoted', { type: Type.MAP_VALUE, node: " # Not a 'comment'." }, 'tie-fighter', { type: Type.MAP_VALUE, node: '|\\-*-/|' } ] } ] } ] }, 'Example 2.18. Multi-line Flow Scalars': { src: `plain: This unquoted scalar spans many lines. quoted: "So does this quoted scalar.\\n"`, tgt: [ { contents: [ { items: [ 'plain', { type: Type.MAP_VALUE, node: 'This unquoted scalar spans many lines.' }, { type: Type.BLANK_LINE }, 'quoted', { type: Type.MAP_VALUE, node: 'So does this quoted scalar.\n' } ] } ] } ] } }, '2.4. Tags': { 'Example 2.19. Integers': { src: `canonical: 12345 decimal: +12345 octal: 0o14 hexadecimal: 0xC`, tgt: [ { contents: [ { items: [ 'canonical', { type: Type.MAP_VALUE, node: '12345' }, 'decimal', { type: Type.MAP_VALUE, node: '+12345' }, 'octal', { type: Type.MAP_VALUE, node: '0o14' }, 'hexadecimal', { type: Type.MAP_VALUE, node: '0xC' } ] } ] } ] }, 'Example 2.20. Floating Point': { src: `canonical: 1.23015e+3 exponential: 12.3015e+02 fixed: 1230.15 negative infinity: -.inf not a number: .NaN`, tgt: [ { contents: [ { items: [ 'canonical', { type: Type.MAP_VALUE, node: '1.23015e+3' }, 'exponential', { type: Type.MAP_VALUE, node: '12.3015e+02' }, 'fixed', { type: Type.MAP_VALUE, node: '1230.15' }, 'negative infinity', { type: Type.MAP_VALUE, node: '-.inf' }, 'not a number', { type: Type.MAP_VALUE, node: '.NaN' } ] } ] } ] }, 'Example 2.21. Miscellaneous': { src: `null: booleans: [ true, false ] string: '012345'`, tgt: [ { contents: [ { items: [ 'null', { type: Type.MAP_VALUE, node: null }, 'booleans', { type: Type.MAP_VALUE, node: { items: ['[', 'true', ',', 'false', ']'] } }, 'string', { type: Type.MAP_VALUE, node: '012345' } ] } ] } ] }, 'Example 2.22. Timestamps': { src: `canonical: 2001-12-15T02:59:43.1Z iso8601: 2001-12-14t21:59:43.10-05:00 spaced: 2001-12-14 21:59:43.10 -5 date: 2002-12-14`, tgt: [ { contents: [ { items: [ 'canonical', { type: Type.MAP_VALUE, node: '2001-12-15T02:59:43.1Z' }, 'iso8601', { type: Type.MAP_VALUE, node: '2001-12-14t21:59:43.10-05:00' }, 'spaced', { type: Type.MAP_VALUE, node: '2001-12-14 21:59:43.10 -5' }, 'date', { type: Type.MAP_VALUE, node: '2002-12-14' } ] } ] } ] }, 'Example 2.23. Various Explicit Tags': { src: `--- not-date: !!str 2002-04-28 picture: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs= application specific tag: !something | The semantics of the tag above may be different for different documents.`, tgt: [ { contents: [ { items: [ 'not-date', { type: Type.MAP_VALUE, node: { tag: { handle: '!!', suffix: 'str' }, strValue: '2002-04-28' } }, { type: Type.BLANK_LINE }, 'picture', { type: Type.MAP_VALUE, node: { tag: { handle: '!!', suffix: 'binary' }, strValue: 'R0lGODlhDAAMAIQAAP//9/X\n17unp5WZmZgAAAOfn515eXv\nPz7Y6OjuDg4J+fn5OTk6enp\n56enmleECcgggoBADs=\n' } }, { type: Type.BLANK_LINE }, 'application specific tag', { type: Type.MAP_VALUE, node: { tag: { handle: '!', suffix: 'something' }, strValue: 'The semantics of the tag\nabove may be different for\ndifferent documents.\n' } } ] } ] } ] }, 'Example 2.24. Global Tags': { src: `%TAG ! tag:clarkevans.com,2002: --- !shape # Use the ! handle for presenting # tag:clarkevans.com,2002:circle - !circle center: &ORIGIN {x: 73, y: 129} radius: 7 - !line start: *ORIGIN finish: { x: 89, y: 102 } - !label start: *ORIGIN color: 0xFFEEBB text: Pretty vector drawing.`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!', 'tag:clarkevans.com,2002:'] } ], contents: [ { tag: { handle: '!', suffix: 'shape' }, comment: ' Use the ! handle for presenting\n tag:clarkevans.com,2002:circle', items: [ { type: Type.SEQ_ITEM, node: { tag: { handle: '!', suffix: 'circle' }, items: [ 'center', { type: Type.MAP_VALUE, node: { anchor: 'ORIGIN', items: [ '{', 'x', ':', '73', ',', 'y', ':', '129', '}' ] } }, 'radius', { type: Type.MAP_VALUE, node: '7' } ] } }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!', suffix: 'line' }, items: [ 'start', { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'ORIGIN' } }, 'finish', { type: Type.MAP_VALUE, node: { items: [ '{', 'x', ':', '89', ',', 'y', ':', '102', '}' ] } } ] } }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!', suffix: 'label' }, items: [ 'start', { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'ORIGIN' } }, 'color', { type: Type.MAP_VALUE, node: '0xFFEEBB' }, 'text', { type: Type.MAP_VALUE, node: 'Pretty vector drawing.' } ] } } ] } ] } ] }, 'Example 2.25. Unordered Sets': { src: `# Sets are represented as a # Mapping where each key is # associated with a null value --- !!set ? Mark McGwire ? Sammy Sosa ? Ken Griff`, tgt: [ { directives: [ { comment: ' Sets are represented as a' }, { comment: ' Mapping where each key is' }, { comment: ' associated with a null value' } ], contents: [ { tag: { handle: '!!', suffix: 'set' }, items: [ { type: Type.MAP_KEY, node: 'Mark McGwire' }, { type: Type.MAP_KEY, node: 'Sammy Sosa' }, { type: Type.MAP_KEY, node: 'Ken Griff' } ] } ] } ] }, 'Example 2.26. Ordered Mappings': { src: `# Ordered maps are represented as # A sequence of mappings, with # each mapping having one key --- !!omap - Mark McGwire: 65 - Sammy Sosa: 63 - Ken Griffy: 58\n\n`, tgt: [ { directives: [ { comment: ' Ordered maps are represented as' }, { comment: ' A sequence of mappings, with' }, { comment: ' each mapping having one key' } ], contents: [ { tag: { handle: '!!', suffix: 'omap' }, items: [ { type: Type.SEQ_ITEM, node: { items: [ 'Mark McGwire', { type: Type.MAP_VALUE, node: '65' } ] } }, { type: Type.SEQ_ITEM, node: { items: ['Sammy Sosa', { type: Type.MAP_VALUE, node: '63' }] } }, { type: Type.SEQ_ITEM, node: { items: ['Ken Griffy', { type: Type.MAP_VALUE, node: '58' }] } } ] } ] } ] } }, '2.5. Full Length Example': { 'Example 2.27. Invoice': { src: `--- ! invoice: 34843 date : 2001-01-23 bill-to: &id001 given : Chris family : Dumars address: lines: | 458 Walkman Dr. Suite #292 city : Royal Oak state : MI postal : 48046 ship-to: *id001 product: - sku : BL394D quantity : 4 description : Basketball price : 450.00 - sku : BL4438H quantity : 1 description : Super Hoop price : 2392.00 tax : 251.42 total: 4443.52 comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.`, tgt: [ { contents: [ { tag: { verbatim: 'tag:clarkevans.com,2002:invoice' }, items: [ 'invoice', { type: Type.MAP_VALUE, node: '34843' }, 'date', { type: Type.MAP_VALUE, node: '2001-01-23' }, 'bill-to', { type: Type.MAP_VALUE, node: { anchor: 'id001', items: [ 'given', { type: Type.MAP_VALUE, node: 'Chris' }, 'family', { type: Type.MAP_VALUE, node: 'Dumars' }, 'address', { type: Type.MAP_VALUE, node: { items: [ 'lines', { type: Type.MAP_VALUE, node: '458 Walkman Dr.\nSuite #292\n' }, 'city', { type: Type.MAP_VALUE, node: 'Royal Oak' }, 'state', { type: Type.MAP_VALUE, node: 'MI' }, 'postal', { type: Type.MAP_VALUE, node: '48046' } ] } } ] } }, 'ship-to', { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'id001' } }, 'product', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: { items: [ 'sku', { type: Type.MAP_VALUE, node: 'BL394D' }, 'quantity', { type: Type.MAP_VALUE, node: '4' }, 'description', { type: Type.MAP_VALUE, node: 'Basketball' }, 'price', { type: Type.MAP_VALUE, node: '450.00' } ] } }, { type: Type.SEQ_ITEM, node: { items: [ 'sku', { type: Type.MAP_VALUE, node: 'BL4438H' }, 'quantity', { type: Type.MAP_VALUE, node: '1' }, 'description', { type: Type.MAP_VALUE, node: 'Super Hoop' }, 'price', { type: Type.MAP_VALUE, node: '2392.00' } ] } } ] } }, 'tax', { type: Type.MAP_VALUE, node: '251.42' }, 'total', { type: Type.MAP_VALUE, node: '4443.52' }, 'comments', { type: Type.MAP_VALUE, node: 'Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.' } ] } ] } ] }, 'Example 2.28. Log File': { src: `--- Time: 2001-11-23 15:01:42 -5 User: ed Warning: This is an error message for the log file --- Time: 2001-11-23 15:02:31 -5 User: ed Warning: A slightly different error message. --- Date: 2001-11-23 15:03:17 -5 User: ed Fatal: Unknown variable "bar" Stack: - file: TopClass.py line: 23 code: | x = MoreObject("345\\n") - file: MoreClass.py line: 58 code: |- foo = bar\n`, tgt: [ { contents: [ { items: [ 'Time', { type: Type.MAP_VALUE, node: '2001-11-23 15:01:42 -5' }, 'User', { type: Type.MAP_VALUE, node: 'ed' }, 'Warning', { type: Type.MAP_VALUE, node: 'This is an error message for the log file' } ] } ] }, { contents: [ { items: [ 'Time', { type: Type.MAP_VALUE, node: '2001-11-23 15:02:31 -5' }, 'User', { type: Type.MAP_VALUE, node: 'ed' }, 'Warning', { type: Type.MAP_VALUE, node: 'A slightly different error message.' } ] } ] }, { contents: [ { items: [ 'Date', { type: Type.MAP_VALUE, node: '2001-11-23 15:03:17 -5' }, 'User', { type: Type.MAP_VALUE, node: 'ed' }, 'Fatal', { type: Type.MAP_VALUE, node: 'Unknown variable "bar"' }, 'Stack', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: { items: [ 'file', { type: Type.MAP_VALUE, node: 'TopClass.py' }, 'line', { type: Type.MAP_VALUE, node: '23' }, 'code', { type: Type.MAP_VALUE, node: 'x = MoreObject("345\\n")\n' } ] } }, { type: Type.SEQ_ITEM, node: { items: [ 'file', { type: Type.MAP_VALUE, node: 'MoreClass.py' }, 'line', { type: Type.MAP_VALUE, node: '58' }, 'code', { type: Type.MAP_VALUE, node: 'foo = bar' } ] } } ] } } ] } ] } ] } }, '5.3. Indicator Characters': { 'Example 5.3. Block Structure Indicators': { src: `sequence: - one - two mapping: ? sky : blue sea : green`, tgt: [ { contents: [ { items: [ 'sequence', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'one' }, { type: Type.SEQ_ITEM, node: 'two' } ] } }, 'mapping', { type: Type.MAP_VALUE, node: { items: [ { type: Type.MAP_KEY, node: 'sky' }, { type: Type.MAP_VALUE, node: 'blue' }, 'sea', { type: Type.MAP_VALUE, node: 'green' } ] } } ] } ] } ] }, 'Example 5.4. Flow Collection Indicators': { src: `sequence: [ one, two, ] mapping: { sky: blue, sea: green }`, tgt: [ { contents: [ { items: [ 'sequence', { type: Type.MAP_VALUE, node: { items: ['[', 'one', ',', 'two', ',', ']'] } }, 'mapping', { type: Type.MAP_VALUE, node: { items: [ '{', 'sky', ':', 'blue', ',', 'sea', ':', 'green', '}' ] } } ] } ] } ] }, 'Example 5.5. Comment Indicator': { src: `# Comment only.`, tgt: [{ contents: [{ comment: ' Comment only.' }] }] }, 'Example 5.6. Node Property Indicators': { src: `anchored: !local &anchor value alias: *anchor`, tgt: [ { contents: [ { items: [ 'anchored', { type: Type.MAP_VALUE, node: { tag: { handle: '!', suffix: 'local' }, anchor: 'anchor', strValue: 'value' } }, 'alias', { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'anchor' } } ] } ] } ] }, 'Example 5.7. Block Scalar Indicators': { src: `literal: | some text folded: > some text `, tgt: [ { contents: [ { items: [ 'literal', { type: Type.MAP_VALUE, node: 'some\ntext\n' }, 'folded', { type: Type.MAP_VALUE, node: 'some text\n' } ] } ] } ] }, 'Example 5.8. Quoted Scalar Indicators': { src: `single: 'text' double: "text"`, tgt: [ { contents: [ { items: [ 'single', { type: Type.MAP_VALUE, node: 'text' }, 'double', { type: Type.MAP_VALUE, node: 'text' } ] } ] } ] }, 'Example 5.9. Directive Indicator': { src: `%YAML 1.2 --- text`, tgt: [ { directives: [{ name: 'YAML', parameters: ['1.2'] }], contents: ['text'] } ] }, 'Example 5.10. Invalid use of Reserved Indicators': { src: `commercial-at: @text grave-accent: \`text`, tgt: [ { contents: [ { items: [ 'commercial-at', { type: Type.MAP_VALUE, node: { strValue: { str: '@text' } } }, 'grave-accent', { type: Type.MAP_VALUE, node: { strValue: { str: '`text' } } } ] } ] } ] // ERROR: Reserved indicators can't start a plain scalar. } }, '5.5. White Space Characters': { 'Example 5.12. Tabs and Spaces': { src: `# Tabs and spaces quoted: "Quoted \t" block:\t| void main() { \tprintf("Hello, world!\\n"); }`, tgt: [ { contents: [ { comment: ' Tabs and spaces' }, { items: [ 'quoted', { type: Type.MAP_VALUE, node: 'Quoted \t' }, 'block', { type: Type.MAP_VALUE, node: 'void main() {\n\tprintf("Hello, world!\\n");\n}\n' } ] } ] } ] } }, '5.7. Escaped Characters': { 'Example 5.13. Escaped Characters': { src: `"Fun with \\\\ \\" \\a \\b \\e \\f \\ \\n \\r \\t \\v \\0 \\ \\ \\_ \\N \\L \\P \\ \\x41 \\u0041 \\U00000041"`, tgt: [ { contents: [ 'Fun with \x5C \x22 \x07 \x08 \x1B \x0C \x0A \x0D \x09 \x0B \x00 \x20 \xA0 \x85 \u2028 \u2029 A A A' ] } ] }, 'Example 5.14. Invalid Escaped Characters': { src: `Bad escapes: "\\c \\xq-"`, tgt: [ { contents: [ { items: [ 'Bad escapes', { type: Type.MAP_VALUE, node: { rawValue: '"\\c\n \\xq-"' } } ] } ] } ] // ERROR: c is an invalid escaped character. // ERROR: q and - are invalid hex digits. } }, '6.1. Indentation Spaces': { 'Example 6.1. Indentation Spaces': { src: ` # Leading comment line spaces are # neither content nor indentation. Not indented: By one space: | By four spaces Flow style: [ # Leading spaces By two, # in flow style Also by two, # are neither \tStill by two # content nor ] # indentation.`, tgt: [ { contents: [ { comment: ' Leading comment line spaces are' }, { comment: ' neither content nor indentation.' }, { type: Type.BLANK_LINE }, { items: [ 'Not indented', { type: Type.MAP_VALUE, node: { items: [ 'By one space', { type: Type.MAP_VALUE, node: 'By four\n spaces\n' }, 'Flow style', { type: Type.MAP_VALUE, node: { items: [ '[', { comment: ' Leading spaces' }, 'By two', ',', { comment: ' in flow style' }, 'Also by two', ',', { comment: ' are neither' }, { strValue: 'Still by two', comment: ' content nor' }, ']' ], comment: ' indentation.' } } ] } } ] } ] } ] }, 'Example 6.2. Indentation Indicators': { src: `? a : -\tb - -\tc - d`, tgt: [ { contents: [ { items: [ { type: Type.MAP_KEY, node: 'a' }, { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'b' }, { type: Type.SEQ_ITEM, node: { items: [ { type: Type.SEQ_ITEM, node: 'c' }, { type: Type.SEQ_ITEM, node: 'd' } ] } } ] } } ] } ] } ] } }, '6.2. Separation Spaces': { 'Example 6.3. Separation Spaces': { src: `- foo:\t bar - - baz -\tbaz`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: ['foo', { type: Type.MAP_VALUE, node: 'bar' }] } }, { type: Type.SEQ_ITEM, node: { items: [ { type: Type.SEQ_ITEM, node: 'baz' }, { type: Type.SEQ_ITEM, node: 'baz' } ] } } ] } ] } ] } }, '6.3. Line Prefixes': { 'Example 6.4. Line Prefixes': { src: `plain: text lines quoted: "text \tlines" block: | text \tlines`, tgt: [ { contents: [ { items: [ 'plain', { type: Type.MAP_VALUE, node: 'text lines' }, 'quoted', { type: Type.MAP_VALUE, node: 'text lines' }, 'block', { type: Type.MAP_VALUE, node: 'text\n \tlines\n' } ] } ] } ] } }, '6.4. Empty Lines': { 'Example 6.5. Empty Lines': { src: `Folding: "Empty line \t as a line feed" Chomping: | Clipped empty lines `, tgt: [ { contents: [ { items: [ 'Folding', { type: Type.MAP_VALUE, node: 'Empty line\nas a line feed' }, 'Chomping', { type: Type.MAP_VALUE, node: 'Clipped empty lines\n' } ] } ] } ] } }, '6.5. Line Folding': { 'Example 6.6. Line Folding': { src: `>- trimmed ·· · ··as ··space`.replace(/·/g, ' '), tgt: [{ contents: ['trimmed\n\n\nas space'] }] }, 'Example 6.7. Block Folding': { src: `> ··foo· · ··\t·bar ··baz\n`.replace(/·/g, ' '), tgt: [{ contents: ['foo \n\n\t bar\n\nbaz\n'] }] }, 'Example 6.8. Flow Folding': { src: `" foo\t \t \t bar baz "`, tgt: [{ contents: [' foo\nbar\nbaz '] }] } }, '6.6. Comments': { 'Example 6.9. Separated Comment': { src: `key: # Comment value`, tgt: [ { contents: [ { items: [ 'key', { type: Type.MAP_VALUE, comment: ' Comment', node: 'value' } ] } ] } ] }, 'Example 6.10. Comment Lines': { src: ` # Comment \n\n`, tgt: [{ contents: [{ comment: ' Comment' }] }] }, 'Example 6.11. Multi-Line Comments': { src: `key: # Comment # lines value\n`, tgt: [ { contents: [ { items: [ 'key', { type: Type.MAP_VALUE, comment: ' Comment\n lines', node: 'value' } ] } ] } ] } }, '6.7. Separation Lines': { 'Example 6.12. Separation Spaces': { src: `{ first: Sammy, last: Sosa }: # Statistics: hr: # Home runs 65 avg: # Average 0.278`, tgt: [ { contents: [ { items: [ { items: [ '{', 'first', ':', 'Sammy', ',', 'last', ':', 'Sosa', '}' ] }, { type: Type.MAP_VALUE, comment: ' Statistics:', node: { items: [ 'hr', { type: Type.MAP_VALUE, comment: ' Home runs', node: '65' }, 'avg', { type: Type.MAP_VALUE, comment: ' Average', node: '0.278' } ] } } ] } ] } ] } }, '6.8. Directives': { 'Example 6.13. Reserved Directives': { src: `%FOO bar baz # Should be ignored # with a warning. --- "foo"`, tgt: [ { directives: [ { name: 'FOO', parameters: ['bar', 'baz'], comment: ' Should be ignored' }, { comment: ' with a warning.' } ], contents: ['foo'] } ] } }, '6.8.1. “YAML” Directives': { 'Example 6.14. “YAML” directive': { src: `%YAML 1.3 # Attempt parsing # with a warning --- "foo"`, tgt: [ { directives: [ { name: 'YAML', parameters: ['1.3'], comment: ' Attempt parsing' }, { comment: ' with a warning' } ], contents: ['foo'] } ] }, 'Example 6.15. Invalid Repeated YAML directive': { src: `%YAML 1.2 %YAML 1.1 foo`, tgt: [ { directives: [ { name: 'YAML', parameters: ['1.2'] }, { name: 'YAML', parameters: ['1.1'] } ], contents: ['foo'] } ] // ERROR: The YAML directive must only be given at most once per document. } }, '6.8.2. “TAG” Directives': { 'Example 6.16. “TAG” directive': { src: `%TAG !yaml! tag:yaml.org,2002: --- !yaml!str "foo"`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!yaml!', 'tag:yaml.org,2002:'] } ], contents: [ { tag: { handle: '!yaml!', suffix: 'str' }, strValue: 'foo' } ] } ] }, 'Example 6.17. Invalid Repeated TAG directive': { src: `%TAG ! !foo %TAG ! !foo bar`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!', '!foo'] }, { name: 'TAG', parameters: ['!', '!foo'] } ], contents: ['bar'] } ] // ERROR: The TAG directive must only be given at most once per handle in the same document. }, 'Example 6.18. Primary Tag Handle': { src: `# Private !foo "bar" ... # Global %TAG ! tag:example.com,2000:app/ --- !foo "bar"`, tgt: [ { contents: [ { comment: ' Private' }, { tag: { handle: '!', suffix: 'foo' }, strValue: 'bar' } ] }, { directives: [ { comment: ' Global' }, { name: 'TAG', parameters: ['!', 'tag:example.com,2000:app/'] } ], contents: [{ tag: { handle: '!', suffix: 'foo' }, strValue: 'bar' }] } ] }, 'Example 6.19. Secondary Tag Handle': { src: `%TAG !! tag:example.com,2000:app/ --- !!int 1 - 3 # Interval, not integer`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!!', 'tag:example.com,2000:app/'] } ], contents: [ { tag: { handle: '!!', suffix: 'int' }, strValue: '1 - 3', comment: ' Interval, not integer' } ] } ] }, 'Example 6.20. Tag Handles': { src: `%TAG !e! tag:example.com,2000:app/ --- !e!foo "bar"`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!e!', 'tag:example.com,2000:app/'] } ], contents: [{ tag: { handle: '!e!', suffix: 'foo' }, strValue: 'bar' }] } ] }, 'Example 6.21. Local Tag Prefix': { src: `%TAG !m! !my- --- # Bulb here !m!light fluorescent ... %TAG !m! !my- --- # Color here !m!light green`, tgt: [ { directives: [{ name: 'TAG', parameters: ['!m!', '!my-'] }], contents: [ { comment: ' Bulb here' }, { tag: { handle: '!m!', suffix: 'light' }, strValue: 'fluorescent' } ] }, { directives: [{ name: 'TAG', parameters: ['!m!', '!my-'] }], contents: [ { comment: ' Color here' }, { tag: { handle: '!m!', suffix: 'light' }, strValue: 'green' } ] } ] }, 'Example 6.22. Global Tag Prefix': { src: `%TAG !e! tag:example.com,2000:app/ --- - !e!foo "bar"`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!e!', 'tag:example.com,2000:app/'] } ], contents: [ { items: [ { type: Type.SEQ_ITEM, node: { tag: { handle: '!e!', suffix: 'foo' }, strValue: 'bar' } } ] } ] } ] } }, '6.9. Node Properties': { 'Example 6.23. Node Properties': { src: `!!str &a1 "foo": !!str bar &a2 baz : *a1`, tgt: [ { contents: [ { items: [ { tag: { handle: '!!', suffix: 'str' }, anchor: 'a1', strValue: 'foo' }, { type: Type.MAP_VALUE, node: { tag: { handle: '!!', suffix: 'str' }, strValue: 'bar' } }, { anchor: 'a2', strValue: 'baz' }, { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'a1' } } ] } ] } ] }, 'Example 6.24. Verbatim Tags': { src: `! foo : ! baz`, tgt: [ { contents: [ { items: [ { tag: { verbatim: 'tag:yaml.org,2002:str' }, strValue: 'foo' }, { type: Type.MAP_VALUE, node: { tag: { verbatim: '!bar' }, strValue: 'baz' } } ] } ] } ] }, 'Example 6.25. Invalid Verbatim Tags': { src: `- ! foo - !<$:?> bar`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { tag: { verbatim: '!' }, strValue: 'foo' } }, { type: Type.SEQ_ITEM, node: { tag: { verbatim: '$:?' }, strValue: 'bar' } } ] } ] } ] // ERROR: Verbatim tags aren't resolved, so ! is invalid. // ERROR: The $:? tag is neither a global URI tag nor a local tag starting with “!”. }, 'Example 6.26. Tag Shorthands': { src: `%TAG !e! tag:example.com,2000:app/ --- - !local foo - !!str bar - !e!tag%21 baz`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!e!', 'tag:example.com,2000:app/'] } ], contents: [ { items: [ { type: Type.SEQ_ITEM, node: { tag: { handle: '!', suffix: 'local' }, strValue: 'foo' } }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!!', suffix: 'str' }, strValue: 'bar' } }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!e!', suffix: 'tag%21' }, strValue: 'baz' } } ] } ] } ] }, 'Example 6.27. Invalid Tag Shorthands': { src: `%TAG !e! tag:example,2000:app/ --- - !e! foo - !h!bar baz`, tgt: [ { directives: [ { name: 'TAG', parameters: ['!e!', 'tag:example,2000:app/'] } ], contents: [ { items: [ { type: Type.SEQ_ITEM, node: { tag: { handle: '!e!', suffix: '' }, strValue: 'foo' } }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!h!', suffix: 'bar' }, strValue: 'baz' } } ] } ] } ] // ERROR: The !e! handle has no suffix. // ERROR: The !h! handle wasn't declared. }, 'Example 6.28. Non-Specific Tags': { src: `# Assuming conventional resolution: - "12" - 12 - ! 12`, tgt: [ { contents: [ { comment: ' Assuming conventional resolution:' }, { items: [ { type: Type.SEQ_ITEM, node: '12' }, { type: Type.SEQ_ITEM, node: '12' }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!', suffix: '' }, strValue: '12' } } ] } ] } ] }, 'Example 6.29. Node Anchors': { src: `First occurrence: &anchor Value Second occurrence: *anchor`, tgt: [ { contents: [ { items: [ 'First occurrence', { type: Type.MAP_VALUE, node: { anchor: 'anchor', strValue: 'Value' } }, 'Second occurrence', { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'anchor' } } ] } ] } ] } }, '7.1. Alias Nodes': { 'Example 7.1. Alias Nodes': { src: `First occurrence: &anchor Foo Second occurrence: *anchor Override anchor: &anchor Bar Reuse anchor: *anchor`, tgt: [ { contents: [ { items: [ 'First occurrence', { type: Type.MAP_VALUE, node: { anchor: 'anchor', strValue: 'Foo' } }, 'Second occurrence', { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'anchor' } }, 'Override anchor', { type: Type.MAP_VALUE, node: { anchor: 'anchor', strValue: 'Bar' } }, 'Reuse anchor', { type: Type.MAP_VALUE, node: { type: Type.ALIAS, rawValue: 'anchor' } } ] } ] } ] } }, '7.2. Empty Nodes': { 'Example 7.2. Empty Content': { src: `{ foo : !!str, !!str : bar, }`, tgt: [ { contents: [ { items: [ '{', 'foo', ':', { tag: { handle: '!!', suffix: 'str' } }, ',', { tag: { handle: '!!', suffix: 'str' } }, ':', 'bar', ',', '}' ] } ] } ] }, 'Example 7.3. Completely Empty Flow Nodes': { src: `{ ? foo :, : bar, }`, tgt: [ { contents: [ { items: ['{', '?', 'foo', ':', ',', ':', 'bar', ',', '}'] } ] } ] } }, '7.3.1. Double-Quoted Style': { 'Example 7.4. Double Quoted Implicit Keys': { src: `"implicit block key" : [ "implicit flow key" : value, ]`, tgt: [ { contents: [ { items: [ 'implicit block key', { type: Type.MAP_VALUE, node: { items: ['[', 'implicit flow key', ':', 'value', ',', ']'] } } ] } ] } ] }, 'Example 7.5. Double Quoted Line Breaks': { src: `"folded to a space,\t to a line feed, or \t\\ \\ \tnon-content"`, tgt: [ { contents: ['folded to a space,\nto a line feed, or \t \tnon-content'] } ] }, 'Example 7.6. Double Quoted Lines': { src: `" 1st non-empty 2nd non-empty \t3rd non-empty "`, tgt: [{ contents: [' 1st non-empty\n2nd non-empty 3rd non-empty '] }] } }, '7.3.2. Single-Quoted Style': { 'Example 7.7. Single Quoted Characters': { src: ` 'here''s to "quotes"'`, tgt: [{ contents: ['here\'s to "quotes"'] }] }, 'Example 7.8. Single Quoted Implicit Keys': { src: `'implicit block key' : [ 'implicit flow key' : value, ]`, tgt: [ { contents: [ { items: [ 'implicit block key', { type: Type.MAP_VALUE, node: { items: ['[', 'implicit flow key', ':', 'value', ',', ']'] } } ] } ] } ] }, 'Example 7.9. Single Quoted Lines': { src: `' 1st non-empty 2nd non-empty\t \t3rd non-empty '`, tgt: [{ contents: [' 1st non-empty\n2nd non-empty 3rd non-empty '] }] } }, '7.3.3. Plain Style': { 'Example 7.10. Plain Characters': { src: `# Outside flow collection: - ::vector - ": - ()" - Up, up, and away! - -123 - http://example.com/foo#bar # Inside flow collection: - [ ::vector, ": - ()", "Up, up and away!", -123, http://example.com/foo#bar ]`, tgt: [ { contents: [ { comment: ' Outside flow collection:' }, { items: [ { type: Type.SEQ_ITEM, node: '::vector' }, { type: Type.SEQ_ITEM, node: ': - ()' }, { type: Type.SEQ_ITEM, node: 'Up, up, and away!' }, { type: Type.SEQ_ITEM, node: '-123' }, { type: Type.SEQ_ITEM, node: 'http://example.com/foo#bar' }, { comment: ' Inside flow collection:' }, { type: Type.SEQ_ITEM, node: { items: [ '[', '::vector', ',', ': - ()', ',', 'Up, up and away!', ',', '-123', ',', 'http://example.com/foo#bar', ']' ] } } ] } ] } ] }, 'Example 7.11. Plain Implicit Keys': { src: `implicit block key : [ implicit flow key : value, ]`, tgt: [ { contents: [ { items: [ 'implicit block key', { type: Type.MAP_VALUE, node: { items: ['[', 'implicit flow key', ':', 'value', ',', ']'] } } ] } ] } ] }, 'Example 7.12. Plain Lines': { src: `1st non-empty 2nd non-empty \t3rd non-empty`, tgt: [{ contents: ['1st non-empty\n2nd non-empty 3rd non-empty'] }] } }, '7.4.1. Flow Sequences': { 'Example 7.13. Flow Sequence': { src: `- [ one, two, ] - [three ,four]`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: ['[', 'one', ',', 'two', ',', ']'] } }, { type: Type.SEQ_ITEM, node: { items: ['[', 'three', ',', 'four', ']'] } } ] } ] } ] }, 'Example 7.14. Flow Sequence Entries': { src: `[ "double quoted", 'single quoted', plain text, [ nested ], single: pair, ]`, tgt: [ { contents: [ { items: [ '[', 'double quoted', ',', 'single quoted', ',', 'plain text', ',', { items: ['[', 'nested', ']'] }, ',', 'single', ':', 'pair', ',', ']' ] } ] } ] } }, '7.4.2. Flow Mappings': { 'Example 7.15. Flow Mappings': { src: `- { one : two , three: four , } - {five: six,seven : eight}`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: [ '{', 'one', ':', 'two', ',', 'three', ':', 'four', ',', '}' ] } }, { type: Type.SEQ_ITEM, node: { items: [ '{', 'five', ':', 'six', ',', 'seven', ':', 'eight', '}' ] } } ] } ] } ] }, 'Example 7.16. Flow Mapping Entries': { src: `{ ? explicit: entry, implicit: entry, ? }`, tgt: [ { contents: [ { items: [ '{', '?', 'explicit', ':', 'entry', ',', 'implicit', ':', 'entry', ',', '?', '}' ] } ] } ] }, 'Example 7.17. Flow Mapping Separate Values': { src: `{ unquoted : "separate", http://foo.com, omitted value:, : omitted key, }`, tgt: [ { contents: [ { items: [ '{', 'unquoted', ':', 'separate', ',', 'http://foo.com', ',', 'omitted value', ':', ',', ':', 'omitted key', ',', '}' ] } ] } ] }, 'Example 7.18. Flow Mapping Adjacent Values': { src: `{ "adjacent":value, "readable": value, "empty": }`, tgt: [ { contents: [ { items: [ '{', 'adjacent', ':', 'value', ',', 'readable', ':', 'value', ',', 'empty', ':', '}' ] } ] } ] }, 'Example 7.19. Single Pair Flow Mappings': { src: `[ foo: bar ]`, tgt: [{ contents: [{ items: ['[', 'foo', ':', 'bar', ']'] }] }] }, 'Example 7.20. Single Pair Explicit Entry': { src: `[ ? foo bar : baz ]`, tgt: [{ contents: [{ items: ['[', '?', 'foo bar', ':', 'baz', ']'] }] }] }, 'Example 7.21. Single Pair Implicit Entries': { src: `- [ YAML : separate ] - [ : empty key entry ] - [ {JSON: like}:adjacent ]`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: ['[', 'YAML', ':', 'separate', ']'] } }, { type: Type.SEQ_ITEM, node: { items: ['[', ':', 'empty key entry', ']'] } }, { type: Type.SEQ_ITEM, node: { items: [ '[', { items: ['{', 'JSON', ':', 'like', '}'] }, ':', 'adjacent', ']' ] } } ] } ] } ] }, 'Example 7.22. Invalid Implicit Keys': { src: `[ foo bar: invalid, "foo...>1K characters...bar": invalid ]`, tgt: [ { contents: [ { items: [ '[', 'foo bar', ':', 'invalid', ',', 'foo...>1K characters...bar', ':', 'invalid', ']' ] } ] } ] // ERROR: The foo bar key spans multiple lines // ERROR: The foo...bar key is too long } }, '7.5. Flow Nodes': { 'Example 7.23. Flow Content': { src: `- [ a, b ] - { a: b } - "a" - 'b' - c`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: ['[', 'a', ',', 'b', ']'] } }, { type: Type.SEQ_ITEM, node: { items: ['{', 'a', ':', 'b', '}'] } }, { type: Type.SEQ_ITEM, node: 'a' }, { type: Type.SEQ_ITEM, node: 'b' }, { type: Type.SEQ_ITEM, node: 'c' } ] } ] } ] }, 'Example 7.24. Flow Nodes': { src: `- !!str "a" - 'b' - &anchor "c" - *anchor - !!str`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { tag: { handle: '!!', suffix: 'str' }, strValue: 'a' } }, { type: Type.SEQ_ITEM, node: 'b' }, { type: Type.SEQ_ITEM, node: { anchor: 'anchor', strValue: 'c' } }, { type: Type.SEQ_ITEM, node: { type: Type.ALIAS, rawValue: 'anchor' } }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!!', suffix: 'str' } } } ] } ] } ] } }, '8.1.1. Block Scalar Headers': { 'Example 8.1. Block Scalar Header': { src: `- | # Empty header literal - >1 # Indentation indicator folded - |+ # Chomping indicator keep - >1- # Both indicators strip`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { comment: ' Empty header', strValue: 'literal\n' } }, { type: Type.SEQ_ITEM, node: { comment: ' Indentation indicator', strValue: ' folded\n' } }, { type: Type.SEQ_ITEM, node: { comment: ' Chomping indicator', strValue: 'keep\n\n' } }, { type: Type.SEQ_ITEM, node: { comment: ' Both indicators', strValue: ' strip' } } ] } ] } ] }, 'Example 8.2. Block Indentation Indicator': { src: `- | ·detected - > · ·· ··# detected - |1 ··explicit - > ·\t ·detected`.replace(/·/g, ' '), tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: 'detected\n' }, { type: Type.SEQ_ITEM, node: '\n\n# detected\n' }, { type: Type.SEQ_ITEM, node: ' explicit\n' }, { type: Type.SEQ_ITEM, node: '\t\ndetected\n' } ] } ] } ] }, 'Example 8.3. Invalid Block Scalar Indentation Indicators': { src: `- | ·· ·text --- - > ··text ·text --- - |2 ·text`.replace(/·/g, ' '), tgt: [ { contents: [{ items: [{ node: ' \ntext\n' }] }] }, { contents: [{ items: [{ node: 'text text\n' }] }] }, { contents: [{ items: [{ node: 'text\n' }] }] } ] // ERROR: A leading all-space line must not have too many spaces. // ERROR: A following text line must not be less indented. // ERROR: The text is less indented than the indicated level. }, 'Example 8.4. Chomping Final Line Break': { src: `strip: |- text clip: | text keep: |+ text\n`, tgt: [ { contents: [ { items: [ 'strip', { type: Type.MAP_VALUE, node: 'text' }, 'clip', { type: Type.MAP_VALUE, node: 'text\n' }, 'keep', { type: Type.MAP_VALUE, node: 'text\n' } ] } ] } ] }, 'Example 8.5. Chomping Trailing Lines': { src: ` # Strip # Comments: strip: |- # text # Clip # comments: clip: | # text # Keep # comments: keep: |+ # text # Trail # comments.`, tgt: [ { contents: [ { type: Type.BLANK_LINE }, { comment: ' Strip' }, { comment: ' Comments:' }, { items: [ 'strip', { type: Type.MAP_VALUE, node: '# text' }, { type: Type.BLANK_LINE }, { comment: ' Clip' }, { comment: ' comments:' }, { type: Type.BLANK_LINE }, 'clip', { type: Type.MAP_VALUE, node: '# text\n' }, { type: Type.BLANK_LINE }, { comment: ' Keep' }, { comment: ' comments:' }, { type: Type.BLANK_LINE }, 'keep', { type: Type.MAP_VALUE, node: '# text\n\n' } ] }, { comment: ' Trail' }, { comment: ' comments.' } ] } ] }, 'Example 8.6. Empty Scalar Chomping': { src: `strip: >- clip: > keep: |+\n\n`, tgt: [ { contents: [ { items: [ 'strip', { type: Type.MAP_VALUE, node: '' }, { type: Type.BLANK_LINE }, 'clip', { type: Type.MAP_VALUE, node: '' }, { type: Type.BLANK_LINE }, 'keep', { type: Type.MAP_VALUE, node: '\n' } ] } ] } ] } }, '8.1.2. Literal Style': { 'Example 8.7. Literal Scalar': { src: `| literal \ttext\n\n`, tgt: [{ contents: ['literal\n\ttext\n'] }] }, 'Example 8.8. Literal Content': { src: `| · ·· ··literal ··· ·· ··text ·# Comment`.replace(/·/g, ' '), tgt: [ { contents: ['\n\nliteral\n \n\ntext\n', { comment: ' Comment' }] } ] } }, '8.1.3. Folded Style': { 'Example 8.9. Folded Scalar': { src: `> folded text\n\n`, tgt: [{ contents: ['folded text\n'] }] }, 'Example 8.10. Folded Lines': { src: `> folded line next line * bullet * list * lines last line # Comment`, tgt: [ { contents: [ '\nfolded line\nnext line\n * bullet\n\n * list\n * lines\n\nlast line\n', { comment: ' Comment' } ] } ] } }, '8.2.1. Block Sequences': { 'Example 8.14. Block Sequence': { src: `block sequence: - one - two : three\n`, tgt: [ { contents: [ { items: [ 'block sequence', { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: 'one' }, { type: Type.SEQ_ITEM, node: { items: [ 'two', { type: Type.MAP_VALUE, node: 'three' } ] } } ] } } ] } ] } ] }, 'Example 8.15. Block Sequence Entry Types': { src: `- # Empty - | block node - - one # Compact - two # sequence - one: two # Compact mapping`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: null, comment: ' Empty' }, { type: Type.SEQ_ITEM, node: 'block node\n' }, { type: Type.SEQ_ITEM, node: { items: [ { type: Type.SEQ_ITEM, node: { comment: ' Compact', strValue: 'one' } }, { type: Type.SEQ_ITEM, node: { comment: ' sequence', strValue: 'two' } } ] } }, { type: Type.SEQ_ITEM, node: { items: [ 'one', { type: Type.MAP_VALUE, node: { comment: ' Compact mapping', strValue: 'two' } } ] } } ] } ] } ] } }, '8.2.2. Block Mappings': { 'Example 8.16. Block Mappings': { src: `block mapping: key: value\n`, tgt: [ { contents: [ { items: [ 'block mapping', { type: Type.MAP_VALUE, node: { items: ['key', { type: Type.MAP_VALUE, node: 'value' }] } } ] } ] } ] }, 'Example 8.17. Explicit Block Mapping Entries': { src: `? explicit key # Empty value ? | block key : - one # Explicit compact - two # block value\n`, tgt: [ { contents: [ { items: [ { type: Type.MAP_KEY, node: { comment: ' Empty value', strValue: 'explicit key' } }, { type: Type.MAP_KEY, node: 'block key\n' }, { type: Type.MAP_VALUE, node: { items: [ { type: Type.SEQ_ITEM, node: { comment: ' Explicit compact', strValue: 'one' } }, { type: Type.SEQ_ITEM, node: { comment: ' block value', strValue: 'two' } } ] } } ] } ] } ] }, 'Example 8.18. Implicit Block Mapping Entries': { src: `plain key: in-line value : # Both empty "quoted key": - entry`, tgt: [ { contents: [ { items: [ 'plain key', { type: Type.MAP_VALUE, node: 'in-line value' }, { type: Type.MAP_VALUE, node: null, comment: ' Both empty' }, 'quoted key', { type: Type.MAP_VALUE, node: { items: [{ type: Type.SEQ_ITEM, node: 'entry' }] } } ] } ] } ] }, 'Example 8.19. Compact Block Mappings': { src: `- sun: yellow - ? earth: blue : moon: white\n`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: { items: ['sun', { type: Type.MAP_VALUE, node: 'yellow' }] } }, { type: Type.SEQ_ITEM, node: { items: [ { type: Type.MAP_KEY, node: { items: [ 'earth', { type: Type.MAP_VALUE, node: 'blue' } ] } }, { type: Type.MAP_VALUE, node: { items: [ 'moon', { type: Type.MAP_VALUE, node: 'white' } ] } } ] } } ] } ] } ] } }, '8.2.3. Block Nodes': { 'Example 8.20. Block Types': { src: `- "flow in block" - > Block scalar - !!map # Block collection foo : bar\n`, tgt: [ { contents: [ { items: [ { type: Type.SEQ_ITEM, node: 'flow in block' }, { type: Type.SEQ_ITEM, node: 'Block scalar\n' }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!!', suffix: 'map' }, comment: ' Block collection', items: ['foo', { type: Type.MAP_VALUE, node: 'bar' }] } } ] } ] } ] }, 'Example 8.21. Block Scalar Nodes': { src: `literal: |2 value folded: !foo >1 value`, tgt: [ { contents: [ { items: [ 'literal', { type: Type.MAP_VALUE, node: 'value\n' }, 'folded', { type: Type.MAP_VALUE, node: { tag: { handle: '!', suffix: 'foo' }, strValue: 'value\n' } } // trailing \n against spec ] } ] } ] }, 'Example 8.22. Block Collection Nodes': { src: `sequence: !!seq - entry - !!seq - nested mapping: !!map foo: bar`, tgt: [ { contents: [ { items: [ 'sequence', { type: Type.MAP_VALUE, node: { tag: { handle: '!!', suffix: 'seq' }, items: [ { type: Type.SEQ_ITEM, node: 'entry' }, { type: Type.SEQ_ITEM, node: { tag: { handle: '!!', suffix: 'seq' }, items: [{ type: Type.SEQ_ITEM, node: 'nested' }] } } ] } }, 'mapping', { type: Type.MAP_VALUE, node: { tag: { handle: '!!', suffix: 'map' }, items: ['foo', { type: Type.MAP_VALUE, node: 'bar' }] } } ] } ] } ] } }, '9.1. Documents': { 'Example 9.1. Document Prefix': { src: `\u{FEFF}# Comment # lines Document`, tgt: [ { contents: [{ comment: ' Comment' }, { comment: ' lines' }, 'Document'] } ] }, 'Example 9.2. Document Markers': { src: `%YAML 1.2 --- Document ... # Suffix`, tgt: [ { directives: [{ name: 'YAML', parameters: ['1.2'] }], contents: ['Document', { comment: ' Suffix' }] } ] }, 'Example 9.3. Bare Documents': { src: `Bare document ... # No document ... | %!PS-Adobe-2.0 # Not the first line`, tgt: [ { contents: ['Bare document'] }, { contents: [{ comment: ' No document' }] }, { contents: ['%!PS-Adobe-2.0 # Not the first line\n'] } ] }, 'Example 9.4. Explicit Documents': { src: `--- { matches % : 20 } ... --- # Empty ...`, tgt: [ { contents: [{ items: ['{', 'matches %', ':', '20', '}'] }] }, { contents: [{ comment: ' Empty' }] } ] }, 'Example 9.5. Directives Documents': { src: `%YAML 1.2 --- | %!PS-Adobe-2.0 ... %YAML 1.2 --- # Empty ...`, tgt: [ { directives: [{ name: 'YAML', parameters: ['1.2'] }], contents: ['%!PS-Adobe-2.0\n'] }, { directives: [{ name: 'YAML', parameters: ['1.2'] }], contents: [{ comment: ' Empty' }] } ] } }, '9.2. Streams': { 'Example 9.6. Stream': { src: `Document --- # Empty ... %YAML 1.2 --- matches %: 20`, tgt: [ { contents: ['Document'] }, { contents: [{ comment: ' Empty' }] }, { directives: [{ name: 'YAML', parameters: ['1.2'] }], contents: [ { items: ['matches %', { type: Type.MAP_VALUE, node: '20' }] } ] } ] } }, 'yaml-test-suite': { '2EBW: Allowed characters in keys': { src: `a!"#$%&'()*+,-./09:;<=>?@AZ[\\]^_\`az{|}~: safe ?foo: safe question mark :foo: safe colon -foo: safe dash this is#not: a comment`, tgt: [ { contents: [ { items: [ 'a!"#$%&\'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~', { node: 'safe' }, '?foo', { node: 'safe question mark' }, ':foo', { node: 'safe colon' }, '-foo', { node: 'safe dash' }, 'this is#not', { node: 'a comment' } ] } ] } ] }, 'PW8X: Anchors on Empty Scalars': { src: `- &a - a - &a : a b: &b &c : &a - ? &d ? &e : &a`, tgt: [ { contents: [ { items: [ { node: { anchor: 'a' } }, { node: 'a' }, { node: { items: [ { anchor: 'a' }, { type: Type.MAP_VALUE, node: 'a' }, 'b', { type: Type.MAP_VALUE, node: { anchor: 'b' } }, { anchor: 'c' }, { type: Type.MAP_VALUE, node: { anchor: 'a' } } ] } }, { node: { items: [ { type: Type.MAP_KEY, node: { anchor: 'd' } }, { type: Type.MAP_KEY, node: { anchor: 'e' } }, { type: Type.MAP_VALUE, node: { anchor: 'a' } } ] } } ] } ] } ] } } } for (const section in spec) { describe(section, () => { for (const name in spec[section]) { test(name, () => { const { src, tgt } = spec[section][name] const documents = parse(src) trace: 'PARSED', JSON.stringify(pretty(documents), null, ' ') testSpec(documents, tgt) const reSrc = String(documents) trace: 'RE-STRUNG', '\n' + reSrc // expect(reSrc).toBe(src) const reDoc = parse(reSrc) trace: 'RE-PARSED', JSON.stringify(pretty(reDoc), null, ' ') testSpec(reDoc, tgt) }) } }) } yaml-1.10.2/tests/cst/common.js000066400000000000000000000031051402322402300163050ustar00rootroot00000000000000import { Node } from '../../src/cst/Node.js' export const pretty = node => { if (!node || typeof node !== 'object') return node if (Array.isArray(node)) return node.map(pretty) const res = {} if (node.anchor) res.anchor = node.anchor if (typeof node.tag === 'string') res.tag = node.tag if (node.comment) res.comment = node.comment if (node.contents) { if (node.directives.length > 0) res.directives = node.directives.map(pretty) if (node.contents.length > 0) res.contents = node.contents.map(pretty) } else if (node.items) { res.type = node.type res.items = node.items.map(pretty) } else if (typeof node.node !== 'undefined') { res.type = node.type res.node = pretty(node.node) } else if (node.strValue) { res.strValue = node.strValue } else if (node.rawValue) { res.type = node.type res.rawValue = node.rawValue } if (Object.keys(res).every(key => key === 'rawValue')) return res.rawValue return res } export const testSpec = (res, exp) => { if (typeof exp === 'string') { const value = res instanceof Node ? 'strValue' in res ? res.strValue : res.rawValue : typeof res === 'string' ? res : res && res.char expect(value).toBe(exp) } else if (Array.isArray(exp)) { expect(res).toBeInstanceOf(Array) trace: 'test-array', exp exp.forEach((e, i) => testSpec(res[i], e)) } else if (exp) { expect(res).toBeInstanceOf(Object) trace: 'test-object', exp for (const key in exp) testSpec(res[key], exp[key]) } else { expect(res).toBeNull() } } yaml-1.10.2/tests/cst/corner-cases.js000066400000000000000000000366651402322402300174220ustar00rootroot00000000000000import { source } from 'common-tags' import parse from '../../parse-cst.js' describe('folded block with chomp: keep', () => { test('nl + nl', () => { const src = `>+\nblock\n\n` const doc = parse(src)[0] expect(doc.contents[0].strValue).toBe('block\n\n') }) test('nl + nl + sp + nl', () => { const src = '>+\nab\n\n \n' const doc = parse(src)[0] expect(doc.contents[0].strValue).toBe('ab\n\n \n') }) }) describe('folded block with indent indicator + leading empty lines + leading whitespace', () => { test('one blank line', () => { const src = '>1\n\n line\n' const doc = parse(src)[0] expect(doc.contents[0].strValue).toBe('\n line\n') }) test('two blank lines', () => { const src = '>1\n\n\n line\n' const doc = parse(src)[0] expect(doc.contents[0].strValue).toBe('\n\n line\n') }) }) describe('multiple linebreaks in scalars', () => { test('plain', () => { const src = `trimmed\n\n\n\nlines\n` const doc = parse(src)[0] expect(doc.contents[0].strValue).toBe('trimmed\n\n\nlines') }) test('single-quoted', () => { const src = `'trimmed\n\n\n\nlines'\n` const doc = parse(src)[0] expect(doc.contents[0].strValue).toBe('trimmed\n\n\nlines') }) }) test('no null document for document-end marker', () => { const src = '---\nx\n...\n' const docs = parse(src) expect(docs).toHaveLength(1) }) test('explicit key after empty value', () => { const src = 'one:\n? two\n' const doc = parse(src)[0] const raw = doc.contents[0].items.map(it => it.rawValue) expect(raw).toMatchObject(['one', ':', '? two']) }) test('seq with anchor as explicit key', () => { const src = '? &key\n- a\n' const doc = parse(src)[0] expect(doc.contents).toHaveLength(1) expect(doc.contents[0].items[0].node.rawValue).toBe('- a') }) test('unindented single-quoted string', () => { const src = `key: 'two\nlines'\n` const doc = parse(src)[0] const { node } = doc.contents[0].items[1] expect(node.error).toBeNull() expect(node.strValue).toMatchObject({ str: 'two lines', errors: [ new SyntaxError( 'Multi-line single-quoted string needs to be sufficiently indented' ) ] }) }) describe('seq unindent to non-empty indent', () => { test('after map', () => { // const src = ` // - a:| - b| - c|` const src = ` - a: - b - c\n` const doc = parse(src)[0] expect(doc.contents).toHaveLength(2) expect(doc.contents[1].items).toHaveLength(2) expect(doc.contents[1].items[1].error).toBeNull() }) test('after seq', () => { const src = ` - - a - b\n` const doc = parse(src)[0] expect(doc.contents).toHaveLength(2) expect(doc.contents[1].items).toHaveLength(2) expect(doc.contents[1].items[1].error).toBeNull() }) }) test('eemeli/yaml#10', () => { const src = ` a: - b c: d ` const doc = parse(src)[0] expect(doc.contents).toHaveLength(2) expect(doc.contents[1].items).toHaveLength(4) expect(doc.contents[1].items[1].error).toBeNull() }) test('eemeli/yaml#19', () => { const src = 'a:\n # 123' const doc = parse(src)[0] expect(doc.contents).toMatchObject([ { type: 'MAP', items: [ { type: 'PLAIN', range: { start: 0, end: 1 } }, { type: 'MAP_VALUE', range: { start: 1, end: 2 } } ] }, { type: 'COMMENT', range: { start: 5, end: 10 } } ]) }) test('eemeli/yaml#20', () => { const src = 'a:\r\n 123\r\nb:\r\n 456\r\n' const docStream = parse(src) const a = docStream[0].contents[0].items[1].node expect(a.strValue).toBe('123') expect(docStream.setOrigRanges()).toBe(true) const { origStart: a0, origEnd: a1 } = a.valueRange expect(src.slice(a0, a1)).toBe('123') const b = docStream[0].contents[0].items[3].node expect(b.strValue).toBe('456') const { origStart: b0, origEnd: b1 } = b.valueRange expect(src.slice(b0, b1)).toBe('456') }) test('eemeli/yaml#38', () => { const src = ` - - - a - ` const doc = parse(src)[0] const { items } = doc.contents[1] expect(items).toHaveLength(3) items.forEach(item => { expect(item.error).toBe(null) }) }) test('eemeli/yaml#56', () => { const src = ':,\n' const doc = parse(src)[0] expect(doc.contents).toHaveLength(1) expect(doc.contents[0]).toMatchObject({ error: null, strValue: ':,', type: 'PLAIN' }) }) describe('collection indicator as last char', () => { test('seq item', () => { const src = '-' const doc = parse(src)[0] expect(doc.contents[0]).toMatchObject({ type: 'SEQ', items: [{ type: 'SEQ_ITEM', node: null }] }) }) test('explicit map key', () => { const src = '?' const doc = parse(src)[0] expect(doc.contents[0]).toMatchObject({ type: 'MAP', items: [{ type: 'MAP_KEY', node: null }] }) }) test('empty map value', () => { const src = ':' const doc = parse(src)[0] expect(doc.contents[0]).toMatchObject({ type: 'MAP', items: [{ type: 'MAP_VALUE', node: null }] }) }) test('indented seq-in-seq', () => { const src = ` -\n - - a\n -` const doc = parse(src)[0] expect(doc.contents[0]).toMatchObject({ items: [ { error: null }, { node: { items: [{ node: { type: 'PLAIN', strValue: 'a' } }] } }, { error: null } ] }) }) test('implicit map value separator', () => { const src = 'a:' const doc = parse(src)[0] expect(doc.contents[0]).toMatchObject({ type: 'MAP', items: [ { type: 'PLAIN', strValue: 'a' }, { type: 'MAP_VALUE', node: null } ] }) }) }) test('parse an empty string as an empty document', () => { const doc = parse('')[0] expect(doc).toMatchObject({ error: null, contents: [] }) }) test('re-stringify flow seq with comments', () => { const src = '[ #c\n1, #d\n2 ]\n' const doc = parse(src) expect(String(doc)).toBe(src) }) test('blank line after less-indented comment (eemeli/yaml#91)', () => { const src = ` foo1: bar # comment foo2: baz` const doc = parse(src) expect(doc).toHaveLength(1) expect(doc[0].contents).toMatchObject([ { type: 'BLANK_LINE' }, { type: 'MAP' } ]) }) describe('flow collection as same-line mapping key value', () => { test('eemeli/yaml#113', () => { const src = source` --- foo: bar: enum: [ "abc", "cde" ] ` const doc = parse(src) const barValue = doc[0].contents[0].items[1].node.items[1].node expect(barValue.items[1].node).toMatchObject({ error: null, items: [ { char: '[' }, { type: 'QUOTE_DOUBLE' }, { char: ',' }, { type: 'QUOTE_DOUBLE' }, { char: ']' } ], type: 'FLOW_SEQ' }) }) test('eemeli/yaml#114', () => { const src = source` foo: { bar: boom } ` const doc = parse(src) const flowCollection = doc[0].contents[0].items[1].node expect(flowCollection).toMatchObject({ error: null, items: [ { char: '{' }, { type: 'PLAIN' }, { char: ':' }, { type: 'PLAIN' }, { char: '}' } ], type: 'FLOW_MAP' }) }) test('Fails on insufficient indent', () => { const src = source` foo: { bar: boom } ` const doc = parse(' ' + src) const flowCollection = doc[0].contents[0].items[1].node expect(flowCollection).toMatchObject({ error: { message: 'Insufficient indentation in flow collection', name: 'YAMLSemanticError' }, items: [ { char: '{' }, { type: 'PLAIN' }, { char: ':' }, { type: 'PLAIN' }, { char: '}' } ], type: 'FLOW_MAP' }) }) }) describe('blank lines before empty collection item value', () => { test('empty value followed by blank line at document end', () => { const src = 'a:\n\n' const doc = parse(src)[0] expect(doc.contents).toMatchObject([ { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] } ]) }) test('empty value with blank line before comment at document end', () => { const src = 'a:\n\n#c\n' const doc = parse(src)[0] expect(doc.contents).toMatchObject([ { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] }, { type: 'BLANK_LINE', range: { start: 3, end: 4 } }, { type: 'COMMENT', range: { start: 4, end: 6 } } ]) }) test('empty value with blank line after inline comment at document end', () => { const src = 'a: #c\n\n' const doc = parse(src)[0] expect(doc.contents).toMatchObject([ { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [{ start: 3, end: 5 }] } ] } ]) }) test('empty value with blank line after separate-line comment at document end', () => { const src = 'a:\n#c\n\n' const doc = parse(src)[0] expect(doc.contents).toMatchObject([ { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] }, { type: 'COMMENT', range: { start: 3, end: 5 } } ]) }) test('empty value with blank line before & after comment at document end', () => { const src = 'a:\n\n#c\n\n' const doc = parse(src)[0] expect(doc.contents).toMatchObject([ { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] }, { type: 'BLANK_LINE', range: { start: 3, end: 4 } }, { type: 'COMMENT', range: { start: 4, end: 6 } } ]) }) test('empty value with blank lines before & after two comments at document end', () => { const src = 'a:\n\n#c\n\n#d\n\n' const doc = parse(src)[0] expect(doc.contents).toMatchObject([ { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] }, { type: 'BLANK_LINE', range: { start: 3, end: 4 } }, { type: 'COMMENT', range: { start: 4, end: 6 } }, { type: 'BLANK_LINE', range: { start: 7, end: 8 } }, { type: 'COMMENT', range: { start: 8, end: 10 } } ]) }) test('empty value followed by blank line not at end', () => { const src = 'a:\n\nb:\n' const doc = parse(src)[0] expect(doc.contents[0].items).toMatchObject([ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] }, { type: 'BLANK_LINE', range: { start: 3, end: 4 } }, { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ]) }) test('empty value with blank line before comment not at end', () => { const src = 'a:\n\n#c\nb:\n' const doc = parse(src)[0] expect(doc.contents[0].items).toMatchObject([ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] }, { type: 'BLANK_LINE', range: { start: 3, end: 4 } }, { type: 'COMMENT', range: { start: 4, end: 6 } }, { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ]) }) test('empty value with blank line after comment not at end', () => { const src = 'a: #c\n\nb:\n' const doc = parse(src)[0] expect(doc.contents[0].items).toMatchObject([ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [{ start: 3, end: 5 }] }, { type: 'BLANK_LINE', range: { start: 6, end: 7 } }, { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ]) }) test('empty value with blank line before & after comment not at end', () => { const src = 'a:\n\n#c\n\nb:\n' const doc = parse(src)[0] expect(doc.contents[0].items).toMatchObject([ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] }, { type: 'BLANK_LINE', range: { start: 3, end: 4 } }, { type: 'COMMENT', range: { start: 4, end: 6 } }, { type: 'BLANK_LINE', range: { start: 7, end: 8 } }, { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ]) }) test('empty value with blank line before comment with CR-LF line ends', () => { const src = '\r\na:\r\n\r\n#c\r\n' const cst = parse(src) cst.setOrigRanges() expect(cst[0].contents).toMatchObject([ { type: 'BLANK_LINE', range: { start: 0, end: 1, origStart: 1, origEnd: 2 } }, { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] }, { type: 'BLANK_LINE', range: { start: 4, end: 5, origStart: 7, origEnd: 8 } }, { type: 'COMMENT', range: { start: 5, end: 7, origStart: 8, origEnd: 10 } } ]) }) test('empty value with blank line after comment with CR-LF line ends', () => { const src = '\r\na: #c\r\n\r\n' const cst = parse(src) cst.setOrigRanges() expect(cst[0].contents[1].items).toMatchObject([ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [{ start: 4, end: 6, origStart: 5, origEnd: 7 }] } ]) }) test('empty value with blank line before & after comment with CR-LF line ends', () => { const src = '\r\na:\r\n\r\n#c\r\n\r\nb:\r\n' const cst = parse(src) cst.setOrigRanges() expect(cst[0].contents).toMatchObject([ { type: 'BLANK_LINE', range: { start: 0, end: 1, origStart: 1, origEnd: 2 } }, { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] }, { type: 'BLANK_LINE', range: { start: 4, end: 5, origStart: 7, origEnd: 8 } }, { type: 'COMMENT', range: { start: 5, end: 7, origStart: 8, origEnd: 10 } }, { type: 'BLANK_LINE', range: { start: 8, end: 9, origStart: 13, origEnd: 14 } }, { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] } ]) }) test('empty value with blank lines before & after two comments with CR-LF line ends', () => { const src = '\r\na:\r\n\r\n#c\r\n\r\n#d\r\n\r\nb:\r\n' const cst = parse(src) cst.setOrigRanges() expect(cst[0].contents).toMatchObject([ { type: 'BLANK_LINE', range: { start: 0, end: 1, origStart: 1, origEnd: 2 } }, { type: 'MAP', items: [ { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] }, { type: 'BLANK_LINE', range: { start: 4, end: 5, origStart: 7, origEnd: 8 } }, { type: 'COMMENT', range: { start: 5, end: 7, origStart: 8, origEnd: 10 } }, { type: 'BLANK_LINE', range: { start: 8, end: 9, origStart: 13, origEnd: 14 } }, { type: 'COMMENT', range: { start: 9, end: 11, origStart: 14, origEnd: 16 } }, { type: 'BLANK_LINE', range: { start: 12, end: 13, origStart: 19, origEnd: 20 } }, { type: 'PLAIN', props: [] }, { type: 'MAP_VALUE', node: null, props: [] } ] } ]) }) }) yaml-1.10.2/tests/cst/parse.js000066400000000000000000000213471402322402300161370ustar00rootroot00000000000000import parse from '../../parse-cst.js' test('return value', () => { const src = '---\n- foo\n- bar\n' const cst = parse(src) expect(cst).toHaveLength(1) expect(cst[0]).toMatchObject({ contents: [ { error: null, items: [ { error: null, node: { error: null, props: [], range: { end: 9, start: 6 }, type: 'PLAIN', value: null, valueRange: { end: 9, start: 6 } }, props: [], range: { end: 9, start: 4 }, type: 'SEQ_ITEM', value: null, valueRange: { end: 9, start: 4 } }, { error: null, node: { error: null, props: [], range: { end: 15, start: 12 }, type: 'PLAIN', value: null, valueRange: { end: 15, start: 12 } }, props: [], range: { end: 15, start: 10 }, type: 'SEQ_ITEM', value: null, valueRange: { end: 15, start: 10 } } ], props: [], range: { end: 16, start: 4 }, type: 'SEQ', value: null, valueRange: { end: 15, start: 4 } } ], directives: [], directivesEndMarker: { start: 0, end: 3 }, documentEndMarker: null, error: null, props: [], range: null, type: 'DOCUMENT', value: null, valueRange: { start: 3, end: 16 } }) }) describe('toString()', () => { test('plain document', () => { const src = '- foo\n- bar\n' const cst = parse(src) expect(String(cst)).toBe(src) }) test('stream of two documents', () => { const src = 'foo\n...\nbar\n' const cst = parse(src) expect(cst).toHaveLength(2) expect(String(cst)).toBe(src) }) test('document with CRLF line separators', () => { const src = '- foo\r\n- bar\r\n' const cst = parse(src) expect(cst.toString()).toBe('- foo\n- bar\n') }) }) describe('setOrigRanges()', () => { test('return false for no CRLF', () => { const src = '- foo\n- bar\n' const cst = parse(src) expect(cst.setOrigRanges()).toBe(false) expect(cst[0].valueRange).toMatchObject({ start: 0, end: 12 }) expect(cst[0].valueRange.origStart).toBeUndefined() expect(cst[0].valueRange.origEnd).toBeUndefined() }) test('no error on comments', () => { const src = '\r\n# hello' expect(() => parse(src).setOrigRanges()).not.toThrowError() }) test('directives', () => { const src = '\r\n%YAML 1.2\r\n---\r\nfoo\r\n' const cst = parse(src) expect(cst.setOrigRanges()).toBe(true) expect(cst[0]).toMatchObject({ directives: [ { type: 'BLANK_LINE' }, { name: 'YAML', range: { end: 10, origEnd: 11, origStart: 2, start: 1 } } ], contents: [ { type: 'PLAIN', range: { end: 18, origEnd: 21, origStart: 18, start: 15 } } ] }) }) test('block scalar', () => { const src = '|\r\n foo\r\n bar\r\n' const cst = parse(src) expect(cst.setOrigRanges()).toBe(true) const node = cst[0].contents[0] expect(node).toMatchObject({ type: 'BLOCK_LITERAL', range: { end: 14, origEnd: 17, origStart: 0, start: 0 } }) expect(node.strValue).toBe('foo\nbar\n') }) test('single document', () => { const src = '- foo\r\n- bar\r\n' const cst = parse(src) expect(cst.setOrigRanges()).toBe(true) expect(cst).toHaveLength(1) const { range, valueRange } = cst[0].contents[0].items[1].node expect(src.slice(range.origStart, range.origEnd)).toBe('bar') expect(src.slice(valueRange.origStart, valueRange.origEnd)).toBe('bar') expect(cst[0]).toMatchObject({ contents: [ { error: null, items: [ { error: null, node: { error: null, props: [], range: { end: 5, origEnd: 5, origStart: 2, start: 2 }, type: 'PLAIN', value: null, valueRange: { end: 5, origEnd: 5, origStart: 2, start: 2 } }, props: [], range: { end: 5, origEnd: 5, origStart: 0, start: 0 }, type: 'SEQ_ITEM', value: null, valueRange: { end: 5, origEnd: 5, origStart: 0, start: 0 } }, { error: null, node: { error: null, props: [], range: { end: 11, origEnd: 12, origStart: 9, start: 8 }, type: 'PLAIN', value: null, valueRange: { end: 11, origEnd: 12, origStart: 9, start: 8 } }, props: [], range: { end: 11, origEnd: 12, origStart: 7, start: 6 }, type: 'SEQ_ITEM', value: null, valueRange: { end: 11, origEnd: 12, origStart: 7, start: 6 } } ], props: [], range: { end: 12, origEnd: 14, origStart: 0, start: 0 }, type: 'SEQ', value: null, valueRange: { end: 11, origEnd: 12, origStart: 0, start: 0 } } ], directives: [], directivesEndMarker: null, documentEndMarker: null, error: null, props: [], range: null, type: 'DOCUMENT', value: null, valueRange: { end: 12, origEnd: 14, origStart: 0, start: 0 } }) expect(cst[0].context.root).toBe(cst[0]) expect(cst[0].contents[0].items[1].node.context.root).toBe(cst[0]) }) test('stream of two documents', () => { const src = 'foo\r\n...\r\nbar\r\n' const cst = parse(src) expect(cst.setOrigRanges()).toBe(true) expect(cst).toHaveLength(2) const { range, valueRange } = cst[1].contents[0] expect(src.slice(range.origStart, range.origEnd)).toBe('bar') expect(src.slice(valueRange.origStart, valueRange.origEnd)).toBe('bar') expect(cst[0]).toMatchObject({ contents: [ { error: null, props: [], range: { end: 3, origEnd: 3, origStart: 0, start: 0 }, type: 'PLAIN', value: null, valueRange: { end: 3, origEnd: 3, origStart: 0, start: 0 } } ], directives: [], directivesEndMarker: null, documentEndMarker: { start: 4, end: 7, origStart: 5, origEnd: 8 }, error: null, props: [], range: null, type: 'DOCUMENT', value: null, valueRange: { end: 4, origEnd: 5, origStart: 0, start: 0 } }) expect(cst[1]).toMatchObject({ contents: [ { error: null, props: [], range: { end: 11, origEnd: 13, origStart: 10, start: 8 }, type: 'PLAIN', value: null, valueRange: { end: 11, origEnd: 13, origStart: 10, start: 8 } } ], directives: [], directivesEndMarker: null, documentEndMarker: null, error: null, props: [], range: null, type: 'DOCUMENT', value: null, valueRange: { end: 12, origEnd: 15, origStart: 10, start: 8 } }) expect(cst[0].context.root).toBe(cst[0]) expect(cst[1].context.root).toBe(cst[1]) }) test('flow collections', () => { const src = '\r\n{ : }\r\n' const cst = parse(src) expect(() => cst.setOrigRanges()).not.toThrowError() expect(cst[0]).toMatchObject({ contents: [ { error: null, props: [], range: { end: 1, origEnd: 2, origStart: 1, start: 0 }, type: 'BLANK_LINE', value: null, valueRange: null }, { error: null, items: [ { char: '{', offset: 1, origOffset: 2 }, { char: ':', offset: 3, origOffset: 4 }, { char: '}', offset: 5, origOffset: 6 } ], props: [], range: { end: 6, origEnd: 7, origStart: 2, start: 1 }, type: 'FLOW_MAP', value: null, valueRange: { end: 6, origEnd: 7, origStart: 2, start: 1 } } ], directives: [], directivesEndMarker: null, documentEndMarker: null, error: null, props: [], range: null, type: 'DOCUMENT', value: null, valueRange: { end: 7, origEnd: 9, origStart: 2, start: 1 } }) expect(cst[0].context.root).toBe(cst[0]) expect(cst[0].contents[1].context.root).toBe(cst[0]) }) }) test('blank lines', () => { const src = '#cc\n\n\n\n##dd' const cst = parse(src) expect(cst[0].contents).toMatchObject([ { type: 'COMMENT', error: null }, { type: 'BLANK_LINE', error: null }, { type: 'BLANK_LINE', error: null }, { type: 'BLANK_LINE', error: null }, { type: 'COMMENT', error: null } ]) }) yaml-1.10.2/tests/cst/set-value.js000066400000000000000000000026111402322402300167230ustar00rootroot00000000000000import { Type } from '../../src/constants.js' import { parse } from '../../src/cst/parse.js' import { CollectionItem } from '../../src/cst/CollectionItem.js' test('set value in collection', () => { const src = `- Mark McGwire - Sammy Sosa - Ken Griffey ` // spec 2.1 const cst = parse(src) cst[0].contents[0].items[1].node.value = 'TEST\n' expect(String(cst)).toBe(src.replace(/Sammy Sosa/, 'TEST')) }) test('replace entire contents', () => { const src = `- Mark McGwire - Sammy Sosa - Ken Griffey ` // spec 2.1 const cst = parse(src) cst[0].contents[0].value = 'TEST: true\n' expect(String(cst)).toBe('TEST: true\n') }) test('remove map key/value pair', () => { const src = `hr: 65 # Home runs avg: 0.278 # Batting average rbi: 147 # Runs Batted In ` // spec 2.2 const cst = parse(src) cst[0].contents[0].items[2].value = '' cst[0].contents[0].items[3].value = '' expect(String(cst)).toBe(src.replace(/avg.*\n/, '')) }) test('add entry to seq', () => { const src = `american: - Boston Red Sox - Detroit Tigers - New York Yankees national: - New York Mets - Chicago Cubs - Atlanta Braves ` // spec 2.3 const cst = parse(src) const seq = cst[0].contents[0].items[3].node const item = new CollectionItem(Type.SEQ_ITEM) item.context = seq.items[2].context item.value = '- "TEST"\n' seq.items.push(item) expect(String(cst)).toBe(`${src} ${item.value}`) }) yaml-1.10.2/tests/cst/source-utils.js000066400000000000000000000033511402322402300174560ustar00rootroot00000000000000import { getLinePos } from '../../src/cst/source-utils.js' import { parse } from '../../src/cst/parse.js' test('lineStarts for empty document', () => { const src = '' const cst = parse(src) expect(() => getLinePos(0, cst)).not.toThrow() expect(cst[0].lineStarts).toMatchObject([0]) }) test('lineStarts for multiple documents', () => { const src = 'foo\n...\nbar\n' const cst = parse(src) expect(() => getLinePos(0, cst)).not.toThrow() expect(cst[0].lineStarts).toMatchObject([0, 4, 8, 12]) }) test('lineStarts for malformed document', () => { const src = '- foo\n\t- bar\n' const cst = parse(src) expect(() => getLinePos(0, cst)).not.toThrow() expect(cst[0].lineStarts).toMatchObject([0, 6, 13]) }) test('getLinePos()', () => { const src = '- foo\n- bar\n' const cst = parse(src) expect(cst[0].lineStarts).toBeUndefined() expect(getLinePos(0, cst)).toMatchObject({ line: 1, col: 1 }) expect(getLinePos(1, cst)).toMatchObject({ line: 1, col: 2 }) expect(getLinePos(2, cst)).toMatchObject({ line: 1, col: 3 }) expect(getLinePos(5, cst)).toMatchObject({ line: 1, col: 6 }) expect(getLinePos(6, cst)).toMatchObject({ line: 2, col: 1 }) expect(getLinePos(7, cst)).toMatchObject({ line: 2, col: 2 }) expect(getLinePos(11, cst)).toMatchObject({ line: 2, col: 6 }) expect(getLinePos(12, cst)).toMatchObject({ line: 3, col: 1 }) expect(cst[0].lineStarts).toMatchObject([0, 6, 12]) }) test('invalid args for getLinePos()', () => { const src = '- foo\n- bar\n' const cst = parse(src) expect(getLinePos()).toBeNull() expect(getLinePos(0)).toBeNull() expect(getLinePos(1)).toBeNull() expect(getLinePos(-1, cst)).toBeNull() expect(getLinePos(13, cst)).toBeNull() expect(getLinePos(Math.MAXINT, cst)).toBeNull() }) yaml-1.10.2/tests/doc/000077500000000000000000000000001402322402300144345ustar00rootroot00000000000000yaml-1.10.2/tests/doc/YAML-1.1.spec.js000066400000000000000000000030761402322402300167700ustar00rootroot00000000000000import { source } from 'common-tags' import YAML from '../../index.js' const orig = {} beforeAll(() => { orig.prettyErrors = YAML.defaultOptions.prettyErrors orig.version = YAML.defaultOptions.version YAML.defaultOptions.prettyErrors = true YAML.defaultOptions.version = '1.1' }) afterAll(() => { YAML.defaultOptions.prettyErrors = orig.prettyErrors YAML.defaultOptions.version = orig.version }) test('Use preceding directives if none defined', () => { const src = source` !bar "First document" ... %TAG ! !foo --- !bar "With directives" --- !bar "Using previous TAG directive" ... %YAML 1.1 --- !bar "Reset settings" --- !bar "Using previous YAML directive" ` const docs = YAML.parseAllDocuments(src, { prettyErrors: false }) expect(docs).toHaveLength(5) expect(docs.map(doc => doc.errors)).toMatchObject([[], [], [], [], []]) const warn = tag => ({ message: `The tag ${tag} is unavailable, falling back to tag:yaml.org,2002:str` }) expect(docs.map(doc => doc.warnings)).toMatchObject([ [warn('!bar')], [warn('!foobar')], [warn('!foobar')], [warn('!bar')], [warn('!bar')] ]) expect(docs.map(doc => doc.version)).toMatchObject([ null, null, null, '1.1', '1.1' ]) expect(docs.map(String)).toMatchObject([ '!bar "First document"\n', '%TAG ! !foo\n---\n!bar "With directives"\n', '%TAG ! !foo\n---\n!bar "Using previous TAG directive"\n', '%YAML 1.1\n---\n!bar "Reset settings"\n', '%YAML 1.1\n---\n!bar "Using previous YAML directive"\n' ]) }) yaml-1.10.2/tests/doc/YAML-1.2.spec.js000066400000000000000000001242451402322402300167730ustar00rootroot00000000000000import YAML from '../../index.js' import { YAMLError } from '../../util.js' const collectionKeyWarning = 'Keys with collection values will be stringified as YAML due to JS Object restrictions. Use mapAsMap: true to avoid this.' const spec = { '2.1. Collections': { 'Example 2.1. Sequence of Scalars': { src: `- Mark McGwire\r - Sammy Sosa\r - Ken Griffey\r`, tgt: [['Mark McGwire', 'Sammy Sosa', 'Ken Griffey']] }, 'Example 2.2. Mapping Scalars to Scalars': { src: `hr: 65 # Home runs\r avg: 0.278 # Batting average\r rbi: 147 # Runs Batted In`, tgt: [ { hr: 65, // ' Home runs' avg: 0.278, // ' Batting average' rbi: 147 // ' Runs Batted In' } ] }, 'Example 2.3. Mapping Scalars to Sequences': { src: `american:\r - Boston Red Sox\r - Detroit Tigers\r - New York Yankees\r national:\r - New York Mets\r - Chicago Cubs\r - Atlanta Braves`, tgt: [ { american: ['Boston Red Sox', 'Detroit Tigers', 'New York Yankees'], national: ['New York Mets', 'Chicago Cubs', 'Atlanta Braves'] } ] }, 'Example 2.4. Sequence of Mappings': { src: `- name: Mark McGwire hr: 65 avg: 0.278 - name: Sammy Sosa hr: 63 avg: 0.288`, tgt: [ [ { name: 'Mark McGwire', hr: 65, avg: 0.278 }, { name: 'Sammy Sosa', hr: 63, avg: 0.288 } ] ] }, 'Example 2.5. Sequence of Sequences': { src: `- [name , hr, avg ] - [Mark McGwire, 65, 0.278] - [Sammy Sosa , 63, 0.288]`, tgt: [ [ ['name', 'hr', 'avg'], ['Mark McGwire', 65, 0.278], ['Sammy Sosa', 63, 0.288] ] ] }, 'Example 2.6. Mapping of Mappings': { src: `Mark McGwire: {hr: 65, avg: 0.278} Sammy Sosa: { hr: 63, avg: 0.288 }`, tgt: [ { 'Mark McGwire': { hr: 65, avg: 0.278 }, 'Sammy Sosa': { hr: 63, avg: 0.288 } } ] } }, '2.2. Structures': { 'Example 2.7. Two Documents in a Stream': { src: `# Ranking of 1998 home runs --- - Mark McGwire - Sammy Sosa - Ken Griffey # Team ranking --- - Chicago Cubs - St Louis Cardinals`, tgt: [ // ' Ranking of 1998 home runs' ['Mark McGwire', 'Sammy Sosa', 'Ken Griffey'], // ' Team ranking' ['Chicago Cubs', 'St Louis Cardinals'] ] }, 'Example 2.8. Play by Play Feed': { src: `--- time: 20:03:20 player: Sammy Sosa action: strike (miss) ... --- time: 20:03:47 player: Sammy Sosa action: grand slam ...`, tgt: [ { time: '20:03:20', player: 'Sammy Sosa', action: 'strike (miss)' }, { time: '20:03:47', player: 'Sammy Sosa', action: 'grand slam' } ] }, 'Example 2.9. Single Document with Two Comments': { src: `--- hr: # 1998 hr ranking - Mark McGwire - Sammy Sosa rbi: # 1998 rbi ranking - Sammy Sosa - Ken Griffey`, tgt: [ { hr: [ // ' 1998 hr ranking' 'Mark McGwire', 'Sammy Sosa' ], rbi: [ // ' 1998 rbi ranking' 'Sammy Sosa', 'Ken Griffey' ] } ] }, 'Example 2.10. Node for “Sammy Sosa” appears twice in this document': { src: `--- hr: - Mark McGwire # Following node labeled SS - &SS Sammy Sosa rbi: - *SS # Subsequent occurrence - Ken Griffey`, tgt: [ { hr: ['Mark McGwire', /* Following node labeled SS */ 'Sammy Sosa'], rbi: ['Sammy Sosa' /* Subsequent occurrence */, 'Ken Griffey'] } ] }, 'Example 2.11. Mapping between Sequences': { src: `? - Detroit Tigers - Chicago cubs : - 2001-07-23 ? [ New York Yankees, Atlanta Braves ] : [ 2001-07-02, 2001-08-12, 2001-08-14 ]`, tgt: [ { '[ Detroit Tigers, Chicago cubs ]': ['2001-07-23'], '[ New York Yankees, Atlanta Braves ]': [ '2001-07-02', '2001-08-12', '2001-08-14' ] } ], warnings: [[collectionKeyWarning]] }, 'Example 2.12. Compact Nested Mapping': { src: `--- # Products purchased - item : Super Hoop quantity: 1 - item : Basketball quantity: 4 - item : Big Shoes quantity: 1`, tgt: [ [ // Products purchased { item: 'Super Hoop', quantity: 1 }, { item: 'Basketball', quantity: 4 }, { item: 'Big Shoes', quantity: 1 } ] ] } }, '2.3. Scalars': { 'Example 2.13. In literals, newlines are preserved': { src: `# ASCII Art --- | \\//||\\/|| // || ||__`, tgt: ['\\//||\\/||\n' + '// || ||__\n'] }, 'Example 2.14. In the folded scalars, newlines become spaces': { src: `--- > Mark McGwire's year was crippled by a knee injury.`, tgt: ["Mark McGwire's year was crippled by a knee injury.\n"] }, 'Example 2.15. Folded newlines are preserved for "more indented" and blank lines': { src: `> Sammy Sosa completed another fine season with great stats. 63 Home Runs 0.288 Batting Average What a year!`, tgt: [ `Sammy Sosa completed another fine season with great stats. 63 Home Runs 0.288 Batting Average What a year!\n` ] }, 'Example 2.16. Indentation determines scope': { src: `name: Mark McGwire accomplishment: > Mark set a major league home run record in 1998. stats: | 65 Home Runs 0.278 Batting Average`, tgt: [ { name: 'Mark McGwire', accomplishment: 'Mark set a major league home run record in 1998.\n', stats: '65 Home Runs\n0.278 Batting Average\n' } ] }, 'Example 2.17. Quoted Scalars': { src: `unicode: "Sosa did fine.\\u263A" control: "\\b1998\\t1999\\t2000\\n" hex esc: "\\x0d\\x0a is \\r\\n" single: '"Howdy!" he cried.' quoted: ' # Not a ''comment''.' tie-fighter: '|\\-*-/|'`, tgt: [ { unicode: 'Sosa did fine.☺', control: '\b1998\t1999\t2000\n', 'hex esc': '\r\n is \r\n', single: '"Howdy!" he cried.', quoted: " # Not a 'comment'.", 'tie-fighter': '|\\-*-/|' } ] }, 'Example 2.18. Multi-line Flow Scalars': { src: `plain: This unquoted scalar spans many lines. quoted: "So does this quoted scalar.\\n"`, tgt: [ { plain: 'This unquoted scalar spans many lines.', quoted: 'So does this quoted scalar.\n' } ] } }, '2.4. Tags': { 'Example 2.19. Integers': { src: `canonical: 12345 decimal: +12345 octal: 0o14 hexadecimal: 0xC`, tgt: [ { canonical: 12345, decimal: 12345, octal: 12, hexadecimal: 12 } ] }, 'Example 2.20. Floating Point': { src: `canonical: 1.23015e+3 exponential: 12.3015e+02 fixed: 1230.15 negative infinity: -.inf not a number: .NaN`, tgt: [ { canonical: 1230.15, exponential: 1230.15, fixed: 1230.15, 'negative infinity': -Infinity, 'not a number': NaN } ] }, 'Example 2.21. Miscellaneous': { src: `null: booleans: [ true, false ] string: '012345'`, tgt: [ { '': null, booleans: [true, false], string: '012345' } ] }, 'Example 2.22. Timestamps': { src: `canonical: 2001-12-15T02:59:43.1Z iso8601: 2001-12-14t21:59:43.10-05:00 spaced: 2001-12-14 21:59:43.10 -5 date: 2001-12-14`, tgt: [ { canonical: '2001-12-15T02:59:43.1Z', iso8601: '2001-12-14t21:59:43.10-05:00', spaced: '2001-12-14 21:59:43.10 -5', date: '2001-12-14' } ], special: src => { const obj = YAML.parse(src, { schema: 'yaml-1.1' }) expect(Object.keys(obj)).toHaveLength(4) ;[('canonical', 'iso8601', 'spaced', 'date')].forEach(key => { const date = obj[key] expect(date).toBeInstanceOf(Date) expect(date.getFullYear()).toBe(2001) expect(date.getMonth()).toBe(11) }) } }, 'Example 2.23. Various Explicit Tags': { src: `--- not-date: !!str 2002-04-28 picture: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs= application specific tag: !something | The semantics of the tag above may be different for different documents.`, tgt: [ { 'not-date': '2002-04-28', picture: 'R0lGODlhDAAMAIQAAP//9/X\n17unp5WZmZgAAAOfn515eXv\nPz7Y6OjuDg4J+fn5OTk6enp\n56enmleECcgggoBADs=\n', 'application specific tag': 'The semantics of the tag\nabove may be different for\ndifferent documents.\n' } ], warnings: [ [ 'The tag tag:yaml.org,2002:binary is unavailable, falling back to tag:yaml.org,2002:str', 'The tag !something is unavailable, falling back to tag:yaml.org,2002:str' ] ], special: src => { const doc = YAML.parseDocument(src, { schema: 'yaml-1.1' }) const data = doc.contents.items[1].value.value expect(data).toBeInstanceOf(Uint8Array) expect(data.byteLength).toBe(65) } }, 'Example 2.24. Global Tags': { src: `%TAG ! tag:clarkevans.com,2002: --- !shape # Use the ! handle for presenting # tag:clarkevans.com,2002:circle - !circle center: &ORIGIN {x: 73, y: 129} radius: 7 - !line start: *ORIGIN finish: { x: 89, y: 102 } - !label start: *ORIGIN color: 0xFFEEBB text: Pretty vector drawing.`, tgt: [ [ { center: { x: 73, y: 129 }, radius: 7 }, { start: { x: 73, y: 129 }, finish: { x: 89, y: 102 } }, { start: { x: 73, y: 129 }, color: 16772795, text: 'Pretty vector drawing.' } ] ], warnings: [ [ 'The tag tag:clarkevans.com,2002:shape is unavailable, falling back to tag:yaml.org,2002:seq', 'The tag tag:clarkevans.com,2002:circle is unavailable, falling back to tag:yaml.org,2002:map', 'The tag tag:clarkevans.com,2002:line is unavailable, falling back to tag:yaml.org,2002:map', 'The tag tag:clarkevans.com,2002:label is unavailable, falling back to tag:yaml.org,2002:map' ] ] }, 'Example 2.25. Unordered Sets': { src: `# Sets are represented as a # Mapping where each key is # associated with a null value --- !!set ? Mark McGwire ? Sammy Sosa ? Ken Griff`, tgt: [ { 'Mark McGwire': null, 'Sammy Sosa': null, 'Ken Griff': null } ], warnings: [ [ 'The tag tag:yaml.org,2002:set is unavailable, falling back to tag:yaml.org,2002:map' ] ] }, 'Example 2.26. Ordered Mappings': { src: `# Ordered maps are represented as # A sequence of mappings, with # each mapping having one key --- !!omap - Mark McGwire: 65 - Sammy Sosa: 63 - Ken Griffy: 58\n\n`, tgt: [ [{ 'Mark McGwire': 65 }, { 'Sammy Sosa': 63 }, { 'Ken Griffy': 58 }] ], warnings: [ [ 'The tag tag:yaml.org,2002:omap is unavailable, falling back to tag:yaml.org,2002:seq' ] ] } }, '2.5. Full Length Example': { 'Example 2.27. Invoice': { src: `--- ! invoice: 34843 date : 2001-01-23 bill-to: &id001 given : Chris family : Dumars address: lines: | 458 Walkman Dr. Suite #292 city : Royal Oak state : MI postal : 48046 ship-to: *id001 product: - sku : BL394D quantity : 4 description : Basketball price : 450.00 - sku : BL4438H quantity : 1 description : Super Hoop price : 2392.00 tax : 251.42 total: 4443.52 comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.`, tgt: [ { invoice: 34843, date: '2001-01-23', 'bill-to': { given: 'Chris', family: 'Dumars', address: { lines: '458 Walkman Dr.\nSuite #292\n', city: 'Royal Oak', state: 'MI', postal: 48046 } }, 'ship-to': { given: 'Chris', family: 'Dumars', address: { lines: '458 Walkman Dr.\nSuite #292\n', city: 'Royal Oak', state: 'MI', postal: 48046 } }, product: [ { sku: 'BL394D', quantity: 4, description: 'Basketball', price: 450 }, { sku: 'BL4438H', quantity: 1, description: 'Super Hoop', price: 2392 } ], tax: 251.42, total: 4443.52, comments: 'Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.' } ], warnings: [ [ 'The tag tag:clarkevans.com,2002:invoice is unavailable, falling back to tag:yaml.org,2002:map' ] ] }, 'Example 2.28. Log File': { src: `--- Time: 2001-11-23 15:01:42 -5 User: ed Warning: This is an error message for the log file --- Time: 2001-11-23 15:02:31 -5 User: ed Warning: A slightly different error message. --- Date: 2001-11-23 15:03:17 -5 User: ed Fatal: Unknown variable "bar" Stack: - file: TopClass.py line: 23 code: | x = MoreObject("345\\n") - file: MoreClass.py line: 58 code: |- foo = bar\n`, tgt: [ { Time: '2001-11-23 15:01:42 -5', User: 'ed', Warning: 'This is an error message for the log file' }, { Time: '2001-11-23 15:02:31 -5', User: 'ed', Warning: 'A slightly different error message.' }, { Date: '2001-11-23 15:03:17 -5', User: 'ed', Fatal: 'Unknown variable "bar"', Stack: [ { file: 'TopClass.py', line: 23, code: 'x = MoreObject("345\\n")\n' }, { file: 'MoreClass.py', line: 58, code: 'foo = bar' } ] } ] } }, '5.3. Indicator Characters': { 'Example 5.3. Block Structure Indicators': { src: `sequence: - one - two mapping: ? sky : blue sea : green`, tgt: [ { sequence: ['one', 'two'], mapping: { sky: 'blue', sea: 'green' } } ] }, 'Example 5.4. Flow Collection Indicators': { src: `sequence: [ one, two, ] mapping: { sky: blue, sea: green }`, tgt: [ { sequence: ['one', 'two'], mapping: { sky: 'blue', sea: 'green' } } ] }, 'Example 5.5. Comment Indicator': { src: `# Comment only.`, tgt: [null] }, 'Example 5.6. Node Property Indicators': { src: `anchored: !local &anchor value alias: *anchor`, tgt: [{ anchored: 'value', alias: 'value' }], warnings: [ ['The tag !local is unavailable, falling back to tag:yaml.org,2002:str'] ], special: src => { const tag = { tag: '!local', resolve: (doc, node) => 'local:' + node.strValue } const res = YAML.parse(src, { customTags: [tag] }) expect(res).toMatchObject({ anchored: 'local:value', alias: 'local:value' }) } }, 'Example 5.7. Block Scalar Indicators': { src: `literal: | some text folded: > some text `, tgt: [ { literal: 'some\ntext\n', folded: 'some text\n' } ] }, 'Example 5.8. Quoted Scalar Indicators': { src: `single: 'text' double: "text"`, tgt: [{ single: 'text', double: 'text' }] }, 'Example 5.9. Directive Indicator': { src: `%YAML 1.2 --- text`, tgt: ['text'], special: src => { const doc = YAML.parseDocument(src) expect(doc.version).toBe('1.2') } }, 'Example 5.10. Invalid use of Reserved Indicators': { src: `commercial-at: @text grave-accent: \`text`, tgt: [{ 'commercial-at': '@text', 'grave-accent': '`text' }], errors: [ [ 'Plain value cannot start with reserved character @', 'Plain value cannot start with reserved character `' ] ] } }, '5.5. White Space Characters': { 'Example 5.12. Tabs and Spaces': { src: `# Tabs and spaces quoted: "Quoted \t" block:\t| void main() { \tprintf("Hello, world!\\n"); }`, tgt: [ { quoted: 'Quoted \t', block: 'void main() {\n\tprintf("Hello, world!\\n");\n}\n' } ] } }, '5.7. Escaped Characters': { 'Example 5.13. Escaped Characters': { src: `"Fun with \\\\ \\" \\a \\b \\e \\f \\ \\n \\r \\t \\v \\0 \\ \\ \\_ \\N \\L \\P \\ \\x41 \\u0041 \\U00000041"`, tgt: [ 'Fun with \x5C \x22 \x07 \x08 \x1B \x0C \x0A \x0D \x09 \x0B \x00 \x20 \xA0 \x85 \u2028 \u2029 A A A' ] }, 'Example 5.14. Invalid Escaped Characters': { src: `Bad escapes: "\\c \\xq-"`, tgt: [{ 'Bad escapes': '\\c \\xq-' }], errors: [['Invalid escape sequence \\c', 'Invalid escape sequence \\xq-']] } }, '6.1. Indentation Spaces': { 'Example 6.1. Indentation Spaces': { src: ` # Leading comment line spaces are # neither content nor indentation. Not indented: By one space: | By four spaces Flow style: [ # Leading spaces By two, # in flow style Also by two, # are neither \tStill by two # content nor ] # indentation.`, tgt: [ { 'Not indented': { 'By one space': 'By four\n spaces\n', 'Flow style': ['By two', 'Also by two', 'Still by two'] } } ] }, 'Example 6.2. Indentation Indicators': { src: `? a : -\tb - -\tc - d`, tgt: [{ a: ['b', ['c', 'd']] }] } }, '6.2. Separation Spaces': { 'Example 6.3. Separation Spaces': { src: `- foo:\t bar - - baz -\tbaz`, tgt: [[{ foo: 'bar' }, ['baz', 'baz']]] } }, '6.3. Line Prefixes': { 'Example 6.4. Line Prefixes': { src: `plain: text lines quoted: "text \tlines" block: | text \tlines`, tgt: [ { plain: 'text lines', quoted: 'text lines', block: 'text\n \tlines\n' } ] } }, '6.4. Empty Lines': { 'Example 6.5. Empty Lines': { src: `Folding: "Empty line \t as a line feed" Chomping: | Clipped empty lines `, tgt: [ { Folding: 'Empty line\nas a line feed', Chomping: 'Clipped empty lines\n' } ] } }, '6.5. Line Folding': { 'Example 6.6. Line Folding': { src: `>- trimmed ·· · ··as ··space`.replace(/·/g, ' '), tgt: ['trimmed\n\n\nas space'] }, 'Example 6.7. Block Folding': { src: `> ··foo· · ··\t·bar ··baz\n`.replace(/·/g, ' '), tgt: ['foo \n\n\t bar\n\nbaz\n'] }, 'Example 6.8. Flow Folding': { src: `" foo\t \t \t bar baz "`, tgt: [' foo\nbar\nbaz '] } }, '6.6. Comments': { 'Example 6.9. Separated Comment': { src: `key: # Comment value`, tgt: [{ key: 'value' }] }, 'Example 6.10. Comment Lines': { src: ` # Comment \n\n`, tgt: [null] }, 'Example 6.11. Multi-Line Comments': { src: `key: # Comment # lines value\n`, tgt: [{ key: 'value' }] } }, '6.7. Separation Lines': { 'Example 6.12. Separation Spaces': { src: `{ first: Sammy, last: Sosa }: # Statistics: hr: # Home runs 65 avg: # Average 0.278`, tgt: [{ '{ first: Sammy, last: Sosa }': { hr: 65, avg: 0.278 } }], warnings: [[collectionKeyWarning]] } }, '6.8. Directives': { 'Example 6.13. Reserved Directives': { src: `%FOO bar baz # Should be ignored # with a warning. --- "foo"`, tgt: ['foo'], warnings: [['YAML only supports %TAG and %YAML directives, and not %FOO']] } }, '6.8.1. “YAML” Directives': { 'Example 6.14. “YAML” directive': { src: `%YAML 1.3 # Attempt parsing # with a warning --- "foo"`, tgt: ['foo'], warnings: [['Document will be parsed as YAML 1.2 rather than YAML 1.3']], special: src => { const doc = YAML.parseDocument(src) expect(doc.version).toBe('1.3') } }, 'Example 6.15. Invalid Repeated YAML directive': { src: `%YAML 1.2 %YAML 1.1 --- foo`, tgt: ['foo'], errors: [ ['The %YAML directive must only be given at most once per document.'] ], special: src => { const doc = YAML.parseDocument(src) expect(doc.version).toBe('1.1') } } }, '6.8.2. “TAG” Directives': { 'Example 6.16. “TAG” directive': { src: `%TAG !yaml! tag:yaml.org,2002: --- !yaml!str "foo"`, tgt: ['foo'] }, 'Example 6.17. Invalid Repeated TAG directive': { src: `%TAG ! !foo %TAG ! !foo --- bar`, tgt: ['bar'], errors: [ [ 'The %TAG directive must only be given at most once per handle in the same document.' ] ], special: src => { const doc = YAML.parseDocument(src) expect(doc.tagPrefixes).toMatchObject([{ handle: '!', prefix: '!foo' }]) } }, 'Example 6.18. Primary Tag Handle': { src: `# Private !foo "bar" ... # Global %TAG ! tag:example.com,2000:app/ --- !foo "bar"`, tgt: ['bar', 'bar'], warnings: [ ['The tag !foo is unavailable, falling back to tag:yaml.org,2002:str'], [ 'The tag tag:example.com,2000:app/foo is unavailable, falling back to tag:yaml.org,2002:str' ] ], special: src => { const customTags = [ { tag: '!foo', resolve: () => 'private' }, { tag: 'tag:example.com,2000:app/foo', resolve: () => 'global' } ] const docs = YAML.parseAllDocuments(src, { customTags }) expect(docs.map(d => d.toJSON())).toMatchObject(['private', 'global']) } }, 'Example 6.19. Secondary Tag Handle': { src: `%TAG !! tag:example.com,2000:app/ --- !!int 1 - 3 # Interval, not integer`, tgt: ['1 - 3'], warnings: [ [ 'The tag tag:example.com,2000:app/int is unavailable, falling back to tag:yaml.org,2002:str' ] ], special: src => { const tag = { tag: 'tag:example.com,2000:app/int', resolve: () => 'interval' } const res = YAML.parse(src, { customTags: [tag] }) expect(res).toBe('interval') } }, 'Example 6.20. Tag Handles': { src: `%TAG !e! tag:example.com,2000:app/ --- !e!foo "bar"`, tgt: ['bar'], warnings: [ [ 'The tag tag:example.com,2000:app/foo is unavailable, falling back to tag:yaml.org,2002:str' ] ], special: src => { const tag = { tag: 'tag:example.com,2000:app/foo', resolve: (doc, node) => 'foo' + node.strValue } const res = YAML.parse(src, { customTags: [tag] }) expect(res).toBe('foobar') } }, 'Example 6.21. Local Tag Prefix': { src: `%TAG !m! !my- --- # Bulb here !m!light fluorescent ... %TAG !m! !my- --- # Color here !m!light green`, tgt: ['fluorescent', 'green'], warnings: [ [ 'The tag !my-light is unavailable, falling back to tag:yaml.org,2002:str' ], [ 'The tag !my-light is unavailable, falling back to tag:yaml.org,2002:str' ] ], special: src => { const tag = { tag: '!my-light', resolve: (doc, node) => 'light:' + node.strValue } const docs = YAML.parseAllDocuments(src, { customTags: [tag] }) expect(docs.map(d => d.toJSON())).toMatchObject([ 'light:fluorescent', 'light:green' ]) } }, 'Example 6.22. Global Tag Prefix': { src: `%TAG !e! tag:example.com,2000:app/ --- - !e!foo "bar"`, tgt: [['bar']], warnings: [ [ 'The tag tag:example.com,2000:app/foo is unavailable, falling back to tag:yaml.org,2002:str' ] ], special: src => { const tag = { tag: 'tag:example.com,2000:app/foo', resolve: (doc, node) => 'foo' + node.strValue } const res = YAML.parse(src, { customTags: [tag] }) expect(res).toMatchObject(['foobar']) } } }, '6.9. Node Properties': { 'Example 6.23. Node Properties': { src: `!!str &a1 "foo": !!str bar &a2 baz : *a1`, tgt: [{ foo: 'bar', baz: 'foo' }] }, 'Example 6.24. Verbatim Tags': { src: `! foo : ! baz`, tgt: [{ foo: 'baz' }], warnings: [ ['The tag !bar is unavailable, falling back to tag:yaml.org,2002:str'] ], special: src => { const tag = { tag: '!bar', resolve: (doc, node) => 'bar' + node.strValue } const res = YAML.parse(src, { customTags: [tag] }) expect(res).toMatchObject({ foo: 'barbaz' }) } }, 'Example 6.25. Invalid Verbatim Tags': { src: `- ! foo - !<$:?> bar`, tgt: [['foo', 'bar']], errors: [["Verbatim tags aren't resolved, so ! is invalid."]], warnings: [ ['The tag $:? is unavailable, falling back to tag:yaml.org,2002:str'] ] }, 'Example 6.26. Tag Shorthands': { src: `%TAG !e! tag:example.com,2000:app/ --- - !local foo - !!str bar - !e!tag%21 baz`, tgt: [['foo', 'bar', 'baz']], warnings: [ [ 'The tag !local is unavailable, falling back to tag:yaml.org,2002:str', 'The tag tag:example.com,2000:app/tag! is unavailable, falling back to tag:yaml.org,2002:str' ] ], special: src => { const customTags = [ { tag: '!local', resolve: (doc, node) => 'local:' + node.strValue }, { tag: 'tag:example.com,2000:app/tag!', resolve: (doc, node) => 'tag!' + node.strValue } ] const res = YAML.parse(src, { customTags }) expect(res).toMatchObject(['local:foo', 'bar', 'tag!baz']) } }, 'Example 6.27. Invalid Tag Shorthands': { src: `%TAG !e! tag:example,2000:app/ --- - !e! foo - !h!bar baz`, tgt: [['foo', 'baz']], errors: [ [ 'The !e! tag has no suffix.', 'The !h! tag handle is non-default and was not declared.' ] ] }, 'Example 6.28. Non-Specific Tags': { src: `# Assuming conventional resolution: - "12" - 12 - ! 12`, tgt: [['12', 12, '12']] }, 'Example 6.29. Node Anchors': { src: `First occurrence: &anchor Value Second occurrence: *anchor`, tgt: [ { 'First occurrence': 'Value', 'Second occurrence': 'Value' } ] } }, '7.1. Alias Nodes': { 'Example 7.1. Alias Nodes': { src: `First occurrence: &anchor Foo Second occurrence: *anchor Override anchor: &anchor Bar Reuse anchor: *anchor`, tgt: [ { 'First occurrence': 'Foo', 'Second occurrence': 'Foo', 'Override anchor': 'Bar', 'Reuse anchor': 'Bar' } ] } }, '7.2. Empty Nodes': { 'Example 7.2. Empty Content': { src: `{ foo : !!str, !!str : bar, }`, tgt: [{ foo: '', '': 'bar' }] }, 'Example 7.3. Completely Empty Flow Nodes': { src: `{ ? foo :, : bar, }`, tgt: [{ foo: null, '': 'bar' }] } }, '7.3.1. Double-Quoted Style': { 'Example 7.4. Double Quoted Implicit Keys': { src: `"implicit block key" : [ "implicit flow key" : value, ]`, tgt: [{ 'implicit block key': [{ 'implicit flow key': 'value' }] }] }, 'Example 7.5. Double Quoted Line Breaks': { src: `"folded to a space,\t to a line feed, or \t\\ \\ \tnon-content"`, tgt: ['folded to a space,\nto a line feed, or \t \tnon-content'] }, 'Example 7.6. Double Quoted Lines': { src: `" 1st non-empty 2nd non-empty \t3rd non-empty "`, tgt: [' 1st non-empty\n2nd non-empty 3rd non-empty '] } }, '7.3.2. Single-Quoted Style': { 'Example 7.7. Single Quoted Characters': { src: ` 'here''s to "quotes"'`, tgt: ['here\'s to "quotes"'] }, 'Example 7.8. Single Quoted Implicit Keys': { src: `'implicit block key' : [ 'implicit flow key' : value, ]`, tgt: [{ 'implicit block key': [{ 'implicit flow key': 'value' }] }] }, 'Example 7.9. Single Quoted Lines': { src: `' 1st non-empty 2nd non-empty\t \t3rd non-empty '`, tgt: [' 1st non-empty\n2nd non-empty 3rd non-empty '] } }, '7.3.3. Plain Style': { 'Example 7.10. Plain Characters': { src: `# Outside flow collection: - ::vector - ": - ()" - Up, up, and away! - -123 - http://example.com/foo#bar # Inside flow collection: - [ ::vector, ": - ()", "Up, up and away!", -123, http://example.com/foo#bar ]`, tgt: [ [ '::vector', ': - ()', 'Up, up, and away!', -123, 'http://example.com/foo#bar', [ '::vector', ': - ()', 'Up, up and away!', -123, 'http://example.com/foo#bar' ] ] ] }, 'Example 7.11. Plain Implicit Keys': { src: `implicit block key : [ implicit flow key : value, ]`, tgt: [{ 'implicit block key': [{ 'implicit flow key': 'value' }] }] }, 'Example 7.12. Plain Lines': { src: `1st non-empty 2nd non-empty \t3rd non-empty`, tgt: ['1st non-empty\n2nd non-empty 3rd non-empty'] } }, '7.4.1. Flow Sequences': { 'Example 7.13. Flow Sequence': { src: `- [ one, two, ] - [three ,four]`, tgt: [ [ ['one', 'two'], ['three', 'four'] ] ] }, 'Example 7.14. Flow Sequence Entries': { src: `[ "double quoted", 'single quoted', plain text, [ nested ], single: pair, ]`, tgt: [ [ 'double quoted', 'single quoted', 'plain text', ['nested'], { single: 'pair' } ] ] } }, '7.4.2. Flow Mappings': { 'Example 7.15. Flow Mappings': { src: `- { one : two , three: four , } - {five: six,seven : eight}`, tgt: [ [ { one: 'two', three: 'four' }, { five: 'six', seven: 'eight' } ] ] }, 'Example 7.16. Flow Mapping Entries': { src: `{ ? explicit: entry, implicit: entry, ? }`, tgt: [{ explicit: 'entry', implicit: 'entry', '': null }] }, 'Example 7.17. Flow Mapping Separate Values': { src: `{ unquoted : "separate", http://foo.com, omitted value:, : omitted key, }`, tgt: [ { unquoted: 'separate', 'http://foo.com': null, 'omitted value': null, '': 'omitted key' } ] }, 'Example 7.18. Flow Mapping Adjacent Values': { src: `{ "adjacent":value, "readable": value, "empty": }`, tgt: [{ adjacent: 'value', readable: 'value', empty: null }] }, 'Example 7.19. Single Pair Flow Mappings': { src: `[ foo: bar ]`, tgt: [[{ foo: 'bar' }]] }, 'Example 7.20. Single Pair Explicit Entry': { src: `[ ? foo bar : baz ]`, tgt: [[{ 'foo bar': 'baz' }]] }, 'Example 7.21. Single Pair Implicit Entries': { src: `- [ YAML : separate ] - [ : empty key entry ] - [ {JSON: like}:adjacent ]`, tgt: [ [ [{ YAML: 'separate' }], [{ '': 'empty key entry' }], [{ '{ JSON: like }': 'adjacent' }] ] ], warnings: [[collectionKeyWarning]] }, 'Example 7.22. Invalid Implicit Keys': { src: `[ foo bar: invalid, "foo ${'x'.repeat(1024)} bar": invalid ]`, tgt: [ [ { 'foo bar': 'invalid' }, { 'foo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx bar': 'invalid' } ] ], errors: [ [ 'Implicit keys of flow sequence pairs need to be on a single line', 'The "foo xxxx...xxxx bar" key is too long' ] ] } }, '7.5. Flow Nodes': { 'Example 7.23. Flow Content': { src: `- [ a, b ] - { a: b } - "a" - 'b' - c`, tgt: [[['a', 'b'], { a: 'b' }, 'a', 'b', 'c']] }, 'Example 7.24. Flow Nodes': { src: `- !!str "a" - 'b' - &anchor "c" - *anchor - !!str`, tgt: [['a', 'b', 'c', 'c', '']] } }, '8.1.1. Block Scalar Headers': { 'Example 8.1. Block Scalar Header': { src: `- | # Empty header literal - >1 # Indentation indicator folded - |+ # Chomping indicator keep - >1- # Both indicators strip`, tgt: [['literal\n', ' folded\n', 'keep\n\n', ' strip']] }, 'Example 8.2. Block Indentation Indicator': { src: `- | ·detected - > · ·· ··# detected - |1 ··explicit - > ·\t ·detected`.replace(/·/g, ' '), tgt: [['detected\n', '\n\n# detected\n', ' explicit\n', '\t\ndetected\n']] }, 'Example 8.3. Invalid Block Scalar Indentation Indicators': { src: `- | ·· ·text --- - > ··text ·text --- - |2 ·text`.replace(/·/g, ' '), tgt: [[' \ntext\n'], ['text text\n'], ['text\n']], errors: [ [ 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator' ], ['Block scalars must not be less indented than their first line'], [ 'Block scalars must not be less indented than their explicit indentation indicator' ] ] }, 'Example 8.4. Chomping Final Line Break': { src: `strip: |- text clip: | text keep: |+ text\n`, tgt: [{ strip: 'text', clip: 'text\n', keep: 'text\n' }] }, 'Example 8.5. Chomping Trailing Lines': { src: ` # Strip # Comments: strip: |- # text # Clip # comments: clip: | # text # Keep # comments: keep: |+ # text # Trail # comments.`, tgt: [{ strip: '# text', clip: '# text\n', keep: '# text\n\n' }] }, 'Example 8.6. Empty Scalar Chomping': { src: `strip: >- clip: > keep: |+\n\n`, tgt: [{ strip: '', clip: '', keep: '\n' }] } }, '8.1.2. Literal Style': { 'Example 8.7. Literal Scalar': { src: `| literal \ttext\n\n`, tgt: ['literal\n\ttext\n'] }, 'Example 8.8. Literal Content': { src: `| · ·· ··literal ··· ·· ··text ·# Comment`.replace(/·/g, ' '), tgt: ['\n\nliteral\n \n\ntext\n'] } }, '8.1.3. Folded Style': { 'Example 8.9. Folded Scalar': { src: `> folded text\n\n`, tgt: ['folded text\n'] }, 'Example 8.10. Folded Lines': { src: `> folded line next line * bullet * list * lines last line # Comment`, tgt: [ ` folded line next line * bullet * list * lines last line ` ] } }, '8.2.1. Block Sequences': { 'Example 8.14. Block Sequence': { src: `block sequence: - one - two : three\n`, tgt: [{ 'block sequence': ['one', { two: 'three' }] }] }, 'Example 8.15. Block Sequence Entry Types': { src: `- # Empty - | block node - - one # Compact - two # sequence - one: two # Compact mapping`, tgt: [[null, 'block node\n', ['one', 'two'], { one: 'two' }]] } }, '8.2.2. Block Mappings': { 'Example 8.16. Block Mappings': { src: `block mapping: key: value\n`, tgt: [{ 'block mapping': { key: 'value' } }] }, 'Example 8.17. Explicit Block Mapping Entries': { src: `? explicit key # Empty value ? | block key : - one # Explicit compact - two # block value\n`, tgt: [ { 'explicit key': null, 'block key\n': ['one', 'two'] } ] }, 'Example 8.18. Implicit Block Mapping Entries': { src: `plain key: in-line value : # Both empty "quoted key": - entry`, tgt: [ { 'plain key': 'in-line value', '': null, 'quoted key': ['entry'] } ] }, 'Example 8.19. Compact Block Mappings': { src: `- sun: yellow - ? earth: blue : moon: white\n`, tgt: [[{ sun: 'yellow' }, { '{ earth: blue }': { moon: 'white' } }]], warnings: [[collectionKeyWarning]] } }, '8.2.3. Block Nodes': { 'Example 8.20. Block Types': { src: `- "flow in block" - > Block scalar - !!map # Block collection foo : bar\n`, tgt: [['flow in block', 'Block scalar\n', { foo: 'bar' }]] }, 'Example 8.21. Block Scalar Nodes': { src: `literal: |2 value folded: !foo >1 value`, tgt: [{ literal: 'value\n', folded: 'value\n' }], warnings: [ ['The tag !foo is unavailable, falling back to tag:yaml.org,2002:str'] ], special: src => { const tag = { tag: '!foo', resolve: (doc, node) => 'foo' + node.strValue } const res = YAML.parse(src, { customTags: [tag] }) expect(res).toMatchObject({ literal: 'value\n', folded: 'foovalue\n' }) } }, 'Example 8.22. Block Collection Nodes': { src: `sequence: !!seq - entry - !!seq - nested mapping: !!map foo: bar`, tgt: [ { sequence: ['entry', ['nested']], mapping: { foo: 'bar' } } ], special: src => { const doc = YAML.parseDocument(src) expect(doc.contents.tag).toBeUndefined() expect(doc.contents.items[0].value.tag).toBe('tag:yaml.org,2002:seq') expect(doc.contents.items[0].value.items[1].tag).toBe( 'tag:yaml.org,2002:seq' ) expect(doc.contents.items[1].value.tag).toBe('tag:yaml.org,2002:map') } } }, '9.1. Documents': { 'Example 9.1. Document Prefix': { src: `\u{FEFF}# Comment # lines Document`, tgt: ['Document'] }, 'Example 9.2. Document Markers': { src: `%YAML 1.2 --- Document ... # Suffix`, tgt: ['Document'], special: src => expect(YAML.parseDocument(src).version).toBe('1.2') }, 'Example 9.3. Bare Documents': { src: `Bare document ... # No document ... | %!PS-Adobe-2.0 # Not the first line`, tgt: ['Bare document', null, '%!PS-Adobe-2.0 # Not the first line\n'] }, 'Example 9.4. Explicit Documents': { src: `--- { matches % : 20 } ... --- # Empty ...`, tgt: [{ 'matches %': 20 }, null] }, 'Example 9.5. Directives Documents': { src: `%YAML 1.2 --- | %!PS-Adobe-2.0 ... %YAML 1.2 --- # Empty ...`, tgt: ['%!PS-Adobe-2.0\n', null], special: src => YAML.parseAllDocuments(src).forEach(doc => expect(doc.version).toBe('1.2') ) } }, '9.2. Streams': { 'Example 9.6. Stream': { src: `Document --- # Empty ... %YAML 1.2 --- matches %: 20`, tgt: ['Document', null, { 'matches %': 20 }], special: src => { const versions = YAML.parseAllDocuments(src).map(doc => doc.version) expect(versions).toMatchObject([null, null, '1.2']) } } } } let origFoldOptions beforeAll(() => { origFoldOptions = YAML.scalarOptions.str.fold YAML.scalarOptions.str.fold = { lineWidth: 20, minContentWidth: 0 } }) afterAll(() => { YAML.scalarOptions.str.fold = origFoldOptions }) for (const section in spec) { describe(section, () => { for (const name in spec[section]) { test(name, () => { const { src, tgt, errors, special, warnings } = spec[section][name] const documents = YAML.parseAllDocuments(src) const json = documents.map(doc => doc.toJSON()) const docErrors = documents.map(doc => doc.errors.map(err => err.message) ) trace: name, '\n' + JSON.stringify(json, null, ' '), { errors: docErrors } expect(json).toMatchObject(tgt) documents.forEach((doc, i) => { if (!errors || !errors[i]) expect(doc.errors).toHaveLength(0) else errors[i].forEach((err, j) => { expect(doc.errors[j]).toBeInstanceOf(YAMLError) expect(doc.errors[j].message).toBe(err) }) if (!warnings || !warnings[i]) expect(doc.warnings).toHaveLength(0) else warnings[i].forEach((err, j) => expect(doc.warnings[j].message).toBe(err) ) }) if (special) special(src) if (!errors) { const src2 = documents.map(doc => String(doc)).join('\n...\n') const documents2 = YAML.parseAllDocuments(src2) const json2 = documents2.map(doc => doc.toJSON()) trace: name, '\nIN\n' + src, '\nJSON\n' + JSON.stringify(json, null, ' '), '\n\nOUT\n' + src2, '\nOUT-JSON\n' + JSON.stringify(src2), '\nRE-JSON\n' + JSON.stringify(json2, null, ' ') expect(json2).toMatchObject(tgt) } }) } }) } yaml-1.10.2/tests/doc/anchors.js000066400000000000000000000223631402322402300164350ustar00rootroot00000000000000import YAML from '../../index.js' import { Merge, YAMLMap } from '../../types.js' test('basic', () => { const src = `- &a 1\n- *a\n` const doc = YAML.parseDocument(src) expect(doc.errors).toHaveLength(0) const { items } = doc.contents expect(items).toMatchObject([{ value: 1 }, { source: { value: 1 } }]) expect(items[1].source).toBe(items[0]) expect(String(doc)).toBe(src) }) test('re-defined anchor', () => { const src = '- &a 1\n- &a 2\n- *a\n' const doc = YAML.parseDocument(src) expect(doc.errors).toHaveLength(0) const { items } = doc.contents expect(items).toMatchObject([ { value: 1 }, { value: 2 }, { source: { value: 2 } } ]) expect(items[2].source).toBe(items[1]) expect(String(doc)).toBe('- &a1 1\n- &a 2\n- *a\n') }) test('circular reference', () => { const src = '&a [ 1, *a ]\n' const doc = YAML.parseDocument(src) expect(doc.errors).toHaveLength(0) expect(doc.warnings).toHaveLength(0) const { items } = doc.contents expect(items).toHaveLength(2) expect(items[1].source).toBe(doc.contents) const res = doc.toJSON() expect(res[1]).toBe(res) expect(String(doc)).toBe(src) }) describe('create', () => { test('doc.anchors.setAnchor', () => { const doc = YAML.parseDocument('[{ a: A }, { b: B }]') const [a, b] = doc.contents.items expect(doc.anchors.setAnchor(null, null)).toBe(null) expect(doc.anchors.setAnchor(a, 'XX')).toBe('XX') expect(doc.anchors.setAnchor(a, 'AA')).toBe('AA') expect(doc.anchors.setAnchor(a, 'AA')).toBe('AA') expect(doc.anchors.setAnchor(a)).toBe('AA') expect(doc.anchors.setAnchor(a.items[0].value)).toBe('a1') expect(doc.anchors.setAnchor(b.items[0].value)).toBe('a2') expect(doc.anchors.setAnchor(null, 'a1')).toBe('a1') expect(doc.anchors.getName(a)).toBe('AA') expect(doc.anchors.getNode('a2').value).toBe('B') expect(String(doc)).toBe('[ &AA { a: A }, { b: &a2 B } ]\n') expect(() => doc.anchors.setAnchor(a.items[0])).toThrow( 'Anchors may only be set for Scalar, Seq and Map nodes' ) expect(() => doc.anchors.setAnchor(a, 'A A')).toThrow( 'Anchor names must not contain whitespace or control characters' ) expect(doc.anchors.getNames()).toMatchObject(['AA', 'a1', 'a2']) }) test('doc.anchors.createAlias', () => { const doc = YAML.parseDocument('[{ a: A }, { b: B }]') const alias = doc.anchors.createAlias(doc.contents.items[0], 'AA') doc.contents.items.push(alias) expect(doc.toJSON()).toMatchObject([{ a: 'A' }, { b: 'B' }, { a: 'A' }]) expect(String(doc)).toMatch('[ &AA { a: A }, { b: B }, *AA ]\n') }) test('errors', () => { const doc = YAML.parseDocument('[{ a: A }, { b: B }]') const node = doc.contents.items[0] const alias = doc.anchors.createAlias(node, 'AA') doc.contents.items.unshift(alias) expect(() => String(doc)).toThrow('Alias node must be after source node') expect(() => { alias.tag = 'tag:yaml.org,2002:alias' }).toThrow('Alias nodes cannot have tags') }) }) describe('__proto__ as anchor name', () => { test('parse', () => { const src = `- &__proto__ 1\n- *__proto__\n` const doc = YAML.parseDocument(src) expect(doc.errors).toHaveLength(0) const { items } = doc.contents expect(items).toMatchObject([{ value: 1 }, { source: { value: 1 } }]) expect(items[1].source).toBe(items[0]) expect(String(doc)).toBe(src) }) test('create/stringify', () => { const doc = YAML.parseDocument('[{ a: A }, { b: B }]') const alias = doc.anchors.createAlias(doc.contents.items[0], '__proto__') doc.contents.items.push(alias) expect(doc.toJSON()).toMatchObject([{ a: 'A' }, { b: 'B' }, { a: 'A' }]) expect(String(doc)).toMatch( '[ &__proto__ { a: A }, { b: B }, *__proto__ ]\n' ) }) }) describe('merge <<', () => { const src = `--- - &CENTER { x: 1, y: 2 } - &LEFT { x: 0, y: 2 } - &BIG { r: 10 } - &SMALL { r: 1 } # All the following maps are equal: - # Explicit keys x: 1 y: 2 r: 10 label: center/big - # Merge one map << : *CENTER r: 10 label: center/big - # Merge multiple maps << : [ *CENTER, *BIG ] label: center/big - # Override << : [ *BIG, *LEFT, *SMALL ] x: 1 label: center/big` test('YAML.parse', () => { const res = YAML.parse(src, { merge: true }) expect(res).toHaveLength(8) for (let i = 4; i < res.length; ++i) { expect(res[i]).toMatchObject({ x: 1, y: 2, r: 10, label: 'center/big' }) } }) test('YAML.parse with merge:false', () => { const res = YAML.parse(src) expect(res).toHaveLength(8) for (let i = 5; i < res.length; ++i) { expect(res[i]).toHaveProperty('<<') } }) test('YAML.parseAllDocuments', () => { const doc = YAML.parseDocument(src, { merge: true }) expect(doc.contents.items).toHaveLength(8) expect(Object.keys(doc.anchors.map)).toMatchObject([ 'CENTER', 'LEFT', 'BIG', 'SMALL' ]) doc.contents.items.slice(5).forEach(({ items }) => { const merge = items[0] expect(merge).toBeInstanceOf(Merge) merge.value.items.forEach(({ source }) => { expect(source).toBeInstanceOf(YAMLMap) }) }) }) describe('doc.anchors.createMergePair', () => { test('simple case', () => { const doc = YAML.parseDocument('[{ a: A }, { b: B }]') const [a, b] = doc.contents.items const merge = doc.anchors.createMergePair(a) b.items.push(merge) expect(doc.toJSON()).toMatchObject([{ a: 'A' }, { a: 'A', b: 'B' }]) expect(String(doc)).toBe('[ &a1 { a: A }, { b: B, <<: *a1 } ]\n') }) test('merge pair of an alias', () => { const doc = YAML.parseDocument('[{ a: A }, { b: B }]') const [a, b] = doc.contents.items const alias = doc.anchors.createAlias(a, 'AA') const merge = doc.anchors.createMergePair(alias) b.items.push(merge) expect(doc.toJSON()).toMatchObject([{ a: 'A' }, { a: 'A', b: 'B' }]) expect(String(doc)).toBe('[ &AA { a: A }, { b: B, <<: *AA } ]\n') }) test('require map node', () => { const exp = 'Merge sources must be Map nodes or their Aliases' const doc = YAML.parseDocument('[{ a: A }, { b: B }]') const [a] = doc.contents.items const merge = doc.anchors.createMergePair(a) expect(() => doc.anchors.createMergePair(merge)).toThrow(exp) const alias = doc.anchors.createAlias(a.items[0].value) expect(() => doc.anchors.createMergePair(alias)).toThrow(exp) }) }) describe('merge multiple times', () => { const srcKeys = ` x: - &a k0: v1 k1: v1 - &b k1: v2 k2: v2 y: k0: v0 <<: *a <<: *b` const srcSeq = ` x: - &a k0: v1 k1: v1 - &b k1: v2 k2: v2 y: k0: v0 <<: [ *a, *b ]` const expObj = { x: [ { k0: 'v1', k1: 'v1' }, { k1: 'v2', k2: 'v2' } ], y: { k0: 'v0', k1: 'v1', k2: 'v2' } } const expMap = new Map([ [ 'x', [ new Map([ ['k0', 'v1'], ['k1', 'v1'] ]), new Map([ ['k1', 'v2'], ['k2', 'v2'] ]) ] ], [ 'y', new Map([ ['k0', 'v0'], ['k1', 'v1'], ['k2', 'v2'] ]) ] ]) test('multiple merge keys, masAsMap: false', () => { const res = YAML.parse(srcKeys, { merge: true }) expect(res).toEqual(expObj) }) test('multiple merge keys, masAsMap: true', () => { const res = YAML.parse(srcKeys, { merge: true, mapAsMap: true }) expect(res).toEqual(expMap) }) test('sequence of anchors, masAsMap: false', () => { const res = YAML.parse(srcSeq, { merge: true }) expect(res).toEqual(expObj) }) test('sequence of anchors, masAsMap: true', () => { const res = YAML.parse(srcSeq, { merge: true, mapAsMap: true }) expect(res).toEqual(expMap) }) }) test('do not throw error when key is null', () => { const src = ': 123' expect(() => YAML.parse(src, { merge: true })).not.toThrow() }) describe('parse errors', () => { test('non-alias merge value', () => { const src = '{ <<: A, B: b }' expect(() => YAML.parse(src, { merge: true })).toThrow( 'Merge nodes can only have Alias nodes as values' ) }) test('non-map alias', () => { const src = '- &A a\n- { <<: *A, B: b }' expect(() => YAML.parse(src, { merge: true })).toThrow( 'Merge nodes aliases can only point to maps' ) }) test('circular reference', () => { const src = '&A { <<: *A, B: b }\n' const doc = YAML.parseDocument(src, { merge: true }) expect(doc.errors).toHaveLength(0) expect(doc.warnings).toHaveLength(0) expect(() => doc.toJSON()).toThrow('Maximum call stack size exceeded') expect(String(doc)).toBe(src) }) }) describe('stringify', () => { test('example', () => { const doc = YAML.parseDocument(src, { merge: true }) expect(YAML.parse(String(doc), { merge: true })).toMatchObject([ { x: 1, y: 2 }, { x: 0, y: 2 }, { r: 10 }, { r: 1 }, { label: 'center/big', r: 10, x: 1, y: 2 }, { label: 'center/big', r: 10, x: 1, y: 2 }, { label: 'center/big', r: 10, x: 1, y: 2 }, { label: 'center/big', r: 10, x: 1, y: 2 } ]) }) }) }) yaml-1.10.2/tests/doc/collection-access.js000066400000000000000000000343611402322402300203730ustar00rootroot00000000000000import YAML from '../../index.js' import { Pair } from '../../types.js' describe('Map', () => { let map beforeEach(() => { map = YAML.createNode({ a: 1, b: { c: 3, d: 4 } }) expect(map.items).toMatchObject([ { key: { value: 'a' }, value: { value: 1 } }, { key: { value: 'b' }, value: { items: [ { key: { value: 'c' }, value: { value: 3 } }, { key: { value: 'd' }, value: { value: 4 } } ] } } ]) }) test('add', () => { map.add({ key: 'c', value: 'x' }) expect(map.get('c')).toBe('x') expect(() => map.add('a')).toThrow(/already set/) expect(() => map.add(new Pair('c', 'y'))).toThrow(/already set/) expect(map.items).toHaveLength(3) }) test('delete', () => { expect(map.delete('a')).toBe(true) expect(map.get('a')).toBeUndefined() expect(map.delete('c')).toBe(false) expect(map.get('b')).toMatchObject({ items: [{}, {}] }) expect(map.items).toHaveLength(1) }) test('get with value', () => { expect(map.get('a')).toBe(1) expect(map.get('a', true)).toMatchObject({ value: 1 }) expect(map.get('b').toJSON()).toMatchObject({ c: 3, d: 4 }) expect(map.get('c')).toBeUndefined() }) test('get with node', () => { expect(map.get(YAML.createNode('a'))).toBe(1) expect(map.get(YAML.createNode('a'), true)).toMatchObject({ value: 1 }) expect(map.get(YAML.createNode('b')).toJSON()).toMatchObject({ c: 3, d: 4 }) expect(map.get(YAML.createNode('c'))).toBeUndefined() }) test('has with value', () => { expect(map.has('a')).toBe(true) expect(map.has('b')).toBe(true) expect(map.has('c')).toBe(false) expect(map.has('')).toBe(false) expect(map.has()).toBe(false) }) test('has with node', () => { expect(map.has(YAML.createNode('a'))).toBe(true) expect(map.has(YAML.createNode('b'))).toBe(true) expect(map.has(YAML.createNode('c'))).toBe(false) expect(map.has(YAML.createNode())).toBe(false) }) test('set with value', () => { map.set('a', 2) expect(map.get('a')).toBe(2) expect(map.get('a', true)).toBe(2) map.set('b', 5) expect(map.get('b')).toBe(5) map.set('c', 6) expect(map.get('c')).toBe(6) expect(map.items).toHaveLength(3) }) test('set with node', () => { map.set(YAML.createNode('a'), 2) expect(map.get('a')).toBe(2) expect(map.get('a', true)).toBe(2) map.set(YAML.createNode('b'), 5) expect(map.get('b')).toBe(5) map.set(YAML.createNode('c'), 6) expect(map.get('c')).toBe(6) expect(map.items).toHaveLength(3) }) }) describe('Seq', () => { let seq beforeEach(() => { seq = YAML.createNode([1, [2, 3]]) expect(seq.items).toMatchObject([ { value: 1 }, { items: [{ value: 2 }, { value: 3 }] } ]) }) test('add', () => { seq.add('x') expect(seq.get(2)).toBe('x') seq.add(1) expect(seq.items).toHaveLength(4) }) test('delete', () => { expect(seq.delete(0)).toBe(true) expect(seq.delete(2)).toBe(false) expect(seq.delete('a')).toBe(false) expect(seq.get(0)).toMatchObject({ items: [{ value: 2 }, { value: 3 }] }) expect(seq.items).toHaveLength(1) }) test('get with value', () => { expect(seq.get(0)).toBe(1) expect(seq.get('0')).toBe(1) expect(seq.get(0, true)).toMatchObject({ value: 1 }) expect(seq.get(1).toJSON()).toMatchObject([2, 3]) expect(seq.get(2)).toBeUndefined() }) test('get with node', () => { expect(seq.get(YAML.createNode(0))).toBe(1) expect(seq.get(YAML.createNode('0'))).toBe(1) expect(seq.get(YAML.createNode(0), true)).toMatchObject({ value: 1 }) expect(seq.get(YAML.createNode(1)).toJSON()).toMatchObject([2, 3]) expect(seq.get(YAML.createNode(2))).toBeUndefined() }) test('has with value', () => { expect(seq.has(0)).toBe(true) expect(seq.has(1)).toBe(true) expect(seq.has(2)).toBe(false) expect(seq.has('0')).toBe(true) expect(seq.has('')).toBe(false) expect(seq.has()).toBe(false) }) test('has with node', () => { expect(seq.has(YAML.createNode(0))).toBe(true) expect(seq.has(YAML.createNode('0'))).toBe(true) expect(seq.has(YAML.createNode(2))).toBe(false) expect(seq.has(YAML.createNode(''))).toBe(false) expect(seq.has(YAML.createNode())).toBe(false) }) test('set with value', () => { seq.set(0, 2) expect(seq.get(0)).toBe(2) expect(seq.get(0, true)).toBe(2) seq.set('1', 5) expect(seq.get(1)).toBe(5) seq.set(2, 6) expect(seq.get(2)).toBe(6) expect(seq.items).toHaveLength(3) }) test('set with node', () => { seq.set(YAML.createNode(0), 2) expect(seq.get(0)).toBe(2) expect(seq.get(0, true)).toBe(2) seq.set(YAML.createNode('1'), 5) expect(seq.get(1)).toBe(5) seq.set(YAML.createNode(2), 6) expect(seq.get(2)).toBe(6) expect(seq.items).toHaveLength(3) }) }) describe('Set', () => { let doc beforeAll(() => { doc = new YAML.Document({ version: '1.1' }) doc.setSchema() }) let set beforeEach(() => { set = doc.schema.createNode([1, 2, 3], true, '!!set') expect(set.items).toMatchObject([ { key: { value: 1 }, value: { value: null } }, { key: { value: 2 }, value: { value: null } }, { key: { value: 3 }, value: { value: null } } ]) }) test('add', () => { set.add('x') expect(set.get('x')).toBe('x') set.add('x') const y0 = new Pair('y') set.add(y0) set.add(new Pair('y')) expect(set.get('y', true)).toBe(y0) expect(set.items).toHaveLength(5) }) test('get', () => { expect(set.get(1)).toBe(1) expect(set.get(1, true)).toMatchObject({ key: { value: 1 }, value: { value: null } }) expect(set.get(0)).toBeUndefined() expect(set.get('1')).toBeUndefined() }) test('set', () => { set.set(1, true) expect(set.get(1)).toBe(1) set.set(1, false) expect(set.get(1)).toBeUndefined() set.set(4, false) expect(set.get(4)).toBeUndefined() set.set(4, true) expect(set.get(4)).toBe(4) expect(set.get(4, true)).toMatchObject({ key: 4, value: null }) expect(set.items).toHaveLength(3) }) }) describe('OMap', () => { let doc beforeAll(() => { doc = new YAML.Document({ version: '1.1' }) doc.setSchema() }) let omap beforeEach(() => { omap = doc.schema.createNode( [{ a: 1 }, { b: { c: 3, d: 4 } }], true, '!!omap' ) expect(omap.items).toMatchObject([ { key: { value: 'a' }, value: { value: 1 } }, { key: { value: 'b' }, value: { items: [ { key: { value: 'c' }, value: { value: 3 } }, { key: { value: 'd' }, value: { value: 4 } } ] } } ]) }) test('add', () => { omap.add({ key: 'c', value: 'x' }) expect(omap.get('c')).toBe('x') expect(() => omap.add('a')).toThrow(/already set/) expect(() => omap.add(new Pair('c', 'y'))).toThrow(/already set/) expect(omap.items).toHaveLength(3) }) test('delete', () => { expect(omap.delete('a')).toBe(true) expect(omap.get('a')).toBeUndefined() expect(omap.delete('c')).toBe(false) expect(omap.get('b')).toMatchObject({ items: [{}, {}] }) expect(omap.items).toHaveLength(1) }) test('get', () => { expect(omap.get('a')).toBe(1) expect(omap.get('a', true)).toMatchObject({ value: 1 }) expect(omap.get('b').toJSON()).toMatchObject({ c: 3, d: 4 }) expect(omap.get('c')).toBeUndefined() }) test('has', () => { expect(omap.has('a')).toBe(true) expect(omap.has('b')).toBe(true) expect(omap.has('c')).toBe(false) expect(omap.has('')).toBe(false) expect(omap.has()).toBe(false) }) test('set', () => { omap.set('a', 2) expect(omap.get('a')).toBe(2) expect(omap.get('a', true)).toBe(2) omap.set('b', 5) expect(omap.get('b')).toBe(5) omap.set('c', 6) expect(omap.get('c')).toBe(6) expect(omap.items).toHaveLength(3) }) }) describe('Collection', () => { let map beforeEach(() => { map = YAML.createNode({ a: 1, b: [2, 3] }) }) test('addIn', () => { map.addIn(['b'], 4) expect(map.getIn(['b', 2])).toBe(4) map.addIn([], new Pair('c', 5)) expect(map.get('c')).toBe(5) expect(() => map.addIn(['a'])).toThrow(/Expected YAML collection/) map.addIn(['b', 3], 6) expect(map.items).toHaveLength(3) expect(map.get('b').items).toHaveLength(4) }) test('deleteIn', () => { expect(map.deleteIn(['a'])).toBe(true) expect(map.get('a')).toBeUndefined() expect(map.deleteIn(['b', 1])).toBe(true) expect(map.getIn(['b', 1])).toBeUndefined() expect(map.deleteIn([1])).toBe(false) expect(map.deleteIn(['b', 2])).toBe(false) expect(() => map.deleteIn(['a', 'e'])).toThrow(/Expected YAML collection/) expect(map.items).toHaveLength(1) expect(map.get('b').items).toHaveLength(1) }) test('getIn', () => { expect(map.getIn(['a'])).toBe(1) expect(map.getIn(['a'], true)).toMatchObject({ value: 1 }) expect(map.getIn(['b', 1])).toBe(3) expect(map.getIn(['b', '1'])).toBe(3) expect(map.getIn(['b', 1], true)).toMatchObject({ value: 3 }) expect(map.getIn(['b', 2])).toBeUndefined() expect(map.getIn(['c', 'e'])).toBeUndefined() expect(map.getIn(['a', 'e'])).toBeUndefined() }) test('hasIn', () => { expect(map.hasIn(['a'])).toBe(true) expect(map.hasIn(['b', 1])).toBe(true) expect(map.hasIn(['b', '1'])).toBe(true) expect(map.hasIn(['b', 2])).toBe(false) expect(map.hasIn(['c', 'e'])).toBe(false) expect(map.hasIn(['a', 'e'])).toBe(false) }) test('setIn', () => { map.setIn(['a'], 2) expect(map.get('a')).toBe(2) expect(map.get('a', true)).toBe(2) map.setIn(['b', 1], 5) expect(map.getIn(['b', 1])).toBe(5) map.setIn([1], 6) expect(map.get(1)).toBe(6) map.setIn(['b', 2], 6) expect(map.getIn(['b', 2])).toBe(6) map.setIn(['e', 'e'], 7) expect(map.getIn(['e', 'e'])).toBe(7) expect(() => map.setIn(['a', 'e'], 8)).toThrow(/Expected YAML collection/) expect(map.items).toHaveLength(4) expect(map.get('b').items).toHaveLength(3) }) }) describe('Document', () => { let doc beforeEach(() => { doc = new YAML.Document() doc.contents = YAML.createNode({ a: 1, b: [2, 3] }) expect(doc.contents.items).toMatchObject([ { key: { value: 'a' }, value: { value: 1 } }, { key: { value: 'b' }, value: { items: [{ value: 2 }, { value: 3 }] } } ]) }) test('add', () => { doc.add({ key: 'c', value: 'x' }) expect(doc.get('c')).toBe('x') expect(() => doc.add('a')).toThrow(/already set/) expect(() => doc.add(new Pair('c', 'y'))).toThrow(/already set/) expect(doc.contents.items).toHaveLength(3) }) test('addIn', () => { doc.addIn(['b'], 4) expect(doc.getIn(['b', 2])).toBe(4) doc.addIn([], new Pair('c', 5)) expect(doc.get('c')).toBe(5) expect(() => doc.addIn(['a'])).toThrow(/Expected YAML collection/) doc.addIn(['b', 3], 6) expect(doc.contents.items).toHaveLength(3) expect(doc.get('b').items).toHaveLength(4) }) test('delete', () => { expect(doc.delete('a')).toBe(true) expect(doc.delete('a')).toBe(false) expect(doc.get('a')).toBeUndefined() expect(doc.contents.items).toHaveLength(1) doc.contents = YAML.createNode('s') expect(() => doc.set('a', 1)).toThrow(/document contents/) }) test('deleteIn', () => { expect(doc.deleteIn(['a'])).toBe(true) expect(doc.get('a')).toBeUndefined() expect(doc.deleteIn(['b', 1])).toBe(true) expect(doc.getIn(['b', 1])).toBeUndefined() expect(doc.deleteIn([1])).toBe(false) expect(doc.deleteIn(['b', 2])).toBe(false) expect(() => doc.deleteIn(['a', 'e'])).toThrow(/Expected/) expect(doc.contents.items).toHaveLength(1) expect(doc.get('b').items).toHaveLength(1) expect(doc.deleteIn(null)).toBe(true) expect(doc.deleteIn(null)).toBe(false) }) test('get', () => { expect(doc.get('a')).toBe(1) expect(doc.get('a', true)).toMatchObject({ value: 1 }) expect(doc.get('c')).toBeUndefined() doc.contents = YAML.createNode('s') expect(doc.get('a')).toBeUndefined() }) test('getIn collection', () => { expect(doc.getIn(['a'])).toBe(1) expect(doc.getIn(['a'], true)).toMatchObject({ value: 1 }) expect(doc.getIn(['b', 1])).toBe(3) expect(doc.getIn(['b', 1], true)).toMatchObject({ value: 3 }) expect(doc.getIn(['b', 'e'])).toBeUndefined() expect(doc.getIn(['c', 'e'])).toBeUndefined() expect(doc.getIn(['a', 'e'])).toBeUndefined() }) test('getIn scalar', () => { doc.contents = YAML.createNode('s') expect(doc.getIn([])).toBe('s') expect(doc.getIn(null, true)).toMatchObject({ value: 's' }) expect(doc.getIn([0])).toBeUndefined() }) test('has', () => { expect(doc.has('a')).toBe(true) expect(doc.has('c')).toBe(false) doc.contents = YAML.createNode('s') expect(doc.has('a')).toBe(false) }) test('hasIn', () => { expect(doc.hasIn(['a'])).toBe(true) expect(doc.hasIn(['b', 1])).toBe(true) expect(doc.hasIn(['b', 'e'])).toBe(false) expect(doc.hasIn(['c', 'e'])).toBe(false) expect(doc.hasIn(['a', 'e'])).toBe(false) }) test('set', () => { doc.set('a', 2) expect(doc.get('a')).toBe(2) expect(doc.get('a', true)).toBe(2) doc.set('c', 6) expect(doc.get('c')).toBe(6) expect(doc.contents.items).toHaveLength(3) doc.contents = YAML.createNode('s') expect(() => doc.set('a', 1)).toThrow(/document contents/) }) test('setIn', () => { doc.setIn(['a'], 2) expect(doc.getIn(['a'])).toBe(2) expect(doc.getIn(['a'], true)).toBe(2) doc.setIn(['b', 1], 5) expect(doc.getIn(['b', 1])).toBe(5) doc.setIn(['c'], 6) expect(doc.getIn(['c'])).toBe(6) doc.setIn(['e', 1, 'e'], 7) expect(doc.getIn(['e', 1, 'e'])).toBe(7) expect(() => doc.setIn(['a', 'e'], 8)).toThrow(/Expected YAML collection/) expect(doc.contents.items).toHaveLength(4) expect(doc.get('b').items).toHaveLength(2) expect(String(doc)).toBe( 'a: 2\nb:\n - 2\n - 5\nc: 6\ne:\n - null\n - e: 7\n' ) doc.contents = YAML.createNode('s') expect(() => doc.setIn(['a'], 1)).toThrow(/document contents/) }) test('setIn with __proto__ as key', () => { doc.setIn(['c', '__proto__'], 9) expect(String(doc)).toBe('a: 1\nb:\n - 2\n - 3\nc:\n __proto__: 9\n') }) }) yaml-1.10.2/tests/doc/comments.js000066400000000000000000000500501402322402300166170ustar00rootroot00000000000000import { source } from 'common-tags' import YAML from '../../index.js' import { Pair } from '../../types.js' describe('parse comments', () => { describe('body', () => { test('directives', () => { const src = '#comment\n%YAML 1.2 #comment\n---\nstring\n' const doc = YAML.parseDocument(src) expect(doc.commentBefore).toBe('comment\ncomment') expect(String(doc)).toBe('#comment\n#comment\n\n%YAML 1.2\n---\nstring\n') }) test('body start comments', () => { const src = source` --- #comment #comment string ` const doc = YAML.parseDocument(src) expect(doc.contents.commentBefore).toBe('comment\ncomment') expect(String(doc)).toBe(src + '\n') }) test('body start comments with empty comment line', () => { const src = source` --- #comment # #comment string ` const doc = YAML.parseDocument(src) expect(doc.contents.commentBefore).toBe('comment\n\ncomment') expect(String(doc)).toBe(src + '\n') }) test('body end comments', () => { const src = '\nstring\n#comment\n#comment\n' const doc = YAML.parseDocument(src) expect(doc.comment).toBe('comment\ncomment') expect(String(doc)).toBe('string\n\n#comment\n#comment\n') }) }) describe('top-level scalar comments', () => { test('plain', () => { const src = '#c0\nvalue #c1\n#c2' const doc = YAML.parseDocument(src) expect(doc.contents.commentBefore).toBe('c0') expect(doc.contents.comment).toBe('c1') expect(doc.comment).toBe('c2') expect(doc.contents.value).toBe('value') expect(doc.contents.range).toMatchObject([4, 13]) }) test('"quoted"', () => { const src = '#c0\n"value" #c1\n#c2' const doc = YAML.parseDocument(src) expect(doc.contents.commentBefore).toBe('c0') expect(doc.contents.comment).toBe('c1') expect(doc.comment).toBe('c2') expect(doc.contents.value).toBe('value') expect(doc.contents.range).toMatchObject([4, 15]) }) test('block', () => { const src = '#c0\n>- #c1\n value\n#c2\n' const doc = YAML.parseDocument(src) expect(doc.contents.commentBefore).toBe('c0') expect(doc.contents.comment).toBe('c1') expect(doc.comment).toBe('c2') expect(doc.contents.value).toBe('value') expect(doc.contents.range).toMatchObject([4, 18]) }) }) describe('seq entry comments', () => { test('plain', () => { const src = `#c0 - value 1 #c1 - value 2 #c2` const doc = YAML.parseDocument(src) expect(doc).toMatchObject({ contents: { items: [ { commentBefore: 'c0', range: [6, 13] }, { commentBefore: 'c1' } ], range: [4, 29] }, comment: 'c2' }) }) test('multiline', () => { const src = ` - value 1 #c0 #c1 #c2 - value 2 #c3 #c4` const doc = YAML.parseDocument(src) expect(doc).toMatchObject({ contents: { items: [{}, { commentBefore: 'c0\nc1\nc2' }] }, comment: 'c3\nc4' }) }) }) describe('map entry comments', () => { test('plain', () => { const src = `#c0 key1: value 1 #c1 key2: value 2 #c2` const doc = YAML.parseDocument(src) expect(doc).toMatchObject({ contents: { items: [{ commentBefore: 'c0' }, { commentBefore: 'c1' }] }, comment: 'c2' }) }) test('multiline', () => { const src = `key1: value 1 #c0 #c1 #c2 key2: value 2 #c3 #c4` const doc = YAML.parseDocument(src) expect(doc).toMatchObject({ contents: { items: [{}, { commentBefore: 'c0\nc1\nc2' }] }, comment: 'c3\nc4' }) }) }) describe('map-in-seq comments', () => { test('plain', () => { const src = `#c0 - #c1 k1: v1 #c2 k2: v2 #c3 #c4 k3: v3 #c5\n` const doc = YAML.parseDocument(src) expect(doc.contents.items).toMatchObject([ { commentBefore: 'c0\nc1', items: [ {}, { commentBefore: 'c2', value: { comment: 'c3' } }, { commentBefore: 'c4' } ] } ]) expect(doc.comment).toBe('c5') expect(String(doc)).toBe(`#c0 #c1 - k1: v1 #c2 k2: v2 #c3 #c4 k3: v3 #c5\n`) }) }) describe('seq-in-map comments', () => { test('plain', () => { const src = `#c0 k1: #c1 - v1 #c2 - v2 #c3 k2: - v3 #c4 #c5\n` const doc = YAML.parseDocument(src) expect(doc.contents.items).toMatchObject([ { comment: 'c1', key: { commentBefore: 'c0', value: 'k1' }, value: { items: [{ value: 'v1' }, { commentBefore: 'c2', value: 'v2' }], comment: 'c3' } }, { key: { value: 'k2' }, value: { items: [{ value: 'v3', comment: 'c4' }] } } ]) expect(doc.comment).toBe('c5') expect(String(doc)).toBe(`#c0 k1: #c1 - v1 #c2 - v2 #c3 k2: - v3 #c4 #c5\n`) }) }) }) describe('stringify comments', () => { describe('single-line comments', () => { test('plain', () => { const src = 'string' const doc = YAML.parseDocument(src) doc.contents.comment = 'comment' expect(String(doc)).toBe('string #comment\n') }) test('"quoted"', () => { const src = '"string\\u0000"' const doc = YAML.parseDocument(src) doc.contents.comment = 'comment' expect(String(doc)).toBe('"string\\0" #comment\n') }) test('block', () => { const src = '>\nstring\n' const doc = YAML.parseDocument(src) doc.contents.comment = 'comment' expect(String(doc)).toBe('> #comment\nstring\n') }) }) describe('multi-line comments', () => { test('plain', () => { const src = 'string' const doc = YAML.parseDocument(src) doc.contents.comment = 'comment\nlines' expect(String(doc)).toBe('#comment\n#lines\nstring\n') }) test('"quoted"', () => { const src = '"string\\u0000"' const doc = YAML.parseDocument(src) doc.contents.comment = 'comment\nlines' expect(String(doc)).toBe('"string\\0"\n#comment\n#lines\n') }) test('block', () => { const src = '>\nstring\n' const doc = YAML.parseDocument(src) doc.contents.comment = 'comment\nlines' expect(String(doc)).toBe('> #comment lines\nstring\n') }) }) describe('document comments', () => { test('directive', () => { const src = source` #c0 --- string ` const doc = YAML.parseDocument(src) expect(doc.commentBefore).toBe('c0') doc.commentBefore += '\nc1' expect(String(doc)).toBe( source` #c0 #c1 --- string ` + '\n' ) }) }) describe('seq comments', () => { test('plain', () => { const src = '- value 1\n- value 2\n' const doc = YAML.parseDocument(src) doc.contents.commentBefore = 'c0' doc.contents.items[0].commentBefore = 'c1' doc.contents.items[1].commentBefore = 'c2' doc.contents.comment = 'c3' expect(String(doc)).toBe( `#c0 #c1 - value 1 #c2 - value 2 #c3 ` ) }) test('multiline', () => { const src = '- value 1\n- value 2\n' const doc = YAML.parseDocument(src) doc.contents.items[0].commentBefore = 'c0\nc1' doc.contents.items[1].commentBefore = '\nc2\n\nc3' doc.contents.comment = 'c4\nc5' expect(String(doc)).toBe( `#c0 #c1 - value 1 # #c2 # #c3 - value 2 #c4 #c5 ` ) }) test('seq-in-map', () => { const src = 'map:\n - value 1\n - value 2\n' const doc = YAML.parseDocument(src) doc.contents.items[0].key.commentBefore = 'c0' doc.contents.items[0].key.comment = 'c1' doc.contents.items[0].comment = 'c2' const seq = doc.contents.items[0].value seq.items[0].commentBefore = 'c3' seq.items[1].commentBefore = 'c4' seq.comment = 'c5' expect(String(doc)).toBe( `#c0 ? map #c1 : #c2 #c3 - value 1 #c4 - value 2 #c5\n` ) }) }) describe('map entry comments', () => { test('plain', () => { const src = 'key1: value 1\nkey2: value 2\n' const doc = YAML.parseDocument(src) doc.contents.items[0].commentBefore = 'c0' doc.contents.items[1].commentBefore = 'c1' doc.contents.items[1].comment = 'c2' doc.contents.items[1].value.spaceBefore = true doc.contents.comment = 'c3' expect(String(doc)).toBe(`#c0 key1: value 1 #c1 key2: #c2 value 2 #c3\n`) }) test('multiline', () => { const src = 'key1: value 1\nkey2: value 2\n' const doc = YAML.parseDocument(src) doc.contents.items[0].commentBefore = 'c0\nc1' doc.contents.items[1].commentBefore = '\nc2\n\nc3' doc.contents.items[1].comment = 'c4\nc5' doc.contents.items[1].value.spaceBefore = true doc.contents.items[1].value.commentBefore = 'c6' doc.contents.comment = 'c7\nc8' expect(String(doc)).toBe( `#c0 #c1 key1: value 1 # #c2 # #c3 key2: #c4 #c5 #c6 value 2 #c7 #c8 ` ) }) }) }) describe('blank lines', () => { describe('drop leading blank lines', () => { test('content', () => { const src = '\n\nstr\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('str\n') }) test('content comment', () => { const src = '\n\n#cc\n\nstr\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('#cc\n\nstr\n') }) test('directive', () => { const src = '\n\n%YAML 1.2\n---\nstr\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('%YAML 1.2\n---\nstr\n') }) test('directive comment', () => { const src = '\n\n#cc\n%YAML 1.2\n---\nstr\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('#cc\n\n%YAML 1.2\n---\nstr\n') }) }) describe('drop trailing blank lines', () => { test('empty contents', () => { const src = '\n\n\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('null\n') }) test('scalar contents', () => { const src = 'str\n\n\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('str\n') }) test('seq contents', () => { const src = '- a\n- b\n\n\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('- a\n- b\n') }) test('empty/comment contents', () => { const src = '#cc\n\n\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('#cc\n\nnull\n') }) }) test('between directive comment & directive', () => { const src = '#cc\n\n\n%YAML 1.2\n---\nstr\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('#cc\n\n%YAML 1.2\n---\nstr\n') }) test('after leading comment', () => { const src = '#cc\n\n\nstr\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('#cc\n\nstr\n') }) test('before first node in document with directives', () => { const doc = YAML.parseDocument('str\n') doc.directivesEndMarker = true doc.contents.spaceBefore = true expect(String(doc)).toBe('---\n\nstr\n') }) test('between seq items', () => { const src = '- a\n\n- b\n\n\n- c\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('- a\n\n- b\n\n- c\n') }) test('between seq items with leading comments', () => { const src = '#A\n- a\n\n#B\n- b\n\n\n#C\n\n- c\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('#A\n- a\n\n#B\n- b\n\n#C\n- c\n') }) describe('not after block scalar with keep chomping', () => { const cases = [ { name: 'in seq', src: '- |+\n a\n\n- b\n' }, { name: 'in map', src: 'a: |+\n A\n\nb: B\n' }, { name: 'in seq in map', src: 'a:\n - |+\n A\n\nb: B\n' } ] for (const { name, src } of cases) { test(name, () => { const doc = YAML.parseDocument(src) expect(String(doc)).toBe(src) expect(doc.contents.items[1]).not.toHaveProperty('spaceBefore', true) doc.contents.items[1].spaceBefore = true expect(String(doc)).toBe(src) }) } test('as contents', () => { const src = '|+\n a\n\n#c\n' const doc = YAML.parseDocument(src) expect(doc).toMatchObject({ comment: 'c', contents: { value: 'a\n\n' } }) expect(String(doc)).toBe(src) }) }) test('before block map values', () => { const src = 'a:\n\n 1\nb:\n\n #c\n 2\n' const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { key: { value: 'a' }, value: { value: 1, spaceBefore: true } }, { key: { value: 'b' }, value: { value: 2, commentBefore: 'c', spaceBefore: true } } ] }) expect(String(doc)).toBe(src) }) describe('after block value', () => { test('in seq', () => { const src = '- |\n a\n\n- >-\n b\n\n- |+\n c\n\n- d\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('- |\n a\n\n- >-\n b\n\n- |+\n c\n\n- d\n') }) test('in map', () => { const src = 'A: |\n a\n\nB: >-\n b\n\nC: |+\n c\n\nD: d\n' const doc = YAML.parseDocument(src) expect(String(doc)).toBe( 'A: |\n a\n\nB: >-\n b\n\nC: |+\n c\n\nD: d\n' ) }) }) describe('flow collections', () => { test('flow seq', () => { const src = '[1,\n\n2,\n3,\n\n4\n\n]' const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { value: 1 }, { value: 2, spaceBefore: true }, { value: 3 }, { value: 4, spaceBefore: true } ] }) expect(String(doc)).toBe('[\n 1,\n\n 2,\n 3,\n\n 4\n]\n') }) test('flow map', () => { const src = '{\n\na: 1,\n\nb: 2 }' const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { key: { value: 'a' }, value: { value: 1 }, spaceBefore: true }, { key: { value: 'b' }, value: { value: 2 }, spaceBefore: true } ] }) }) test('flow map value comments & spaces', () => { const src = '{\n a:\n #c\n 1,\n b:\n\n #d\n 2\n}\n' const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { key: { value: 'a' }, value: { value: 1, commentBefore: 'c' } }, { key: { value: 'b' }, value: { value: 2, commentBefore: 'd', spaceBefore: true } } ] }) expect(String(doc)).toBe(src) }) }) test('blank line after less-indented comment (eemeli/yaml#91)', () => { const src = ` map: foo0: key2: value2 # foo1: # key0: value0 # key1: value1 foo2: key3: value3` const doc = YAML.parseDocument(src) expect(doc.errors).toHaveLength(0) expect(doc.toJSON()).toMatchObject({ map: { foo0: { key2: 'value2' }, foo2: { key3: 'value3' } } }) }) }) describe('eemeli/yaml#18', () => { test('reported', () => { const src = `test1: foo: #123 bar: 1\n` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(src) }) test('minimal', () => { const src = `foo: #123\n bar: baz\n` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(src) }) }) describe('eemeli/yaml#28', () => { test('reported', () => { const src = `# This comment is ok entryA: - foo entryB: - bar # bar comment # Ending comment # Ending comment 2\n` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(`# This comment is ok entryA: - foo entryB: - bar # bar comment # Ending comment # Ending comment 2\n`) }) test('collection end comment', () => { const src = `a: b #c\n#d\n` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(`a: b #c\n\n#d\n`) }) test('comment association by indentation', () => { const src = ` a: - b #c #d\n` const cst = YAML.parseCST(src) const collection = cst[0].contents[1] expect(collection.items).toHaveLength(2) const comment = cst[0].contents[2] expect(comment.type).toBe('COMMENT') expect(comment.comment).toBe('d') }) test('blank line after seq in map', () => { const src = `a: - aa b: - bb c: cc\n` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(src) }) test('blank line after map in seq', () => { const src = `- a: aa - b: bb c: cc - d: dd\n` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(src) }) }) describe('collection end comments', () => { test('seq in seq', () => { const src = `#0 - - a - b #1 #2 - d\n` const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { items: [{ value: 'a' }, { value: 'b' }], comment: '1' }, { spaceBefore: true, commentBefore: '2', value: 'd' } ] }) expect(String(doc)).toBe(src) }) test('map in seq', () => { const src = `#0 - a: 1 b: 2 #1 #2 - d\n` const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { items: [ { key: { value: 'a' }, value: { value: 1 } }, { key: { value: 'b' }, value: { value: 2 } } ], comment: '1' }, { spaceBefore: true, commentBefore: '2', value: 'd' } ] }) expect(String(doc)).toBe(src) }) test('seq in map', () => { const src = `#0 a: - b - c #1 #2 d: 1\n` const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { key: { value: 'a' }, value: { items: [{ value: 'b' }, { value: 'c' }], comment: '1' } }, { spaceBefore: true, commentBefore: '2', key: { value: 'd' }, value: { value: 1 } } ] }) expect(String(doc)).toBe(src) }) test('map in map', () => { const src = `#0 a: b: 1 c: 2 #1 #2 d: 1\n` const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { key: { value: 'a' }, value: { items: [ { key: { value: 'b' }, value: { value: 1 } }, { key: { value: 'c' }, value: { value: 2 } } ], comment: '1' } }, { spaceBefore: true, commentBefore: '2', key: { value: 'd' }, value: { value: 1 } } ] }) expect(String(doc)).toBe(src) }) test('indented seq in map in seq', () => { const src = `#0 a: #1 - b: - c #2 - e\n` const doc = YAML.parseDocument(src) expect(doc.contents).toMatchObject({ items: [ { key: { value: 'a' }, value: { commentBefore: '1', items: [ { items: [ { key: { value: 'b' }, value: { items: [{ value: 'c' }] } } ] }, { spaceBefore: true, commentBefore: '2', value: 'e' } ] } } ] }) expect(String(doc)).toBe(src) }) }) describe('Pair.commentBefore', () => { test('Should get key comment', () => { const key = YAML.createNode('foo', true) const pair = new Pair(key, 42) key.commentBefore = 'cc' expect(pair.commentBefore).toBe('cc') }) test('Should set key comment', () => { const key = YAML.createNode('foo', true) const pair = new Pair(key, 42) pair.commentBefore = 'cc' expect(key.commentBefore).toBe('cc') }) test('Should create a key from a null value', () => { const pair = new Pair(null, 42) expect(pair.key).toBeNull() pair.commentBefore = 'cc' expect(pair.key).not.toBeNull() expect(pair.key.commentBefore).toBe('cc') }) test('Should throw for non-Node key', () => { const pair = new Pair({ foo: 'bar' }, 42) expect(() => { pair.commentBefore = 'cc' }).toThrow(/commentBefore is an alias/) }) }) yaml-1.10.2/tests/doc/createNode.js000066400000000000000000000240341402322402300170460ustar00rootroot00000000000000import { YAML } from '../../src/index.js' import { Pair, Scalar, YAMLMap, YAMLSeq } from '../../src/ast/index.js' import { YAMLSet } from '../../src/tags/yaml-1.1/set.js' describe('scalars', () => { describe('createNode(value, false)', () => { test('boolean', () => { const s = YAML.createNode(false, false) expect(s).toBe(false) }) test('null', () => { const s = YAML.createNode(null, false) expect(s).toBeNull() }) test('undefined', () => { const s = YAML.createNode(undefined, false) expect(s).toBeNull() }) test('number', () => { const s = YAML.createNode(3, false) expect(s).toBe(3) }) test('string', () => { const s = YAML.createNode('test', false) expect(s).toBe('test') }) }) }) describe('createNode(value, true)', () => { test('boolean', () => { const s = YAML.createNode(false, true) expect(s).toBeInstanceOf(Scalar) expect(s.value).toBe(false) }) test('null', () => { const s = YAML.createNode(null, true) expect(s).toBeInstanceOf(Scalar) expect(s.value).toBe(null) }) test('undefined', () => { const s = YAML.createNode(undefined, true) expect(s).toBeInstanceOf(Scalar) expect(s.value).toBe(null) }) test('number', () => { const s = YAML.createNode(3, true) expect(s).toBeInstanceOf(Scalar) expect(s.value).toBe(3) }) test('string', () => { const s = YAML.createNode('test', true) expect(s).toBeInstanceOf(Scalar) expect(s.value).toBe('test') }) }) describe('explicit tags', () => { test('wrapScalars: false', () => { const s = YAML.createNode(3, false, 'tag:yaml.org,2002:str') expect(s).toBe(3) }) test('wrapScalars: true', () => { const s = YAML.createNode(3, true, '!!str') expect(s).toBeInstanceOf(Scalar) expect(s).toMatchObject({ value: 3, tag: 'tag:yaml.org,2002:str' }) }) test('unknown tag', () => { expect(() => YAML.createNode('3', true, '!foo')).toThrow( 'Tag !foo not found' ) }) }) describe('arrays', () => { test('createNode([])', () => { const s = YAML.createNode([]) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toHaveLength(0) }) test('createNode([true], false)', () => { const s = YAML.createNode([true], false) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toMatchObject([true]) }) describe('[3, ["four", 5]]', () => { const array = [3, ['four', 5]] test('createNode(value, false)', () => { const s = YAML.createNode(array, false) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toHaveLength(2) expect(s.items[0]).toBe(3) expect(s.items[1]).toBeInstanceOf(YAMLSeq) expect(s.items[1].items).toMatchObject(['four', 5]) }) test('createNode(value, true)', () => { const s = YAML.createNode(array, true) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toHaveLength(2) expect(s.items[0].value).toBe(3) expect(s.items[1]).toBeInstanceOf(YAMLSeq) expect(s.items[1].items).toHaveLength(2) expect(s.items[1].items[0].value).toBe('four') expect(s.items[1].items[1].value).toBe(5) }) test('set doc contents', () => { const res = '- 3\n- - four\n - 5\n' const doc = new YAML.Document() doc.contents = array expect(String(doc)).toBe(res) doc.contents = YAML.createNode(array, false) expect(String(doc)).toBe(res) doc.contents = YAML.createNode(array, true) expect(String(doc)).toBe(res) }) }) }) describe('objects', () => { test('createNode({})', () => { const s = YAML.createNode({}) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(0) }) test('createNode({ x: true }, false)', () => { const s = YAML.createNode({ x: true }, false) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(1) expect(s.items[0]).toBeInstanceOf(Pair) expect(s.items[0]).toMatchObject({ key: 'x', value: true }) }) describe('{ x: 3, y: [4], z: { w: "five", v: 6 } }', () => { const object = { x: 3, y: [4], z: { w: 'five', v: 6 } } test('createNode(value, false)', () => { const s = YAML.createNode(object, false) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(3) expect(s.items).toMatchObject([ { key: 'x', value: 3 }, { key: 'y', value: { items: [4] } }, { key: 'z', value: { items: [ { key: 'w', value: 'five' }, { key: 'v', value: 6 } ] } } ]) }) test('createNode(value, true)', () => { const s = YAML.createNode(object, true) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(3) expect(s.items).toMatchObject([ { key: { value: 'x' }, value: { value: 3 } }, { key: { value: 'y' }, value: { items: [{ value: 4 }] } }, { key: { value: 'z' }, value: { items: [ { key: { value: 'w' }, value: { value: 'five' } }, { key: { value: 'v' }, value: { value: 6 } } ] } } ]) }) test('set doc contents', () => { const res = `x: 3 y: - 4 z: w: five v: 6\n` const doc = new YAML.Document() doc.contents = object expect(String(doc)).toBe(res) doc.contents = YAML.createNode(object, false) expect(String(doc)).toBe(res) doc.contents = YAML.createNode(object, true) expect(String(doc)).toBe(res) }) }) }) describe('Set', () => { test('createNode(new Set)', () => { const s = YAML.createNode(new Set()) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toHaveLength(0) }) test('createNode(new Set([true]), false)', () => { const s = YAML.createNode(new Set([true]), false) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toMatchObject([true]) }) describe("Set { 3, Set { 'four', 5 } }", () => { const set = new Set([3, new Set(['four', 5])]) test('createNode(set, false)', () => { const s = YAML.createNode(set, false) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toHaveLength(2) expect(s.items[0]).toBe(3) expect(s.items[1]).toBeInstanceOf(YAMLSeq) expect(s.items[1].items).toMatchObject(['four', 5]) }) test('createNode(set, true)', () => { const s = YAML.createNode(set, true) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toHaveLength(2) expect(s.items[0].value).toBe(3) expect(s.items[1]).toBeInstanceOf(YAMLSeq) expect(s.items[1].items).toHaveLength(2) expect(s.items[1].items[0].value).toBe('four') expect(s.items[1].items[1].value).toBe(5) }) test('set doc contents', () => { const res = '- 3\n- - four\n - 5\n' const doc = new YAML.Document() doc.contents = set expect(String(doc)).toBe(res) doc.contents = YAML.createNode(set, false) expect(String(doc)).toBe(res) doc.contents = YAML.createNode(set, true) expect(String(doc)).toBe(res) }) test('Schema#createNode() - YAML 1.2', () => { const doc = new YAML.Document() doc.setSchema() const s = doc.schema.createNode(set, true) expect(s).toBeInstanceOf(YAMLSeq) expect(s.items).toMatchObject([ { value: 3 }, { items: [{ value: 'four' }, { value: 5 }] } ]) }) test('Schema#createNode() - YAML 1.1', () => { const doc = new YAML.Document({ version: '1.1' }) doc.setSchema() const s = doc.schema.createNode(set, true) expect(s).toBeInstanceOf(YAMLSet) expect(s.items).toMatchObject([ { key: { value: 3 } }, { key: { items: [{ key: { value: 'four' } }, { key: { value: 5 } }] } } ]) }) }) }) describe('Map', () => { test('createNode(new Map)', () => { const s = YAML.createNode(new Map()) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(0) }) test('createNode(new Map([["x", true]]), false)', () => { const s = YAML.createNode(new Map([['x', true]]), false) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(1) expect(s.items[0]).toBeInstanceOf(Pair) expect(s.items[0]).toMatchObject({ key: 'x', value: true }) }) describe("Map { 'x' => 3, 'y' => Set { 4 }, Map { 'w' => 'five', 'v' => 6 } => 'z' }", () => { const map = new Map([ ['x', 3], ['y', new Set([4])], [ new Map([ ['w', 'five'], ['v', 6] ]), 'z' ] ]) test('createNode(map, false)', () => { const s = YAML.createNode(map, false) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(3) expect(s.items).toMatchObject([ { key: 'x', value: 3 }, { key: 'y', value: { items: [4] } }, { key: { items: [ { key: 'w', value: 'five' }, { key: 'v', value: 6 } ] }, value: 'z' } ]) }) test('createNode(map, true)', () => { const s = YAML.createNode(map, true) expect(s).toBeInstanceOf(YAMLMap) expect(s.items).toHaveLength(3) expect(s.items).toMatchObject([ { key: { value: 'x' }, value: { value: 3 } }, { key: { value: 'y' }, value: { items: [{ value: 4 }] } }, { key: { items: [ { key: { value: 'w' }, value: { value: 'five' } }, { key: { value: 'v' }, value: { value: 6 } } ] }, value: { value: 'z' } } ]) }) test('set doc contents', () => { const res = `x: 3 y: - 4 ? w: five v: 6 : z\n` const doc = new YAML.Document() doc.contents = map expect(String(doc)).toBe(res) doc.contents = YAML.createNode(map, false) expect(String(doc)).toBe(res) doc.contents = YAML.createNode(map, true) expect(String(doc)).toBe(res) }) }) }) describe('toJSON()', () => { test('Date', () => { const date = new Date('2018-12-22T08:02:52Z') const node = YAML.createNode(date) expect(node.value).toBe(date.toJSON()) }) }) yaml-1.10.2/tests/doc/errors.js000066400000000000000000000261161402322402300163140ustar00rootroot00000000000000import fs from 'fs' import path from 'path' import { Node } from '../../src/cst/Node.js' import { YAMLError } from '../../src/errors.js' import { warnFileDeprecation, warnOptionDeprecation } from '../../src/warnings.js' import { YAML } from '../../src/index.js' test('require a message and source for all errors', () => { const exp = /Invalid arguments/ expect(() => new YAMLError()).toThrow(exp) expect(() => new YAMLError('Foo')).toThrow(exp) expect(() => new YAMLError('Foo', {})).toThrow(exp) expect(() => new YAMLError('Foo', new Node())).toThrow(exp) expect(() => new YAMLError('Foo', null, 'foo')).toThrow(exp) expect(() => new YAMLError('Foo', new Node(), 'foo')).not.toThrow() }) test('fail on map value indented with tab', () => { const src = 'a:\n\t1\nb:\n\t2\n' const doc = YAML.parseDocument(src) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError' }, { name: 'YAMLSemanticError' }, { name: 'YAMLSemanticError' }, { name: 'YAMLSemanticError' } ]) expect(() => String(doc)).toThrow( 'Document with errors cannot be stringified' ) }) test('eemeli/yaml#6', () => { const src = 'abc: 123\ndef' const doc = YAML.parseDocument(src) expect(doc.errors).toMatchObject([{ name: 'YAMLSemanticError' }]) const node = doc.errors[0].source expect(node).toBeInstanceOf(Node) expect(node.rangeAsLinePos).toMatchObject({ start: { line: 2, col: 1 }, end: { line: 2, col: 4 } }) }) describe('eemeli/yaml#7', () => { test('map', () => { const src = '{ , }\n---\n{ 123,,, }\n' const docs = YAML.parseAllDocuments(src) expect(docs[0].errors).toMatchObject([{ name: 'YAMLSyntaxError' }]) expect(docs[1].errors).toMatchObject([ { name: 'YAMLSyntaxError' }, { name: 'YAMLSyntaxError' } ]) const node = docs[0].errors[0].source expect(node).toBeInstanceOf(Node) expect(node.rangeAsLinePos).toMatchObject({ start: { line: 1, col: 1 }, end: { line: 1, col: 6 } }) }) test('seq', () => { const src = '[ , ]\n---\n[ 123,,, ]\n' const docs = YAML.parseAllDocuments(src) expect(docs[0].errors).toMatchObject([{ name: 'YAMLSyntaxError' }]) expect(docs[1].errors).toMatchObject([ { name: 'YAMLSyntaxError' }, { name: 'YAMLSyntaxError' } ]) const node = docs[1].errors[0].source expect(node).toBeInstanceOf(Node) expect(node.rangeAsLinePos).toMatchObject({ start: { line: 3, col: 1 }, end: { line: 3, col: 11 } }) }) }) describe('block collections', () => { test('mapping with bad indentation', () => { const src = 'foo: "1"\n bar: 2\n' const doc = YAML.parseDocument(src) expect(doc.errors).toMatchObject([ { message: 'All collection items must start at the same column' } ]) expect(doc.contents).toMatchObject({ type: 'MAP', items: [ { key: { value: 'foo' }, value: { value: '1' } }, { key: { value: 'bar' }, value: { value: 2 } } ] }) }) test('sequence with bad indentation', () => { const src = '- "foo"\n - bar\n' const doc = YAML.parseDocument(src) expect(doc.errors).toMatchObject([ { message: 'All collection items must start at the same column' } ]) expect(doc.contents).toMatchObject({ type: 'SEQ', items: [{ value: 'foo' }, { value: 'bar' }] }) }) test('seq item in mapping', () => { const src = 'foo: "1"\n- bar\n' const doc = YAML.parseDocument(src) expect(doc.errors).toMatchObject([ { message: 'A collection cannot be both a mapping and a sequence' }, { message: 'Failed to resolve SEQ_ITEM node here' }, { message: 'Implicit map keys need to be followed by map values' } ]) expect(doc.contents).toMatchObject({ type: 'MAP', items: [ { key: { value: 'foo' }, value: { value: '1' } }, { key: null, value: null } ] }) }) }) describe('missing flow collection terminator', () => { test('start only of flow map (eemeli/yaml#8)', () => { const doc = YAML.parseDocument('{', { prettyErrors: true }) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', message: 'Expected flow map to end with } at line 1, column 2:\n\n{\n ^\n', nodeType: 'FLOW_MAP', range: { start: 1, end: 2 }, linePos: { start: { line: 1, col: 2 }, end: { line: 1, col: 3 } } } ]) }) test('start only of flow sequence (eemeli/yaml#8)', () => { const doc = YAML.parseDocument('[', { prettyErrors: true }) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', message: 'Expected flow sequence to end with ] at line 1, column 2:\n\n[\n ^\n', nodeType: 'FLOW_SEQ', range: { start: 1, end: 2 }, linePos: { start: { line: 1, col: 2 }, end: { line: 1, col: 3 } } } ]) }) test('flow sequence without end', () => { const doc = YAML.parseDocument('[ foo, bar,', { prettyErrors: true }) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', message: 'Expected flow sequence to end with ] at line 1, column 12:\n\n[ foo, bar,\n ^\n', nodeType: 'FLOW_SEQ', range: { start: 11, end: 12 }, linePos: { start: { line: 1, col: 12 }, end: { line: 1, col: 13 } } } ]) }) }) describe('pretty errors', () => { test('eemeli/yaml#6', () => { const src = 'abc: 123\ndef' const doc = YAML.parseDocument(src, { prettyErrors: true }) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', message: 'Implicit map keys need to be followed by map values at line 2, column 1:\n\ndef\n^^^\n', nodeType: 'PLAIN', range: { start: 9, end: 12 }, linePos: { start: { line: 2, col: 1 }, end: { line: 2, col: 4 } } } ]) expect(doc.errors[0]).not.toHaveProperty('source') }) test('eemeli/yaml#7 maps', () => { const src = '{ , }\n---\n{ 123,,, }\n' const docs = YAML.parseAllDocuments(src, { prettyErrors: true }) expect(docs[0].errors).toMatchObject([ { name: 'YAMLSyntaxError', message: 'Flow map contains an unexpected , at line 1, column 3:\n\n{ , }\n ^\n', nodeType: 'FLOW_MAP', range: { start: 2, end: 3 }, linePos: { start: { line: 1, col: 3 }, end: { line: 1, col: 4 } } } ]) expect(docs[0].errors[0]).not.toHaveProperty('source') expect(docs[1].errors).toMatchObject([ { name: 'YAMLSyntaxError', message: 'Flow map contains an unexpected , at line 3, column 7:\n\n{ 123,,, }\n ^\n', nodeType: 'FLOW_MAP', range: { start: 16, end: 17 }, linePos: { start: { line: 3, col: 7 }, end: { line: 3, col: 8 } } }, { name: 'YAMLSyntaxError', message: 'Flow map contains an unexpected , at line 3, column 8:\n\n{ 123,,, }\n ^\n', nodeType: 'FLOW_MAP', range: { start: 17, end: 18 }, linePos: { start: { line: 3, col: 8 }, end: { line: 3, col: 9 } } } ]) expect(docs[1].errors[0]).not.toHaveProperty('source') expect(docs[1].errors[1]).not.toHaveProperty('source') }) test('pretty warnings', () => { const src = '%FOO\n---bar\n' const doc = YAML.parseDocument(src, { prettyErrors: true }) expect(doc.warnings).toMatchObject([ { name: 'YAMLWarning', nodeType: 'DIRECTIVE' } ]) }) }) describe('invalid options', () => { test('unknown schema', () => { const doc = new YAML.Document({ schema: 'foo' }) expect(() => doc.setSchema()).toThrow(/Unknown schema/) }) test('unknown custom tag', () => { const doc = new YAML.Document({ customTags: ['foo'] }) expect(() => doc.setSchema()).toThrow(/Unknown custom tag/) }) }) test('broken document with comment before first node', () => { const doc = YAML.parseDocument('#c\n*x\nfoo\n') expect(doc.contents).toBeNull() expect(doc.errors).toMatchObject([ { name: 'YAMLReferenceError', message: 'Aliased anchor not found: x' }, { name: 'YAMLSyntaxError', message: 'Document contains trailing content not separated by a ... or --- line' } ]) }) describe('broken directives', () => { for (const tag of ['%TAG', '%YAML']) test(`incomplete ${tag} directive`, () => { const doc = YAML.parseDocument(`${tag}\n---\n`) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', source: { type: 'DIRECTIVE' } } ]) }) test('missing separator', () => { const doc = YAML.parseDocument(`%YAML 1.2\n`) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', source: { type: 'DOCUMENT' } } ]) }) }) test('multiple tags on one node', () => { const doc = YAML.parseDocument('!foo !bar baz\n') expect(doc.contents).toMatchObject({ value: 'baz', type: 'PLAIN' }) expect(doc.errors).toMatchObject([{ name: 'YAMLSemanticError' }]) expect(doc.warnings).toMatchObject([{}]) }) describe('deprecations', () => { let mock beforeEach(() => { mock = jest.spyOn(global.process, 'emitWarning').mockImplementation() }) afterEach(() => mock.mockRestore()) describe('env vars', () => { let prevAll, prevDeprecations beforeEach(() => { prevAll = global.YAML_SILENCE_WARNINGS prevDeprecations = global.YAML_SILENCE_DEPRECATION_WARNINGS }) afterEach(() => { global.YAML_SILENCE_WARNINGS = prevAll global.YAML_SILENCE_DEPRECATION_WARNINGS = prevDeprecations }) test('YAML_SILENCE_WARNINGS', () => { global.YAML_SILENCE_WARNINGS = true warnFileDeprecation('foo') warnOptionDeprecation('bar1', 'baz') expect(mock).toHaveBeenCalledTimes(0) }) test('YAML_SILENCE_DEPRECATION_WARNINGS', () => { global.YAML_SILENCE_DEPRECATION_WARNINGS = true warnFileDeprecation('foo') warnOptionDeprecation('bar2', 'baz') expect(mock).toHaveBeenCalledTimes(0) }) }) test('only warn once', () => { warnOptionDeprecation('bar3') warnOptionDeprecation('bar3') expect(mock).toHaveBeenCalledTimes(1) }) test('without process.emitWarning', () => { global.process.emitWarning = null const cMock = jest.spyOn(console, 'warn').mockImplementation() try { warnFileDeprecation('foo') warnOptionDeprecation('bar4', 'baz') expect(cMock).toHaveBeenCalledTimes(2) } finally { cMock.mockRestore() } }) test('tags option', () => { const doc = new YAML.Document({ tags: [] }) doc.setSchema() expect(mock).toHaveBeenCalledTimes(1) }) const files = [ 'map', 'pair', 'scalar', 'schema', 'seq', 'types/binary', 'types/omap', 'types/pairs', 'types/set', 'types/timestamp' ] const root = path.resolve(__dirname, '../..') const fileTest = fs.existsSync(path.resolve(root, 'dist')) ? test : test.skip for (const file of files) fileTest(`file: ${file}`, () => { const fp = path.resolve(root, file) // await import() may fail with ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING due // to https://github.com/facebook/jest/issues/9430 require(fp) expect(mock).toHaveBeenCalledTimes(1) }) }) yaml-1.10.2/tests/doc/foldFlowLines.js000066400000000000000000000311151402322402300175420ustar00rootroot00000000000000import { foldFlowLines as fold, FOLD_FLOW, FOLD_QUOTED } from '../../src/stringify/foldFlowLines.js' import { YAML } from '../../src/index.js' describe('plain', () => { const src = 'abc def ghi jkl mno pqr stu vwx yz\n' let onFold let options beforeEach(() => { onFold = jest.fn() options = { indentAtStart: 0, lineWidth: 10, minContentWidth: 0, onFold } }) test('pass-through', () => { options.lineWidth = 40 expect(fold(src, '', FOLD_FLOW, options)).toBe(src) expect(onFold).not.toHaveBeenCalled() }) test('simple', () => { options.lineWidth = 20 expect(fold(src, '', FOLD_FLOW, options)).toBe( 'abc def ghi jkl mno\npqr stu vwx yz\n' ) expect(onFold).toHaveBeenCalled() }) test('multiple folds', () => { expect(fold(src, '', FOLD_FLOW, options)).toBe( 'abc def\nghi jkl\nmno pqr\nstu vwx yz\n' ) expect(onFold).toHaveBeenCalledTimes(1) }) test('indent', () => { expect(fold(src, ' ', FOLD_FLOW, options)).toBe( 'abc def\n ghi jkl\n mno pqr\n stu vwx\n yz\n' ) }) test('indent > lineWidth', () => { const indent = ' ' options.lineWidth = 7 const i = '\n' + indent expect(fold(src, indent, FOLD_FLOW, options)).toBe( `abc def${i}ghi${i}jkl${i}mno${i}pqr${i}stu${i}vwx${i}yz\n` ) }) test('indent > lineWidth, with minContentWidth', () => { const indent = ' ' options.lineWidth = 7 options.minContentWidth = 7 const i = '\n' + indent expect(fold(src, indent, FOLD_FLOW, options)).toBe( `abc def${i}ghi jkl${i}mno pqr${i}stu vwx${i}yz\n` ) }) test('positive indentAtStart', () => { options.indentAtStart = 8 expect(fold(src, '', FOLD_FLOW, options)).toBe( 'abc\ndef ghi\njkl mno\npqr stu\nvwx yz\n' ) }) test('negative indentAtStart', () => { options.indentAtStart = -8 expect(fold(src, '', FOLD_FLOW, options)).toBe( 'abc def ghi jkl\nmno pqr\nstu vwx yz\n' ) }) test('doubled spaces', () => { const src2 = 'abc def ghi jkl mno pqr stu vwx yz\n' expect(fold(src2, '', FOLD_FLOW, options)).toBe(src2) expect(onFold).not.toHaveBeenCalled() }) }) describe('double-quoted', () => { const src = '"abc def ghi jkl mnopqrstuvwxyz\n"' let onFold let options beforeEach(() => { onFold = jest.fn() options = { indent: '', indentAtStart: 0, lineWidth: 10, minContentWidth: 0, mode: FOLD_QUOTED, onFold } }) test('pass-through', () => { options.lineWidth = 40 expect(fold(src, '', FOLD_QUOTED, options)).toBe(src) expect(onFold).not.toHaveBeenCalled() }) test('simple', () => { options.lineWidth = 20 expect(fold(src, '', FOLD_QUOTED, options)).toBe( '"abc def ghi jkl\nmnopqrstuvwxyz\n"' ) expect(onFold).toHaveBeenCalled() }) test('multiple folds', () => { expect(fold(src, '', FOLD_QUOTED, options)).toBe( '"abc def\nghi jkl\nmnopqrstu\\\nvwxyz\n"' ) expect(onFold).toHaveBeenCalledTimes(1) }) test('short lineWidth', () => { options.lineWidth = 3 expect(fold(src, '', FOLD_QUOTED, options)).toBe( '"a\\\nbc\ndef\nghi\njkl\nmn\\\nop\\\nqr\\\nst\\\nuv\\\nwx\\\nyz\n"' ) }) test('doubled spaces', () => { const src2 = '"abc def ghi jkl mno pqr stu vwx yz\n"' options.lineWidth = 9 expect(fold(src2, '', FOLD_QUOTED, options)).toBe( '"abc de\\\nf ghi \\\njkl mno \\\npqr stu \\\nvwx yz\n"' ) }) test('terminal whitespace', () => { const src2 = '" \t \t \t \t \tnext \t"' expect(fold(src2, '', FOLD_QUOTED, options)).toBe( '" \t \t \t \t \t\\\nnext \t"' ) }) test('escape longer than lineWidth', () => { const src2 = `"foo\\U01234567"` expect(fold(src2, '', FOLD_QUOTED, options)).toBe(src2) }) describe('Folding double-quoted strings', () => { describe('eemeli/yaml#48: Split \\" escape in double-quoted string', () => { test('minimal', () => { const src2 = '"01234567\\""' expect(fold(src2, '', FOLD_QUOTED, options)).toBe('"01234567\\\n\\""') const src3 = '"012345678\\""' expect(fold(src3, '', FOLD_QUOTED, options)).toBe('"012345678\\\n\\""') }) test('reported', () => { const x = '{"module":"database","props":{"databaseType":"postgresql"},"extra":{},"foo":"bar\'"}' const str = YAML.stringify({ x }) const doc = YAML.parseDocument(str) expect(doc.errors).toHaveLength(0) expect(doc.contents.items[0].value.value).toBe(x) }) }) describe('eemeli/yaml#57', () => { test('minimal', () => { const str = `"0123\\"\\\\ '"` expect(fold(str, '', FOLD_QUOTED, options)).toBe(`"0123\\"\\\\\n'"`) }) test('reported', () => { const key2 = `!""""""""""""""""""""""""""""""""""#"\\ '` const str = YAML.stringify([{ key2 }]) const res = YAML.parse(str) expect(res[0].key2).toBe(key2) }) }) describe('eemeli/yaml#59', () => { test('minimal', () => { const str = `"######\\\\P#"` expect(fold(str, '', FOLD_QUOTED, options)).toBe(`"######\\\\\\\nP#"`) }) test('reported', () => { const value = '>####################################"##########################\'####\\P#' const str = YAML.stringify({ key: [[value]] }) const doc = YAML.parseDocument(str) expect(doc.errors).toHaveLength(0) expect(doc.contents.items[0].value.items[0].items[0].value).toBe(value) }) }) describe('awslabs/cdk8s#494', () => { test('slash', () => { const str = `"1234567\\\\ab"` expect(fold(str, '', FOLD_QUOTED, options)).toBe(`"1234567\\\n\\\\ab"`) }) test('null', () => { const str = `"1234567\\\0ab"` expect(fold(str, '', FOLD_QUOTED, options)).toBe(`"1234567\\\n\\\0ab"`) }) test('space', () => { const str = `"1234567\\ ab"` expect(fold(str, '', FOLD_QUOTED, options)).toBe(`"1234567\\\n\\ ab"`) }) }) }) describe('Folding input with excessive start indentation - eemeli/yaml#196', () => { test('quoted', () => { options.indentAtStart = 6 options.minContentWidth = 6 expect(fold('"ab cd ef gh"', ' ', FOLD_QUOTED, options)).toBe( '\n "ab cd ef\n gh"' ) }) test('plain', () => { options.indentAtStart = 6 options.minContentWidth = 6 expect(fold('ab cd ef gh', ' ', FOLD_FLOW, options)).toBe( '\n ab cd ef\n gh' ) }) test('reported', () => { const input = { testgljrisgjsrligjsrligsjrglisrjgrligjsligrjglisjgrlijgsrilgsejrfiwlahflirgjaelfjafil: '&cLorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sed nibh ac metus elementum venenatis eu vitae diam. Etiam tristique suscipit mauris. Donec pulvinar sed nunc a gravida. Morbi nulla lacus, gravida eu elementum id, ultricies nec ipsum. Cras bibendum tellus ut mollis malesuada. Maecenas eleifend felis at fermentum hendrerit. Nulla porta vitae erat eget faucibus. Sed egestas viverra magna ac vulputate. Suspendisse vel posuere mauris, accumsan dapibus libero. Curabitur bibendum tellus in ex ultricies, quis tempus magna luctus. Maecenas maximus orci est, id fringilla lorem gravida sit amet. Pellentesque a rutrum lorem. Vestibulum ante ipsum primis in faucibus orci.' } expect(YAML.stringify(input)).toBe( `testgljrisgjsrligjsrligsjrglisrjgrligjsligrjglisjgrlijgsrilgsejrfiwlahflirgjaelfjafil: "&cLorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sed nibh ac metus elementum venenatis eu vitae diam. Etiam tristique suscipit mauris. Donec pulvinar sed nunc a gravida. Morbi nulla lacus, gravida eu elementum id, ultricies nec ipsum. Cras bibendum tellus ut mollis malesuada. Maecenas eleifend felis at fermentum hendrerit. Nulla porta vitae erat eget faucibus. Sed egestas viverra magna ac vulputate. Suspendisse vel posuere mauris, accumsan dapibus libero. Curabitur bibendum tellus in ex ultricies, quis tempus magna luctus. Maecenas maximus orci est, id fringilla lorem gravida sit amet. Pellentesque a rutrum lorem. Vestibulum ante ipsum primis in faucibus orci."\n` ) }) }) }) describe('end-to-end', () => { let origFoldOptions beforeAll(() => { origFoldOptions = YAML.scalarOptions.str.fold YAML.scalarOptions.str.fold = { lineWidth: 20, minContentWidth: 0 } }) afterAll(() => { YAML.scalarOptions.str.fold = origFoldOptions }) test('more-indented folded block', () => { const src = `> # comment with an excessive length that won't get folded Text on a line that should get folded with a line width of 20 characters. Indented text that appears to be folded but is not. Text that is prevented from folding due to being more-indented. Unfolded paragraph.\n` const doc = YAML.parseDocument(src) expect(doc.contents.value).toBe( `Text on a line that should get folded with a line width of 20 characters. Indented text that appears to be folded but is not. Text that is prevented from folding due to being more-indented. Unfolded paragraph.\n` ) expect(String(doc)).toBe(src) }) test('eemeli/yaml#55', () => { const str = ' first more-indented line\nnext line\n' const ys = YAML.stringify(str) expect(ys).toBe('>1\n first more-indented line\nnext line\n') }) test('plain string', () => { const src = `- plain value with enough length to fold twice - plain with comment # that won't get folded\n` const doc = YAML.parseDocument(src) expect(doc.contents.items[0].value).toBe( 'plain value with enough length to fold twice' ) expect(doc.contents.items[1].value).toBe('plain with comment') expect(String(doc)).toBe(src) }) test('long line width', () => { const src = { lorem: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In laoreet massa eros, dignissim aliquam nunc elementum sit amet. Mauris pulvinar nunc eget ante sodales viverra. Vivamus quis convallis sapien, ut auctor magna. Cras volutpat erat eu lacus luctus facilisis. Aenean sapien leo, auctor sed tincidunt at, scelerisque a urna. Nunc ullamcorper, libero non mollis aliquet, nulla diam lobortis neque, ac rutrum dui nibh iaculis lectus. Aenean lobortis interdum arcu eget sollicitudin.\n\nDuis quam enim, ultricies a enim non, tincidunt lobortis ipsum. Mauris condimentum ultrices eros rutrum euismod. Fusce et mi eget quam dapibus blandit. Maecenas sodales tempor euismod. Phasellus vulputate purus felis, eleifend ullamcorper tortor semper sit amet. Sed nunc quam, iaculis et neque sit amet, consequat egestas lectus. Aenean dapibus lorem sed accumsan porttitor. Curabitur eu magna congue, mattis urna ac, lacinia eros. In in iaculis justo, nec faucibus enim. Fusce id viverra purus, nec ultricies mi. Aliquam eu risus risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse potenti. \n' } YAML.scalarOptions.str.fold.lineWidth = 1000 const ysWithLineWidthGreater = YAML.stringify(src) YAML.scalarOptions.str.fold.lineWidth = 0 const ysWithUnlimitedLength = YAML.stringify(src) YAML.scalarOptions.str.fold.lineWidth = -1 const ysWithUnlimitedLength2 = YAML.stringify(src) expect(ysWithLineWidthGreater).toBe( 'lorem: |\n' + ' Lorem ipsum dolor sit amet, consectetur adipiscing elit. In laoreet massa eros, dignissim aliquam nunc elementum sit amet. Mauris pulvinar nunc eget ante sodales viverra. Vivamus quis convallis sapien, ut auctor magna. Cras volutpat erat eu lacus luctus facilisis. Aenean sapien leo, auctor sed tincidunt at, scelerisque a urna. Nunc ullamcorper, libero non mollis aliquet, nulla diam lobortis neque, ac rutrum dui nibh iaculis lectus. Aenean lobortis interdum arcu eget sollicitudin.\n' + '\n' + ' Duis quam enim, ultricies a enim non, tincidunt lobortis ipsum. Mauris condimentum ultrices eros rutrum euismod. Fusce et mi eget quam dapibus blandit. Maecenas sodales tempor euismod. Phasellus vulputate purus felis, eleifend ullamcorper tortor semper sit amet. Sed nunc quam, iaculis et neque sit amet, consequat egestas lectus. Aenean dapibus lorem sed accumsan porttitor. Curabitur eu magna congue, mattis urna ac, lacinia eros. In in iaculis justo, nec faucibus enim. Fusce id viverra purus, nec ultricies mi. Aliquam eu risus risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse potenti. \n' ) expect(ysWithUnlimitedLength).toBe(ysWithLineWidthGreater) expect(ysWithUnlimitedLength2).toBe(ysWithLineWidthGreater) }) }) yaml-1.10.2/tests/doc/parse.js000066400000000000000000000467171402322402300161230ustar00rootroot00000000000000import fs from 'fs' import path from 'path' import YAML from '../../index.js' describe('tags', () => { describe('implicit tags', () => { test('plain string', () => { const doc = YAML.parseDocument('foo') expect(doc.contents.tag).toBeUndefined() expect(doc.contents.value).toBe('foo') }) test('quoted string', () => { const doc = YAML.parseDocument('"foo"') expect(doc.contents.tag).toBeUndefined() expect(doc.contents.value).toBe('foo') }) test('flow map', () => { const doc = YAML.parseDocument('{ foo }') expect(doc.contents.tag).toBeUndefined() expect(doc.contents.toJSON()).toMatchObject({ foo: null }) }) test('flow seq', () => { const doc = YAML.parseDocument('[ foo ]') expect(doc.contents.tag).toBeUndefined() expect(doc.contents.toJSON()).toMatchObject(['foo']) }) test('block map', () => { const doc = YAML.parseDocument('foo:\n') expect(doc.contents.tag).toBeUndefined() expect(doc.contents.toJSON()).toMatchObject({ foo: null }) }) test('block seq', () => { const doc = YAML.parseDocument('- foo') expect(doc.contents.tag).toBeUndefined() expect(doc.contents.toJSON()).toMatchObject(['foo']) }) }) describe('explicit tags', () => { test('plain string', () => { const doc = YAML.parseDocument('!!str foo') expect(doc.contents.tag).toBe('tag:yaml.org,2002:str') expect(doc.contents.value).toBe('foo') }) test('quoted string', () => { const doc = YAML.parseDocument('!!str "foo"') expect(doc.contents.tag).toBe('tag:yaml.org,2002:str') expect(doc.contents.value).toBe('foo') }) test('flow map', () => { const doc = YAML.parseDocument('!!map { foo }') expect(doc.contents.tag).toBe('tag:yaml.org,2002:map') expect(doc.contents.toJSON()).toMatchObject({ foo: null }) }) test('flow seq', () => { const doc = YAML.parseDocument('!!seq [ foo ]') expect(doc.contents.tag).toBe('tag:yaml.org,2002:seq') expect(doc.contents.toJSON()).toMatchObject(['foo']) }) test('block map', () => { const doc = YAML.parseDocument('!!map\nfoo:\n') expect(doc.contents.tag).toBe('tag:yaml.org,2002:map') expect(doc.contents.toJSON()).toMatchObject({ foo: null }) }) test('block seq', () => { const doc = YAML.parseDocument('!!seq\n- foo') expect(doc.contents.tag).toBe('tag:yaml.org,2002:seq') expect(doc.contents.toJSON()).toMatchObject(['foo']) }) }) test('eemeli/yaml#97', () => { const doc = YAML.parseDocument('foo: !!float 3.0') expect(String(doc)).toBe('foo: !!float 3.0\n') }) }) describe('number types', () => { describe('asBigInt: false', () => { test('Version 1.1', () => { const src = ` - 0b10_10 - 0123 - -00 - 123_456 - 3.1e+2 - 5.1_2_3E-1 - 4.02 - 4.20 - .42 - 00.4` const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.contents.items).toMatchObject([ { value: 10, format: 'BIN' }, { value: 83, format: 'OCT' }, { value: -0, format: 'OCT' }, { value: 123456 }, { value: 310, format: 'EXP' }, { value: 0.5123, format: 'EXP' }, { value: 4.02 }, { value: 4.2, minFractionDigits: 2 }, { value: 0.42 }, { value: 0.4 } ]) expect(doc.contents.items[3]).not.toHaveProperty('format') expect(doc.contents.items[6]).not.toHaveProperty('format') expect(doc.contents.items[6]).not.toHaveProperty('minFractionDigits') expect(doc.contents.items[7]).not.toHaveProperty('format') }) test('Version 1.2', () => { const src = ` - 0o123 - 0o0 - 123456 - 3.1e+2 - 5.123E-1 - 4.02 - 4.20 - .42 - 00.4` const doc = YAML.parseDocument(src, { version: '1.2' }) expect(doc.contents.items).toMatchObject([ { value: 83, format: 'OCT' }, { value: 0, format: 'OCT' }, { value: 123456 }, { value: 310, format: 'EXP' }, { value: 0.5123, format: 'EXP' }, { value: 4.02 }, { value: 4.2, minFractionDigits: 2 }, { value: 0.42 }, { value: 0.4 } ]) expect(doc.contents.items[2]).not.toHaveProperty('format') expect(doc.contents.items[5]).not.toHaveProperty('format') expect(doc.contents.items[5]).not.toHaveProperty('minFractionDigits') expect(doc.contents.items[6]).not.toHaveProperty('format') }) }) describe('asBigInt: true', () => { let prevAsBigInt beforeAll(() => { prevAsBigInt = YAML.scalarOptions.int.asBigInt YAML.scalarOptions.int.asBigInt = true }) afterAll(() => { YAML.scalarOptions.int.asBigInt = prevAsBigInt }) test('Version 1.1', () => { const src = ` - 0b10_10 - 0123 - -00 - 123_456 - 3.1e+2 - 5.1_2_3E-1 - 4.02` const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.contents.items).toMatchObject([ { value: 10n, format: 'BIN' }, { value: 83n, format: 'OCT' }, { value: 0n, format: 'OCT' }, { value: 123456n }, { value: 310, format: 'EXP' }, { value: 0.5123, format: 'EXP' }, { value: 4.02 } ]) expect(doc.contents.items[3]).not.toHaveProperty('format') expect(doc.contents.items[6]).not.toHaveProperty('format') expect(doc.contents.items[6]).not.toHaveProperty('minFractionDigits') }) test('Version 1.2', () => { const src = ` - 0o123 - 0o0 - 123456 - 3.1e+2 - 5.123E-1 - 4.02` const doc = YAML.parseDocument(src, { version: '1.2' }) expect(doc.contents.items).toMatchObject([ { value: 83n, format: 'OCT' }, { value: 0n, format: 'OCT' }, { value: 123456n }, { value: 310, format: 'EXP' }, { value: 0.5123, format: 'EXP' }, { value: 4.02 } ]) expect(doc.contents.items[2]).not.toHaveProperty('format') expect(doc.contents.items[5]).not.toHaveProperty('format') expect(doc.contents.items[5]).not.toHaveProperty('minFractionDigits') }) }) }) test('eemeli/yaml#2', () => { const src = ` aliases: - docker: - image: circleci/node:8.11.2 - key: repository-{{ .Revision }}\n` expect(YAML.parse(src)).toMatchObject({ aliases: [ { docker: [{ image: 'circleci/node:8.11.2' }] }, { key: 'repository-{{ .Revision }}' } ] }) }) test('eemeli/yaml#3', () => { const src = '{ ? : 123 }' const doc = YAML.parseDocument(src) expect(doc.errors).toHaveLength(0) expect(doc.contents.items[0].key).toBeNull() expect(doc.contents.items[0].value.value).toBe(123) }) describe('eemeli/yaml#10', () => { test('reported', () => { const src = ` aliases: - restore_cache: - v1-yarn-cache - save_cache: paths: - ~/.cache/yarn - &restore_deps_cache keys: - v1-deps-cache-{{ checksum "yarn.lock" }}\n` const docs = YAML.parseAllDocuments(src) expect(docs).toHaveLength(1) expect(docs[0].errors).toHaveLength(0) }) test('complete file', () => { const src = fs.readFileSync( path.resolve(__dirname, '../artifacts/prettier-circleci-config.yml'), 'utf8' ) const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ aliases: [ { restore_cache: { keys: ['v1-yarn-cache'] } }, { save_cache: { key: 'v1-yarn-cache', paths: ['~/.cache/yarn'] } }, { restore_cache: { keys: ['v1-deps-cache-{{ checksum "yarn.lock" }}'] } }, { save_cache: { key: 'v1-yarn-deps-{{ checksum "yarn.lock" }}', paths: ['node_modules'] } }, { docker: [{ image: 'circleci/node:9' }], working_directory: '~/prettier' } ], jobs: { build_prod: { '<<': { docker: [{ image: 'circleci/node:9' }], working_directory: '~/prettier' }, environment: { NODE_ENV: 'production' }, steps: [ { attach_workspace: { at: '~/prettier' } }, { run: 'yarn build' }, { persist_to_workspace: { paths: ['dist'], root: '.' } }, { store_artifacts: { path: '~/prettier/dist' } } ] }, checkout_code: { '<<': { docker: [{ image: 'circleci/node:9' }], working_directory: '~/prettier' }, steps: [ 'checkout', { restore_cache: { keys: ['v1-yarn-cache'] } }, { restore_cache: { keys: ['v1-deps-cache-{{ checksum "yarn.lock" }}'] } }, { run: 'yarn install' }, { run: 'yarn check-deps' }, { save_cache: { key: 'v1-yarn-deps-{{ checksum "yarn.lock" }}', paths: ['node_modules'] } }, { save_cache: { key: 'v1-yarn-cache', paths: ['~/.cache/yarn'] } }, { persist_to_workspace: { paths: ['.'], root: '.' } } ] }, test_prod_node4: { '<<': { docker: [{ image: 'circleci/node:9' }], working_directory: '~/prettier' }, docker: [{ image: 'circleci/node:4' }], steps: [ { attach_workspace: { at: '~/prettier' } }, { run: 'yarn test:dist' } ] }, test_prod_node9: { '<<': { docker: [{ image: 'circleci/node:9' }], working_directory: '~/prettier' }, steps: [ { attach_workspace: { at: '~/prettier' } }, { run: 'yarn test:dist' } ] } }, version: 2, workflows: { prod: { jobs: [ 'checkout_code', { build_prod: { requires: ['checkout_code'] } }, { test_prod_node4: { requires: ['build_prod'] } }, { test_prod_node9: { requires: ['build_prod'] } } ] }, version: 2 } }) expect(String(doc)).toBe(src) }) test('minimal', () => { const src = ` - a - b: - c - d` const docs = YAML.parseAllDocuments(src) expect(docs[0].errors).toHaveLength(0) expect(docs[0].toJSON()).toMatchObject(['a', { b: ['c'] }, 'd']) }) }) describe('eemeli/yaml#l19', () => { test('map', () => { const src = 'a:\n # 123' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('? a\n\n# 123\n') }) test('seq', () => { const src = '- a: # 123' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('- ? a # 123\n') }) }) test('eemeli/yaml#32', () => { expect(YAML.parse('[ ? ]')).toEqual([{ '': null }]) expect(YAML.parse('[? 123]')).toEqual([{ 123: null }]) expect(YAML.parse('[ 123, ? ]')).toEqual([123, { '': null }]) expect(YAML.parse('[ 123, ? 456 ]')).toEqual([123, { 456: null }]) }) test('eemeli/yaml#34', () => { expect(YAML.parse('|')).toEqual('') }) test('eemeli/yaml#36', () => { expect(() => YAML.parse(`{ x: ${'x'.repeat(1024)} }`)).not.toThrowError() }) test('eemeli/yaml#38', () => { const src = ` content: arrayOfArray: - - first: John last: Black - first: Brian last: Green - - first: Mark last: Orange - - first: Adam last: Grey ` expect(YAML.parse(src)).toEqual({ content: { arrayOfArray: [ [ { first: 'John', last: 'Black' }, { first: 'Brian', last: 'Green' } ], [{ first: 'Mark', last: 'Orange' }], [{ first: 'Adam', last: 'Grey' }] ] } }) }) test('eemeli/yaml#120', () => { const src = `test: - test1: test1 test2:` expect(YAML.parse(src)).toEqual({ test: [{ test1: 'test1', test2: null }] }) }) test('comment between key & : in flow collection (eemeli/yaml#149)', () => { const src1 = '{"a"\n#c\n:1}' expect(YAML.parse(src1)).toEqual({ a: 1 }) const src2 = '{a\n#c\n:1}' expect(() => YAML.parse(src2)).toThrow( 'Indicator : missing in flow map entry' ) }) test('empty node should respect setOrigRanges()', () => { const cst = YAML.parseCST('\r\na: # 123\r\n') expect(cst).toHaveLength(1) expect(cst.setOrigRanges()).toBe(true) const doc = new YAML.Document({ keepCstNodes: true }).parse(cst[0]) const empty = doc.contents.items[0].value.cstNode expect(empty.range).toEqual({ start: 3, end: 3, origStart: 4, origEnd: 4 }) }) test('parse an empty string as null', () => { const value = YAML.parse('') expect(value).toBeNull() }) test('comment on single-line value in flow map', () => { const src = '{a: 1 #c\n}' const doc = YAML.parseDocument(src) expect(String(doc)).toBe('{\n a: 1 #c\n}\n') }) describe('maps with no values', () => { test('block map', () => { const src = `a: null\n? b #c` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(`? a\n? b #c\n`) doc.contents.items[1].value = 'x' expect(String(doc)).toBe(`a: null\n? b #c\n: x\n`) }) test('flow map', () => { const src = `{\na: null,\n? b\n}` const doc = YAML.parseDocument(src) expect(String(doc)).toBe(`{ a, b }\n`) doc.contents.items[1].comment = 'c' expect(String(doc)).toBe(`{\n a,\n b #c\n}\n`) doc.contents.items[1].value = 'x' expect(String(doc)).toBe(`{\n a: null,\n b: #c\n x\n}\n`) }) }) describe('collection item with anchor followed by empty line (#242)', () => { test('reported 1', () => { const src = ` key1: &default subkey1: value1 key2: <<: *default\n` expect(YAML.parse(src, { merge: true })).toMatchObject({ key1: { subkey1: 'value1' }, key2: { subkey1: 'value1' } }) }) test('reported 2', () => { const src = ` key1: &default # This key ... subkey1: value1 key2: <<: *default\n` expect(YAML.parse(src, { merge: true })).toMatchObject({ key1: { subkey1: 'value1' }, key2: { subkey1: 'value1' } }) }) test('reported 3', () => { const src = ` key1: &default # This key ... subkey1: value1 key2: <<: *default\n` expect(YAML.parse(src, { merge: true })).toMatchObject({ key1: { subkey1: 'value1' }, key2: { subkey1: 'value1' } }) }) test('minimal with anchor', () => { const src = '- &a\n\n foo' expect(YAML.parse(src)).toMatchObject(['foo']) }) test('minimal with tag', () => { const src = '- !!str\n\n foo' expect(YAML.parse(src)).toMatchObject(['foo']) }) }) describe('Excessive entity expansion attacks', () => { const root = path.resolve(__dirname, '../artifacts/pr104') const src1 = fs.readFileSync(path.resolve(root, 'case1.yml'), 'utf8') const src2 = fs.readFileSync(path.resolve(root, 'case2.yml'), 'utf8') const srcB = fs.readFileSync(path.resolve(root, 'billion-laughs.yml'), 'utf8') const srcQ = fs.readFileSync(path.resolve(root, 'quadratic.yml'), 'utf8') let origEmitWarning beforeAll(() => { origEmitWarning = process.emitWarning }) afterAll(() => { process.emitWarning = origEmitWarning }) describe('Limit count by default', () => { for (const [name, src] of [ ['js-yaml case 1', src1], ['js-yaml case 2', src2], ['billion laughs', srcB], ['quadratic expansion', srcQ] ]) { test(name, () => { process.emitWarning = jest.fn() expect(() => YAML.parse(src)).toThrow(/Excessive alias count/) }) } }) describe('Work sensibly even with disabled limits', () => { test('js-yaml case 1', () => { process.emitWarning = jest.fn() const obj = YAML.parse(src1, { maxAliasCount: -1 }) expect(obj).toMatchObject({}) const key = Object.keys(obj)[0] expect(key.length).toBeGreaterThan(2000) expect(key.length).toBeLessThan(8000) expect(process.emitWarning).toHaveBeenCalled() }) test('js-yaml case 2', () => { const arr = YAML.parse(src2, { maxAliasCount: -1 }) expect(arr).toHaveLength(2) const key = Object.keys(arr[1])[0] expect(key).toBe('*id057') }) test('billion laughs', () => { const obj = YAML.parse(srcB, { maxAliasCount: -1 }) expect(Object.keys(obj)).toHaveLength(9) }) test('quadratic expansion', () => { const obj = YAML.parse(srcQ, { maxAliasCount: -1 }) expect(Object.keys(obj)).toHaveLength(11) }) }) describe('maxAliasCount limits', () => { const rows = [ 'a: &a [lol, lol, lol, lol, lol, lol, lol, lol, lol]', 'b: &b [*a, *a, *a, *a, *a, *a, *a, *a, *a]', 'c: &c [*b, *b, *b, *b]', 'd: &d [*c, *c]', 'e: [*d]' ] test(`depth 0: maxAliasCount 1 passes`, () => { expect(() => YAML.parse(rows[0], { maxAliasCount: 1 })).not.toThrow() }) test(`depth 1: maxAliasCount 1 fails on first alias`, () => { const src = `${rows[0]}\nb: *a` expect(() => YAML.parse(src, { maxAliasCount: 1 })).toThrow() }) const limits = [10, 50, 150, 300] for (let i = 0; i < 4; ++i) { const src = rows.slice(0, i + 2).join('\n') test(`depth ${i + 1}: maxAliasCount ${limits[i] - 1} fails`, () => { expect(() => YAML.parse(src, { maxAliasCount: limits[i] - 1 }) ).toThrow() }) test(`depth ${i + 1}: maxAliasCount ${limits[i]} passes`, () => { expect(() => YAML.parse(src, { maxAliasCount: limits[i] }) ).not.toThrow() }) } }) }) test('Anchor for empty node (6KGN)', () => { const src = `a: &anchor\nb: *anchor` expect(YAML.parse(src)).toMatchObject({ a: null, b: null }) }) describe('handling complex keys', () => { let origEmitWarning beforeAll(() => { origEmitWarning = process.emitWarning }) afterAll(() => { process.emitWarning = origEmitWarning }) test('add warning to doc when casting key in collection to string', () => { const doc = YAML.parseDocument('[foo]: bar') const message = 'Keys with collection values will be stringified as YAML due to JS Object restrictions. Use mapAsMap: true to avoid this.' expect(doc.warnings).toMatchObject([{ message }]) }) test('do not add warning when using mapIsMap: true', () => { const doc = YAML.parseDocument('[foo]: bar', { mapAsMap: true }) expect(doc.warnings).toMatchObject([]) }) test('warn when casting key in collection to string', () => { process.emitWarning = jest.fn() const obj = YAML.parse('[foo]: bar') expect(Object.keys(obj)).toMatchObject(['[ foo ]']) expect(process.emitWarning).toHaveBeenCalled() }) test('warn when casting key in sequence to string', () => { process.emitWarning = jest.fn() const obj = YAML.parse('[ [foo]: bar ]') expect(obj).toMatchObject([{ '[ foo ]': 'bar' }]) expect(process.emitWarning).toHaveBeenCalled() }) }) test('Document.toJSON(null, onAnchor)', () => { const src = 'foo: &a [&v foo]\nbar: *a\nbaz: *a\n' const doc = YAML.parseDocument(src) const onAnchor = jest.fn() const res = doc.toJSON(null, onAnchor) expect(onAnchor.mock.calls).toMatchObject([ [res.foo, 3], ['foo', 1] ]) }) describe('__proto__ as mapping key', () => { test('plain object', () => { const src = '{ __proto__: [42] }' const obj = YAML.parse(src) expect(Array.isArray(obj)).toBe(false) expect(obj.hasOwnProperty('__proto__')).toBe(true) expect(obj).not.toHaveProperty('length') expect(JSON.stringify(obj)).toBe('{"__proto__":[42]}') }) test('with merge key', () => { const src = '- &A { __proto__: [42] }\n- { <<: *A }\n' const obj = YAML.parse(src, { merge: true }) expect(obj[0].hasOwnProperty('__proto__')).toBe(true) expect(obj[1].hasOwnProperty('__proto__')).toBe(true) expect(JSON.stringify(obj)).toBe('[{"__proto__":[42]},{"__proto__":[42]}]') }) }) yaml-1.10.2/tests/doc/stringify.js000066400000000000000000000451411402322402300170150ustar00rootroot00000000000000/* global BigInt */ import { source } from 'common-tags' import YAML from '../../index.js' import { Pair } from '../../types.js' import { Type, stringifyString } from '../../util.js' for (const [name, version] of [ ['YAML 1.1', '1.1'], ['YAML 1.2', '1.2'] ]) { describe(name, () => { let origVersion beforeAll(() => { origVersion = YAML.defaultOptions.version YAML.defaultOptions.version = version }) afterAll(() => { YAML.defaultOptions.version = origVersion }) test('undefined', () => { expect(YAML.stringify()).toBe('\n') }) test('null', () => { expect(YAML.stringify(null)).toBe('null\n') }) describe('boolean', () => { test('true', () => { expect(YAML.stringify(true)).toBe('true\n') }) test('false', () => { expect(YAML.stringify(false)).toBe('false\n') }) }) describe('number', () => { test('integer', () => { expect(YAML.stringify(3)).toBe('3\n') }) test('float', () => { expect(YAML.stringify(3.141)).toBe('3.141\n') }) test('zero', () => { expect(YAML.stringify(0)).toBe('0\n') }) test('NaN', () => { expect(YAML.stringify(NaN)).toBe('.nan\n') }) test('float with trailing zeros', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(3, true) doc.contents.minFractionDigits = 2 expect(String(doc)).toBe('3.00\n') }) test('scientific float ignores minFractionDigits', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(3, true) doc.contents.format = 'EXP' doc.contents.minFractionDigits = 2 expect(String(doc)).toBe('3e+0\n') }) test('integer with HEX format', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(42, true) doc.contents.format = 'HEX' expect(String(doc)).toBe('0x2a\n') }) test('float with HEX format', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(4.2, true) doc.contents.format = 'HEX' expect(String(doc)).toBe('4.2\n') }) test('negative integer with HEX format', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(-42, true) doc.contents.format = 'HEX' const exp = version === '1.2' ? '-42\n' : '-0x2a\n' expect(String(doc)).toBe(exp) }) test('BigInt', () => { expect(YAML.stringify(BigInt('-42'))).toBe('-42\n') }) test('BigInt with HEX format', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(BigInt('42'), true) doc.contents.format = 'HEX' expect(String(doc)).toBe('0x2a\n') }) test('BigInt with OCT format', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(BigInt('42'), true) doc.contents.format = 'OCT' const exp = version === '1.2' ? '0o52\n' : '052\n' expect(String(doc)).toBe(exp) }) test('negative BigInt with OCT format', () => { const doc = new YAML.Document() doc.contents = YAML.createNode(BigInt('-42'), true) doc.contents.format = 'OCT' const exp = version === '1.2' ? '-42\n' : '-052\n' expect(String(doc)).toBe(exp) }) }) describe('string', () => { let origFoldOptions beforeAll(() => { origFoldOptions = YAML.scalarOptions.str.fold YAML.scalarOptions.str.fold = { lineWidth: 20, minContentWidth: 0 } }) afterAll(() => { YAML.scalarOptions.str.fold = origFoldOptions }) test('plain', () => { expect(YAML.stringify('STR')).toBe('STR\n') }) test('double-quoted', () => { expect(YAML.stringify('"x"')).toBe('\'"x"\'\n') }) test('single-quoted', () => { expect(YAML.stringify("'x'")).toBe('"\'x\'"\n') }) test('escaped', () => { expect(YAML.stringify('null: \u0000')).toBe('"null: \\0"\n') }) test('short multiline', () => { expect(YAML.stringify('blah\nblah\nblah')).toBe( '|-\nblah\nblah\nblah\n' ) }) test('long multiline', () => { expect( YAML.stringify( 'blah blah\nblah blah blah blah blah blah blah blah blah blah\n' ) ).toBe(`> blah blah blah blah blah blah blah blah blah blah blah blah\n`) }) test('long line in map', () => { const foo = 'fuzz'.repeat(16) const doc = new YAML.Document() doc.contents = YAML.createNode({ foo }) for (const node of doc.contents.items) node.value.type = Type.QUOTE_DOUBLE expect( String(doc) .split('\n') .map(line => line.length) ).toMatchObject([20, 20, 20, 20, 0]) }) test('long line in sequence', () => { const foo = 'fuzz'.repeat(16) const doc = new YAML.Document() doc.contents = YAML.createNode([foo]) for (const node of doc.contents.items) node.type = Type.QUOTE_DOUBLE expect( String(doc) .split('\n') .map(line => line.length) ).toMatchObject([20, 20, 20, 17, 0]) }) test('long line in sequence in map', () => { const foo = 'fuzz'.repeat(16) const doc = new YAML.Document() doc.contents = YAML.createNode({ foo: [foo] }) const seq = doc.contents.items[0].value for (const node of seq.items) node.type = Type.QUOTE_DOUBLE expect( String(doc) .split('\n') .map(line => line.length) ).toMatchObject([4, 20, 20, 20, 20, 10, 0]) }) }) }) } describe('timestamp-like string (YAML 1.1)', () => { for (const [name, str] of [ ['canonical', '2001-12-15T02:59:43.1Z'], ['validIso8601', '2001-12-14t21:59:43.10-05:00'], ['spaceSeparated', '2001-12-14 21:59:43.10 -5'], ['noTimeZone', '2001-12-15 2:59:43.10'] ]) { test(name, () => { const res = YAML.stringify(str, { version: '1.1' }) expect(res).toBe(`"${str}"\n`) expect(YAML.parse(res, { version: '1.1' })).toBe(str) }) } }) describe('circular references', () => { test('parent at root', () => { const map = { foo: 'bar' } map.map = map expect(YAML.stringify(map)).toBe(`&a1 foo: bar map: *a1\n`) }) test('ancestor at root', () => { const baz = {} const map = { foo: { bar: { baz } } } baz.map = map expect(YAML.stringify(map)).toBe(`&a1 foo: bar: baz: map: *a1\n`) }) test('sibling sequences', () => { const one = ['one'] const two = ['two'] const seq = [one, two, one, one, two] expect(YAML.stringify(seq)).toBe(`- &a1 - one - &a2 - two - *a1 - *a1 - *a2\n`) }) test('further relatives', () => { const baz = { a: 1 } const seq = [{ foo: { bar: { baz } } }, { fe: { fi: { fo: { baz } } } }] expect(YAML.stringify(seq)).toBe(`- foo: bar: baz: &a1 a: 1 - fe: fi: fo: baz: *a1\n`) }) test('only match objects', () => { const date = new Date('2001-12-15T02:59:43.1Z') const seq = ['a', 'a', 1, 1, true, true, date, date] expect(YAML.stringify(seq, { anchorPrefix: 'foo', version: '1.1' })) .toBe(`- a - a - 1 - 1 - true - true - &foo1 2001-12-15T02:59:43.100Z - *foo1\n`) }) test('do not match nulls', () => { const set = { a: null, b: null } expect(YAML.stringify(set)).toBe('? a\n? b\n') }) }) test('array', () => { const array = [3, ['four', 5]] const str = YAML.stringify(array) expect(str).toBe( `- 3 - - four - 5\n` ) }) describe('maps', () => { test('JS Object', () => { const object = { x: 3, y: [4], z: { w: 'five', v: 6 } } const str = YAML.stringify(object) expect(str).toBe( `x: 3 y: - 4 z: w: five v: 6\n` ) }) test('Map with non-Pair item', () => { const doc = new YAML.Document() doc.contents = YAML.createNode({ x: 3, y: 4 }) expect(String(doc)).toBe('x: 3\ny: 4\n') doc.contents.items.push('TEST') expect(() => String(doc)).toThrow(/^Map items must all be pairs.*TEST/) }) test('Keep block scalar types for keys', () => { const doc = YAML.parseDocument('? >+ #comment\n foo\n\n: bar') expect(String(doc)).toBe('? >+ #comment\n foo\n\n: bar\n') }) test('Document as key', () => { const doc1 = new YAML.Document() doc1.contents = YAML.createNode({ a: 1 }) const doc2 = new YAML.Document() doc2.contents = YAML.createNode({ b: 2, c: 3 }) doc1.add(doc2) expect(String(doc1)).toBe('a: 1\n? b: 2\n c: 3\n: null\n') }) }) test('eemeli/yaml#43: Quoting colons', () => { const doc = new YAML.Document() doc.contents = YAML.createNode({ key: ':' }) const str = String(doc) expect(() => YAML.parse(str)).not.toThrow() expect(str).toBe('key: ":"\n') }) test('eemeli/yaml#52: Quoting item markers', () => { const doc = new YAML.Document() doc.contents = YAML.createNode({ key: '-' }) const str = String(doc) expect(() => YAML.parse(str)).not.toThrow() expect(str).toBe('key: "-"\n') doc.contents = YAML.createNode({ key: '?' }) const str2 = String(doc) expect(() => YAML.parse(str2)).not.toThrow() expect(str2).toBe('key: "?"\n') }) describe('eemeli/yaml#80: custom tags', () => { const regexp = { identify: value => value instanceof RegExp, tag: '!re', resolve(doc, cst) { const match = cst.strValue.match(/^\/([\s\S]+)\/([gimuy]*)$/) return new RegExp(match[1], match[2]) } } const sharedSymbol = { identify: value => value.constructor === Symbol, tag: '!symbol/shared', resolve: (doc, cst) => Symbol.for(cst.strValue), stringify(item, ctx, onComment, onChompKeep) { const key = Symbol.keyFor(item.value) if (key === undefined) throw new Error('Only shared symbols are supported') return stringifyString({ value: key }, ctx, onComment, onChompKeep) } } beforeAll(() => { YAML.defaultOptions.customTags = [regexp, sharedSymbol] }) afterAll(() => { YAML.defaultOptions.customTags = [] }) describe('RegExp', () => { test('stringify as plain scalar', () => { const str = YAML.stringify(/re/g) expect(str).toBe('!re /re/g\n') const res = YAML.parse(str) expect(res).toBeInstanceOf(RegExp) }) test('stringify as quoted scalar', () => { const str = YAML.stringify(/re: /g) expect(str).toBe('!re "/re: /g"\n') const res = YAML.parse(str) expect(res).toBeInstanceOf(RegExp) }) test('parse plain string as string', () => { const res = YAML.parse('/re/g') expect(res).toBe('/re/g') }) test('parse quoted string as string', () => { const res = YAML.parse('"/re/g"') expect(res).toBe('/re/g') }) }) describe('Symbol', () => { test('stringify as plain scalar', () => { const symbol = Symbol.for('foo') const str = YAML.stringify(symbol) expect(str).toBe('!symbol/shared foo\n') const res = YAML.parse(str) expect(res).toBe(symbol) }) test('stringify as block scalar', () => { const symbol = Symbol.for('foo\nbar') const str = YAML.stringify(symbol) expect(str).toBe('!symbol/shared |-\nfoo\nbar\n') const res = YAML.parse(str) expect(res).toBe(symbol) }) }) }) test('reserved names', () => { const str = YAML.stringify({ comment: 'foo' }) expect(str).toBe('comment: foo\n') }) describe('eemeli/yaml#85', () => { test('reported', () => { const str = `testArray: []\ntestObject: {}\ntestArray2: [ "hello" ]\n` const doc = YAML.parseDocument(str) expect(String(doc)).toBe(str) }) test('multiline flow collection', () => { const str = `foo: [ bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar, bar ]` const doc = YAML.parseDocument(str) const str2 = String(doc) expect(str2).toMatch(/^foo:\n {2}\[\n {4}bar/) expect(YAML.parse(str2)).toMatchObject(doc.toJSON()) }) }) test('eemeli/yaml#87', () => { const doc = YAML.parseDocument('test: x') doc.set('test', { a: 'test' }) expect(String(doc)).toBe('test:\n a: test\n') }) describe('simple keys', () => { test('key with null value', () => { const doc = YAML.parseDocument('~: ~') expect(String(doc)).toBe('? null\n') doc.options.simpleKeys = true expect(String(doc)).toBe('null: null\n') }) test('key with block scalar value', () => { const doc = YAML.parseDocument('foo: bar') doc.contents.items[0].key.type = 'BLOCK_LITERAL' expect(String(doc)).toBe('? |-\n foo\n: bar\n') doc.options.simpleKeys = true expect(String(doc)).toBe('"foo": bar\n') }) test('key with comment', () => { const doc = YAML.parseDocument('foo: bar') doc.contents.items[0].key.comment = 'FOO' expect(String(doc)).toBe('? foo #FOO\n: bar\n') doc.options.simpleKeys = true expect(() => String(doc)).toThrow( /With simple keys, key nodes cannot have comments/ ) }) test('key with collection value', () => { const doc = YAML.parseDocument('[foo]: bar') expect(String(doc)).toBe('? [ foo ]\n: bar\n') doc.options.simpleKeys = true expect(() => String(doc)).toThrow( /With simple keys, collection cannot be used as a key value/ ) }) test('key value lingth > 1024', () => { let str = ` ? ${new Array(1026).join('a')} : longkey` const doc = YAML.parseDocument(str) expect(String(doc)).toBe(`? ${new Array(1026).join('a')}\n: longkey\n`) doc.options.simpleKeys = true expect(() => String(doc)).toThrow( /With simple keys, single line scalar must not span more than 1024 characters/ ) }) }) test('eemeli/yaml#128: YAML node inside object', () => { const seq = YAML.createNode(['a']) seq.commentBefore = 'sc' const map = YAML.createNode({ foo: 'bar', seq }) map.commentBefore = 'mc' const obj = { array: [1], map } expect(YAML.stringify(obj)).toBe( source` array: - 1 map: #mc foo: bar seq: #sc - a ` + '\n' ) }) describe('sortMapEntries', () => { const obj = { b: 2, a: 1, c: 3 } test('sortMapEntries: undefined', () => { expect(YAML.stringify(obj)).toBe('b: 2\na: 1\nc: 3\n') }) test('sortMapEntries: true', () => { expect(YAML.stringify(obj, { sortMapEntries: true })).toBe( 'a: 1\nb: 2\nc: 3\n' ) }) test('sortMapEntries: function', () => { const sortMapEntries = (a, b) => a.key < b.key ? 1 : a.key > b.key ? -1 : 0 expect(YAML.stringify(obj, { sortMapEntries })).toBe('c: 3\nb: 2\na: 1\n') }) test('doc.add', () => { const doc = new YAML.Document({ sortMapEntries: true }) doc.setSchema() doc.contents = doc.schema.createNode(obj) doc.add(new Pair('bb', 4)) expect(String(doc)).toBe('a: 1\nb: 2\nbb: 4\nc: 3\n') }) test('doc.set', () => { const doc = new YAML.Document({ sortMapEntries: true }) doc.setSchema() doc.contents = doc.schema.createNode(obj) doc.set('bb', 4) expect(String(doc)).toBe('a: 1\nb: 2\nbb: 4\nc: 3\n') }) }) describe('custom indent', () => { let obj beforeEach(() => { const seq = YAML.createNode(['a']) seq.commentBefore = 'sc' const map = YAML.createNode({ foo: 'bar', seq }) map.commentBefore = 'mc' obj = { array: [{ a: 1, b: 2 }], map } }) test('indent: 0', () => { expect(() => YAML.stringify(obj, { indent: 0 })).toThrow( /must be a positive integer/ ) }) test('indent: 1', () => { expect(YAML.stringify(obj, { indent: 1 })).toBe( source` array: - a: 1 b: 2 map: #mc foo: bar seq: #sc - a ` + '\n' ) }) test('indent: 4', () => { expect(YAML.stringify(obj, { indent: 4 })).toBe( source` array: - a: 1 b: 2 map: #mc foo: bar seq: #sc - a ` + '\n' ) }) }) describe('indentSeq: false', () => { let obj beforeEach(() => { const seq = YAML.createNode(['a']) seq.commentBefore = 'sc' obj = { array: [{ a: 1, b: 2 }], map: { seq } } }) test('indent: 1', () => { expect(YAML.stringify(obj, { indent: 1, indentSeq: false })).toBe( source` array: - a: 1 b: 2 map: seq: #sc - a ` + '\n' ) }) test('indent: 2', () => { expect(YAML.stringify(obj, { indent: 2, indentSeq: false })).toBe( source` array: - a: 1 b: 2 map: seq: #sc - a ` + '\n' ) }) test('indent: 4', () => { expect(YAML.stringify(obj, { indent: 4, indentSeq: false })).toBe( source` array: - a: 1 b: 2 map: seq: #sc - a ` + '\n' ) }) }) describe('Document markers in top-level scalars', () => { let origDoubleQuotedOptions beforeAll(() => { origDoubleQuotedOptions = YAML.scalarOptions.str.doubleQuoted YAML.scalarOptions.str.doubleQuoted = { jsonEncoding: false, minMultiLineLength: 0 } }) afterAll(() => { YAML.scalarOptions.str.doubleQuoted = origDoubleQuotedOptions }) test('---', () => { const str = YAML.stringify('---') expect(str).toBe('|-\n ---\n') expect(YAML.parse(str)).toBe('---') }) test('...', () => { const str = YAML.stringify('...') expect(str).toBe('|-\n ...\n') expect(YAML.parse(str)).toBe('...') }) test('foo\\n...\\n', () => { const str = YAML.stringify('foo\n...\n') expect(str).toBe('|\n foo\n ...\n') expect(YAML.parse(str)).toBe('foo\n...\n') }) test("'foo\\n...'", () => { const doc = new YAML.Document() doc.contents = YAML.createNode('foo\n...', true) doc.contents.type = Type.QUOTE_SINGLE const str = String(doc) expect(str).toBe("'foo\n\n ...'\n") expect(YAML.parse(str)).toBe('foo\n...') }) test('"foo\\n..."', () => { const doc = new YAML.Document() doc.contents = YAML.createNode('foo\n...', true) doc.contents.type = Type.QUOTE_DOUBLE const str = String(doc) expect(str).toBe('"foo\n\n ..."\n') expect(YAML.parse(str)).toBe('foo\n...') }) test('foo\\n%bar\\n', () => { const str = YAML.stringify('foo\n%bar\n') expect(str).toBe('|\n foo\n %bar\n') expect(YAML.parse(str)).toBe('foo\n%bar\n') }) }) describe('YAML.stringify on ast Document', () => { test('null document', () => { const doc = YAML.parseDocument('null') expect(YAML.stringify(doc)).toBe('null\n') }) }) yaml-1.10.2/tests/doc/types.js000066400000000000000000000504441402322402300161450ustar00rootroot00000000000000import { YAML } from '../../src/index.js' import { Scalar, YAMLSeq } from '../../src/ast/index.js' import { binary } from '../../src/tags/yaml-1.1/binary.js' import { YAMLOMap } from '../../src/tags/yaml-1.1/omap.js' import { YAMLSet } from '../../src/tags/yaml-1.1/set.js' let origFoldOptions beforeAll(() => { origFoldOptions = YAML.scalarOptions.str.fold YAML.scalarOptions.str.fold = { lineWidth: 20, minContentWidth: 0 } }) afterAll(() => { YAML.scalarOptions.str.fold = origFoldOptions }) describe('json schema', () => { test('!!bool', () => { const src = `"canonical": true "answer": false "logical": True "option": TruE` const doc = YAML.parseDocument(src, { schema: 'json' }) expect(doc.toJSON()).toMatchObject({ canonical: true, answer: false, logical: null, option: null }) expect(doc.errors).toHaveLength(2) doc.errors = [] doc.contents.items.splice(2, 2) expect(String(doc)).toBe('"canonical": true\n"answer": false\n') }) test('!!float', () => { const src = `"canonical": 6.8523015e+5 "fixed": 685230.15 "negative infinity": -.inf "not a number": .NaN` const doc = YAML.parseDocument(src, { schema: 'json' }) expect(doc.toJSON()).toMatchObject({ canonical: 685230.15, fixed: 685230.15, 'negative infinity': null, 'not a number': null }) expect(doc.errors).toHaveLength(2) doc.errors = [] doc.contents.items.splice(2, 2) doc.contents.items[1].value.tag = 'tag:yaml.org,2002:float' expect(String(doc)).toBe( '"canonical": 685230.15\n"fixed": !!float 685230.15\n' ) }) test('!!int', () => { const src = `"canonical": 685230 "decimal": -685230 "octal": 0o2472256 "hexadecimal": 0x0A74AE` const doc = YAML.parseDocument(src, { schema: 'json' }) expect(doc.toJSON()).toMatchObject({ canonical: 685230, decimal: -685230, octal: null, hexadecimal: null }) expect(doc.errors).toHaveLength(2) doc.errors = [] doc.contents.items.splice(2, 2) doc.set('bigint', 42n) expect(String(doc)).toBe( '"canonical": 685230\n"decimal": -685230\n"bigint": 42\n' ) }) test('!!null', () => { const src = `"empty": "canonical": ~ "english": null ~: 'null key'` const doc = YAML.parseDocument(src, { schema: 'json' }) expect(doc.toJSON()).toMatchObject({ empty: null, canonical: null, english: null, '': 'null key' }) expect(doc.errors).toHaveLength(2) doc.errors = [] expect(String(doc)).toBe( '"empty": null\n"canonical": null\n"english": null\n? null\n: "null key"\n' ) }) }) describe('core schema', () => { test('!!bool', () => { const src = `canonical: true answer: FALSE logical: True option: TruE\n` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ canonical: true, answer: false, logical: true, option: 'TruE' }) expect(String(doc)).toBe(`canonical: true answer: false logical: true option: TruE\n`) }) test('!!float', () => { const src = `canonical: 6.8523015e+5 fixed: 685230.15 negative infinity: -.inf not a number: .NaN` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ canonical: 685230.15, fixed: 685230.15, 'negative infinity': Number.NEGATIVE_INFINITY, 'not a number': NaN }) expect(String(doc)).toBe(`canonical: 6.8523015e+5 fixed: 685230.15 negative infinity: -.inf not a number: .nan\n`) }) test('!!int', () => { const src = `canonical: 685230 decimal: +685230 octal: 0o2472256 hexadecimal: 0x0A74AE` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ canonical: 685230, decimal: 685230, octal: 685230, hexadecimal: 685230 }) expect(String(doc)).toBe(`canonical: 685230 decimal: 685230 octal: 0o2472256 hexadecimal: 0xa74ae\n`) }) test('!!null', () => { const src = `empty: canonical: ~ english: null ~: null key` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ empty: null, canonical: null, english: null, '': 'null key' }) expect(String(doc)).toBe(`empty: null canonical: null english: null null: null key\n`) }) describe('!!map', () => { test('mapAsMap: false', () => { const src = ` one: 1 2: two { 3: 4 }: many\n` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ one: 1, 2: 'two', '{ 3: 4 }': 'many' }) expect(doc.errors).toHaveLength(0) doc.contents.items[2].key = { 3: 4 } expect(doc.toJSON()).toMatchObject({ one: 1, 2: 'two', '{"3":4}': 'many' }) }) test('mapAsMap: true', () => { const src = ` one: 1 2: two { 3: 4 }: many\n` const doc = YAML.parseDocument(src, { mapAsMap: true }) expect(doc.toJSON()).toMatchObject( new Map([ ['one', 1], [2, 'two'], [new Map([[3, 4]]), 'many'] ]) ) expect(doc.errors).toHaveLength(0) doc.contents.items[2].key = { 3: 4 } expect(doc.toJSON()).toMatchObject( new Map([ ['one', 1], [2, 'two'], [{ 3: 4 }, 'many'] ]) ) }) }) }) describe('YAML 1.1 schema', () => { test('!!binary', () => { const src = `canonical: !!binary "\\ R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\\ OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\\ +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\\ AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=" generic: !!binary | R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= description: The binary value above is a tiny arrow encoded as a gif image.` const doc = YAML.parseDocument(src, { schema: 'yaml-1.1' }) const canonical = doc.contents.items[0].value.value const generic = doc.contents.items[1].value.value expect(canonical).toBeInstanceOf(Uint8Array) expect(generic).toBeInstanceOf(Uint8Array) expect(canonical).toHaveLength(185) expect(generic).toHaveLength(185) let canonicalStr = '' let genericStr = '' for (let i = 0; i < canonical.length; ++i) canonicalStr += String.fromCharCode(canonical[i]) for (let i = 0; i < generic.length; ++i) genericStr += String.fromCharCode(generic[i]) expect(canonicalStr).toBe(genericStr) expect(canonicalStr.substr(0, 5)).toBe('GIF89') YAML.scalarOptions.str.fold.lineWidth = 80 expect(String(doc)) .toBe(`canonical: !!binary "R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J\\ +fn5OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/\\ ++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BN\\ JHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=" generic: !!binary |- R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlp aWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++SH+Dk1h ZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYN G84BwwEeECcgggoBADs= description: The binary value above is a tiny arrow encoded as a gif image.\n`) YAML.scalarOptions.str.fold.lineWidth = 20 }) test('!!bool', () => { const src = ` canonical: y answer: NO logical: True option: on` const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.toJSON()).toMatchObject({ canonical: true, answer: false, logical: true, option: true }) expect(String(doc)).toBe(`canonical: true answer: false logical: true option: true\n`) }) test('!!float', () => { const src = `%YAML 1.1 --- canonical: 6.8523015e+5 exponential: 685.230_15e+03 fixed: 685_230.15 sexagesimal: 190:20:30.15 negative infinity: -.inf not a number: .NaN` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ canonical: 685230.15, exponential: 685230.15, fixed: 685230.15, sexagesimal: 685230.15, 'negative infinity': Number.NEGATIVE_INFINITY, 'not a number': NaN }) expect(String(doc)).toBe(`%YAML 1.1 --- canonical: 6.8523015e+5 exponential: 6.8523015e+5 fixed: 685230.15 sexagesimal: 190:20:30.15 negative infinity: -.inf not a number: .nan\n`) }) test('!!int', () => { const src = `%YAML 1.1 --- canonical: 685230 decimal: +685_230 octal: 02472256 hexadecimal: 0x_0A_74_AE binary: 0b1010_0111_0100_1010_1110 sexagesimal: 190:20:30` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ canonical: 685230, decimal: 685230, octal: 685230, hexadecimal: 685230, binary: 685230, sexagesimal: 685230 }) expect(String(doc)).toBe(`%YAML 1.1 --- canonical: 685230 decimal: 685230 octal: 02472256 hexadecimal: 0xa74ae binary: 0b10100111010010101110 sexagesimal: 190:20:30\n`) }) test('!!null', () => { const src = `%YAML 1.1 --- empty: canonical: ~ english: null ~: null key` const doc = YAML.parseDocument(src) expect(doc.toJSON()).toMatchObject({ empty: null, canonical: null, english: null, '': 'null key' }) expect(String(doc)).toBe(`%YAML 1.1 --- empty: null canonical: null english: null null: null key\n`) }) describe('!!timestamp', () => { test('parse & document', () => { const src = `%YAML 1.1 --- canonical: 2001-12-15T02:59:43.1Z valid iso8601: 2001-12-14t21:59:43.10-05:00 space separated: 2001-12-14 21:59:43.10 -5 no time zone (Z): 2001-12-15 2:59:43.10 date (00:00:00Z): 2002-12-14` const doc = YAML.parseDocument(src, { keepBlobsInJSON: false }) doc.contents.items.forEach(item => { expect(item.value.value).toBeInstanceOf(Date) }) expect(doc.toJSON()).toMatchObject({ canonical: '2001-12-15T02:59:43.100Z', 'valid iso8601': '2001-12-15T02:59:43.100Z', 'space separated': '2001-12-15T02:59:43.100Z', 'no time zone (Z)': '2001-12-15T02:59:43.100Z', 'date (00:00:00Z)': '2002-12-14T00:00:00.000Z' }) expect(String(doc)).toBe(`%YAML 1.1 --- canonical: 2001-12-15T02:59:43.100Z valid iso8601: 2001-12-15T02:59:43.100Z space separated: 2001-12-15T02:59:43.100Z no time zone (Z): 2001-12-15T02:59:43.100Z date (00:00:00Z): 2002-12-14\n`) }) test('stringify', () => { const date = new Date('2018-12-22T08:02:52Z') const str = YAML.stringify(date) // stringified as !!str expect(str).toBe('2018-12-22T08:02:52.000Z\n') const str2 = YAML.stringify(date, { version: '1.1' }) expect(str2).toBe('2018-12-22T08:02:52\n') }) }) describe('!!pairs', () => { for (const { name, src } of [ { name: 'parse block seq', src: `!!pairs\n- a: 1\n- b: 2\n- a: 3\n` }, { name: 'parse flow seq', src: `!!pairs [ a: 1, b: 2, a: 3 ]\n` } ]) test(name, () => { const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.contents).toBeInstanceOf(YAMLSeq) expect(doc.contents.items).toMatchObject([ { key: { value: 'a' }, value: { value: 1 } }, { key: { value: 'b' }, value: { value: 2 } }, { key: { value: 'a' }, value: { value: 3 } } ]) expect(doc.toJSON()).toBeInstanceOf(Array) expect(doc.toJSON()).toMatchObject([{ a: 1 }, { b: 2 }, { a: 3 }]) expect(String(doc)).toBe(src) }) test('stringify', () => { const doc = new YAML.Document({ version: '1.1' }) doc.setSchema() doc.contents = doc.schema.createNode( [ ['a', 1], ['b', 2], ['a', 3] ], false, '!!pairs' ) expect(doc.contents.tag).toBe('tag:yaml.org,2002:pairs') expect(String(doc)).toBe(`!!pairs\n- a: 1\n- b: 2\n- a: 3\n`) }) }) describe('!!omap', () => { for (const { name, src } of [ { name: 'parse block seq', src: `!!omap\n- a: 1\n- b: 2\n- c: 3\n` }, { name: 'parse flow seq', src: `!!omap [ a: 1, b: 2, c: 3 ]\n` } ]) test(name, () => { const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.contents).toBeInstanceOf(YAMLOMap) expect(doc.toJSON()).toBeInstanceOf(Map) expect(doc.toJSON()).toMatchObject( new Map([ ['a', 1], ['b', 2], ['c', 3] ]) ) expect(String(doc)).toBe(src) }) test('require unique keys', () => { const src = `!!omap\n- a: 1\n- b: 2\n- b: 9\n` const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', message: 'Ordered maps must not include duplicate keys' } ]) }) test('stringify Map', () => { const map = new Map([ ['a', 1], ['b', 2], ['c', 3] ]) const str = YAML.stringify(map, { version: '1.1' }) expect(str).toBe(`!!omap\n- a: 1\n- b: 2\n- c: 3\n`) const str2 = YAML.stringify(map) expect(str2).toBe(`a: 1\nb: 2\nc: 3\n`) }) test('stringify Array', () => { const doc = new YAML.Document({ version: '1.1' }) doc.setSchema() doc.contents = doc.schema.createNode( [ ['a', 1], ['b', 2], ['a', 3] ], false, '!!omap' ) expect(doc.contents).toBeInstanceOf(YAMLOMap) expect(String(doc)).toBe(`!!omap\n- a: 1\n- b: 2\n- a: 3\n`) }) }) describe('!!set', () => { for (const { name, src } of [ { name: 'parse block map', src: `!!set\n? a\n? b\n? c\n` }, { name: 'parse flow map', src: `!!set { a, b, c }\n` } ]) test(name, () => { const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.contents).toBeInstanceOf(YAMLSet) expect(doc.toJSON()).toBeInstanceOf(Set) expect(doc.toJSON()).toMatchObject(new Set(['a', 'b', 'c'])) expect(String(doc)).toBe(src) }) test('require null values', () => { const src = `!!set\n? a\n? b\nc: d\n` const doc = YAML.parseDocument(src, { version: '1.1' }) expect(doc.errors).toMatchObject([ { name: 'YAMLSemanticError', message: 'Set items must all have null values' } ]) }) test('stringify', () => { const set = new Set(['a', 'b', 'c']) const str = YAML.stringify(set, { version: '1.1' }) expect(str).toBe(`!!set\n? a\n? b\n? c\n`) const str2 = YAML.stringify(set) expect(str2).toBe(`- a\n- b\n- c\n`) }) test('eemeli/yaml#78', () => { const set = new Set(['a', 'b', 'c']) const str = YAML.stringify({ set }, { version: '1.1' }) expect(str).toBe(`set:\n !!set\n ? a\n ? b\n ? c\n`) }) }) }) describe('custom tags', () => { const src = `%TAG !e! tag:example.com,2000:test/ --- !e!x - !y 2 - !e!z 3 - ! 4 - '5'` test('parse', () => { const doc = YAML.parseDocument(src) expect(doc.contents).toBeInstanceOf(YAMLSeq) expect(doc.contents.tag).toBe('tag:example.com,2000:test/x') const { items } = doc.contents expect(items).toHaveLength(4) items.forEach(item => expect(typeof item.value).toBe('string')) expect(items[0].tag).toBe('!y') expect(items[1].tag).toBe('tag:example.com,2000:test/z') expect(items[2].tag).toBe('tag:example.com,2000:other/w') }) test('stringify', () => { const doc = YAML.parseDocument(src) expect(String(doc)).toBe( `%TAG !e! tag:example.com,2000:test/ --- !e!x - !y "2" - !e!z "3" - ! "4" - '5'\n` ) }) test('modify', () => { const doc = YAML.parseDocument(src) const prefix = 'tag:example.com,2000:other/' doc.setTagPrefix('!f!', prefix) expect(doc.tagPrefixes).toMatchObject([ { handle: '!e!' }, { handle: '!f!' } ]) doc.contents.commentBefore = 'c' doc.contents.items[3].comment = 'cc' const s = new Scalar(6) s.tag = '!g' doc.contents.items.splice(1, 1, s, '7') expect(String(doc)).toBe( `%TAG !e! tag:example.com,2000:test/ %TAG !f! tag:example.com,2000:other/ --- #c !e!x - !y "2" - !g 6 - "7" - !f!w "4" - '5' #cc\n` ) doc.setTagPrefix('!f!', null) expect(doc.tagPrefixes).toMatchObject([{ handle: '!e!' }]) expect(() => doc.setTagPrefix('!f', prefix)).toThrow( 'Handle must start and end with !' ) }) test('YAML 1.0 explicit tags', () => { const src = `%YAML:1.0 --- date: 2001-01-23 number: !int '123' string: !str 123 pool: !!ball { number: 8 } perl: !perl/Text::Tabs {}` const doc = YAML.parseDocument(src) expect(doc.version).toBe('1.0') expect(doc.toJSON()).toMatchObject({ number: 123, string: '123', pool: { number: 8 }, perl: {} }) const date = doc.contents.items[0].value.value expect(date).toBeInstanceOf(Date) expect(date.getFullYear()).toBe(2001) expect(String(doc)).toBe(`%YAML:1.0 --- date: 2001-01-23 number: !yaml.org,2002:int 123 string: !yaml.org,2002:str "123" pool: !ball { number: 8 } perl: !perl/Text::Tabs {}\n`) }) test('YAML 1.0 tag prefixing', () => { const src = `%YAML:1.0 --- invoice: !domain.tld,2002/^invoice customers: !seq - !^customer given : Chris family : Dumars` const doc = YAML.parseDocument(src) expect(doc.version).toBe('1.0') expect(doc.toJSON()).toMatchObject({ invoice: { customers: [{ family: 'Dumars', given: 'Chris' }] } }) expect(String(doc)).toBe(`%YAML:1.0 --- invoice: !domain.tld,2002/^invoice customers: !yaml.org,2002:seq - !^customer given: Chris family: Dumars\n`) }) describe('custom tag objects', () => { const src = `!!binary | R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=` test('tag object in tags', () => { const bin = YAML.parse(src, { customTags: [binary] }) expect(bin).toBeInstanceOf(Uint8Array) }) test('tag array in tags', () => { const bin = YAML.parse(src, { customTags: [[binary]] }) expect(bin).toBeInstanceOf(Uint8Array) }) test('tag string in tags', () => { const bin = YAML.parse(src, { customTags: ['binary'] }) expect(bin).toBeInstanceOf(Uint8Array) }) test('tag string in tag array', () => { const bin = YAML.parse(src, { customTags: [['binary']] }) expect(bin).toBeInstanceOf(Uint8Array) }) test('custom tags from function', () => { const customTags = tags => tags.concat('binary') const bin = YAML.parse(src, { customTags }) expect(bin).toBeInstanceOf(Uint8Array) }) test('no custom tag object', () => { const doc = YAML.parseDocument(src) const message = 'The tag tag:yaml.org,2002:binary is unavailable, falling back to tag:yaml.org,2002:str' expect(doc.warnings).toMatchObject([{ message }]) expect(typeof doc.contents.value).toBe('string') }) }) }) describe('schema changes', () => { test('write as json', () => { const doc = YAML.parseDocument('foo: bar', { schema: 'core' }) expect(doc.options.schema).toBe('core') doc.setSchema('json') expect(doc.options.schema).toBe('json') expect(String(doc)).toBe('"foo": "bar"\n') }) test('fail for missing type', () => { const doc = YAML.parseDocument('foo: 1971-02-03T12:13:14', { version: '1.1' }) expect(doc.options.version).toBe('1.1') doc.setSchema('1.2') expect(doc.version).toBeNull() expect(doc.options.version).toBe('1.2') expect(doc.options.schema).toBeUndefined() expect(() => String(doc)).toThrow(/Tag not resolved for Date value/) }) test('set schema + custom tags', () => { const doc = YAML.parseDocument('foo: 1971-02-03T12:13:14', { version: '1.1' }) doc.setSchema('json', ['timestamp']) expect(String(doc)).toBe('"foo": 1971-02-03T12:13:14\n') }) test('set version + custom tags', () => { const doc = YAML.parseDocument('foo: 1971-02-03T12:13:14', { version: '1.1' }) doc.setSchema(1.2, ['timestamp']) expect(String(doc)).toBe('foo: 1971-02-03T12:13:14\n') }) }) yaml-1.10.2/tests/properties.js000066400000000000000000000020221402322402300164150ustar00rootroot00000000000000import YAML from '../index.js' import * as fc from 'fast-check' describe('properties', () => { test('parse stringified object', () => { const key = fc.fullUnicodeString() const values = [ key, fc.lorem(1000, false), // words fc.lorem(100, true), // sentences fc.boolean(), fc.integer(), fc.double(), fc.constantFrom(null, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY) ] const yamlArbitrary = fc.anything({ key: key, values: values }) const optionsArbitrary = fc.record( { keepBlobsInJSON: fc.boolean(), keepCstNodes: fc.boolean(), keepNodeTypes: fc.boolean(), mapAsMap: fc.constant(false), merge: fc.boolean(), schema: fc.constantFrom('core', 'yaml-1.1') // ignore 'failsafe', 'json' }, { withDeletedKeys: true } ) fc.assert( fc.property(yamlArbitrary, optionsArbitrary, (obj, opts) => { expect(YAML.parse(YAML.stringify(obj, opts), opts)).toStrictEqual(obj) }) ) }) }) yaml-1.10.2/tests/typings.ts000066400000000000000000000043211402322402300157340ustar00rootroot00000000000000// To test types, compile this file with tsc import * as YAML from '../index' import { YAMLMap, YAMLSeq, Pair } from '../types' YAML.parse('3.14159') // 3.14159 YAML.parse('[ true, false, maybe, null ]\n') // [ true, false, 'maybe', null ] const file = `# file.yml YAML: - A human-readable data serialization language - https://en.wikipedia.org/wiki/YAML yaml: - A complete JavaScript implementation - https://www.npmjs.com/package/yaml` YAML.parse(file) // { YAML: // [ 'A human-readable data serialization language', // 'https://en.wikipedia.org/wiki/YAML' ], // yaml: // [ 'A complete JavaScript implementation', // 'https://www.npmjs.com/package/yaml' ] } YAML.stringify(3.14159) // '3.14159\n' YAML.stringify([true, false, 'maybe', null]) // `- true // - false // - maybe // - null // ` YAML.stringify({ number: 3, plain: 'string', block: 'two\nlines\n' }) // `number: 3 // plain: string // block: > // two // // lines // ` const src = '[{ a: A }, { b: B }]' const doc = YAML.parseDocument(src) const seq = doc.contents as YAMLSeq const { anchors } = doc const [a, b] = seq.items as YAMLMap[] anchors.setAnchor(a.items[0].value) // 'a1' anchors.setAnchor(b.items[0].value) // 'a2' anchors.setAnchor(null, 'a1') // 'a1' anchors.getName(a) // undefined anchors.getNode('a2') // { value: 'B', range: [ 16, 18 ], type: 'PLAIN' } String(doc) // [ { a: A }, { b: &a2 B } ] const alias = anchors.createAlias(a, 'AA') seq.items.push(alias) const refs = new Map() doc.toJSON(null, (value, count) => refs.set(value, count)) // [ { a: 'A' }, { b: 'B' }, { a: 'A' } ] String(doc) // [ &AA { a: A }, { b: &a2 B }, *AA ] refs // Map(3) { undefined => 1, 'B' => 1, { a: 'A' } => 2 } const merge = anchors.createMergePair(alias) b.items.push(merge) doc.toJSON() // [ { a: 'A' }, { b: 'B', a: 'A' }, { a: 'A' } ] String(doc) // [ &AA { a: A }, { b: &a2 B, <<: *AA }, *AA ] // This creates a circular reference merge.value.items.push(anchors.createAlias(b)) doc.toJSON() // [RangeError: Maximum call stack size exceeded] String(doc) // [ // &AA { a: A }, // &a3 { // b: &a2 B, // <<: // [ *AA, *a3 ] // }, // *AA // ] const map = new YAMLMap() map.items.push(new Pair('foo', 'bar')) doc.contents = map yaml-1.10.2/tests/yaml-test-suite/000077500000000000000000000000001402322402300167355ustar00rootroot00000000000000yaml-1.10.2/tests/yaml-test-suite.js000066400000000000000000000062711402322402300173010ustar00rootroot00000000000000import fs from 'fs' import path from 'path' import YAML from '../index.js' import { testEvents } from '../dist/test-events.js' const testDirs = fs .readdirSync(path.resolve(__dirname, 'yaml-test-suite')) .filter(dir => /^[A-Z0-9]{4}$/.test(dir)) const matchJson = (docs, json) => { if (!json) return const received = docs[0] ? docs.map(doc => doc.toJSON()) : null const expected = docs.length > 1 ? json .replace(/\n$/, '') .split('\n') .map(line => JSON.parse(line)) : [JSON.parse(json)] if (!received || typeof received !== 'object') { expect(received).toBe(expected) } else { expect(received).toMatchObject(expected) } } let origFoldOptions beforeAll(() => { origFoldOptions = YAML.scalarOptions.str.fold YAML.scalarOptions.str.fold = { lineWidth: 20, minContentWidth: 0 } }) afterAll(() => { YAML.scalarOptions.str.fold = origFoldOptions }) testDirs.forEach(dir => { const root = path.resolve(__dirname, 'yaml-test-suite', dir) const name = fs.readFileSync(path.resolve(root, '==='), 'utf8').trim() const yaml = fs.readFileSync(path.resolve(root, 'in.yaml'), 'utf8') let error, events, json, outYaml try { fs.readFileSync(path.resolve(root, 'error'), 'utf8') error = true } catch (e) { /* ignore error */ } try { // Too much variance in event stream length for error cases events = !error && fs.readFileSync(path.resolve(root, 'test.event'), 'utf8') } catch (e) { /* ignore error */ } try { json = fs.readFileSync(path.resolve(root, 'in.json'), 'utf8') } catch (e) { /* ignore error */ } try { outYaml = fs.readFileSync(path.resolve(root, 'out.yaml'), 'utf8') } catch (e) { /* ignore error */ } describe(`${dir}: ${name}`, () => { const docs = YAML.parseAllDocuments(yaml) if (events) { test('test.event', () => { const res = testEvents(yaml) expect(res.events.join('\n') + '\n').toBe(events) expect(res.error).toBeNull() }) } if (json) test('in.json', () => matchJson(docs, json)) test('errors', () => { const errors = docs .map(doc => doc.errors) .filter(docErrors => docErrors.length > 0) if (error) { expect(errors).not.toHaveLength(0) } else { expect(errors).toHaveLength(0) } }) if (!error) { const src2 = docs.map(doc => String(doc).replace(/\n$/, '')).join('\n...\n') + '\n' const docs2 = YAML.parseAllDocuments(src2) trace: name, '\nIN\n' + yaml, '\nJSON\n' + JSON.stringify(docs[0], null, ' '), '\n\nOUT\n' + src2, '\nOUT-JSON\n' + JSON.stringify(src2), '\nRE-JSON\n' + JSON.stringify(docs2[0], null, ' ') if (json) test('stringfy+re-parse', () => matchJson(docs2, json)) if (outYaml) { test('out.yaml', () => { const resDocs = YAML.parseAllDocuments(yaml, { mapAsMap: true }) const resJson = resDocs.map(doc => doc.toJSON()) const expDocs = YAML.parseAllDocuments(outYaml, { mapAsMap: true }) const expJson = expDocs.map(doc => doc.toJSON()) expect(resJson).toMatchObject(expJson) }) } } }) }) yaml-1.10.2/types.d.ts000066400000000000000000000265541402322402300144770ustar00rootroot00000000000000import { Document, scalarOptions } from './index' import { CST } from './parse-cst' import { Type } from './util' export const binaryOptions: scalarOptions.Binary export const boolOptions: scalarOptions.Bool export const intOptions: scalarOptions.Int export const nullOptions: scalarOptions.Null export const strOptions: scalarOptions.Str export class Schema { /** Default: `'tag:yaml.org,2002:'` */ static defaultPrefix: string static defaultTags: { /** Default: `'tag:yaml.org,2002:map'` */ MAP: string /** Default: `'tag:yaml.org,2002:seq'` */ SEQ: string /** Default: `'tag:yaml.org,2002:str'` */ STR: string } constructor(options: Schema.Options) /** * Convert any value into a `Node` using this schema, recursively turning * objects into collections. * * @param wrapScalars If `true`, also wraps plain values in `Scalar` objects; * if undefined or `false` and `value` is not an object, it will be returned * directly. * @param tag Use to specify the collection type, e.g. `"!!omap"`. Note that * this requires the corresponding tag to be available in this schema. */ createNode( value: any, wrapScalars?: boolean, tag?: string, ctx?: Schema.CreateNodeContext ): Node /** * Convert a key and a value into a `Pair` using this schema, recursively * wrapping all values as `Scalar` or `Collection` nodes. * * @param ctx To not wrap scalars, use a context `{ wrapScalars: false }` */ createPair(key: any, value: any, ctx?: Schema.CreateNodeContext): Pair merge: boolean name: Schema.Name sortMapEntries: ((a: Pair, b: Pair) => number) | null tags: Schema.Tag[] } export namespace Schema { type Name = 'core' | 'failsafe' | 'json' | 'yaml-1.1' interface Options { /** * Array of additional tags to include in the schema, or a function that may * modify the schema's base tag array. */ customTags?: (TagId | Tag)[] | ((tags: Tag[]) => Tag[]) /** * Enable support for `<<` merge keys. * * Default: `false` for YAML 1.2, `true` for earlier versions */ merge?: boolean /** * The base schema to use. * * Default: `"core"` for YAML 1.2, `"yaml-1.1"` for earlier versions */ schema?: Name /** * When stringifying, sort map entries. If `true`, sort by comparing key values with `<`. * * Default: `false` */ sortMapEntries?: boolean | ((a: Pair, b: Pair) => number) /** * @deprecated Use `customTags` instead. */ tags?: Options['customTags'] } interface CreateNodeContext { wrapScalars?: boolean [key: string]: any } interface StringifyContext { forceBlockIndent?: boolean implicitKey?: boolean indent?: string indentAtStart?: number inFlow?: boolean [key: string]: any } type TagId = | 'binary' | 'bool' | 'float' | 'floatExp' | 'floatNaN' | 'floatTime' | 'int' | 'intHex' | 'intOct' | 'intTime' | 'null' | 'omap' | 'pairs' | 'set' | 'timestamp' type Tag = CustomTag | DefaultTag interface BaseTag { /** * An optional factory function, used e.g. by collections when wrapping JS objects as AST nodes. */ createNode?: ( schema: Schema, value: any, ctx: Schema.CreateNodeContext ) => YAMLMap | YAMLSeq | Scalar /** * If a tag has multiple forms that should be parsed and/or stringified differently, use `format` to identify them. */ format?: string /** * Used by `YAML.createNode` to detect your data type, e.g. using `typeof` or * `instanceof`. */ identify(value: any): boolean /** * The `Node` child class that implements this tag. Required for collections and tags that have overlapping JS representations. */ nodeClass?: new () => any /** * Used by some tags to configure their stringification, where applicable. */ options?: object /** * Optional function stringifying the AST node in the current context. If your * data includes a suitable `.toString()` method, you can probably leave this * undefined and use the default stringifier. * * @param item The node being stringified. * @param ctx Contains the stringifying context variables. * @param onComment Callback to signal that the stringifier includes the * item's comment in its output. * @param onChompKeep Callback to signal that the output uses a block scalar * type with the `+` chomping indicator. */ stringify?: ( item: Node, ctx: Schema.StringifyContext, onComment?: () => void, onChompKeep?: () => void ) => string /** * The identifier for your data type, with which its stringified form will be * prefixed. Should either be a !-prefixed local `!tag`, or a fully qualified * `tag:domain,date:foo`. */ tag: string } interface CustomTag extends BaseTag { /** * A JavaScript class that should be matched to this tag, e.g. `Date` for `!!timestamp`. * @deprecated Use `Tag.identify` instead */ class?: new () => any /** * Turns a CST node into an AST node. If returning a non-`Node` value, the * output will be wrapped as a `Scalar`. */ resolve(doc: Document, cstNode: CST.Node): Node | any } interface DefaultTag extends BaseTag { /** * If `true`, together with `test` allows for values to be stringified without * an explicit tag. For most cases, it's unlikely that you'll actually want to * use this, even if you first think you do. */ default: true /** * Alternative form used by default tags; called with `test` match results. */ resolve(...match: string[]): Node | any /** * Together with `default` allows for values to be stringified without an * explicit tag and detected using a regular expression. For most cases, it's * unlikely that you'll actually want to use these, even if you first think * you do. */ test: RegExp } } export class Node { /** A comment on or immediately after this */ comment?: string | null /** A comment before this */ commentBefore?: string | null /** Only available when `keepCstNodes` is set to `true` */ cstNode?: CST.Node /** * The [start, end] range of characters of the source parsed * into this node (undefined for pairs or if not parsed) */ range?: [number, number] | null /** A blank line before this node and its commentBefore */ spaceBefore?: boolean /** A fully qualified tag, if required */ tag?: string /** A plain JS representation of this node */ toJSON(arg?: any): any /** The type of this node */ type?: Type | Pair.Type } export class Scalar extends Node { constructor(value: any) type?: Scalar.Type /** * By default (undefined), numbers use decimal notation. * The YAML 1.2 core schema only supports 'HEX' and 'OCT'. */ format?: 'BIN' | 'HEX' | 'OCT' | 'TIME' value: any toJSON(arg?: any, ctx?: AST.NodeToJsonContext): any toString(): string } export namespace Scalar { type Type = | Type.BLOCK_FOLDED | Type.BLOCK_LITERAL | Type.PLAIN | Type.QUOTE_DOUBLE | Type.QUOTE_SINGLE } export class Alias extends Node { type: Type.ALIAS source: Node cstNode?: CST.Alias toString(ctx: Schema.StringifyContext): string } export class Pair extends Node { constructor(key: any, value?: any) type: Pair.Type.PAIR | Pair.Type.MERGE_PAIR /** Always Node or null when parsed, but can be set to anything. */ key: any /** Always Node or null when parsed, but can be set to anything. */ value: any cstNode?: never // no corresponding cstNode toJSON(arg?: any, ctx?: AST.NodeToJsonContext): object | Map toString( ctx?: Schema.StringifyContext, onComment?: () => void, onChompKeep?: () => void ): string } export namespace Pair { enum Type { PAIR = 'PAIR', MERGE_PAIR = 'MERGE_PAIR' } } export class Merge extends Pair { type: Pair.Type.MERGE_PAIR /** Always Scalar('<<'), defined by the type specification */ key: AST.PlainValue /** Always YAMLSeq, stringified as *A if length = 1 */ value: YAMLSeq toString(ctx?: Schema.StringifyContext, onComment?: () => void): string } export class Collection extends Node { type?: Type.MAP | Type.FLOW_MAP | Type.SEQ | Type.FLOW_SEQ | Type.DOCUMENT items: any[] schema?: Schema /** * Adds a value to the collection. For `!!map` and `!!omap` the value must * be a Pair instance or a `{ key, value }` object, which may not have a key * that already exists in the map. */ add(value: any): void addIn(path: Iterable, value: any): void /** * Removes a value from the collection. * @returns `true` if the item was found and removed. */ delete(key: any): boolean deleteIn(path: Iterable): boolean /** * Returns item at `key`, or `undefined` if not found. By default unwraps * scalar values from their surrounding node; to disable set `keepScalar` to * `true` (collections are always returned intact). */ get(key: any, keepScalar?: boolean): any getIn(path: Iterable, keepScalar?: boolean): any /** * Checks if the collection includes a value with the key `key`. */ has(key: any): boolean hasIn(path: Iterable): boolean /** * Sets a value in this collection. For `!!set`, `value` needs to be a * boolean to add/remove the item from the set. */ set(key: any, value: any): void setIn(path: Iterable, value: any): void } export class YAMLMap extends Collection { type?: Type.FLOW_MAP | Type.MAP items: Array hasAllNullValues(): boolean toJSON(arg?: any, ctx?: AST.NodeToJsonContext): object | Map toString( ctx?: Schema.StringifyContext, onComment?: () => void, onChompKeep?: () => void ): string } export class YAMLSeq extends Collection { type?: Type.FLOW_SEQ | Type.SEQ delete(key: number | string | Scalar): boolean get(key: number | string | Scalar, keepScalar?: boolean): any has(key: number | string | Scalar): boolean set(key: number | string | Scalar, value: any): void hasAllNullValues(): boolean toJSON(arg?: any, ctx?: AST.NodeToJsonContext): any[] toString( ctx?: Schema.StringifyContext, onComment?: () => void, onChompKeep?: () => void ): string } export namespace AST { interface NodeToJsonContext { anchors?: any[] doc: Document keep?: boolean mapAsMap?: boolean maxAliasCount?: number onCreate?: (node: Node) => void [key: string]: any } interface BlockFolded extends Scalar { type: Type.BLOCK_FOLDED cstNode?: CST.BlockFolded } interface BlockLiteral extends Scalar { type: Type.BLOCK_LITERAL cstNode?: CST.BlockLiteral } interface PlainValue extends Scalar { type: Type.PLAIN cstNode?: CST.PlainValue } interface QuoteDouble extends Scalar { type: Type.QUOTE_DOUBLE cstNode?: CST.QuoteDouble } interface QuoteSingle extends Scalar { type: Type.QUOTE_SINGLE cstNode?: CST.QuoteSingle } interface FlowMap extends YAMLMap { type: Type.FLOW_MAP cstNode?: CST.FlowMap } interface BlockMap extends YAMLMap { type: Type.MAP cstNode?: CST.Map } interface FlowSeq extends YAMLSeq { type: Type.FLOW_SEQ items: Array cstNode?: CST.FlowSeq } interface BlockSeq extends YAMLSeq { type: Type.SEQ items: Array cstNode?: CST.Seq } } yaml-1.10.2/types.js000066400000000000000000000007761402322402300142410ustar00rootroot00000000000000const types = require('./dist/types') exports.binaryOptions = types.binaryOptions exports.boolOptions = types.boolOptions exports.intOptions = types.intOptions exports.nullOptions = types.nullOptions exports.strOptions = types.strOptions exports.Schema = types.Schema exports.Alias = types.Alias exports.Collection = types.Collection exports.Merge = types.Merge exports.Node = types.Node exports.Pair = types.Pair exports.Scalar = types.Scalar exports.YAMLMap = types.YAMLMap exports.YAMLSeq = types.YAMLSeq yaml-1.10.2/types.mjs000066400000000000000000000011021402322402300143760ustar00rootroot00000000000000import types from './dist/types.js' export const binaryOptions = types.binaryOptions export const boolOptions = types.boolOptions export const intOptions = types.intOptions export const nullOptions = types.nullOptions export const strOptions = types.strOptions export const Schema = types.Schema export const Alias = types.Alias export const Collection = types.Collection export const Merge = types.Merge export const Node = types.Node export const Pair = types.Pair export const Scalar = types.Scalar export const YAMLMap = types.YAMLMap export const YAMLSeq = types.YAMLSeq yaml-1.10.2/types/000077500000000000000000000000001402322402300136715ustar00rootroot00000000000000yaml-1.10.2/types/binary.js000066400000000000000000000003471402322402300155170ustar00rootroot00000000000000'use strict' Object.defineProperty(exports, '__esModule', { value: true }) const legacy = require('../dist/legacy-exports') exports.binary = legacy.binary exports.default = [exports.binary] legacy.warnFileDeprecation(__filename) yaml-1.10.2/types/omap.js000066400000000000000000000001651402322402300151650ustar00rootroot00000000000000const legacy = require('../dist/legacy-exports') module.exports = legacy.omap legacy.warnFileDeprecation(__filename) yaml-1.10.2/types/pairs.js000066400000000000000000000001661402322402300153500ustar00rootroot00000000000000const legacy = require('../dist/legacy-exports') module.exports = legacy.pairs legacy.warnFileDeprecation(__filename) yaml-1.10.2/types/set.js000066400000000000000000000001641402322402300150230ustar00rootroot00000000000000const legacy = require('../dist/legacy-exports') module.exports = legacy.set legacy.warnFileDeprecation(__filename) yaml-1.10.2/types/timestamp.js000066400000000000000000000005271402322402300162360ustar00rootroot00000000000000'use strict' Object.defineProperty(exports, '__esModule', { value: true }) const legacy = require('../dist/legacy-exports') exports.default = [legacy.intTime, legacy.floatTime, legacy.timestamp] exports.floatTime = legacy.floatTime exports.intTime = legacy.intTime exports.timestamp = legacy.timestamp legacy.warnFileDeprecation(__filename) yaml-1.10.2/util.d.ts000066400000000000000000000040361402322402300142770ustar00rootroot00000000000000import { Document } from './index' import { CST } from './parse-cst' import { AST, Pair, Scalar, Schema } from './types' export function findPair(items: any[], key: Scalar | any): Pair | undefined export function parseMap(doc: Document, cst: CST.Map): AST.BlockMap export function parseMap(doc: Document, cst: CST.FlowMap): AST.FlowMap export function parseSeq(doc: Document, cst: CST.Seq): AST.BlockSeq export function parseSeq(doc: Document, cst: CST.FlowSeq): AST.FlowSeq export function stringifyNumber(item: Scalar): string export function stringifyString( item: Scalar, ctx: Schema.StringifyContext, onComment?: () => void, onChompKeep?: () => void ): string export function toJSON( value: any, arg?: any, ctx?: Schema.CreateNodeContext ): any export enum Type { ALIAS = 'ALIAS', BLANK_LINE = 'BLANK_LINE', BLOCK_FOLDED = 'BLOCK_FOLDED', BLOCK_LITERAL = 'BLOCK_LITERAL', COMMENT = 'COMMENT', DIRECTIVE = 'DIRECTIVE', DOCUMENT = 'DOCUMENT', FLOW_MAP = 'FLOW_MAP', FLOW_SEQ = 'FLOW_SEQ', MAP = 'MAP', MAP_KEY = 'MAP_KEY', MAP_VALUE = 'MAP_VALUE', PLAIN = 'PLAIN', QUOTE_DOUBLE = 'QUOTE_DOUBLE', QUOTE_SINGLE = 'QUOTE_SINGLE', SEQ = 'SEQ', SEQ_ITEM = 'SEQ_ITEM' } interface LinePos { line: number col: number } export class YAMLError extends Error { name: | 'YAMLReferenceError' | 'YAMLSemanticError' | 'YAMLSyntaxError' | 'YAMLWarning' message: string source?: CST.Node nodeType?: Type range?: CST.Range linePos?: { start: LinePos; end: LinePos } /** * Drops `source` and adds `nodeType`, `range` and `linePos`, as well as * adding details to `message`. Run automatically for document errors if * the `prettyErrors` option is set. */ makePretty(): void } export class YAMLReferenceError extends YAMLError { name: 'YAMLReferenceError' } export class YAMLSemanticError extends YAMLError { name: 'YAMLSemanticError' } export class YAMLSyntaxError extends YAMLError { name: 'YAMLSyntaxError' } export class YAMLWarning extends YAMLError { name: 'YAMLWarning' } yaml-1.10.2/util.js000066400000000000000000000007771402322402300140530ustar00rootroot00000000000000const util = require('./dist/util') exports.findPair = util.findPair exports.toJSON = util.toJSON exports.parseMap = util.parseMap exports.parseSeq = util.parseSeq exports.stringifyNumber = util.stringifyNumber exports.stringifyString = util.stringifyString exports.Type = util.Type exports.YAMLError = util.YAMLError exports.YAMLReferenceError = util.YAMLReferenceError exports.YAMLSemanticError = util.YAMLSemanticError exports.YAMLSyntaxError = util.YAMLSyntaxError exports.YAMLWarning = util.YAMLWarning yaml-1.10.2/util.mjs000066400000000000000000000010731402322402300142160ustar00rootroot00000000000000import util from './dist/util.js' export const findPair = util.findPair export const toJSON = util.toJSON export const parseMap = util.parseMap export const parseSeq = util.parseSeq export const stringifyNumber = util.stringifyNumber export const stringifyString = util.stringifyString export const Type = util.Type export const YAMLError = util.YAMLError export const YAMLReferenceError = util.YAMLReferenceError export const YAMLSemanticError = util.YAMLSemanticError export const YAMLSyntaxError = util.YAMLSyntaxError export const YAMLWarning = util.YAMLWarning